o
    2h?                     @   sX   d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 edG dd deZ
dS )    N)keras_export)Callback)
file_utilszkeras.callbacks.CSVLoggerc                       s@   e Zd ZdZd fdd	ZdddZdd	d
ZdddZ  ZS )	CSVLoggeraC  Callback that streams epoch results to a CSV file.

    Supports all values that can be represented as a string,
    including 1D iterables such as `np.ndarray`.

    Args:
        filename: Filename of the CSV file, e.g. `'run/log.csv'`.
        separator: String used to separate elements in the CSV file.
        append: Boolean. True: append if file exists (useful for continuing
            training). False: overwrite existing file.

    Example:

    ```python
    csv_logger = CSVLogger('training.log')
    model.fit(X_train, Y_train, callbacks=[csv_logger])
    ```
    ,Fc                    s>   t    || _t|| _|| _d | _d | _d| _	d | _
d S )NT)super__init__sepr   path_to_stringfilenameappendwriterkeysappend_headercsv_file)selfr   	separatorr   	__class__ Y/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/callbacks/csv_logger.pyr       s   

zCSVLogger.__init__Nc                 C   s   | j r-t| jr*t| jd}tt|  | _W d    n1 s%w   Y  d}nd}| j	r;| j	j
s;| j	  t| j|| _	d | _d | _d S )Nraw)r   r   existsr   Fileboollenreadliner   r   closedcloser   r   )r   logsfmoder   r   r   on_train_begin*   s   

zCSVLogger.on_train_beginc                    s   pi dd  j d u r6t  _ d}j D ]}|dr$d} nq|s6j r6j dd j D  js^G fdd	d	tj}d
gj pJg  }tjj||d_j	r^j
  td
|i}| fddj D  j| j  d S )Nc                 S   sR   t | tjo
| jdk}t | tr| S t | tjjr'|s'ddt	t|  dS | S )Nr   z"[z, z]")

isinstancenpndarrayndimstrcollectionsabcIterablejoinmap)kis_zero_dim_ndarrayr   r   r   handle_value=   s   
z,CSVLogger.on_epoch_end.<locals>.handle_valueFval_Tc                 S   s   g | ]}d | qS )r2   r   ).0r/   r   r   r   
<listcomp>R   s    z*CSVLogger.on_epoch_end.<locals>.<listcomp>c                       s   e Zd Z jZdS )z-CSVLogger.on_epoch_end.<locals>.CustomDialectN)__name__
__module____qualname__r	   	delimiterr   )r   r   r   CustomDialectV   s    
r9   epoch)
fieldnamesdialectc                 3   s$    | ]}|  |d fV  qdS )NAN)get)r3   key)r1   r!   r   r   	<genexpr>b   s    
z)CSVLogger.on_epoch_end.<locals>.<genexpr>)r   sorted
startswithextendr   csvexcel
DictWriterr   r   writeheaderr*   OrderedDictupdatewriterowflush)r   r:   r!   val_keys_foundr?   r9   r;   row_dictr   )r1   r!   r   r   on_epoch_end:   s4   




zCSVLogger.on_epoch_endc                 C   s"   | j r| j js| j   d | _d S N)r   r   r    r   )r   r!   r   r   r   on_train_endh   s   

zCSVLogger.on_train_end)r   FrO   )	r5   r6   r7   __doc__r   r$   rN   rP   __classcell__r   r   r   r   r      s    


.r   )r*   rD   numpyr&   keras.src.api_exportr   keras.src.callbacks.callbackr   keras.src.utilsr   r   r   r   r   r   <module>   s    