o
    pi                     @   s(   d dl Z ddlmZ G dd deZdS )    N   )BaseReducerc                       sN   e Zd Zd fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z	  Z
S )ThresholdReducerNc                    s^   t  jdi | |d us|d usJ d|| _|| _| jddgdd | jg ddd d S )	Nz-At least one of low or high must be specifiedlowhighF)list_of_namesis_stat)num_past_filternum_above_lownum_below_highT )super__init__r   r   add_to_recordable_attributes)selfr   r   kwargs	__class__r   f/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/reducers/threshold_reducer.pyr      s   

zThresholdReducer.__init__c                 C      |  ||S Nelement_reduction_helperr   lossesloss_indices
embeddingslabelsr   r   r   element_reduction      z"ThresholdReducer.element_reductionc                 C   r   r   r   r   r   r   r   pos_pair_reduction   r   z#ThresholdReducer.pos_pair_reductionc                 C   r   r   r   r   r   r   r   neg_pair_reduction   r   z#ThresholdReducer.neg_pair_reductionc                 C   r   r   r   r   r   r   r   triplet_reduction   r   z"ThresholdReducer.triplet_reductionc                 C   sx   d\}}| j d ur|| j k}|| }| jd ur || jk }|| }t|}|dkr.t|}n| |}| ||| |S )NNNr   )r   r   lentorchmean	zero_loss	set_stats)r   r   r   low_conditionhigh_conditionr	   lossr   r   r   r       s   




z)ThresholdReducer.element_reduction_helperc                 C   s   | j r?|| _t + | jd urt| | _| jd ur-t| | _	W d    d S W d    d S 1 s8w   Y  d S d S r   )
collect_statsr	   r%   no_gradr   sumitemr
   r   num_above_high)r   r)   r*   r	   r   r   r   r(   0   s   


"zThresholdReducer.set_statsr#   )__name__
__module____qualname__r   r   r    r!   r"   r   r(   __classcell__r   r   r   r   r      s    r   )r%   base_reducerr   r   r   r   r   r   <module>   s    