a
    d                     @   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
 d dl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Union)Tensor)Loggerrank_zero_experiment)_add_prefix)rank_zero_onlyrank_zero_warn)_PATHc                       s.  e Zd ZdZdZd#eeeee	ef  ee	d fdd	Z
eed
ddZeee	ef d
ddZeed
ddZeed
ddZeedd
ddZeeeeef ef ddddZed$eeeeef f ee	 ddddZedd
 fddZeedddd Ze	d
d!d"Z  ZS )%	CSVLoggera  
    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'``.
        version: Experiment version. If version is not specified the logger inspects the save
            directory for existing versions, then automatically assigns the next available version.
        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                    s<   t    t|| _|pd| _|| _|| _d | _|| _	d S )Nr   )
super__init__osfspath	_root_dir_name_version_prefix_experiment_flush_logs_every_n_steps)selfr   r   r   r   r   	__class__ j/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lightning_fabric/loggers/csv_logs.pyr   8   s    

zCSVLogger.__init__returnc                 C   s   | j S )zcGets the name of the experiment.

        Returns:
            The name of the experiment.
        )r   r#   r&   r&   r'   r   H   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   Q   s    

zCSVLogger.versionc                 C   s   | j S )zFGets the save directory where the versioned CSV experiments are saved.)r   r*   r&   r&   r'   r   \   s    zCSVLogger.root_dirc                 C   s6   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   log_dirr&   r&   r'   r1   a   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)r1   )r!   r   makedirsr   r2   r1   r*   r&   r&   r'   
experimentm   s
    

zCSVLogger.experiment)paramsr)   c                 C   s   t dd S )Nz=The `CSVLogger` does not yet support logging hyperparameters.)NotImplementedError)r#   r7   r&   r&   r'   log_hyperparams~   s    zCSVLogger.log_hyperparams)metricsstepr)   c                 C   sD   t || j| j}| j|| |d ur@|d | j dkr@|   d S )N   r   )r   r    LOGGER_JOIN_CHARr6   log_metricsr"   save)r#   r:   r;   r&   r&   r'   r>      s    zCSVLogger.log_metricsc                    s   t    | j  d S N)r   r?   r6   r*   r$   r&   r'   r?      s    
zCSVLogger.save)statusr)   c                 C   s   | j d u rd S |   d S r@   )r!   r?   )r#   rA   r&   r&   r'   finalize   s    
zCSVLogger.finalizec                 C   s   | j }tj|s"td| dS g }t|D ]<}tjtj||r0|dr0|	t
|dd  q0t|dkr~dS t|d S )NzMissing logger folder: %sr   r,   _r<   )r   r   r/   isdirlogwarninglistdirr0   
startswithappendintsplitlenmax)r#   r   Zexisting_versionsdr&   r&   r'   r+      s     zCSVLogger._get_next_version)r   Nr   r   )N)__name__
__module____qualname____doc__r=   r   r.   r   r   rJ   r   propertyr   r   r   r1   r
   r6   r   r   r   r   r9   r   floatr>   r?   rB   r+   __classcell__r&   r&   r$   r'   r      sB       
"*r   c                   @   sR   e Zd ZdZdZeddddZdeeef e	e
 dddd	Zdd
ddZdS )r2   zh
    Experiment writer for CSVLogger.

    Args:
        log_dir: Directory for the experiment logs
    zmetrics.csvN)r1   r)   c                 C   s`   g | _ || _tj| jr8t| jr8td| j d tj| jdd tj| j| j	| _
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!Tr3   )r:   r1   r   r/   existsrG   r   r5   r0   NAME_METRICS_FILEmetrics_file_path)r#   r1   r&   r&   r'   r      s    z_ExperimentWriter.__init__)metrics_dictr;   r)   c                    sX   t ttf td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 r@   )r-   r   item)rZ   r&   r&   r'   _handle_value   s    
z4_ExperimentWriter.log_metrics.<locals>._handle_valueNc                    s   i | ]\}}| |qS r&   r&   ).0kvr\   r&   r'   
<dictcomp>       z1_ExperimentWriter.log_metrics.<locals>.<dictcomp>r;   )r   r   r   rL   r:   itemsrI   )r#   rY   r;   r:   r&   r`   r'   r>      s    
z_ExperimentWriter.log_metricsr(   c                 C   s   | j s
dS i }| j D ]}|| qt| }t| jddd2}tj||d}|  |	| j  W d   n1 sx0    Y  dS )z!Save recorded metrics into files.Nwr   )newline)
fieldnames)
r:   updatelistkeysopenrX   csv
DictWriterwriteheader	writerows)r#   Zlast_mmZmetrics_keysfwriterr&   r&   r'   r?      s    
z_ExperimentWriter.save)N)rO   rP   rQ   rR   rW   r.   r   r   rT   r   rJ   r>   r?   r&   r&   r&   r'   r2      s
    r2   )rk   loggingr   argparser   typingr   r   r   r   r   Ztorchr   Zlightning_fabric.loggers.loggerr	   r
   Z!lightning_fabric.utilities.loggerr   Z$lightning_fabric.utilities.rank_zeror   r   Z lightning_fabric.utilities.typesr   	getLoggerrO   rE   r   r2   r&   r&   r&   r'   <module>   s   
 
