o
    zixc                     @   sh  d dl Z d dlZd dlZd dlmZmZmZ d dlmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlmZ d dlZd dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lm Z  d dl!m"Z"m#Z#m$Z$ d dl%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z< d dl=m>Z> G dd deZ?dS )    N)ChainMapOrderedDictdefaultdict)AnyDefaultDictIterableIteratorListOptionalTupleUnion)apply_to_collection)Tensor)_set_sampler_epoch)_RICH_AVAILABLE)_DataFetcher_DataLoaderIterDataFetcher)_Loop)_BatchProgress)_no_grad_context_select_data_fetcher"_verify_dataloader_idx_requirement)call)_check_dataloader_iterable_DataLoaderSource_parse_num_batches_process_dataloader_request_dataloader_resolve_overfit_batches)	_OUT_DICT_ResultCollection)RunningStage	TrainerFn)CombinedLoader)has_len_all_ranks)SIGTERMException)_ModuleModeis_overridden)is_param_in_hook_signaturec                       s6  e Zd ZdZ		dOdddedededed	d
f fddZed	e	fddZ
ed	eee	ef  fddZed	efddZed	efddZed	efddZed	ee fddZdPddZdPddZdPddZd	ee fdd ZdPd!d"Zd#ed$ed	d
fd%d&ZdPd'd(ZdPd)d*Zd#ed$ed	d
fd+d,Zd#ed$ed	d
fd-d.ZdPd/d0Z dPd1d2Z!dPd3d4Z"dPd5d6Z#d7ed8e	d9e	d:e$e% d	d
f
d;d<Z&d7ed8e	d9e$e	 d	e'fd=d>Z(d?e'd@e)d	e*fdAdBZ+dPdCdDZ,e-dEe.d	e/e0e)dFf  fdGdHZ1e-dEe.dIe/e) d	e$e fdJdKZ2e-dLee de)d	d
fdMdNZ3  Z4S )Q_EvaluationLoopz/Top-level loop where validation/testing starts.Ttrainerz
pl.Trainer
trainer_fnstageverboseinference_modereturnNc                    s   t  | || _|| _t | _g | _tdd| _g | _	d| _
|| _|| _td |j d| _d | _d | _tt| _td| _t | _d S )NF)training_dataloaderz-inf)super__init__r-   r.   r   batch_progress_max_batchesr    _results_logged_outputs_has_run_trainer_fn_stager   dataloader_prefix_data_source_combined_loader_data_fetcherr   int_seen_batches_per_dataloaderfloat_last_val_dl_reload_epochr&   _module_mode)selfr*   r+   r,   r-   r.   	__class__ [/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_lightning/loops/evaluation_loop.pyr3   3   s    

z_EvaluationLoop.__init__c                 C   s   | j }|dus	J t|jS )z-Returns the number of prediction dataloaders.N)r=   len	flattened)rD   combined_loaderrG   rG   rH   num_dataloadersM   s   
z_EvaluationLoop.num_dataloadersc                    s$    j } jjs	|S  fdd|D S )z0The max number of batches to run per dataloader.c                    s   g | ]	}t  jj|qS rG   )minr*   num_sanity_val_steps).0batchesrD   rG   rH   
<listcomp>Z       z/_EvaluationLoop.max_batches.<locals>.<listcomp>)r5   r*   sanity_checking)rD   max_batchesrG   rQ   rH   rU   T   s   z_EvaluationLoop.max_batchesc                 C   s   t | jdkS )z1Returns whether the evaluation should be skipped.r   )sumrU   rQ   rG   rG   rH   skip\   s   z_EvaluationLoop.skipc                 C   s"   | j j}t|o| j j| j |kS )z2Check if validation dataloader should be reloaded.)r*   !reload_dataloaders_every_n_epochsboolcurrent_epochrB   )rD   n_epochsrG   rG   rH   _should_reload_val_dla   s   z%_EvaluationLoop._should_reload_val_dlc                 C   s   | j d usJ | j jdkS )N
sequential)r=   _moderQ   rG   rG   rH   _is_sequentialg   s   z_EvaluationLoop._is_sequentialc                 C   s   |    | jr	g S |   |   | j}|d usJ d}	 zHz5t|tr2t|}|j}|j	}|j
}n	d }t|\}}}||krC|   |}|j| j_| |||| W n ty`   Y W d| _nw W d| _nd| _w q|   |  S )Nr   TF)
setup_datarW   reseton_run_startr>   
isinstancer   next_batch
_batch_idx_dataloader_idx_store_dataloader_outputsdoner4   is_last_batch_evaluation_stepStopIteration_restarting
on_run_end)rD   data_fetcherprevious_dataloader_idxdataloader_iterbatch	batch_idxdataloader_idxrG   rG   rH   runl   s>   

z_EvaluationLoop.runc                 C   s  | j }| j}| jd ur|tjkr| jsd S |j}|jr|jn|j	}|jr&dnd}|dks1t
||s3d S |tjkrH|jrA|jj sD|jsH|j| _| j}| j}t|}|j|j d t|tsgt|d}	n|}	|tjkrx|jdkrxt|	| g }|	jD ]}
t|
|| t||||
}
||
 q}||	_|	| _|j}|j d ur||j jO }g | _!|	jD ]'}
t"|
|j|rt#|
nt$d}t%|d|j d}t&|||}| j!| qt't(| _)d S )	N	test_stepvalidation_stepr   z_dataloader()r]   inflimit__batches)*r*   r9   r=   r"   FITTINGr\   lightning_moduletestinglimit_test_batcheslimit_val_batchesr'   rT   fit_loop
epoch_loop_should_check_val_epochrZ   rB   r:   r<   r   strategybarrierr;   rc   r#   overfit_batchesr   rJ   r   r   append2allow_zero_length_dataloader_with_multiple_devices
datamoduler5   r$   rI   rA   getattrr   r   r?   r@   )rD   r*   r+   	pl_modulelimit_batches	hook_namer,   sourcedataloadersrK   dlallow_zero_lengthlengthnum_batchesrG   rG   rH   r`      sV   






