o
    pi0                     @   sR   d dl mZ d dlZd dlZddlmZ ddlmZ ddlm	Z	 G dd dZ
dS )	    )defaultdictN   )common_functions)	inference)AccuracyCalculatorc                   @   s   e Zd Z															d1ddZd	d
 Zdd Zdd Zdd Zdd Z				d2ddZ	dd Z
dd Zdd Zdd Zd3d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			d4d/d0ZdS )5
BaseTesterTF    r   Nr   c                 C   s   || _ |r	t|nd | _|| _t|| _|d u rt n|| _|| _|| _	|d u r,tj
n|| _|	| _|
| _|| _|| _|| _|| _|| _|   |   i | _d S N)normalize_embeddingsintpcause_trunk_output
batch_sizec_fuse_cuda_if_availabledata_devicedtypedataloader_num_workersreturn_inputdata_and_label_getterlabel_hierarchy_levelend_of_testing_hookdataset_labelsset_min_label_to_zeroaccuracy_calculator
visualizeroriginal_visualizer_hookinitialize_label_mapperinitialize_accuracy_calculatorreference_split_names)selfr
   r   r   r   r   r   r   r   r   r   r   r   r   r   visualizer_hook r"   _/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_metric_learning/testers/base_tester.py__init__   s(   

zBaseTester.__init__c                 C   s   t | j| jj| _d S r	   )r   LabelMapperr   r   maplabel_mapperr    r"   r"   r#   r   5   s
   z"BaseTester.initialize_label_mapperc                 C   s   | j d u rt | _ d S d S r	   )r   r   r(   r"   r"   r#   r   :   s   
z)BaseTester.initialize_accuracy_calculatorc                 O   s"   | j d ur| j |i | d S d S r	   )r   )r    argskwargsr"   r"   r#   r!   >   s   
zBaseTester.visualizer_hookc                 C   s6   | j rt|}t|| j }| jrtjj	|}|S r	   )
r   r   torch_standard_scalerr   run_pcar
   torchnn
