U
    d                     @   s0   d dl mZmZ d dlmZ G dd deZdS )    )coreschema)
ModelLayerc                       s*   e Zd ZdZd fdd	Zdd Z  ZS )ReservoirSamplingz
    Collect samples from input record w/ reservoir sampling. If you have complex
    data, use PackRecords to pack it before using this layer.

    This layer is not thread safe.
    reservoir_samplingc                    sN  t t| j|||f| |dks$t|| _| jddgd|jd| _| jdg ddtj	j
df|jd| _| jdg d	|jd| _g | _g | _d
|kr| jdd dtj	j
tj	jdf|jd}| jddgddtj	j
df|jd}| j|  | j||g | j||g tdt|j| jgfdtj| jdfdtj| jdf| _d S )Nr   	reservoir)ConstantFill)
param_nameshapeZinitializerZ	optimizerZnum_visitedr   )valueZdtypemutex)ZCreateMutex	object_idobject_to_posZ	CreateMap)Z	key_dtypeZvalued_dtypepos_to_object)Zblob)superr   __init__AssertionErrornum_to_collectZcreate_paramZNoOptimr   r   ZDataTypeZINT64num_visited_blobr   extra_input_blobsextra_output_blobsZINT32appendr   extendr   StructZfrom_blob_listdataZScalarZoutput_schema)selfmodelinput_recordr   namekwargsr   r   	__class__ K/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/reservoir_sampling.pyr      sz    
  	
		zReservoirSampling.__init__c                 C   s>   |j | j| j| j | jg| j | j| jg| j | jd d S )N)r   )	r   r   r   r   r   r   r   r   r   )r   netr"   r"   r#   add_opsS   s    zReservoirSampling.add_ops)r   )__name__
__module____qualname____doc__r   r%   __classcell__r"   r"   r    r#   r      s    ?r   N)Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   r   r"   r"   r"   r#   <module>   s   