z_EvaluationLoop.setup_datac                 C   s   | j }d| _g | _| js| j  n| j  |jj}|dus!J |t	j
kr+| j  |jjdus3J t||jj}| j}|dusCJ |t	j
kr[t|jD ]\}}t||jjjj qM| j|_|| t| | j| jjj7  _| j|_| j|_|| _dS )z&Resets the internal state of the loop.FN) r*   r8   r7   
restartingr4   reset_on_runreset_on_restartstatefnr"   r{   r,   r   r=   	enumeraterJ   r   r   epoch_progresscurrent	processedrU   limitssetupiterfetchedready_on_before_fetch_start_profiler_on_after_fetch_stop_profilerr>   )rD   r*   r   ro   rK   ir   rG   rG   rH   ra      s0   





z_EvaluationLoop.resetc                 C   s$   |    |   |   |   dS )zrRuns the ``_on_evaluation_model_eval``, ``_on_evaluation_start`` and ``_on_evaluation_epoch_start``
        hooks.N)r   _on_evaluation_model_eval_on_evaluation_start_on_evaluation_epoch_startrQ   rG   rG   rH   rb      s   z_EvaluationLoop.on_run_startc                 C   s   | j j  | j j  |   | jg }| _| j j }tt| }|	| |D ]}|	| q*| j j
| |   |   | jrP| j jrP| || jj |S )z+Runs the ``_on_evaluation_epoch_end`` hook.)r*   _logger_connectorepoch_end_reached_evaluation_epoch_end_on_evaluation_epoch_endr7   update_eval_epoch_metricsdictr   updatelog_eval_end_metrics_on_evaluation_end_on_evaluation_model_trainr-   is_global_zero_print_resultsr:   value)rD   logged_outputsepoch_end_logged_outputsall_logged_outputs
dl_outputsrG   rG   rH   rn      s   
z_EvaluationLoop.on_run_endc                 C   s(   | j d ur| j   d | _ | j  d S N)r>   teardownr6   cpurQ   rG   rG   rH   r     s   

z_EvaluationLoop.teardownargskwargsc                 O   sf   | j }|jrdnd}tj||g|R i | tj||g|R i | tj||g|R i | dS )z*Runs ``on_{validation/test}_start`` hooks.on_test_starton_validation_startN)r*   r}   r   _call_callback_hooks_call_lightning_module_hook_call_strategy_hookrD   r   r   r*   r   rG   rG   rH   r     s
   z$_EvaluationLoop._on_evaluation_startc                 C   s2   | j }|jrdnd}| j|j t|| dS )zSets model to eval mode.on_test_model_evalon_validation_model_evalN)r*   r}   rC   capturer|   r   r   rD   r*   r   rG   rG   rH   r   %  s   z)_EvaluationLoop._on_evaluation_model_evalc                 C   sB   | j }|jrdnd}t||jrt|| dS | j|j dS )zUndoes the eval mode.on_test_model_trainon_validation_model_trainN)r*   r}   r'   r|   r   r   rC   restorer   rG   rG   rH   r   ,  s
   z*_EvaluationLoop._on_evaluation_model_trainc                 O   sp   | j }|jrdnd}tj||g|R i | tj||g|R i | tj||g|R i | |j  dS )z'Runs ``on_{validation/test}_end`` hook.on_test_endon_validation_endN)r*   r}   r   r   r   r   r   reset_resultsr   rG   rG   rH   r   5  s   z"_EvaluationLoop._on_evaluation_endc                 O   sL   | j }|jrdnd}tj||g|R i | tj||g|R i | dS )z4Runs the ``on_{validation/test}_epoch_start`` hooks.on_test_epoch_starton_validation_epoch_startN)r*   r}   r   r   r   r   rG   rG   rH   r   @  s   z*_EvaluationLoop._on_evaluation_epoch_startc                 C   s:   | j }|jrdnd}t|| t|| |j  dS )z-Runs ``on_{validation/test}_epoch_end`` hook.on_test_epoch_endon_validation_epoch_endN)r*   r}   r   r   r   r   on_epoch_endr   rG   rG   rH   r   H  s
   z(_EvaluationLoop._on_evaluation_epoch_endc                 C   s&   | j }|j  | j|j  d S r   )r*   r   r   r7   r   r   )rD   r*   rG   rG   rH   rh   R  s   
