U
    d                     @   sD   d dl mZmZ d dlmZ d dlmZ d dlZG dd deZ	dS )    )coreschema)
ModelLayer)TagsNc                       s&   e Zd Zd fdd	Zdd Z  ZS )BatchHuberLossbatch_huber_loss      ?c                    s|   t t| j|||f| |dks$t|| _ttdt fdt f|sRt| j	
tjg ttj| d| _d S )Nr   label
predictionoutput)superr   __init__AssertionError_deltar   Zis_schema_subsetStructZScalartagsupdater   ZEXCLUDE_FROM_PREDICTIONnpfloat32Zget_next_blob_referenceoutput_schema)selfmodelinput_recordnamedeltakwargs	__class__ I/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/batch_huber_loss.pyr      s    

zBatchHuberLoss.__init__c                 C   s  |j | j |ddgd}| jj }| jj j| jj jkrj|j||dt	
| jj d}|j||d| jtjjd}|||d}|||d	}|||g|d
}|||g|d}|j||tdd}||||g|g|d}|||g|d}	d| jjkr| j }
| jj jtjkrl|j|
|
d tjjd}
||
g|dg}
||	|
g|d}	||	| j  d S )NZsqueezed_prediction   )ZdimsZ
cast_label)tor   )valueZdtypeZstopped_labelZstopped_delta	abs_errorZmin_error_deltag      ?)ZscaleZhuber_linear_term
huber_distweightZ_float32Zweight_stop_gradientZweighted_huber_distance)ZSqueezer   r
   ZNextScopedBlobr	   Zfield_blobsZ
field_typebaseZCastr   Zdata_type_for_dtypeZConstantFillr   r   ZDataTypeFLOATZStopGradientZ
L1DistanceZMinZScaleZSqrfloatZMulZSubZAddfieldsr%   r   r   ZAveragedLossr   )r   netr
   r	   Zconst_deltar#   Z	min_errorZquadratic_termZlinear_termr$   Zweight_blobr   r   r   add_ops(   s    
   	 

zBatchHuberLoss.add_ops)r   r   )__name__
__module____qualname__r   r+   __classcell__r   r   r   r   r      s   r   )
Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   Zcaffe2.python.layers.tagsr   Znumpyr   r   r   r   r   r   <module>   s   