U
    d                     @   s<   d dl mZ d dlmZmZ d dlmZ G dd deZdS )    )schema)
ModelLayerget_layer_class)SamplingTrainableMixinc                       s.   e Zd Zd	 fdd	Zdd Zdd Z  ZS )
SamplingTrainTsampling_trainc           	         s   t t| j ||f| t|}t|ts.td|ks:tt|jt	j
sPtdd|ks\t|| _| jrtd|kstt| |jfd|i|| _ fdd| jjD | j_| jj| _| jj| _d S )Nindicesz6input_record.indices is expected to be a schema.Scalarinputsampling_proboutput_dimsc                    s    g | ]} j t|d  qS )Z_sampled)netZNextBlobstr).0Zblobmodel G/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/sampling_train.py
<listcomp>/   s   z*SamplingTrain.__init__.<locals>.<listcomp>)superr   __init__r   
issubclassr   AssertionError
isinstancer   r   ZScalarsubtract_log_oddr	   _prediction_layerparam_blobstrain_param_blobsparamsoutput_schema)	selfr   input_recordZprediction_layerr   r   namekwargsZlayer_class	__class__r   r   r      s<    

  


zSamplingTrain.__init__c                 C   s   | j | d S )N)r   add_ops)r   r   r   r   r   r%   8   s    zSamplingTrain.add_opsc                 C   s   t | jj| jjD ]\}}||| j g| q| j| | jsHd S |	| j
 |d}|j|  |g|  ddd d S )Nlog_q   )	broadcastZuse_grad_hack)zipr   r   r   ZGatherr    r   add_train_opsr   Logr
   ZNextScopedBlobZSubr   )r   r   Z	full_blobZsampled_blobr&   r   r   r   r*   ;   s     zSamplingTrain.add_train_ops)Tr   )__name__
__module____qualname__r   r%   r*   __classcell__r   r   r#   r   r      s
     *r   N)Zcaffe2.pythonr   Zcaffe2.python.layers.layersr   r   Z-caffe2.python.layers.sampling_trainable_mixinr   r   r   r   r   r   <module>   s   