o
    2h"                     @   s   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 G dd dZ	dd	 Z
d
d ZG dd dZejG dd deZejG dd deZejG dd deZdS )    wraps)treeget_global_attribute)set_global_attribute)python_utilsc                   @   s   e Zd Zdd Zdd ZdS )DotNotTrackScopec                 C   s   t  | _tdd d S )Ntracking_onF)is_tracking_enabledoriginal_valuer   self r   S/var/www/html/chatgem/venv/lib/python3.10/site-packages/keras/src/utils/tracking.py	__enter__
   s   zDotNotTrackScope.__enter__c                 O   s   t d| j d S )Nr
   )r   r   )r   argskwargsr   r   r   __exit__   s   zDotNotTrackScope.__exit__N)__name__
__module____qualname__r   r   r   r   r   r   r	   	   s    r	   c                   C   s
   t ddS )Nr
   Tr   r   r   r   r   r         
r   c                    s   t   fdd}|S )Nc                     s8   t    | i |W  d    S 1 sw   Y  d S N)r	   )r   r   fnr   r   wrapper   s   $z1no_automatic_dependency_tracking.<locals>.wrapperr   )r   r   r   r   r    no_automatic_dependency_tracking   s   r   c                   @   sT   e Zd ZdZdddZdd Zdd Zdd	d
Zdd Zdd Z	dd Z
dd ZdS )Trackera  Attribute tracker, used for e.g. Variable tracking.

    Monitors certain attribute types
    and put them in appropriate lists in case of a match.

    Also passively tracks certain mutable collections
    (dict, list) so that items added to them later
    still get tracked. This is done by wrapping these
    collections into an equivalent, tracking-aware object.

    Example:

    ```python
    def __init__(self):
        self.tracker = Tracker(
            # Format: `name: (test_fn, store)`
            {
                "variables":
                    (lambda x: isinstance(x, Variable), self._variables),
                "metrics": (lambda x: isinstance(x, Metric), self._metrics),
                "layers": (lambda x: isinstance(x, Layer), self._layers),
            }
        )

    def __setattr__(self, name, value):
        if hasattr(self, "_tracker"):
            value = self._tracker.track(value)
        return super().__setattr__(name, value)
    ```
    Nc                 C   s6   || _ dd | j  D | _d| _d | _|pi | _d S )Nc                 S   s   i | ]}|t  qS r   )set).0namer   r   r   
<dictcomp>A       z$Tracker.__init__.<locals>.<dictcomp>F)configkeys
stored_idslocked_lock_violation_msg
exclusions)r   r$   r)   r   r   r   __init__?   s
   zTracker.__init__c           	      C   s:  t  s|S | j D ]3\}\}}||r=|| jv r-| j| D ]}| ||r,|    S q| ||s9| || |  S q
t|trdt|drdi }|	  D ]\}}| 
|||< qP|jdi |S t|tr}g }|D ]
}|| 
| qm||S t|trt|| S t|trt|| S t|trt|| S |S )N_fieldsr   )r   r$   itemsr)   is_in_storeadd_to_store
isinstancetuplehasattr_asdicttrack	__class__appendlistTrackedListdictTrackedDictr   
TrackedSet)	r   attr
store_nameis_attr_type_exclwrapped_attrr!   er   r   r   r3   F   s<   








zTracker.trackc                 C   sP   | j  D ] }t|| j | v r%| j | t| t| j| d | qd S N   )r&   r%   idremover   remove_by_idr$   )r   valuer<   r   r   r   untrackg   s   zTracker.untrackc                 C   s   d| _ |d ur|| _d S d S )NT)r'   r(   )r   msgr   r   r   lockm   s   
zTracker.lockc                 C   s
   d| _ d S )NF)r'   r   r   r   r   unlockr   r   zTracker.unlockc                 C   s<   | j rt| j| j| d | | j| t| d S rB   )r'   
