o
    èp©iº  ã                   @   s8   d dl mZ d dlmZ ddlmZ G dd„ deƒZdS )é   )Úminers)Úcommon_functionsé   )ÚBaseTrainerc                       sL   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	‡  Z
S )ÚCascadedEmbeddingsc                    s   t ƒ j|i |¤Ž || _d S ©N)ÚsuperÚ__init__Úembedding_sizes)Úselfr
   ÚargsÚkwargs©Ú	__class__© úh/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/trainers/cascaded_embeddings.pyr	      s   
zCascadedEmbeddings.__init__c              
   C   sî   |\}}|   |¡}d}g }d }t| jƒD ]@\}}	d| }
d| }d| }|d d …|||	 …f }|  ||||¡}| j|
  |  ||||
¡7  < | |  ||¡¡ ||	7 }qt|ƒD ]\}}|d u rbqYd| }
| j|
  |  |||
¡7  < qYd S )Né    zmetric_loss_%dztuple_miner_%dzclassifier_%dzclassifier_loss_%d)	Úcompute_embeddingsÚ	enumerater
   Úmaybe_mine_embeddingsÚlossesÚmaybe_get_metric_lossÚappendÚmaybe_get_logitsÚmaybe_get_classifier_loss)r   Ú
curr_batchÚdataÚlabelsÚ
embeddingsÚsÚlogitsÚindices_tupleÚiÚ	curr_sizeÚcurr_loss_nameÚcurr_miner_nameÚcurr_classifier_nameÚeÚLr   r   r   Úcalculate_loss   s4   
ÿÿ

ÿüz!CascadedEmbeddings.calculate_lossc                 C   s(   | j  |d¡dkr| j| |||ƒS dS ©Nr   )Úloss_weightsÚgetÚ
loss_funcs)r   r   r   r!   r$   r   r   r   r   (   s   z(CascadedEmbeddings.maybe_get_metric_lossc                 C   sT   || j v r(| j | }t|tjƒr!| ||¡ |||ƒ}| ¡  |S |||ƒ}|S d S r   )Úmining_funcsÚ
isinstancer   ÚHDCMinerÚset_idx_externallyÚ	reset_idx)r   r   r   Úprev_indices_tupler%   Ú
curr_minerÚcurr_indices_tupler   r   r   r   -   s   



ÿz(CascadedEmbeddings.maybe_mine_embeddingsc                 C   s    | j  |d ¡r| j | |ƒS d S r   )Úmodelsr,   )r   r   r&   r   r   r   r   ;   s   z#CascadedEmbeddings.maybe_get_logitsc                 C   s.   | j  |d¡dkr| j| |t ||¡ƒS dS r*   )r+   r,   r-   Úc_fÚ	to_device)r   r    r   r$   r   r   r   r   @   s
   ÿz,CascadedEmbeddings.maybe_get_classifier_lossc                 C   s8   | j d  jdg7  _ddg| j d _dg| j d _d S )Nr6   zclassifier_[0-9]+zmetric_loss_[0-9]+zclassifier_loss_[0-9]+r-   ztuple_miner_[0-9]+r.   )ÚschemaÚkeys)r   r   r   r   Úmodify_schemaG   s
   þz CascadedEmbeddings.modify_schema)Ú__name__Ú
__module__Ú__qualname__r	   r)   r   r   r   r   r;   Ú__classcell__r   r   r   r   r      s    r   N)Ú r   Úutilsr   r7   Úbase_trainerr   r   r   r   r   r   Ú<module>   s    