o
    b¦µiz&  ã                   @   s„   d dl Zd dlmZ d dlmZ d dlmZ d dlmZ d dlm	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)Úbackend)Útree)Úutils)Úkeras_export)ÚCallback)ÚHistory)ÚProgbarLogger)Úpython_utilszkeras.callbacks.CallbackListc                       s2  e Zd ZdZ				d>dd„Zdd„ Zdd	„ Zd
d„ Z‡ fdd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zd?dd„Zd?dd„Zd?dd„Zd?dd„Zd?dd„Zd?d d!„Zd?d"d#„Zd?d$d%„Zd?d&d'„Zd?d(d)„Zd?d*d+„Zd?d,d-„Zd?d.d/„Zd?d0d1„Zd?d2d3„Zd?d4d5„Zd?d6d7„Zd?d8d9„Zd?d:d;„Zd?d<d=„Z ‡  Z!S )@ÚCallbackListz*Container abstracting a list of callbacks.NFc                 K   sf   |rt  |¡ng | _d| _d| _d| _d| _d| _g | _|  	|¡ |  
||¡ |  |¡ |  |¡ dS )a  Container for `Callback` instances.

        This object wraps a list of `Callback` instances, making it possible
        to call them all at once via a single endpoint
        (e.g. `callback_list.on_epoch_end(...)`).

        Args:
            callbacks: List of `Callback` instances.
            add_history: Whether a `History` callback should be added, if one
                does not already exist in the `callbacks` list.
            add_progbar: Whether a `ProgbarLogger` callback should be added, if
                one does not already exist in the `callbacks` list.
            model: The `Model` these callbacks are used with.
            **params: If provided, parameters will be passed to each `Callback`
                via `Callback.set_params`.
        r   NF)r   ÚflattenÚ	callbacksÚ_in_begin_end_block_countÚ	_executorÚ_async_trainÚ_async_testÚ_async_predictÚ_futuresÚ_configure_async_dispatchÚ_add_default_callbacksÚ	set_modelÚ
set_params)Úselfr   Úadd_historyÚadd_progbarÚmodelÚparams© r   úU/home/ubuntu/.local/lib/python3.10/site-packages/keras/src/callbacks/callback_list.pyÚ__init__   s   

zCallbackList.__init__c                 C   s(   || _ |r| jD ]	}| |¡ qd S d S ©N)r   r   r   )r   r   Úcallbackr   r   r   r   5   s   
þzCallbackList.set_paramsc                 C   s–   t jsd S d}d}d}|r@t|ttfƒr@|D ])}t|ddƒrqt |j¡s'd}t |j	¡s/d}t |j
¡s7d}t |j¡s?d}q|| _|| _|| _d S )NTÚ
async_safeF)r   ÚIS_THREAD_SAFEÚ
isinstanceÚlistÚtupleÚgetattrr   Ú
is_defaultÚon_batch_endÚon_train_batch_endÚon_test_batch_endÚon_predict_batch_endr   r   r   )r   r   Úasync_trainÚ
async_testÚasync_predictÚcbkr   r   r   r   ;   s,   €
z&CallbackList._configure_async_dispatchc                 C   sŽ   d| _ d| _| jD ]}t|tƒr|| _ q	t|tƒr|| _q	| jdu r/|r/tƒ | _| j | j¡ | j du rC|rEtƒ | _ | j | j ¡ dS dS dS )z)Adds `Callback`s that are always present.N)Ú_progbarÚ_historyr   r#   r   r   Úappend)r   r   r   Úcbr   r   r   r   V   s   


€þz#CallbackList._add_default_callbacksc                    s<   |sd S t ƒ  |¡ | jr| j|_| jD ]}| |¡ qd S r   )Úsuperr   r1   Úhistoryr   )r   r   r    ©Ú	__class__r   r   r   i   s   
ÿzCallbackList.set_modelc                 C   sP   |  j d7  _ | j dkr"| js| js| jr&| jdu r$tj ¡ | _dS dS dS dS )zhCalled by `on_train/test/predict_begin`.

        Start the executor for async calls if needed.
        é   N)r   r   r   r   r   Ú
concurrentÚfuturesÚThreadPoolExecutor©r   r   r   r   Ú	_on_beginr   s   
ÿÿÿ
üþzCallbackList._on_beginc                 C   sP   |  j d8  _ | j dk rtdƒ‚| j dkr$| jdur&| j ¡  d| _dS dS dS )zCalled by `on_train/test/predict_end`.

        Shutdown the executor for async calls if all begin/end blocks completed.
        r8   r   z8`on_xxx_end` called without corresponding `on_xxx_begin`N)r   Ú
ValueErrorr   Úshutdownr<   r   r   r   Ú_on_end   s   
ÿ

