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 )    )schemacore)
ModelLayer)TagsNc                       s&   e Zd Zd fdd	Zdd Z  ZS )	MarginRankLossmargin_rank_loss皙?Fc              	      s   t t| j|||f| |dks(td|| _|| _ttdt	 fdt
tjf|s`t| jtjg t	tj| d| _d S )Nr   z/For hinge loss, margin should be no less than 0pos_predictionneg_predictionoutput)superr   __init__AssertionError_margin_average_lossr   Zis_schema_subsetStructZScalarListnpZfloat32tagsupdater   ZEXCLUDE_FROM_PREDICTIONZget_next_blob_referenceoutput_schema)selfmodelinput_recordnamemarginZaverage_losskwargs	__class__ I/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/margin_rank_loss.pyr      s     
zMarginRankLoss.__init__c                 C   s   | j jd  }|| j  | j jd  g|d}|j||ddtjjd}|j	|||g|d| j
d}| jr||| j  n||| j  d S )	NvalueslengthsZpos_score_repeatedconst_1   )valueZdtype	rank_loss)r   )r   r
   ZLengthsTiler	   ZNextScopedBlobZConstantFillr   ZDataTypeZINT32ZMarginRankingCriterionr   r   ZAveragedLossr   Zfield_blobsZReduceFrontSum)r   netZ	neg_scoreZ	pos_scorer#   r&   r   r   r    add_ops&   s*    zMarginRankLoss.add_ops)r   r   F)__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   