o
    bi#                     @   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.
    COMET_DISABLE_AUTO_LOGGING1r   Nz1pip install 'comet-ml' to use CometLoggerCallback)osenvironcomet_mlImportErrorRuntimeError)r    r   N/home/ubuntu/.local/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'
                )]
        )

    )auto_output_logginglog_git_metadatalog_git_patchlog_env_cpulog_env_gpudoneshould_checkpoint)node_iphostnamepiddate)trial_idexperiment_id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)r1   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)r1   r6   r7   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 fromRay	callbacksr   )r   r   r=   r>   comet_ml.configr?   r'   r!   r%   set_namestradd_tagsr"   	log_otherconfigr)   poplog_parameters)r1   r<   r=   r>   r?   experiment_cls
experimentrG   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.
        training_iterationrG   rA   Nr9   )step)	delimiterc                 3       | ]	}  |V  qd S r$   r;   .0r7   kr1   r   r   	<genexpr>       z7CometLoggerCallback.log_trial_result.<locals>.<genexpr>c                 3   rR   r$   rS   rT   rV   r   r   rX      rY   c                 3   rR   r$   rS   rT   rV   r   r   rX      rY   c                 3   rR   r$   rS   rT   rV   r   r   rX      rY   )xyrP   )r'   rL   rH   r)   items
isinstancedictrI   r   log_parameteranyr*   r.   r,   r0   
log_otherslog_metricslog_system_info	log_curverangelen)r1   rM   r<   rN   rK   rP   config_updatev
other_logsmetric_logssystem_logsepisode_logsflat_resultr   rV   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 )Ncheckpoint_model)nameartifact_typez./   )logical_path)r   r#   
checkpointr'   ArtifactrD   r]   
filesystempyarrowfsLocalFileSystempathr
   walkrelpathr   as_posixr:   addlog_artifact)r1   r<   r   rK   artifactcheckpoint_rootrootdirsfilesrel_rootfile
local_filert   r   r   r   log_trial_save   s*   


z"CometLoggerCallback.log_trial_savefailedc                 C   s   | j |   | j |= d S r$   )r'   end)r1   r<   r   r   r   r   log_trial_end   s   z!CometLoggerCallback.log_trial_endc                 C   s&   | j  D ]\}}|  qi | _ d S r$   )r'   r\   r   )r1   r<   rK   r   r   r   __del__  s   

zCometLoggerCallback.__del__)TNF)r<   r   )F)__name__
__module____qualname____doc__r3   r(   r+   r-   r/   boolr   rD   r2   r&   r;   rL   intr   rn   r   r   r   r   r   r   r   r      s0    5	


1"r   )r
   pathlibr   typingr   r   
pyarrow.fsrx   ray.tune.experimentr   ray.tune.loggerr   ray.tune.utilsr   r   r   r   r   r   r   <module>   s    