
    2Vh"                        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      Z	d Z
d	 Z G d
 d      Zej                   G d de             Zej                   G d de             Zej                   G d de             Zy)    wraps)treeget_global_attribute)set_global_attribute)python_utilsc                       e Zd Zd Zd Zy)DotNotTrackScopec                 :    t               | _        t        dd       y )Ntracking_onF)is_tracking_enabledoriginal_valuer   selfs    H/home/dcms/DCMS/lib/python3.12/site-packages/keras/src/utils/tracking.py	__enter__zDotNotTrackScope.__enter__
   s    13]E2    c                 0    t        d| j                         y )Nr   )r   r   )r   argskwargss      r   __exit__zDotNotTrackScope.__exit__   s    ]D,?,?@r   N)__name__
__module____qualname__r   r    r   r   r   r   	   s    3Ar   r   c                      t        dd      S )Nr   Tr   r   r   r   r   r      s    t44r   c                 .     t                fd       }|S )Nc                  T    t               5   | i |cd d d        S # 1 sw Y   y xY wN)r   )r   r   fns     r   wrapperz1no_automatic_dependency_tracking.<locals>.wrapper   s+     	't&v&	' 	' 	's   'r   )r!   r"   s   ` r    no_automatic_dependency_trackingr#      s     
2Y' ' Nr   c                   D    e Zd ZdZddZd Zd ZddZd Zd Z	d	 Z
d
 Zy)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                     || _         | j                   j                         D ci c]  }|t                c}| _        d| _        d | _        |xs i | _        y c c}w NF)configkeysset
stored_idslocked_lock_violation_msg
exclusions)r   r(   r.   names       r   __init__zTracker.__init__?   sO    37;;3C3C3EF44;F#' $* Gs   Ac                 L   t               s|S | j                  j                         D ]r  \  }\  }} ||      s|| j                  v r,| j                  |   D ]  }| j	                  ||      s|c c S  | j	                  ||      s| j                  ||       |c S  t        |t              rZt        |d      rNi }|j                         j                         D ]  \  }}| j                  |      ||<     |j                  di |S t        |t              r:g }|D ]"  }|j                  | j                  |             $ |j                  |      S t        |t              rt        ||       S t        |t              rt!        ||       S t        |t"              rt%        ||       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/   es	            r   r:   zTracker.trackF   s   "$K-1[[->->-@ 	)J)qD!0 $
 ; (++D$7#'K( ''
D9%%j$7	 dE"wtY'?L<<>//1 3a%)ZZ]T"3!4>>1L11dE"L 3##DJJqM23>>,//d#tT**d#tT**c"dD))r   c                    | j                   j                         D ]j  }t        |      | j                   |   v s| j                   |   j                  t        |             t	        j
                  | j                  |   d   |       l y N   )r+   r)   idremover	   remove_by_idr(   )r   valuerC   s      r   untrackzTracker.untrackg   sn    //..0 	MJ%yDOOJ77
+222e9=))$++j*A!*DeL	Mr   c                 &    d| _         ||| _        y y )NT)r,   r-   )r   msgs     r   lockzTracker.lockm   s    ?'*D$ r   c                     d| _         y r'   )r,   r   s    r   unlockzTracker.unlockr   s	    r   c                     | j                   rt        | j                        | j                  |   d   j	                  |       | j
                  |   j                  t        |             y rJ   )r,   
