
    BVh                         d Z ddlZddlZddlmZ 	 ddlZd Zd Z G d de	      Z
 G d d	e	      Zd
 Zy# e$ r Y 'w xY w)z/Utilities related to layer/model functionality.    N)object_identityc                 @    t        | d      xr t        | t               S )&Implicit check for Layer-like objects.	_is_layer)hasattr
isinstancetype)objs    W/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/trackable/layer_utils.pyis_layerr       s      
k	"	@:c4+@'@@    c                     t        t        |       d      xr t        t        |       d      }|xr t        | t               S )r   trainable_weightsnon_trainable_weights)r   r	   r   )r
   
has_weights     r   has_weightsr   &   sD     S	#67 @DI'>?  
	1JsD111r   c                   *    e Zd ZdZdZd Zed        Zy)MutationSentinelz?Container for tracking whether a property is in a cached state.Fc                 2    || j                   k7  }|| _         |S N_in_cached_state)selfvaluemay_affect_upstreams      r   mark_aszMutationSentinel.mark_as3   s!     D$9$99!Dr   c                     | j                   S r   r   )r   s    r   in_cached_statez MutationSentinel.in_cached_state8   s       r   N)__name__
__module____qualname____doc__r   r   propertyr    r   r   r   r   /   s$    G
 ! !r   r   c                   N     e Zd ZdZd
dZ fdZd Zd Zd Zd Z	d Z
d	 Z xZS )AttributeSentinelzContainer for managing attribute cache state within a Layer.

  The cache can be invalidated either on an individual basis (for instance when
  an attribute is mutated) or a layer-wide basis (such as when a new dependency
  is added).
  c                     t        j                         | _        t        j                  t
              | _        || _        y r   )weakrefWeakSet_parentscollectionsdefaultdictr   
attributesalways_propagate)r   r.   s     r   __init__zAttributeSentinel.__init__E   s-    OO%DM!--.>?DO -Dr   c           	          dj                  t        t        |          | j                  j                         D ci c]  \  }}||j                   c}}      S c c}}w )Nz{}
  {})formatsuperr&   __repr__r-   itemsr   )r   kv	__class__s      r   r3   zAttributeSentinel.__repr__O   sS    /1*.//*?*?*AB$!QA	BD DBs   Ac                 Z    | j                   j                  |       |j                          y r   )r*   addinvalidate_all)r   nodes     r   
add_parentzAttributeSentinel.add_parentT   s"     	MMdr   c                 4    | j                   |   j                  S r   )r-   r   r   keys     r   getzAttributeSentinel.get_   s    ??3///r   c                     | j                   |   j                  |      }|s| j                  r#| j                  D ]  }|j	                  |        y y r   )r-   r   r.   r*   
invalidate)r   r?   r   r   r;   s        r   _setzAttributeSentinel._setc   sK    //#.66u=d33-- $ 4r   c                 (    | j                  |d       y )NTrC   r>   s     r   mark_cachedzAttributeSentinel.mark_cachedj   s    IIc4r   c                 (    | j                  |d       y NFrE   r>   s     r   rB   zAttributeSentinel.invalidaten   s    IIc5r   c                     | j                   j                         D ]   }| j                   |   j                  d       " | j                  D ]  }|j	                           y rH   )r-   keysr   r*   r:   )r   r?   r;   s      r   r:   z AttributeSentinel.invalidate_allr   sX     ##% *
ooc""5)*  
r   )F)r   r    r!   r"   r/   r3   r<   r@   rC   rF   rB   r:   __classcell__)r7   s   @r   r&   r&   =   s1    -D
	0r   r&   c              #     K   t        j                         }| ddd   }|rb|j                         }||v r|j                  |       t	        |      r| n(t        |dd      xs g }|j                  |ddd          |rayyw)z4Filter out empty Layer-like containers and uniquify.Nlayers)r   ObjectIdentitySetpopr9   r   getattrextend)
layer_listexistingto_visitr
   
sub_layerss        r   filter_empty_layer_containersrW   |   s      ..0("(
,,.C
hLL}i3$/52j ooj2&' 	s   A?BB)r"   r+   r(   tensorflow.python.utilr   typingImportErrorr   r   objectr   r&   rW   r$   r   r   <module>r\      s[    6
   2
A2!v !< <~(A  s   6 >>