o
    pi                     @   s4   d dl Z ddlmZ ddlmZ G dd deZdS )    N   )common_functions)ModuleWithRecordsc                       s   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Z  ZS ))BaseReducerc                    s$   t  j|i | | jddd d S )Nlosses_sizeT)nameis_stat)super__init__add_to_recordable_attributes)selfargskwargs	__class__ a/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/reducers/base_reducer.pyr
      s   zBaseReducer.__init__c                 C   sZ   |    t|dksJ t| d }|| }| |\}}}}	| ||||	||}
|
S )N   r   )reset_statslenlistkeysunpack_loss_inforeduce_the_loss)r   	loss_dict
embeddingslabels	loss_name	loss_infolossesloss_indicesreduction_typer   loss_valr   r   r   forward   s   zBaseReducer.forwardc                 C   s   |d |d |d i fS )Nr   indicesr!   r   )r   r   r   r   r   r      s
   zBaseReducer.unpack_loss_infoc                 C   sL   |  | | |r| |S | ||| | |}|||||fi |S N)set_losses_size_statinput_is_zero_loss	zero_lossassert_sizesget_reduction_func)r   r   r    r!   r   r   r   reduction_funcr   r   r   r      s   



zBaseReducer.reduce_the_lossc                 C   s   |j dkst|dksJ |S Nr   r   )ndimr   r   r   r    r   r   r   r   r   already_reduced_reduction)   s   z%BaseReducer.already_reduced_reductionc                 C      t r%   NotImplementedErrorr.   r   r   r   element_reduction-      zBaseReducer.element_reductionc                 C   r0   r%   r1   r.   r   r   r   pos_pair_reduction0   r4   zBaseReducer.pos_pair_reductionc                 C   r0   r%   r1   r.   r   r   r   neg_pair_reduction3   r4   zBaseReducer.neg_pair_reductionc                 C   r0   r%   r1   r.   r   r   r   triplet_reduction6   r4   zBaseReducer.triplet_reductionc                 C   s   t | d|S )Nz{}_reductiongetattrformat)r   r!   r   r   r   r*   9      zBaseReducer.get_reduction_funcc                 C   s   t | d||| d S )Nzassert_sizes_{}r8   )r   r   r    r!   r   r   r   r)   <   s   zBaseReducer.assert_sizesc                 C   s   t |d S )Nr   )torchsum)r   r   r   r   r   r(   ?   s   zBaseReducer.zero_lossc                 C   s   t |s|dkrdS dS )Nr   TFr<   	is_tensorr   r   r   r   r   r'   B   s   zBaseReducer.input_is_zero_lossc                 C   s   d S r%   r   r   r   r    r   r   r   assert_sizes_already_reducedG   r4   z(BaseReducer.assert_sizes_already_reducedc                 C   s4   t |sJ t |sJ t|t|ksJ d S r%   )r<   r?   r   rA   r   r   r   assert_sizes_elementJ   s   z BaseReducer.assert_sizes_elementc                 C   sv   t |sJ t|sJ t|dksJ tdd |D s!J t|t|d   kr6t|d ks9J  J d S )Nr   c                 s   s    | ]}t |V  qd S r%   r>   .0xr   r   r   	<genexpr>S   s    z0BaseReducer.assert_sizes_pair.<locals>.<genexpr>r   r   r<   r?   c_fis_list_or_tupler   allrA   r   r   r   assert_sizes_pairO   s
   4zBaseReducer.assert_sizes_pairc                 C      |  || d S r%   rL   rA   r   r   r   assert_sizes_pos_pairV   r;   z!BaseReducer.assert_sizes_pos_pairc                 C   rM   r%   rN   rA   r   r   r   assert_sizes_neg_pairY   r;   z!BaseReducer.assert_sizes_neg_pairc                    sJ   t  sJ t|sJ t|dksJ t fdd|D s#J d S )N   c                 3   s     | ]}t |t  kV  qd S r%   )r   rD   r   r   r   rG   `   s    z3BaseReducer.assert_sizes_triplet.<locals>.<genexpr>rH   rA   r   rR   r   assert_sizes_triplet\   s   z BaseReducer.assert_sizes_tripletc                 C   s6   | j rt|r|jdkrd| _d S t|| _d S d S r,   )collect_statsr<   r?   r-   r   r   r@   r   r   r   r&   b   s
   
z BaseReducer.set_losses_size_stat)__name__
__module____qualname__r
   r#   r   r   r/   r3   r5   r6   r7   r*   r)   r(   r'   rB   rC   rL   rO   rP   rS   r&   __classcell__r   r   r   r   r      s*    
r   )r<   utilsr   rI   utils.module_with_recordsr   r   r   r   r   r   <module>   s    