o
    1 i#                     @   sl   d dl Z d dlmZ d dlmZmZ d dlZd dlm	Z	 d dl
mZ d dlmZ dd ZG d	d
 d
eZdS )    N)Path)DictList)Trial)LoggerCallback)flatten_dictc                  C   s:   dt jvr
dt jd< zddl} W | S  ty   tdw )zTry importing comet_ml.

    Used to check if comet_ml is installed and, otherwise, pass an informative
    error message.
    ZCOMET_DISABLE_AUTO_LOGGING1r   Nz1pip install 'comet-ml' to use CometLoggerCallback)osenvironcomet_mlImportErrorRuntimeError)r    r   f/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/ray/air/integrations/comet.py_import_comet   s   


r   c                   @   s   e Zd ZdZg dZddgZg dZg dZddgZ			
	d'de	de
e de	fddZdd Zdedede	fddZd(ddZdedddefddZd(d d!Zd)ddd"e	fd#d$Zd%d& Zd
S )*CometLoggerCallbacka  CometLoggerCallback for logging Tune results to Comet.

    Comet (https://comet.ml/site/) is a tool to manage and optimize the
    entire ML lifecycle, from experiment tracking, model optimization
    and dataset versioning to model production monitoring.

    This Ray Tune ``LoggerCallback`` sends metrics and parameters to
    Comet for tracking.

    In order to use the CometLoggerCallback you must first install Comet
    via ``pip install comet_ml``

    Then set the following environment variables
    ``export COMET_API_KEY=<Your API Key>``

    Alternatively, you can also pass in your API Key as an argument to the
    CometLoggerCallback constructor.

    ``CometLoggerCallback(api_key=<Your API Key>)``

    Args:
            online: Whether to make use of an Online or
                Offline Experiment. Defaults to True.
            tags: Tags to add to the logged Experiment.
                Defaults to None.
            save_checkpoints: If ``True``, model checkpoints will be saved to
                Comet ML as artifacts. Defaults to ``False``.
            **experiment_kwargs: Other keyword arguments will be passed to the
                constructor for comet_ml.Experiment (or OfflineExperiment if
                online=False).

    Please consult the Comet ML documentation for more information on the
    Experiment and OfflineExperiment classes: https://comet.ml/site/

    Example:

    .. code-block:: python

        from ray.air.integrations.comet import CometLoggerCallback
        tune.run(
            train,
            config=config
            callbacks=[CometLoggerCallback(
                True,
                ['tag1', 'tag2'],
                workspace='my_workspace',
                project_name='my_project_name'
                )]
        )

    )Zauto_output_loggingZlog_git_metadataZlog_git_patchZlog_env_cpuZlog_env_gpudoneZshould_checkpoint)Znode_iphostnamepiddate)Ztrial_idZexperiment_idZexperiment_tagzhist_stats/episode_rewardzhist_stats/episode_lengthsTNFonlinetagssave_checkpointsc                 K   s`   t   || _|| _|| _|| _|   i | _| j | _	| j
 | _| j | _| j | _d S N)r   r   r   r   experiment_kwargs_configure_experiment_defaults_trial_experiments_exclude_resultscopy_to_exclude_system_results
_to_system_other_results	_to_other_episode_results_to_episodes)selfr   r   r   r   r   r   r   __init__f   s   zCometLoggerCallback.__init__c                 C   s&   | j D ]}| j|sd| j|< qdS )z@Disable the specific autologging features that cause throttling.FN)_exclude_autologr   get)r&   optionr   r   r   r   ~   s
   

z2CometLoggerCallback._configure_experiment_defaultskeyitemreturnc                 C   s   | |d p
||kS )z
        Check if key argument is equal to item argument or starts with item and
        a forward slash. Used for parsing trial result dictionary into ignored
        keys, system metrics, episode logs, etc.
        /)
startswith)r&   r+   r,   r   r   r   _check_key_name   s   z#CometLoggerCallback._check_key_nametrialr   c                 C   s   t   ddlm}m} ddlm} || jvr/| jr|n|}|di | j}|| j|< |d n| j| }|	t
| || j |dd |j }|dd || dS )	z
        Initialize an Experiment (or OfflineExperiment if self.online=False)
        and start logging to Comet.

        Args:
            trial: Trial object.

        r   )
ExperimentOfflineExperiment)set_global_experimentNzCreated fromZRay	callbacksr   )r   r   r2   r3   Zcomet_ml.configr4   r   r   r   set_namestrZadd_tagsr   Z	log_otherconfigr   poplog_parameters)r&   r1   r2   r3   r4   Zexperiment_cls
experimentr8   r   r   r   log_trial_start   s   	




z#CometLoggerCallback.log_trial_start	iterationresultc                    s  |j vr
| j | }|d }|di  }|dd | D ]\ }t|tr;|jt |id|d q%|j	 ||d q%i }i }	i }
i }t|dd}| D ]L\ }t
 fdd	jD rhqVt
 fd
d	jD rz|| < qVt
 fdd	jD r||
 < qVt
 fdd	jD r|| < qV||	 < qV|| |j|	|d |
 D ]
\ }| | q| D ]\ }|j tt|||d qdS )zH
        Log the current result of a Trial upon each iteration.
        Ztraining_iterationr8   r5   Nr.   )step)	delimiterc                 3       | ]	}  |V  qd S r   r0   .0r,   kr&   r   r   	<genexpr>       z7CometLoggerCallback.log_trial_result.<locals>.<genexpr>c                 3   rA   r   rB   rC   rE   r   r   rG      rH   c                 3   rA   r   rB   rC   rE   r   r   rG      rH   c                 3   rA   r   rB   rC   rE   r   r   rG      rH   )xyr?   )r   r<   r9   r   items
isinstancedictr:   r   Zlog_parameteranyr   r#   r!   r%   Z
log_othersZlog_metricsZlog_system_infoZ	log_curverangelen)r&   r=   r1   r>   r;   r?   Zconfig_updatevZ
other_logsZmetric_logsZsystem_logsZepisode_logsZflat_resultr   rE   r   log_trial_result   s@   








z$CometLoggerCallback.log_trial_resultc                 C   s   t  }| jrj|jrl| j| }|jdt| dd}d }t|jjtj	j
r)|jj}|rct|D ]2\}}}tj||}	|D ]#}
t||	|
 }t|	|
 }|drZ|dd  }|j||d q>q0|| d S d S d S )NZcheckpoint_model)nameZartifact_typez./   )logical_path)r   r   
checkpointr   ZArtifactr7   rL   
filesystempyarrowfsZLocalFileSystempathr	   walkrelpathr   as_posixr/   addZlog_artifact)r&   r1   r   r;   artifactZcheckpoint_rootrootdirsfilesZrel_rootfile
local_filerV   r   r   r   log_trial_save   s*   


z"CometLoggerCallback.log_trial_savefailedc                 C   s   | j |   | j |= d S r   )r   end)r&   r1   rg   r   r   r   log_trial_end   s   z!CometLoggerCallback.log_trial_endc                 C   s&   | j  D ]\}}|  qi | _ d S r   )r   rK   rh   )r&   r1   r;   r   r   r   __del__  s   

zCometLoggerCallback.__del__)TNF)r1   r   )F)__name__
__module____qualname____doc__r(   r   r    r"   r$   boolr   r7   r'   r   r0   r<   intr   rR   rf   ri   rj   r   r   r   r   r      s0    5	


1"r   )r	   pathlibr   typingr   r   Z
pyarrow.fsrY   Zray.tune.experimentr   Zray.tune.loggerr   Zray.tune.utilsr   r   r   r   r   r   r   <module>   s    