z)_EvaluationLoop._store_dataloader_outputsc                 C   *   | j jdt| j d| jj d d S N[z]._next)r*   profilerstarttype__name__r:   r;   rQ   rG   rG   rH   r   W  s   *z _EvaluationLoop._on_before_fetchc                 C   r   r   )r*   r   stopr   r   r:   r;   rQ   rG   rG   rH   r   Z  s   *z_EvaluationLoop._on_after_fetchrr   rs   rt   rq   c                 C   s  | j }| j}|dusJ t|t }s*|j|}|jj||d}tj	|d||d}| 
||| jr8| jdkr8|nd}| j  |j|| jrN| jdkrN|nd |jrVdnd}	tj||	g| R   tj||	g| R   | j  |jrzdnd}	|s| ||	n|f}
tj	||	g|
R  }| j  |r|j}|j}|j}| 
||| jr| jdkr|nd}|jrd	nd
}	tj||	|g| R   tj||	|g| R   |j  | j  |jsd| _|j| j |  | j |  d7  < | jj!s|j"rt#dS dS )a  Runs the actual evaluation step together with all the necessary bookkeeping and the hooks tied to it.

        Args:
            batch: The current batch to run through the step.
            batch_idx: The index of the current batch.
            dataloader_idx: the index of the dataloader producing the current batch.
            dataloader_iter: The iterator if using this step flavor.

        N)rt   batch_to_device   on_test_batch_starton_validation_batch_startrv   rw   on_test_batch_endon_validation_batch_endT)$r*   r>   rc   r   precision_pluginconvert_inputr|   _on_before_batch_transferr   r   _build_kwargsr_   rL   r4   increment_readyr   on_batch_startr}   r   valuesr   increment_started!_build_step_args_from_hook_kwargsincrement_processedre   rf   rg   on_batch_endincrement_completedrT   r8   update_eval_step_metricsr@   rj   received_sigtermr%   )rD   rr   rs   rt   rq   r*   ro   using_dataloader_iterhook_kwargsr   	step_argsoutputrG   rG   rH   rk   _  sX   




z _EvaluationLoop._evaluation_stepc                 C   s(   t d|fd|fg}|dur||d< |S )a  Helper method to build the arguments for the current step.

        Args:
            batch: the current batch to run through the step.
            batch_idx: the index of the current batch.
            dataloader_idx: the index of the dataloader producing the current batch. None if not multiple dataloaders
                in sequential mode.

        Returns:
            the dictionary containing all the keyboard arguments for the step

        rr   rs   Nrt   )r   )rD   rr   rs   rt   step_kwargsrG   rG   rH   r     s   z_EvaluationLoop._build_kwargsr   step_hook_namec                 C   s<   |  }t| jj|}t|ddds|dd t| S )zAHelper method to build args for `test_step` or `validation_step`.rs      )min_argsN)copyr   r*   r|   r(   poptupler   )rD   r   r   r   step_hook_fxrG   rG   rH   r     s
   z1_EvaluationLoop._build_step_args_from_hook_kwargsc                 C   s   | j }|jrdnd}|jrdnd}|jrdnd}t|f| jo)| jdko)t| jt | j|j	 t||f| jo:| jdk| j|j	 d S )Nrv   rw   r   r   r   r   r   )
r*   r}   r   r_   rL   rc   r>   r   r:   r|   )rD   r*   	step_hookbatch_start_hookbatch_end_hookrG   rG   rH   r     s&   z2_EvaluationLoop._verify_dataloader_idx_requirementdata.c                 c   sN    |   D ]\}}t|tr t|ttjD ]	}|g|R V  qq|fV  qd S r   )itemsrc   r   r   r)   	_get_keys)r   kvnew_keyrG   rG   rH   r    s   

