o
    ziC%                     @   s   d dl Z d dlZd dl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 d dlmZ d dlmZmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ eeZG dd deZ G dd dZ!dS )    N)	Namespace)AnyDictListOptionalSetUnion)Tensor)override)Loggerrank_zero_experiment)_is_dirget_filesystem)_add_prefix)rank_zero_onlyrank_zero_warn)_PATHc                       sd  e Zd ZdZdZ				d(dedee d	eee	ef  d
ede	f
 fddZ
eedefddZeedee	ef fddZeedefddZeedefddZeed)ddZeedeeeef ef ddfddZee	d*deeeeef f dee	 ddfdd Zeed+ fd!d"Zeed#eddfd$d%Zde	fd&d'Z  ZS ),	CSVLoggerah  Log to the local file system in CSV format.

    Logs are saved to ``os.path.join(root_dir, name, version)``.

    Args:
        root_dir: The root directory in which all your experiments with different names and versions will be stored.
        name: Experiment name. Defaults to ``'lightning_logs'``. If name is ``None``, logs
            (versions) will be stored to the save dir directly.
        version: Experiment version. If version is not specified the logger inspects the save
            directory for existing versions, then automatically assigns the next available version.
            If the version is specified, and the directory already contains a metrics file for that version, it will be
            overwritten.
        prefix: A string to put at the beginning of metric keys.
        flush_logs_every_n_steps: How often to flush logs to disk (defaults to every 100 steps).

    Example::

        from lightning_fabric.loggers import CSVLogger

        logger = CSVLogger("path/to/logs/root", name="my_model")
        logger.log_metrics({"loss": 0.235, "acc": 0.75})
        logger.finalize("success")

    -lightning_logsN d   root_dirnameversionprefixflush_logs_every_n_stepsc                    sJ   t    t|}|| _|pd| _|| _|| _t|| _	d | _
|| _d S )Nr   )super__init__osfspath	_root_dir_name_version_prefixr   _fs_experiment_flush_logs_every_n_steps)selfr   r   r   r   r   	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/lightning_fabric/loggers/csv_logs.pyr   =   s   




zCSVLogger.__init__returnc                 C      | j S )zdGets the name of the experiment.

        Returns:
            The name of the experiment.

        )r"   r(   r+   r+   r,   r   O   s   	zCSVLogger.namec                 C   s   | j du r
|  | _ | j S )zGets the version of the experiment.

        Returns:
            The version of the experiment if it is specified, else the next version.

        N)r#   _get_next_versionr/   r+   r+   r,   r   Z   s   
	
zCSVLogger.versionc                 C   r.   )zFGets the save directory where the versioned CSV experiments are saved.)r!   r/   r+   r+   r,   r   g   s   zCSVLogger.root_dirc                 C   s2   t | jtr	| jnd| j }tj| j| j|S )zThe log directory for this run.

        By default, it is named ``'version_${self.version}'`` but it can be overridden by passing a string value for the
        constructor's version parameter instead of ``None`` or an int.

        version_)
isinstancer   strr   pathjoinr!   r   )r(   r   r+   r+   r,   log_dirm   s   
zCSVLogger.log_dir_ExperimentWriterc                 C   s4   | j dur| j S tj| jdd t| jd| _ | j S )zActual ExperimentWriter object. To use ExperimentWriter features anywhere in your code, do the following.

        Example::

            self.logger.experiment.some_experiment_writer_function()

        NTexist_ok)r6   )r&   r   makedirsr!   r7   r6   r/   r+   r+   r,   
experimentz   s
   

zCSVLogger.experimentparamsc                 C   s   t d)Nz=The `CSVLogger` does not yet support logging hyperparameters.)NotImplementedError)r(   r<   r+   r+   r,   log_hyperparams   s   zCSVLogger.log_hyperparamsmetricsstepc                 C   sT   t || j| j}|d u rt| jj}| j|| |d | j dkr(|   d S d S )N   r   )	r   r$   LOGGER_JOIN_CHARlenr;   r?   log_metricsr'   save)r(   r?   r@   r+   r+   r,   rD      s   zCSVLogger.log_metricsc                    s   t    | j  d S N)r   rE   r;   r/   r)   r+   r,   rE      s   
zCSVLogger.savestatusc                 C   s   | j d u rd S |   d S rF   )r&   rE   )r(   rG   r+   r+   r,   finalize   s   
zCSVLogger.finalizec                 C   s   t j| j| j}t| j|ddsdS g }| j|D ])}|d }t j|}t| j|rD|	drD|
dd }| rD|t| qt|dkrMdS t|d S )NT)strictr   r   r1   _rA   )r   r4   r5   r!   r   r   r%   listdirbasename
startswithsplitisdigitappendintrC   max)r(   versions_rootexisting_versionsd	full_pathr   dir_verr+   r+   r,   r0      s   zCSVLogger._get_next_version)r   Nr   r   )r-   r7   rF   r-   N)__name__
__module____qualname____doc__rB   r   r   r3   r   rQ   r   propertyr
   r   r   r   r6   r   r;   r   r   r   r   r>   r	   floatrD   rE   rH   r0   __classcell__r+   r+   r)   r,   r   !   sj    	&