ValueErrorr(   r$   r5   r&   addrD   r   r<   rG   r   r   r   r.   u   s   
zTracker.add_to_storec                 C   s   t || j| v S r   )rD   r&   rN   r   r   r   r-   {   s   zTracker.is_in_storec                 C   sf   |  ||std| | j| d }||}|||< | j| t| | j| t| d S )NzUnknown value: rC   )r-   rL   r$   indexr&   rE   rD   rM   )r   r<   	old_value	new_value
store_listrO   r   r   r   replace_tracked_value~   s   
zTracker.replace_tracked_valuer   )r   r   r   __doc__r*   r3   rH   rJ   rK   r.   r-   rS   r   r   r   r   r      s    
!
r   c                       s   e Zd Zd fdd	Z fddZ fddZ fdd	Z fd
dZd fdd	Z fddZ	 fddZ
dd Zedd Z  ZS )r7   Nc                    4    | _  r|r fdd|D }t |pg  d S )Nc                    s   g | ]}  |qS r   r3   r    vtrackerr   r   
<listcomp>       z(TrackedList.__init__.<locals>.<listcomp>rZ   superr*   r   valuesrZ   r4   rY   r   r*         zTrackedList.__init__c                    "   | j r	| j | t | d S r   )rZ   r3   r^   r5   r   rG   ra   r   r   r5         zTrackedList.appendc                    $   | j r	| j | t || d S r   )rZ   r3   r^   insertr   rO   rG   ra   r   r   rg         zTrackedList.insertc                    (    j r fdd|D }t | d S )Nc                       g | ]} j |qS r   rZ   r3   rW   r   r   r   r[          z&TrackedList.extend.<locals>.<listcomp>)rZ   r^   extendr   r`   ra   r   r   rn         zTrackedList.extendc                    sF   | j r	| j | z	t | W d S  ty"   t| | Y d S w r   )rZ   rH   r^   rE   rL   r   rF   rd   ra   r   r   rE      s   zTrackedList.removec                    s2   | j r| | }| j | t |S t |S r   )rZ   rH   r^   poprh   ra   r   r   rr      s
   zTrackedList.popc                    *   | j r| D ]}| j | qt   d S r   rZ   rH   r^   clearrd   ra   r   r   ru         zTrackedList.clearc                    s.   | | }t  | | jr| j| d S d S r   )r^   __delitem__rZ   rH   rh   ra   r   r   rw      s
   zTrackedList.__delitem__c                 C      | d fS r   r   r   r   r   r   tree_flatten      zTrackedList.tree_flattenc                 C      | |S r   r   clsmetadatachildrenr   r   r   tree_unflatten      zTrackedList.tree_unflattenNN)rq   )r   r   r   r*   r5   rg   rn   rE   rr   ru   rw   ry   classmethodr   __classcell__r   r   ra   r   r7      s    r7   c                       sp   e Zd Zd fdd	Z fddZ fddZd fdd		Z fd
dZ fddZdd Z	e
dd Z  ZS )r9   Nc                    s8    | _  r|r fdd| D }t |pg  d S )Nc                    s   i | ]
\}}|  |qS r   rV   r    krX   rY   r   r   r"      s    z(TrackedDict.__init__.<locals>.<dictcomp>)rZ   r,   r^   r*   r_   ra   rY   r   r*      s   zTrackedDict.__init__c                    rf   r   )rZ   r3   r^   __setitem__r   keyrG   ra   r   r   r      ri   zTrackedDict.__setitem__c                    s,    j r fdd| D }t | d S )Nc                    s   i | ]\}}| j |qS r   rl   r   r   r   r   r"      s    z&TrackedDict.update.<locals>.<dictcomp>)rZ   r,   r^   update)r   mappingra   r   r   r      s   zTrackedDict.updatec                    s:   | j rt ||}||ur| j | |S t ||S r   )rZ   r^   rr   rH   )r   r   defaultrG   ra   r   r   rr      s   zTrackedDict.popc                    s(   t   \}}| jr| j| ||fS r   )r^   popitemrZ   rH   r   ra   r   r   r      s   zTrackedDict.popitemc                    s.   | j r|  D ]}| j | qt   d S r   )rZ   r`   rH   r^   ru   rd   ra   r   r   ru      s   zTrackedDict.clearc                    s,   t t  } fdd|D }|||fS )Nc                    s   g | ]} | qS r   r   )r    r   r   r   r   r[      r#   z,TrackedDict.tree_flatten.<locals>.<listcomp>)sortedr6   r%   )r   r%   r`   r   r   r   ry      s   
zTrackedDict.tree_flattenc                 C   s   | t ||S r   )zip)r}   r%   r`   r   r   r   r      s   zTrackedDict.tree_unflattenr   r   )r   r   r   r*   r   r   rr   r   ru   ry   r   r   r   r   r   ra   r   r9      s    	r9   c                       sn   e Zd Zd fdd	Z fddZ fddZ fdd	Z fd
dZ fddZdd Z	e
dd Z  ZS )r:   Nc                    rU   )Nc                    s   h | ]}  |qS r   rV   rW   rY   r   r   	<setcomp>   r\   z&TrackedSet.__init__.<locals>.<setcomp>r]   r_   ra   rY   r   r*      rb   zTrackedSet.__init__c                    rc   r   )rZ   r3   r^   rM   rd   ra   r   r   rM      re   zTrackedSet.addc                    rj   )Nc                    rk   r   rl   rW   r   r   r   r[     rm   z%TrackedSet.update.<locals>.<listcomp>)rZ   r^   r   ro   ra   r   r   r     rp   zTrackedSet.updatec                    rc   r   )rZ   rH   r^   rE   rd   ra   r   r   rE   
  re   zTrackedSet.removec                    s    t   }| jr| j| |S r   )r^   rr   rZ   rH   rd   ra   r   r   rr     s   
zTrackedSet.popc                    rs   r   rt   rd   ra   r   r   ru     rv   zTrackedSet.clearc                 C   rx   r   r   r   r   r   r   ry     rz   zTrackedSet.tree_flattenc                 C   r{   r   r   r|   r   r   r   r     r   zTrackedSet.tree_unflattenr   )r   r   r   r*   rM   r   rE   rr   ru   ry   r   r   r   r   r   ra   r   r:      s    r:   N)	functoolsr   	keras.srcr   %keras.src.backend.common.global_stater   r   keras.src.utilsr   r	   r   r   r   register_tree_node_classr6   r7   r8   r9   r   r:   r   r   r   r   <module>   s    		i<2