þzCallbackList._on_endc                 G   sL   | j D ]}| ¡ r| ¡  | j  |¡ q| jj|g|¢R Ž }| j  |¡ d S r   )r   ÚdoneÚresultÚremover   Úsubmitr2   )r   ÚfnÚargsÚfuturer   r   r   Ú_async_dispatch   s   
€zCallbackList._async_dispatchc                 C   s   | j D ]}| ¡  qg | _ dS )z6Waits for all futures to complete and clears the list.N)r   rB   )r   rG   r   r   r   Ú_flush_futures•   s   


zCallbackList._flush_futuresc                 C   ó(   t  |¡}| jD ]	}|j||d qd S ©N)Úlogs)r	   Úpythonify_logsr   Úon_batch_begin©r   ÚbatchrL   r    r   r   r   rN   ›   ó   

ÿzCallbackList.on_batch_beginc                 C   s&   t  |¡}| jD ]}| ||¡ qd S r   )r	   rM   r   Úon_epoch_begin©r   ÚepochrL   r    r   r   r   rR       s   

ÿzCallbackList.on_epoch_beginc                 C   s4   | j r|  ¡  t |¡}| jD ]}| ||¡ qd S r   )r   rI   r	   rM   r   Úon_epoch_endrS   r   r   r   rU   ¥   s   

ÿzCallbackList.on_epoch_endc                 C   rJ   rK   )r	   rM   r   Úon_train_batch_beginrO   r   r   r   rV   ­   rQ   z!CallbackList.on_train_batch_beginc                 C   rJ   rK   )r	   rM   r   Úon_test_batch_beginrO   r   r   r   rW   ²   rQ   z CallbackList.on_test_batch_beginc                 C   rJ   rK   )r	   rM   r   Úon_predict_batch_beginrO   r   r   r   rX   ·   rQ   z#CallbackList.on_predict_batch_beginc                 C   ó*   | j r|  | j||¡ d S |  ||¡ d S r   )r   rH   Ú_on_batch_end©r   rP   rL   r   r   r   r(   ¼   ó   zCallbackList.on_batch_endc                 C   rY   r   )r   rH   Ú_on_train_batch_endr[   r   r   r   r)   Â   r\   zCallbackList.on_train_batch_endc                 C   rY   r   )r   rH   Ú_on_test_batch_endr[   r   r   r   r*   È   r\   zCallbackList.on_test_batch_endc                 C   rY   r   )r   rH   Ú_on_predict_batch_endr[   r   r   r   r+   Î   r\   z!CallbackList.on_predict_batch_endc                 C   rJ   rK   )r	   rM   r   r(   rO   r   r   r   rZ   Ô   rQ   zCallbackList._on_batch_endc                 C   rJ   rK   )r	   rM   r   r)   rO   r   r   r   r]   Ù   rQ   z CallbackList._on_train_batch_endc                 C   rJ   rK   )r	   rM   r   r*   rO   r   r   r   r^   Þ   rQ   zCallbackList._on_test_batch_endc                 C   rJ   rK   )r	   rM   r   r+   rO   r   r   r   r_   ã   rQ   z"CallbackList._on_predict_batch_endc                 C   ó,   |   ¡  t |¡}| jD ]}| |¡ qd S r   )r=   r	   rM   r   Úon_train_begin©r   rL   r    r   r   r   ra   è   ó
   

ÿzCallbackList.on_train_beginc                 C   ó:   | j r|  ¡  t |¡}| jD ]}| |¡ q|  ¡  d S r   )r   rI   r	   rM   r   Úon_train_endr@   rb   r   r   r   re   ï   ó   

zCallbackList.on_train_endc                 C   r`   r   )r=   r	   rM   r   Úon_test_beginrb   r   r   r   rg   ù   rc   zCallbackList.on_test_beginc                 C   rd   r   )r   rI   r	   rM   r   Úon_test_endr@   rb   r   r   r   rh      rf   zCallbackList.on_test_endc                 C   r`   r   )r=   r	   rM   r   Úon_predict_beginrb   r   r   r   ri   
  rc   zCallbackList.on_predict_beginc                 C   rd   r   )r   rI   r	   rM   r   Úon_predict_endr@   rb   r   r   r   rj     rf   zCallbackList.on_predict_end)NFFNr   )"Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r=   r@   rH   rI   rN   rR   rU   rV   rW   rX   r(   r)   r*   r+   rZ   r]   r^   r_   ra   re   rg   rh   ri   rj   Ú__classcell__r   r   r6   r   r
      sF    
û$	




















r
   )Úconcurrent.futuresr9   Ú	keras.srcr   r   r   Úkeras.src.api_exportr   Úkeras.src.callbacks.callbackr   Úkeras.src.callbacks.historyr   Ú"keras.src.callbacks.progbar_loggerr   Úkeras.src.utilsr	   r
   r   r   r   r   Ú<module>   s    