r   c                   @   s   e Zd ZdZdZdeddfddZddeeef d	e	e
 ddfd
dZdddZdee fddZdee ddfddZdddZdS )r7   zdExperiment writer for CSVLogger.

    Args:
        log_dir: Directory for the experiment logs

    zmetrics.csvr6   r-   Nc                 C   sN   g | _ g | _t|| _|| _tj| j| j| _	| 
  | jj| jdd d S )NTr8   )r?   metrics_keysr   r%   r6   r   r4   r5   NAME_METRICS_FILEmetrics_file_path_check_log_dir_existsr:   )r(   r6   r+   r+   r,   r      s   
z_ExperimentWriter.__init__metrics_dictr@   c                    sZ   dt ttf dtfdd |du rt| j} fdd| D }||d< | j| dS )	zRecord metrics.valuer-   c                 S   s   t | tr	|  S | S rF   )r2   r	   item)re   r+   r+   r,   _handle_value   s   
z4_ExperimentWriter.log_metrics.<locals>._handle_valueNc                    s   i | ]	\}}| |qS r+   r+   ).0kvrg   r+   r,   
<dictcomp>   s    z1_ExperimentWriter.log_metrics.<locals>.<dictcomp>r@   )r   r	   r   rC   r?   itemsrP   )r(   rd   r@   r?   r+   rk   r,   rD      s   
z_ExperimentWriter.log_metricsc                 C   s   | j sdS |  }| j| j}|r|r| | j | jj| j|r#dnddd}tj	|| jd}|s7|
  || j  W d   n1 sGw   Y  g | _ dS )z!Save recorded metrics into files.Nawr   )modenewline
fieldnames)r?   _record_new_keysr%   isfilerb   _rewrite_with_new_headerr`   opencsv
DictWriterwriteheader	writerows)r(   new_keysfile_existsfilewriterr+   r+   r,   rE      s   
z_ExperimentWriter.savec                 C   s6   t  j| j }|t | j }| j| | j  |S )z2Records new keys that have not been logged before.)setunionr?   r`   extendsort)r(   current_keysr|   r+   r+   r,   rt      s
   
z"_ExperimentWriter._record_new_keysrs   c                 C   s   | j j| jddd}tt|}W d    n1 sw   Y  | j j| jddd}tj||d}|  || W d    d S 1 sGw   Y  d S )Nrr   )rq   ro   rr   )	r%   rw   rb   listrx   
DictReaderry   rz   r{   )r(   rs   r~   r?   r   r+   r+   r,   rv     s   "z*_ExperimentWriter._rewrite_with_new_headerc                 C   sZ   | j | jr'| j | jr)td| j d | j | jr+| j | j d S d S d S d S )NzExperiment logs directory zk exists and is not empty. Previous log files in this directory will be deleted when the new ones are saved!)r%   existsr6   rK   r   ru   rb   rm_filer/   r+   r+   r,   rc   
  s   z'_ExperimentWriter._check_log_dir_existsrF   rX   )rY   rZ   r[   r\   ra   r3   r   r   r^   r   rQ   rD   rE   r   rt   r   rv   rc   r+   r+   r+   r,   r7      s    $
	r7   )"rx   loggingr   argparser   typingr   r   r   r   r   r   torchr	   typing_extensionsr
   lightning_fabric.loggers.loggerr   r   #lightning_fabric.utilities.cloud_ior   r   !lightning_fabric.utilities.loggerr   $lightning_fabric.utilities.rank_zeror   r    lightning_fabric.utilities.typesr   	getLoggerrY   logr   r7   r+   r+   r+   r,   <module>   s     
  