a
    ==ic                     @   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i | t|}t|ts2J d|v s>J t|jtj	sTJ dd|v s`J || _
| j
rxd|v sxJ | |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 t/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/layers/sampling_train.py
<listcomp>/   s   z*SamplingTrain.__init__.<locals>.<listcomp>)superr   __init__r   
issubclassr   
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      s8    




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NextScopedBlob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   