functional	normalize)r    
embeddingsfor_pcar"   r"   r#   maybe_normalizeB   s   
zBaseTester.maybe_normalizec                 C   s  d\}}t  s tt|D ]`\}}| |\}}	t|	d| j}	| |||}
|		 dkr5|	
d}	|dkr[t jt|j|	d| j|	jd}t jt|j|
d| j|
jd}||
d }|
|||< |	|||< |}qW d    ||fS 1 s~w   Y  ||fS )N)r   r   all   r   devicer   )r-   no_grad	enumeratetqdmr   r   process_labelr'   get_embeddings_for_evaldim	unsqueezezeroslendatasetsizer   r   )r    
dataloadertrunk_modelembedder_modelseidataimglabelqlabelsall_qr"   r"   r#   compute_all_embeddingsJ   s<   


z!BaseTester.compute_all_embeddingsc           
      C   sz   |d u r	t j }|r|  |  t|| j| j|}| |||\}}	| 	|}|r9|
  |	
  fS ||	fS r	   )r-   r.   Identityevalr   get_eval_dataloaderr   r   rO   r3   cpunumpy)
r    rA   rD   rE   
collate_fnrQ   return_as_numpyrC   r1   rM   r"   r"   r#   get_all_embeddingsf   s   	

zBaseTester.get_all_embeddingsc                 C   s.   t j|| j| jd}||}| jr|S ||S )Nr6   )r   	to_devicer   r   r   )r    rD   rE   
input_imgstrunk_outputr"   r"   r#   r<      s   
z"BaseTester.get_embeddings_for_evalc              
   C   s   | j rV| j jj}| D ]K\}\}}tjd|| | j |	 
 }tjd| | |D ] }|d d |f 	 
 }	| j||d}
| | j ||	||
| q4qd S d S )NzRunning {} on the {} setzFinished {}r   )r   	__class____name__itemsr   LOGGERinfoformatfit_transformrS   rT   label_levels_to_evaluateaccuracies_keynamer!   )r    embeddings_and_labelsepochvisualizer_name
split_namer1   rM   dim_reducedLlabel_schemekeynamer"   r"   r#   maybe_visualize   s0   

zBaseTester.maybe_visualizec                 C   sv   | j r
|d| j  7 }| jr|d7 }| jr|d7 }|d| jj 7 }|d| | j 7 }| j }|dkr9|d| 7 }|S )Nz_pca%d_normalized_trunk__level_ )	r   r
   r   r\   r]   label_hierarchy_level_to_strr   r   description)r    	base_nameaccuracy_calculator_descriptorr"   r"   r#   description_suffixes   s   
zBaseTester.description_suffixesc                 C   s&   t |rddd |D S t|S )Nrp   c                 s   s    | ]}t |V  qd S r	   )str).0xr"   r"   r#   	<genexpr>   s    z:BaseTester.label_hierarchy_level_to_str.<locals>.<genexpr>)r   is_list_or_tuplejoinrx   )r    r   r"   r"   r#   rs      s   
z'BaseTester.label_hierarchy_level_to_strc                 C   sH   |rd| S |dkst |rt| jdkr| jd }d|| |f S )Nz
AVERAGE_%sr4   r5   r   z
%s_level%s)r   r|   r@   label_levelsrs   )r    metricr   averager"   r"   r#   rd      s   
zBaseTester.accuracies_keynamec                    sN    fdd|D }t tt |  \}}tj|dd}tj|dd}||fS )Nc                    s   i | ]}| | qS r"   r"   )ry   splitre   r"   r#   
<dictcomp>       z3BaseTester.maybe_combine_splits.<locals>.<dictcomp>r   )r=   )listzipvaluesr-   cat)r    re   splits
to_combineeeelllcurr_embeddingscurr_labelsr"   r   r#   maybe_combine_splits   s
   zBaseTester.maybe_combine_splitsc                 C   s(   || \}}|  ||\}}||||fS r	   )r   )r    re   query_split_namer   query_embeddingsquery_labelsreference_embeddingsreference_labelsr"   r"   r#   set_reference_and_query   s
   z"BaseTester.set_reference_and_queryc                 C   sf   |j d }| jdkrt|S t| jtr| j|k sJ | jgS t| jr1t| j|k s.J | jS d S )Nr5   r4   )shaper   range
isinstancer   r   r|   max)r    r   num_levels_availabler"   r"   r#   rc      s   

z#BaseTester.label_levels_to_evaluatec           	      C   sT   |D ]%}| j |dd}d}|D ]}| j ||d}||| 7 }q|t| ||< qd S )NT)r   r   r[   )rd   r@   )	r    
accuraciesmetricsr~   mrl   summed_accuracyrj   curr_keyr"   r"   r#   calculate_average_accuracies   s   z'BaseTester.calculate_average_accuraciesc                 C   s   |d u rdd |D }dd |D }t |t t|ks J dt }t|D ] \}\}}|||g  ||v rG|| ||g| f||< q'|t|fS )Nc                 S   s   g | ]}||gfqS r"   r"   )ry   kr"   r"   r#   
<listcomp>   r   z?BaseTester.get_splits_to_compute_embeddings.<locals>.<listcomp>c                 S   s   g | ]}|d  qS )r   r"   )ry   tr"   r"   r#   r      s    z4Unsupported: Evaluating a query split more than once)r@   setr9   updateremover   )r    dataset_dictsplits_to_evalquery_splitssplits_to_compute_embeddingsrH   query_splitreference_splitsr"   r"   r#    get_splits_to_compute_embeddings   s    
z+BaseTester.get_splits_to_compute_embeddingsc                 C   s:   i }|D ]}t jd|  | || |||||< q|S )Nz#Getting embeddings for the %s split)r   r_   r`   rW   )r    r   rD   rE   r   rU   re   rh   r"   r"   r#   !get_all_embeddings_for_all_splits   s   
z,BaseTester.get_all_embeddings_for_all_splitsc                 C   s   t r	   )NotImplementedError)r    r   re   r   r   r"   r"   r#   do_knn_and_accuracies  s   z BaseTester.do_knn_and_accuraciesc                 C   s   ||v S r	   r"   )r    r   r   r"   r"   r#   ref_includes_query  s   zBaseTester.ref_includes_queryc           
      C   s   t jd| |d u rtj }|  |  | ||\}}| 	|||||| _
| | j
| tt| _|D ](\}}	t jd| d|	  || j| d< |	| j|< | | j| | j
||	 q:| jrk| | nt j| j | `
| jS  | `
| jS )NzEvaluating epoch {}zComputing accuracy for the z split w.r.t rf   )r   r_   r`   ra   r-   r.   rP   rQ   r   r   re   rm   r   dictall_accuraciesr   r   r   )
r    r   rf   rD   rE   r   rU   r   r   r   r"   r"   r#   test  sL   	



zBaseTester.test)TFr   r   NNNNr   NNFNNN)NNTF)r   F)NNN)r]   
__module____qualname__r$   r   r   r!   r3   rO   rW   r<   rm   rw   rs   rd   r   r   rc   r   r   r   r   r   r   r"   r"   r"   r#   r      sX    
) 
	
		r   )collectionsr   r-   r:   utilsr   r   r   utils.accuracy_calculatorr   r   r"   r"   r"   r#   <module>   s    