o
    pi:                     @   sT   d dl Zd dlZddlmZ ddlmZ ddlmZ	 ddl
mZ G dd	 d	eZdS )
    N   )
LpDistance)common_functions)loss_and_miner_utils   )	BaseMinerc                       s2   e Zd ZdZd	 fdd	Zdd Zdd Z  ZS )
AngularMinerz
    Returns triplets that form an angle greater than some threshold (angle).
    The angle is computed as defined in the angular loss paper:
    https://arxiv.org/abs/1708.01682
       c                    sX   t  jd	i | tj| tdddd t|| _| jdgdd | jg ddd d S )
Nr   r   T)ppowernormalize_embeddingsangleF)list_of_namesis_stat)average_angleaverage_angle_above_thresholdaverage_angle_below_threshold	min_angle	max_anglestd_of_angle )	super__init__c_fassert_distance_typer   npradiansr   add_to_recordable_attributes)selfr   kwargs	__class__r   `/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/miners/angular_miner.pyr      s   

zAngularMiner.__init__c                 C   s   t ||\}}}|| || || }}	}
||	 d }| j||	}| j|
|}t|d|  }|| jk}| || || || || fS )Nr   )lmuget_all_triplets_indicesdistancepairwise_distancetorchatanr   	set_stats)r   
embeddingslabelsref_emb
ref_labels
anchor_idxpositive_idxnegative_idxanchors	positives	negativescentersap_distnc_distanglesthreshold_conditionr   r   r"   mine$   s"   


zAngularMiner.minec                 C   s  | j rt o t|dkr:tt| | _tt	| | _
tt| | _tt| | _t|dkrNtt||  | _| }t|dkrntt||   | _W d    d S W d    d S 1 syw   Y  d S d S )Nr   )collect_statsr'   no_gradlenr   degreesmeanitemr   minr   maxr   stdr   sumr   r   )r   r7   r8   negated_conditionr   r   r"   r)   9   s(   
"zAngularMiner.set_stats)r	   )__name__
__module____qualname____doc__r   r9   r)   __classcell__r   r   r    r"   r   
   s
    r   )numpyr   r'   	distancesr   utilsr   r   r   r#   
base_minerr   r   r   r   r   r"   <module>   s    