ValueErrorr-   r(   r<   r+   addrL   r   rC   rO   s      r   r5   zTracker.add_to_storeu   sQ    ;;T5566J"))%0
#''5	2r   c                 6    t        |      | j                  |   v S r    )rL   r+   rY   s      r   r4   zTracker.is_in_store{   s    %yDOOJ777r   c                 0   | j                  ||      st        d|       | j                  |   d   }|j                  |      }|||<   | j                  |   j                  t        |             | j                  |   j                  t        |             y )NzUnknown value: rK   )r4   rW   r(   indexr+   rM   rL   rX   )r   rC   	old_value	new_value
store_listr\   s         r   replace_tracked_valuezTracker.replace_tracked_value~   s    
I6yk:;;[[,Q/
  +%
5
#**2i=9
#''96r   r    )r   r   r   __doc__r0   r:   rP   rS   rU   r5   r4   r`   r   r   r   r%   r%      s1    >+BM+
387r   r%   c                   ~     e Zd Zd fd	Z fdZ fdZ fdZ fdZd fd	Z fdZ	 fdZ
d	 Zed
        Z xZS )r>   c                     || _         |r |r|D cg c]  }|j                  |       }}t        |   |xs g        y c c}w r    trackerr:   superr0   r   valuesre   vr;   s       r   r0   zTrackedList.__init__   A    v0671gmmA&7F72& 8   ?c                 r    | j                   r| j                   j                  |       t        |   |       y r    )re   r:   rf   r<   r   rO   r;   s     r   r<   zTrackedList.append   s(    <<LLu%ur   c                 t    | j                   r| j                   j                  |       t        |   ||       y r    )re   r:   rf   insertr   r\   rO   r;   s      r   ro   zTrackedList.insert   s*    <<LLu%ue$r   c                     | j                   r(|D cg c]  }| j                   j                  |       }}t        |   |       y c c}w r    )re   r:   rf   extendr   rh   ri   r;   s      r   rr   zTrackedList.extend   =    <<5;<dll((+<F<v =   "Ac                     | j                   r| j                   j                  |       	 t        |   |       y # t        $ r t        j                  | |       Y y w xY wr    )re   rP   rf   rM   rW   r	   rN   rm   s     r   rM   zTrackedList.remove   sL    <<LL  '	3GN5! 	3%%dE2	3s   : AAc                     | j                   r/| |   }| j                   j                  |       t        |   |      S t        |   |      S r    )re   rP   rf   poprp   s      r   rx   zTrackedList.pop   sC    <<KELL  '7;u%%7;u%%r   c                 ~    | j                   r"| D ]  }| j                   j                  |        t        |           y r    re   rP   rf   clearrm   s     r   r{   zTrackedList.clear   4    << ,$$U+,r   c                 ~    | |   }t         |   |       | j                  r| j                  j                  |       y y r    )rf   __delitem__re   rP   rp   s      r   r~   zTrackedList.__delitem__   s7    UE"<<LL  ' r   c                 
    | d fS r    r   r   s    r   tree_flattenzTrackedList.tree_flatten       d|r   c                      | |      S r    r   clsmetadatachildrens      r   tree_unflattenzTrackedList.tree_unflatten        8}r   NN))r   r   r   r0   r<   ro   rr   rM   rx   r{   r~   r   classmethodr   __classcell__r;   s   @r   r>   r>      sD    '
%

3&(  r   r>   c                   j     e Zd Zd	 fd	Z fdZ fdZd
 fd	Z fdZ fdZd Z	e
d        Z xZS )r@   c                     || _         |r4|r2|j                         D ci c]  \  }}||j                  |       }}}t        |   |xs g        y c c}}w r    )re   r3   r:   rf   r0   )r   rh   re   kri   r;   s        r   r0   zTrackedDict.__init__   sQ    v6<llnEdaaq))EFE2& Fs   Ac                 t    | j                   r| j                   j                  |       t        |   ||       y r    )re   r:   rf   __setitem__r   keyrO   r;   s      r   r   zTrackedDict.__setitem__   s+    <<LLu%C'r   c                     | j                   r<|j                         D ci c]!  \  }}|| j                   j                  |      # }}}t        |   |       y c c}}w r    )re   r3   r:   rf   update)r   mappingr   ri   r;   s       r   r   zTrackedDict.update   sM    <<<CMMOLDAqq$,,,,Q//LGLw Ms   &Ac                     | j                   r1t        | 	  ||      }||ur| j                   j                  |       |S t        | 	  ||      S r    )re   rf   rx   rP   )r   r   defaultrO   r;   s       r   rx   zTrackedDict.pop   sJ    <<GKW-EG#$$U+L7;sG,,r   c                 |    t         |          \  }}| j                  r| j                  j                  |       ||fS r    )rf   popitemre   rP   r   s      r   r   zTrackedDict.popitem   s6    W_&
U<<LL  'Ezr   c                     | j                   r0| j                         D ]  }| j                   j                  |        t        |           y r    )re   rh   rP   rf   r{   rm   s     r   r{   zTrackedDict.clear   s:    << ,$$U+,r   c                 ~    t        t        | j                                     }|D cg c]  }| |   	 }}|||fS c c}w r    )sortedr=   r)   )r   r)   r   rh   s       r   r   zTrackedDict.tree_flatten   s@    d499;'(#'(a$q'((tT!! )s   :c                 &     | t        ||            S r    )zip)r   r)   rh   s      r   r   zTrackedDict.tree_unflatten   s     3tV$%%r   r   r    )r   r   r   r0   r   r   rx   r   r{   r   r   r   r   r   s   @r   r@   r@      s:    '(
 
-" & &r   r@   c                   h     e Zd Zd	 fd	Z fdZ fdZ fdZ fdZ fdZd Z	e
d        Z xZS )
rA   c                     || _         |r |r|D ch c]  }|j                  |       }}t        |   |xs g        y c c}w r    rd   rg   s       r   r0   zTrackedSet.__init__   rj   rk   c                 r    | j                   r| j                   j                  |       t        |   |       y r    )re   r:   rf   rX   rm   s     r   rX   zTrackedSet.add   s(    <<LLu%Er   c                     | j                   r(|D cg c]  }| j                   j                  |       }}t        |   |       y c c}w r    )re   r:   rf   r   rs   s      r   r   zTrackedSet.update  rt   ru   c                 r    | j                   r| j                   j                  |       t        |   |       y r    )re   rP   rf   rM   rm   s     r   rM   zTrackedSet.remove
  s(    <<LL  'ur   c                 r    t         |          }| j                  r| j                  j                  |       |S r    )rf   rx   re   rP   rm   s     r   rx   zTrackedSet.pop  s,    <<LL  'r   c                 ~    | j                   r"| D ]  }| j                   j                  |        t        |           y r    rz   rm   s     r   r{   zTrackedSet.clear  r|   r   c                 
    | d fS r    r   r   s    r   r   zTrackedSet.tree_flatten  r   r   c                      | |      S r    r   r   s      r   r   zTrackedSet.tree_unflatten  r   r   r   )r   r   r   r0   rX   r   rM   rx   r{   r   r   r   r   r   s   @r   rA   rA      s:    '


  r   rA   N)	functoolsr   	keras.srcr   %keras.src.backend.common.global_stater   r   keras.src.utilsr	   r   r   r#   r%   register_tree_node_classr=   r>   r?   r@   r*   rA   r   r   r   <module>r      s      F F (A A5f7 f7R 9$ 9 9x /&$ /& /&d ) ) )r   