o
    pi                     @   s(   d dl Z ddlmZ G dd deZdS )    N   )ModuleWithRecordsc                       s   e Zd Z	d fdd	Zddd	Zd
d Zdd Zdd Zdd Zdd Z	d ddZ
d ddZd ddZdd Zdd Z  ZS )!BaseDistanceTr      Fc                    sR   t  jdi | || _|| _|| _|| _| jddgdd | jg ddd d S )NppowerF)list_of_namesis_stat)initial_avg_query_norminitial_avg_ref_normfinal_avg_query_normfinal_avg_ref_normT )super__init__normalize_embeddingsr   r   is_invertedadd_to_recordable_attributes)selfr   r   r   r   kwargs	__class__r   c/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/distances/base_distance.pyr      s   
zBaseDistance.__init__Nc                 C   s   |    | || | |}|d u r|}|}n| |}| |||| | ||}| jdkr5|| j }| t|d|dfksHJ |S )Nr   r   )	reset_statscheck_shapesmaybe_normalizeset_default_statscompute_matr   sizetorchSize)r   	query_embref_embquery_emb_normalizedref_emb_normalizedmatr   r   r   forward   s   



&zBaseDistance.forwardc                 C      t NNotImplementedErrorr   r!   r"   r   r   r   r   ,      zBaseDistance.compute_matc                 C   r'   r(   r)   r+   r   r   r   pairwise_distance/   r,   zBaseDistance.pairwise_distancec                 O   &   | j rtj|i |S tj|i |S r(   )r   r   maxminr   argsr   r   r   r   smallest_dist2      zBaseDistance.smallest_distc                 O   r.   r(   )r   r   r0   r/   r1   r   r   r   largest_dist7   r4   zBaseDistance.largest_distc                 C   s   | j r|| S || S r(   )r   )r   xyr   r   r   margin=   s   zBaseDistance.marginc                 K   s   t jjj|f| j|d|S N)r   dim)r   nn
functional	normalizer   r   
embeddingsr:   r   r   r   r   r=   B   s   zBaseDistance.normalizec                 K   s    | j r| j|fd|i|S |S )Nr:   )r   r=   r>   r   r   r   r   E   s   zBaseDistance.maybe_normalizec                 K   s   t j|f| j|d|S r9   )r   normr   r>   r   r   r   get_normJ   s   zBaseDistance.get_normc                 C   s   | j rFt 5 t| | | _t| | | _t| | | _t| | | _	W d    d S 1 s?w   Y  d S d S r(   )
collect_statsr   no_gradmeanrA   itemr
   r   r   r   )r   r!   r"   r#   r$   r   r   r   r   M   s(   
"zBaseDistance.set_default_statsc                 C   s,   |j dks|d ur|j dkrtdd S d S )Nr   zDembeddings must be a 2D tensor of shape (batch_size, embedding_size))ndim
ValueErrorr+   r   r   r   r   ]   s
   zBaseDistance.check_shapes)Tr   r   Fr(   )r   )__name__
__module____qualname__r   r&   r   r-   r3   r5   r8   r=   r   rA   r   r   __classcell__r   r   r   r   r      s    



r   )r   utils.module_with_recordsr   r   r   r   r   r   <module>   s    