z_EvaluationLoop._get_keystargetc                 C   s0   |^}}|| vr
d S | | }|s|S t ||S r   )r)   _find_value)r   r  target_startrestresultrG   rG   rH   r    s   z_EvaluationLoop._find_valueresultsc              	      sR  dd | D } dd t | ttjD }|sd S dd |D }ttt|| \}}dd tt| D }tj	ddj
p<d	}ttttt|td
tt|td
d|d dd |D }| D ]5}t||D ]-\}}	t||}
|
d urt|
tr|
 dkr|
 n|
 }
|	|
  qf|	d qfq_t|  tdt|D ] |  }fdd|D }|d| d  trddlm} ddlm m}  fdd|D }d|d _|| }t||D ]\}}	|	d| |j|	  q| }|| qd dt| }t|d }zt j!j"d ur&d#t j!j" W n t$y3   d}Y nw d}|| }||j%| & |g}t||D ]O\}}	t||krt||kr||d | }||d  }||j%|g|	R  &  t||ks[||%|d&  qI||j%|g|	R  &  qI|| tt'j()| qd S )Nc                 S   s   g | ]}d d |  D qS )c                 S   s    i | ]\}}| d d |qS )z/dataloader_idx_r   )split)rO   r  r  rG   rG   rH   
<dictcomp>  s     z=_EvaluationLoop._print_results.<locals>.<listcomp>.<dictcomp>)r  )rO   r
  rG   rG   rH   rR     s    z2_EvaluationLoop._print_results.<locals>.<listcomp>c                 S   s   h | ]	}|D ]}|qqS rG   rG   )rO   keysr  rG   rG   rH   	<setcomp>  rS   z1_EvaluationLoop._print_results.<locals>.<setcomp>c                 S   s   g | ]}d  |qS ):)join)rO   metricrG   rG   rH   rR         c                 S   s   g | ]}d | qS )zDataLoader rG   )rO   r   rG   rG   rH   rR     r  )x      )fallbackr  )key   r   c                 S   s   g | ]}g qS rG   rG   )rO   _rG   rG   rH   rR     s    r    r   c                    s   g | ]
}|    qS rG   rG   )rO   row)r   num_colsrG   rH   rR         z Metric)get_console)ColumnTablec                    s   g | ]
} |d ddqS )centermagenta)justifystylewidthrG   )rO   h)r  
max_lengthrG   rH   rR     r  cyanz{:^}u   ─-)*r   r   r)   r  zipsortedrangerI   shutilget_terminal_sizecolumnsr?   rM   maxr  rc   r   numelitemtolistr   insert
capitalizer   richr  
rich.tabler  r   r$  add_rowprintsysstdoutencodingencodeUnicodeEncodeErrorformatrstriposlinesepr  )r  r,   metrics_pathsmetrics_strsheaders	term_sizerowsr
  r  r  valtable_headers
table_rowsr  r   r0  tableconsole
row_formathalf_term_sizebar_characterbarlines
row_metricrG   )r  r   r'  r  rH   r     sv   2


 
z_EvaluationLoop._print_results)TT)r/   N)5r   
__module____qualname____doc__r"   r!   rY   r3   propertyr?   rL   r	   r   rA   rU   rW   r\   r_   r   r   ru   r`   ra   rb   rn   r   r   r   r   r   r   r   r   rh   r   r   r
   r   rk   r   r   strr   r   r   staticmethodr   r   r   r  r  r   __classcell__rG   rG   rE   rH   r)   0   s~    
#
8
'

	
	





M
  	$r)   )@rB  r.  r;  collectionsr   r   r   typingr   r   r   r   r	   r
   r   r   #lightning_utilities.core.apply_funcr   torchr   pytorch_lightningpllightning_fabric.utilities.datar   2pytorch_lightning.callbacks.progress.rich_progressr    pytorch_lightning.loops.fetchersr   r   pytorch_lightning.loops.loopr    pytorch_lightning.loops.progressr   !pytorch_lightning.loops.utilitiesr   r   r   pytorch_lightning.trainerr   3pytorch_lightning.trainer.connectors.data_connectorr   r   r   r   r   r   <pytorch_lightning.trainer.connectors.logger_connector.resultr   r     pytorch_lightning.trainer.statesr!   r"   +pytorch_lightning.utilities.combined_loaderr#    pytorch_lightning.utilities.datar$   &pytorch_lightning.utilities.exceptionsr%   )pytorch_lightning.utilities.model_helpersr&   r'   +pytorch_lightning.utilities.signature_utilsr(   r)   rG   rG   rG   rH   <module>   s0   ( 