
    BVhl                     F   d Z ddlZ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 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 edg       d        Z edg       d        Z G d de      Z edg        G d dej4                               Z G d deej8                        Z G d deej<                  e      Z  G d deejB                        Z! G d d eejD                        Z# G d! d"eejD                        Z$d# Z%d$ Z&d% Z'y# e$ r
 ddlmZ Y w xY w)&zTrackable data structures.    N   )wrapt)def_function)function)	variables)base)layer_utils)collections_abc)	tf_exportc                       e Zd ZdZdgZd Zy)NoDependencya  Allows attribute assignment to `Trackable` objects with no dependency.

  Example usage:
  ```python
  obj = Trackable()
  obj.has_dependency = tf.Variable(0., name="dep")
  obj.no_dependency = NoDependency(tf.Variable(1., name="nodep"))
  assert obj.no_dependency.name == "nodep:0"
  ```

  `obj` in this example has a dependency on the variable "dep", and both
  attributes contain un-wrapped `Variable` objects.

  `NoDependency` also works with `tf.keras.Model`, but only for checkpoint
  dependencies: wrapping a `Layer` in `NoDependency` will assign the (unwrapped)
  `Layer` to the attribute without a checkpoint dependency, but the `Model` will
  still track the `Layer` (so it will appear in `Model.layers`, and its
  variables will appear in `Model.variables`).
  valuec                     || _         y Nr   selfr   s     [/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/trackable/data_structures.py__init__zNoDependency.__init__:   s	    DJ    N)__name__
__module____qualname____doc__	__slots__r    r   r   r   r   #   s    ( i)r   r   c                 6   | D ]  }t        |t              r yt        |t        j                        r yt	        |      t
        k(  r yt	        |      t        j                  k(  r yt	        |      t        k(  r yt        |t              st        |      s y y)z2Determine if a tuple has any trackable components.TF)
isinstancer   r   	TrackabletypedictcollectionsOrderedDictlisttuple_should_wrap_tuple)telements     r   r&   r&   >   s~    
  g'<('4>>*G}G}///G}'5!&8&A 
r   z__internal__.tracking.wrap)v1c                    t        | t              r| j                  S t        | t        j                        r| S t        |       t        k(  rt        |       S t        |       t        j                  k(  rt        |       S t        |       t        k(  rt        |       S t        | t              rt        |       rt        |       S | S )a  Wraps input value into trackable data structures.

  This is mostly useful for containers like list, dict, etc, which could contain
  trackable objects in it. Wrapped data structure will be tracked when
  associated with a `tf.Module`, so that save model/checkpoint can properly
  track the dependency.

  It will also unwrap NoDependency objects.

  Args:
    value: the input object to be wrapped.

  Returns:
    Wrapped trackable data structure.
  )r   r   r   r   r   r    r!   _DictWrapperr"   r#   r$   ListWrapperr%   r&   _TupleWrapperr   s    r   wrap_or_unwrapr.   V   s    ( |$;;t~~&LE{dE{k---E{du%$6u$=Lr   z1__internal__.tracking.sticky_attribute_assignmentc                     t        |t              rd}nd}t        |      }|s|S t        |t        j                        r| j                  ||d       |S )ak  Adds dependencies, generally called from __setattr__.

  This behavior is shared between Trackable and Model.

  Respects NoDependency indicators, but otherwise makes trackable objects
  out of common data structures and tracks objects by their attribute names.

  Args:
    trackable: The object to add dependencies to (generally the one having
      an attribute assigned).
    name: The attribute name being assigned.
    value: The value being assigned. Not necessarily a trackable object.

  Returns:
    The value which should be stored in the attribute (unwrapped from a
    NoDependency object if necessary).
  FT)name	overwrite)r   r   r.   r   r   _track_trackable)	trackabler0   r   add_dependencys       r   sticky_attribute_assignmentr5   |   s\    & |$NN

%	Lt~~&D    
,r   c                       e Zd Zd Zd Zy)_UntrackableErrorc                     || _         y r   _valuer   s     r   r   z_UntrackableError.__init__   s	    DKr   c                 "    d| j                    dS )NzZOnly trackable objects (such as Layers or Optimizers) may be stored in a List object. Got z(, which does not inherit from Trackable.r9   r   s    r   __str__z_UntrackableError.__str__   s    ,,0KK= 9&& 'r   N)r   r   r   r   r=   r   r   r   r7   r7      s    'r   r7   z,__internal__.tracking.TrackableDataStructurec                      e Zd ZdZd Zed        Zed        Zej                  d        Zd Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zd Zd Zy)TrackableDataStructurez?Base class for data structures which contain trackable objects.c                 T    d| _         g | _        t        j                  d      | _        y NT)_self_trainable_self_extra_variablesr	   AttributeSentinel_self_attribute_sentinelr<   s    r   r   zTrackableDataStructure.__init__   s'    
  D!#D$/$A$A$$GD!r   c                     | j                   S r   )rE   r<   s    r   _attribute_sentinelz*TrackableDataStructure._attribute_sentinel   s    (((r   c                     | j                   S r   rB   r<   s    r   	trainablez TrackableDataStructure.trainable   s    r   c                     || _         y r   rI   r   s     r   rJ   z TrackableDataStructure.trainable   s
     Dr   c                 P   t        | ||      }t        |t        j                        r| j                  j                  |       t        |t        j                        st        |      t        |d      rd|_
        t        |dd      }|r|j                  | j                         |S )zAdd a dependency on `value`.r3   r   r0   _use_resource_variablesTrG   N)r5   r   r   VariablerC   appendr   r   r7   hasattrrN   getattr
add_parentrG   )r   r   r0   value_attribute_sentinels       r   _track_valuez#TrackableDataStructure._track_value   s    'e$0E%++,
  ''.eT^^,e$$u/0 '+e#&u.CTJ))$*B*BCLr   c                     t        d      )z9An iterable/sequence which may contain trackable objects.zAbstract method)NotImplementedErrorr<   s    r   _valueszTrackableDataStructure._values   s     /
00r   c                     g }| j                   D ]N  }t        |t              s+t        j                  |      st        j
                  |      s>|j                  |       P |S )z<All Layers and Layer containers, including empty containers.)rX   r   r?   r	   is_layerhas_weightsrP   )r   	collectedobjs      r   _layerszTrackableDataStructure._layers   sY    
 I|| 
S0
1!!#&$$S)	
 r   c                 R    t        t        j                  | j                              S r   )r$   r	   filter_empty_layer_containersr^   r<   s    r   layerszTrackableDataStructure.layers   s    99$,,GHHr   c                    | j                   sg S g }| j                  D ]9  }t        |t        j                        st        |d      s+||j                  z  }; | j                  D cg c]  }|j                  s| }}||z   S c c}w )Ntrainable_variables)	rB   rX   r   r   r   rQ   rc   rC   rJ   )r   rc   r]   vtrainable_extra_variabless        r   trainable_weightsz(TrackableDataStructure.trainable_weights   s    i|| 7	C	(W
$.&s6667
 --!! ! !:::!s   'B9Bc                    | j                   D cg c]  }|j                  s| }}| j                   D cg c]  }|j                  r| }}g }| j                  D ]9  }t        |t        j
                        st        |d      s+||j                  z  }; | j                  sWg }| j                  D ]9  }t        |t        j
                        st        |d      s+||j                  z  }; ||z   |z   |z   }|S ||z   }|S c c}w c c}w )Nnon_trainable_variablesrc   )
rC   rJ   rX   r   r   r   rQ   rh   rB   rc   )r   rd   re   non_trainable_extra_variablesrh   r]   rc   s          r   non_trainable_weightsz,TrackableDataStructure.non_trainable_weights   s6    --!! ! --%Q[[%! % !|| ?	C	(W
(.*3#>#>>?
  9#c4>>*w&0(
!8!8
8
9  9
9
!"$AB  #" "$A
A  #"7!%s   DDDDc                 4    | j                   | j                  z   S r   )rf   rj   r<   s    r   weightszTrackableDataStructure.weights  s    !!D$>$>>>r   c                     | j                   S r   )rf   r<   s    r   rc   z*TrackableDataStructure.trainable_variables  s    !!!r   c                     | j                   S r   )rj   r<   s    r   rh   z.TrackableDataStructure.non_trainable_variables   s    %%%r   c                     | j                   S r   )rl   r<   s    r   r   z TrackableDataStructure.variables$  s    <<r   c                 d    g }| j                   D ]  }t        |d      s||j                  z  }  |S )z-Aggregate updates from any `Layer` instances.updates)ra   rQ   rq   r   
aggregatedlayers      r   rq   zTrackableDataStructure.updates(  s<     J $			"emm#
$ r   c                 d    g }| j                   D ]  }t        |d      s||j                  z  }  |S )z,Aggregate losses from any `Layer` instances.losses)ra   rQ   rv   rr   s      r   rv   zTrackableDataStructure.losses4  s<     J #		!ell"
# r   c                     t        |       S r   )idr<   s    r   __hash__zTrackableDataStructure.__hash__=  s     d8Or   c                 
    | |u S r   r   r   others     r   __eq__zTrackableDataStructure.__eq__B  s     5=r   N)r   r   r   r   r   propertyrG   rJ   setterrU   rX   r^   ra   rf   rj   rl   rc   rh   r   rq   rv   ry   r}   r   r   r   r?   r?      s:   GH ) )     ! !" 1 1 
 
 I I ; ; # #< ? ? " " & &   	 	  
r   r?   c                        e Zd ZdZ fdZd Zd Zd Zd Zd Z	e
d        Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z fdZ xZS )Lista  An append-only sequence type which is trackable.

  Maintains checkpoint dependencies on its contents (which must also be
  trackable), and forwards any `Layer` metadata such as updates and losses.

  Note that `List` is purely a container. It lets a `tf.keras.Model` or
  other trackable object know about its contents, but does not call any
  `Layer` instances which are added to it. To indicate a sequence of `Layer`
  instances which should be called sequentially, use `tf.keras.Sequential`.

  Example usage:
  ```python
  class HasList(tf.keras.Model):

    def __init__(self):
      super().__init__()
      self.layer_list = List([layers.Dense(3)])
      self.layer_list.append(layers.Dense(4))

    def call(self, x):
      aggregation = 0.
      for l in self.layer_list:
        x = l(x)
        aggregation += tf.reduce_sum(x)
      return aggregation
  ```

  This kind of wrapping is necessary because `Trackable` objects do not
  (yet) deeply inspect regular Python data structures, so for example assigning
  a regular list (`self.layer_list = [layers.Dense(3)]`) does not create a
  checkpoint dependency and does not add the `Layer` instance's weights to its
  parent `Model`.
  c                     t         |            | j                  |i || _        t	        | j                        D ]4  \  }}| j                  || j                  |            | j                  |<   6 y)z;Construct a new sequence. Arguments are passed to `list()`.r0   N)superr   _make_storage_storage	enumeraterU   _name_element)r   argskwargsindexr(   	__class__s        r   r   zList.__init__k  sq    	G&D&&77DM#DMM2 3w!..
**51 / 3dmmE3r   c                 ^     t        |       t        j                  | j                              S r   r    copyr   r<   s    r   r   z	List.copys       4:dii.//r   c                 "    | j                         S r   r   r<   s    r   __copy__zList.__copy__v  s    99;r   c                 `     t        |       t        j                  | j                  |            S r   r    r   deepcopyr   r   memos     r   __deepcopy__zList.__deepcopy__y  "    4:dmmDMM4899r   c                     t        |i |S )z:Determines the backing storage (overridden in subclasses).)r$   r   r   r   s      r   r   zList._make_storage|  s       r   c                     d|fz  S )N%dr   )r   r   s     r   r   zList._name_element  s    5(?r   c                     | S *Collect values for TrackableDataStructure.r   r<   s    r   rX   zList._values  	     Kr   c                     | j                  || j                  t        | j                                    }| j                  j	                  |       yzAdd a new trackable value.N)rU   r   lenr   rP   r   s     r   rP   zList.append  s:    eT%7%7DMM8J%KLEMMr   c                 4    |D ]  }| j                  |        yz#Add a sequence of trackable values.N)rP   )r   valuesr   s      r   extendzList.extend  s     
kk%r   c                 (    | j                  |       | S r   )r   )r   r   s     r   __iadd__zList.__iadd__  s    KKKr   c                 6    | j                   t        |d|      z   S Nr   r   rR   r{   s     r   __add__zList.__add__      ==75*e<<<r   c                     |dk  rt        d| d      t        | j                        }t        |dz
        D ]0  }t        |      D ]   }| j	                  | j                  |          " 2 | S )Nr   z3List only supports append, multiplying in place by z removes elements.   )
ValueErrorr   r   rangerP   )r   yn_is        r   __imul__zList.__imul__  s~    Av?s C   	DMMA1q5\ &Qx &!DMM!$%&& Kr   c                      | j                   |z  S r   r   r   r   s     r   __mul__zList.__mul__  s    ==1r   c                     | |z  S r   r   r   s     r   __rmul__zList.__rmul__  s    !8Or   c                      || j                   z   S r   r   r{   s     r   __radd__zList.__radd__  s    4==  r   c                      | j                   |   S r   r   r   keys     r   __getitem__zList.__getitem__      ==r   c                 4    | j                   t        ||         S r   )r   slicer   r   js      r   __getslice__zList.__getslice__  s    ==q!%%r   c                 ,    t        | j                        S r   r   r   r<   s    r   __len__zList.__len__      t}}r   c                 4    dt        | j                        dS )NzList()reprr   r<   s    r   __repr__zList.__repr__  s    dmm,..r   c                 `    t         |          t        j                  | j                        z   S r   )r   
__sizeof__sys	getsizeofr   )r   r   s    r   r   zList.__sizeof__  s#    7#--">>>r   )r   r   r   r   r   r   r   r   r   r   r~   rX   rP   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r   r   r   H  s     D30:!   

=!&/? ?r   r   c                   n    e Zd ZdZ fdZed        Zej                  d        Zed        Zej                  d        Z fdZ	 fdZ
d	 Zd
 Zd Zd Zej                   j"                  f fd	Zd Zd Zd Z fdZ fdZ fdZd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z# fdZ$d  Z% xZ&S )!r,   a7  Wraps the built-in `list` to support restore-on-create for variables.

  Unlike `List`, this sequence type is mutable in the same ways built-in lists
  are. Instead of throwing an error immediately like `List`, it records
  problematic mutations (e.g. assigning a new element to a position already
  occupied, meaning both elements get the same names at different times) and
  refuses to save.

  On assignment to an attribute of a Model or Trackable object, Python
  lists are replaced with ListWrapper. Wrapping a list in a
  `NoDependency` object prevents this.
  c                 t    d| _         d| _        t        |   |       t	        | j
                        | _        y)ab  Construct a new list wrapper.

    Args:
      wrapped_list: The initial value of the data structure. A shallow copy may
        be maintained for error checking. `wrapped_list` itself should not be
        modified directly after constructing the `ListWrapper`, and if changes
        are detected the `ListWrapper` will throw an exception on save.
    FN)_non_append_mutation_value_external_modification_valuer   r   r$   r   _last_wrapped_list_snapshot)r   wrapped_listr   s     r   r   zListWrapper.__init__  s3     ',D#(-D%	G\"'+DMM':D$r   c                     | j                   S r   )r   r<   s    r   _non_append_mutationz ListWrapper._non_append_mutation  s    ***r   c                 F    | j                   j                          || _        y r   )rG   invalidate_allr   r   s     r   r   z ListWrapper._non_append_mutation  s     	++-&+D#r   c                     | j                   S r   )r   r<   s    r   _external_modificationz"ListWrapper._external_modification  s    ,,,r   c                 F    | j                   j                          || _        y r   )rG   r   r   r   s     r   r   z"ListWrapper._external_modification  s     	++-(-D%r   c                 h    t         |          }| j                  |_        | j                  |_        |S r   )r   r   r   r   )r   copiedr   s     r   r   zListWrapper.__copy__   s1    WF"&";";F$($?$?F!Mr   c                 j    t         |   |      }| j                  |_        | j                  |_        |S r   )r   r   r   r   )r   r   r   r   s      r   r   zListWrapper.__deepcopy__  s3    W!$'F"&";";F$($?$?F!Mr   c                 4    | j                   | j                  ffS r   )r   r   r   protocols     r   __reduce_ex__zListWrapper.__reduce_ex__  s    NN]] r   c                     |S )z)Use the user's original list for storage.r   )r   r   s     r   r   zListWrapper._make_storage  s    r   c                     | j                   s| j                  ry| j                  | j                  k7  rd| _         d| _        yy)zCChecks for any changes to the wrapped list not through the wrapper.NT)r   r   r   r   r<   s    r   _check_external_modificationz(ListWrapper._check_external_modification  s=    ""d&?&?}}888$(d!)-d& 9r   c                     | j                   j                          | j                  s| j                  ryt	        | j
                        | _        y)z1Acknowledges tracked changes to the wrapped list.N)rG   r   r   r   r$   r   r   r<   s    r   _update_snapshotzListWrapper._update_snapshot  s;    
 	++-""d&?&?'+DMM':D$r   c           	         | j                          | j                  rt        d|  d      | j                  r)t        d|  d| j                   d| j
                   d      t        |   |fi |}|t        j                  j                  k(  rB|j                  t        |       D ci c]  \  }}t        |      rt        |      | c}}       |S c c}}w )NUnable to save the object a   (a list wrapper constructed to track trackable TensorFlow objects). A list element was replaced (__setitem__, __setslice__), deleted (__delitem__, __delslice__), or moved (sort). In order to support restoration on object creation, tracking is exclusively for append-only data structures.

If you don't need this list checkpointed, wrap it in a non-trackable object; it will be subsequently ignored.z (a list wrapper constructed to track trackable TensorFlow objects). The wrapped list was modified outside the wrapper (its final value was 7, its value when a checkpoint dependency was added was z), which breaks restoration on object creation.

If you don't need this list checkpointed, wrap it in a NoDependency object; it will be subsequently ignored.)r   r   r   r   r   r   r   _trackable_childrenr   SaveType
SAVEDMODELupdater   _is_functionstrr   	save_typer   childrenr   r   r   s         r   r   zListWrapper._trackable_children'  s    %%'  &tf -C CD D ""&tf -66:mm_ E9--. /"	"# # w*9??HDMM,,,oo%dOc5%  c(E/ 	 Os   (!C
c                 T    | j                   ryt        d | j                  D              S )zDShort-circuits a check for trackables if there's already a mutation.Tc              3   P   K   | ]  }t        |t        j                           y wr   )r   r   r   ).0r(   s     r   	<genexpr>z9ListWrapper._has_mutation_or_trackable.<locals>.<genexpr>L  s     Pwz'4>>2Ps   $&)r   anyr   r<   s    r   _has_mutation_or_trackablez&ListWrapper._has_mutation_or_trackableH  s#      P$--PPPr   c                     | j                          | j                         rd| _        | j                  |= | j	                          y rA   )r   r  r   r   r   r   s     r   __delitem__zListWrapper.__delitem__N  s:    %%'&&("&dcr   c                    | j                          t        |t              rt        | j                        }|| j                  |<   t        |      }t        | j                        }t        t        ||            D ]  }||k  r| j                  |   nd }||k  r||   nd }t        |t        j                        rd| _
        |I||k7  sO| j                  | j                  |   | j                  |            | j                  |<    n\t        | j                  |   t        j                        rd| _
        | j                  || j                  |            | j                  |<   | j                          y rA   )r   r   r   r$   r   r   r   maxr   r   r   rU   r   r   )	r   r   r   storage_copy
len_beforelen_nowr   	value_nowvalue_befores	            r   __setitem__zListWrapper.__setitem__U  s;   %%'#u $--(l dmmC|$jDMM"gSW-. 	F!()GDMM!$	*+j.|AdlDNN3&*$
# Y,%>!..t}}Q/?/3/A/A!/DF$--
	F 
DMM#&	7$(!,,UD4F4Fs4KLdmmCr   c                 d    | j                          t        | 	  |       | j                          yr   )r   r   rP   r   )r   r   r   s     r   rP   zListWrapper.appends  s'    %%'	GN5r   c                 d    | j                          t        | 	  |       | j                          yr   )r   r   r   r   )r   r   r   s     r   r   zListWrapper.extendy  s'    %%'	GN6r   c                     |dk  rN| j                          | j                         rd| _        | xj                  |z  c_        | j	                          | S t
        |   |      S )Nr   T)r   r  r   r   r   r   r   )r   r   r   s     r   r   zListWrapper.__imul__  s[    Av
'')		(	(	*$(!
mmqm
k 7Ar   c                 6    | j                   t        |d|      k(  S r   r   r{   s     r   r}   zListWrapper.__eq__      ==GE:u===r   c                 6    | j                   t        |d|      k7  S r   r   r{   s     r   __ne__zListWrapper.__ne__  r  r   c                 6    | j                   t        |d|      k  S r   r   r{   s     r   __lt__zListWrapper.__lt__  r   r   c                 6    | j                   t        |d|      k  S r   r   r{   s     r   __le__zListWrapper.__le__  r  r   c                 6    | j                   t        |d|      kD  S r   r   r{   s     r   __gt__zListWrapper.__gt__  r   r   c                 6    | j                   t        |d|      k\  S r   r   r{   s     r   __ge__zListWrapper.__ge__  r  r   c                     t        d      )Nzunhashable type: 'ListWrapper'	TypeErrorr<   s    r   ry   zListWrapper.__hash__  s     4
55r   c                     | j                          | j                         st        |t        j                        rd| _        | j                  j                  ||       | j                          y rA   )	r   r  r   r   r   r   r   insertr   )r   r   r]   s      r   r#  zListWrapper.insert  sO    %%''')ZT^^-L"&dMM$r   c                     | j                          | j                         rd| _        | j                  j	                          | j                          y rA   )r   r  r   r   sortr   r<   s    r   r%  zListWrapper.sort  s>    %%'&&("&dMMr   c                 <    | j                  t        ||      |       y r   )r  r   )r   r   r   r   s       r   __setslice__zListWrapper.__setslice__  s    U1a[!$r   c                     | j                          | j                         rd| _        | j                  t	        ||      = | j                          y rA   )r   r  r   r   r   r   r   s      r   __delslice__zListWrapper.__delslice__  s@    %%'&&("&deAqk"r   c                 h    	 t         |   ||      }|S # t        $ r t        | ||      }Y |S w xY w(Allows storage of non-trackable objects.r   r0   rM   r   rU   r   r5   r   r   r0   r   s      r   rU   zListWrapper._track_value  L    2g"T":e L  2 *D2eL2    11c                 4    dt        | j                        dS )NzListWrapper(r   r   r<   s    r   r   zListWrapper.__repr__  s     $T]] 355r   )'r   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   
CHECKPOINTr   r  r  r  rP   r   r   r}   r  r  r  r  r  ry   r#  r%  r'  r)  rU   r   r   r   s   @r   r,   r,     s    
;" + + 	, 	, - -   . !..; +/--*B*B BQ<
>>=>=>6
%	6r   r,   c                   n     e Zd ZdZ fdZd Zd Zd Zed        Z	d Z
d Zd	 Zd
 Zd Zd Zd Z xZS )MappingzAn append-only trackable mapping data structure with string keys.

  Maintains checkpoint dependencies on its contents (which must also be
  trackable), named based on its keys.

  Note that once a key has been added, it may not be deleted or replaced.
  c                 *   t         |            | j                  |i || _        | j                  j	                  | j                  j                         D ci c](  \  }}|| j                  || j                  |            * c}}       yc c}}w )z;Construct a new sequence. Arguments are passed to `dict()`.r   N)r   r   r   r   r   itemsrU   r   )r   r   r   r   r   r   s        r   r   zMapping.__init__  s    	G&D&&77DMMM  ==..0	2S% 
d**3/   1 
1 	23	2s   -B
c                 ^     t        |       t        j                  | j                              S r   r   r<   s    r   r   zMapping.__copy__  r   r   c                 `     t        |       t        j                  | j                  |            S r   r   r   s     r   r   zMapping.__deepcopy__  r   r   c                     t        |i |S r   )r!   r   s      r   r   zMapping._make_storage  s       r   c                 j    t        t        t        | j                         d              }|r|d   S g S )r   c                     | d   S Nr   r   its    r   <lambda>z!Mapping._values.<locals>.<lambda>  
    BqE r   r   r   r$   zipsortedr7  r   ordereds     r   rX   zMapping._values  3     3tzz|1ABCDGQZIr   c                 h    t        |t              st        dt        |       d      t        |      S )Nz0Mapping accepts only string keys, but got a key .)r   r   r!  r   r   s     r   r   zMapping._name_element  s4    c3<T#YKq
IK Ks8Or   c                     | j                  |      }| j                  ||      }| j                  j                  ||      }||urt	        d| d| d|       y )Nr   zHMappings are an append-only data structure. Tried to overwrite the key 'z' with value z, but it already contains )r   rU   r   
setdefaultr   )r   r   r   r0   current_values        r   r  zMapping.__setitem__  st    c"De$/EMM,,S%8ME!mE7*DO  "r   c                 P    t        |i |j                         D ]
  \  }}|| |<    y r   r!   r7  r   r   r   r   r   s        r   r   zMapping.update  1    D+F+113 
Ud3ir   c                      | j                   |   S r   r   r   s     r   r   zMapping.__getitem__  r   r   c                 ,    t        | j                        S r   r   r<   s    r   r   zMapping.__len__  r   r   c                 4    dt        | j                        dS )NzMapping(r   r   r<   s    r   r   zMapping.__repr__  s     /11r   c                 ,    t        | j                        S r   )iterr   r<   s    r   __iter__zMapping.__iter__
  s    r   )r   r   r   r   r   r   r   r   r~   rX   r   r  r   r   r   r   rW  r   r   s   @r   r5  r5    sS    30:!  2r   r5  c                        e Zd ZdZddZd Z fdZd Zd Zd Z	e
d        Zej                  j                  f fd		Ze
d
        Zd Zd Z fdZd Zd Zd Zd Zd Zd Zd Z xZS )r+   aS  Wraps built-in dicts to support restore-on-create for variables.

  _DictWrapper is to Mapping as ListWrapper is to List. Unlike Mapping,
  _DictWrapper allows non-string keys and values and arbitrary mutations (delete
  keys, reassign values). Like ListWrapper, these mutations mean that
  _DictWrapper will raise an exception on save.
  c                    |i }t        |t        j                        st        |      }t        j
                  j                  | |       t        j                  |        d| _        d| _	        | j                  j                  | j                  j                         D ci c](  \  }}|| j                  || j                  |            * c}}       | j                          y c c}}w )NFr   )r   r
   r5  r!   r   ObjectProxyr   r?   _self_non_string_key_self_external_modification__wrapped__r   r7  rU   r   r   )r   wrapped_dictr   r   s       r   r   z_DictWrapper.__init__  s    llO$;$;<,'l	t\2##D) %D',D$  ++113	5S% 
d**3/   1 
1 	56 		5s   -C%
c                 4    | j                   | j                  ffS r   r   r]  r   s     r   r   z_DictWrapper.__reduce_ex__(      NN! !r   c                     t        t        |       |      r9t        t        t        |       |      t              rt
        j                  | |      S 	 t        |   |      S # t        $ r}t        |d }~ww xY wr   )
rQ   r    r   rR   r~   object__getattribute__r   r!  AttributeError)r   r0   er   s      r   rd  z_DictWrapper.__getattribute__,  sh    T
D!wtDz40(;
 $$T400
$w'-- $!#$s   A   	A5)A00A5c                 ,    t        j                   |       S r   r   r<   s    r   r   z_DictWrapper.copy=  s    99T?r   c                     t        t        j                  | j                              }| j                  |_        | j                  |_        |S r   )r+   r   r]  r\  r[  )r   r   s     r   r   z_DictWrapper.__copy__A  s<    $))D$4$456F)-)I)IF&"&";";FMr   c                     t        t        j                  | j                  |            }| j                  |_        | j
                  |_        |S r   )r+   r   r   r]  r\  r[  )r   r   r   s      r   r   z_DictWrapper.__deepcopy__G  s>    $--(8(8$?@F)-)I)IF&"&";";FMr   c                 j    t        t        t        | j                         d              }|r|d   S g S )r   c                     | d   S r=  r   r>  s    r   r@  z&_DictWrapper._values.<locals>.<lambda>R  rA  r   rB  r   rC  rF  s     r   rX   z_DictWrapper._valuesN  rH  r   c           	         | j                          | j                  rt        d|  d      | j                  rt        d|  d|  d| j                   d      | j
                  rJ t        |   |fi |}|t        j                  j                  k(  r?|j                  | j                         D ci c]  \  }}t        |      s|| c}}       |S c c}}w )zBCheck that the object is saveable before listing its dependencies.r   a,   (a dictionary wrapper constructed automatically on attribute assignment). The wrapped dictionary contains a non-string key which maps to a trackable object or mutable data structure.

If you don't need this dictionary checkpointed, wrap it in a non-trackable object; it will be subsequently ignored.z (a dictionary wrapper constructed automatically on attribute assignment). The wrapped dictionary was modified outside the wrapper (its final value was r   z), which breaks restoration on object creation.

If you don't need this dictionary checkpointed, wrap it in a non-trackable object; it will be subsequently ignored.)!_check_self_external_modificationr[  r   r\   _self_last_wrapped_dict_snapshot_dirtyr   r   r   r   r   r   r7  r   r   s         r   r   z _DictWrapper._trackable_childrenW  s    **,  &tf -5 56 6 ''&tf -??Cf E9223 4C	CD D {{?w*9??HDMM,,,oo(,


L*#uU8K3:
LN O Ms   1C
C
c                 6    | j                   xs | j                  S )zACheck if there has already been a mutation which prevents saving.)r\  r[  r<   s    r   ro  z_DictWrapper._dirtyv  s      ,, )((*r   c                 Z    | j                   ry| | j                  k7  rd| _        d| _        yy)zCChecks for any changes to the wrapped dict not through the wrapper.NT)ro  rn  r\  r<   s    r   rm  z._DictWrapper._check_self_external_modification|  s/    {{t444)-d&.2d+ 5r   c                 r    | j                   j                          | j                  ryt        |       | _        y)z1Acknowledges tracked changes to the wrapped dict.N)rG   r   ro  r!   rn  r<   s    r   r   z_DictWrapper._update_snapshot  s*    ++-{{,0JD)r   c                     t        |t              rd}nd}d}	 t        |t              }t        |   ||      }|s	|sd| _        |S # t        $ r t        | ||      cY S w xY w)r,  Tz-non_string_keyFr-  rM   )r   r   r   r   rU   r[  r   r5   )r   r   r0   
string_keyno_dependencyr   s        r   rU   z_DictWrapper._track_value  sz    $jdj2 5mg"T":eM %)!l 2 )D2 22s   -A A"!A"c                     |S )z8Tells TrackableDataStructure to use keys as names as-is.r   r   s     r   r   z_DictWrapper._name_element  s    Jr   c                 F   | j                          | j                          t        |t              }t        |t              r| j                  ||      }n.t        |      }|s!t        |t        j                        rd| _	        || j                  |<   | j                          y)zEAllow any modifications, but possibly mark the wrapper as unsaveable.r   TN)rm  _maybe_initialize_trackabler   r   r   rU   r.   r   r   r[  r]  r   )r   r   r   no_deps       r   r  z_DictWrapper.__setitem__  s    **,$$&|,F#sC0eU#e
5$..9 %)!!DSr   c                 ^    | j                          | j                  |= | j                          y r   )rm  r]  r   r   s     r   r  z_DictWrapper.__delitem__  s(    **,r   c                 4    dt        | j                        dS )NzDictWrapper(r   r   r]  r<   s    r   r   z_DictWrapper.__repr__  s     $T%5%5 688r   c                     t        d      )Nzunhashable type: 'DictWrapper'r   r<   s    r   ry   z_DictWrapper.__hash__  s    
4
55r   c                      | j                   |k(  S r   r]  r{   s     r   r}   z_DictWrapper.__eq__       u$$r   c                 P    t        |i |j                         D ]
  \  }}|| |<    y r   rO  rP  s        r   r   z_DictWrapper.update  rQ  r   r   )r   r   r   r   r   r   rd  r   r   r   r~   rX   r   r   r3  r   ro  rm  r   rU   r   r  r  r   ry   r}   r   r   r   s   @r   r+   r+     s    "!$"   +/--*B*B > * *
372*$
96%
r   r+   c                        e Zd ZdZddZed        Z fdZd Zd Z	d Z
d Zd	 Zed
        Zd Zd Zd Zej$                  j&                  f fd	Z fdZ xZS )r-   z-Trackable wrapper for tuples and namedtuples.c           
      6   g }g }|D ]O  }t        |t              r|j                  d       n|j                  d       |j                  t        |             Q 	 |j                  }d}t        |      }d| _        |r	  |di t        t        |            }n ||      }t        j                  j                  | |       t        j                  |        |r,t        ||      D ]  \  }}	}|	s
| j                  ||        t!        t        ||            D ]"  \  }
\  }	}|	s| j                  |d|
fz         $ y # t
        $ r d}Y w xY w# t        $ r? t        j                  j                  | |       t        j                  |        d| _        Y y w xY w)NFTr   r   r   )r   r   rP   r.   _fieldsre  r    _self_tuple_is_constructabler!   rD  r!  r   rZ  r   r?   rU   r   )r   original_wrapped_tupler4   substituted_wrapped_tupler(   fieldsis_namedtupleoriginal_typer0   should_dependr   s              r   r   z_TupleWrapper.__init__  s   N ") @	G\	*e$d#&&~g'>?@%--f
 m/0M )-D%$1 %<3v89:%<! #00I"J	t%>?##D) +.
.";+= 0
&$w


G$

/0 ,5N56,8 9''w	'x89C  m  ""4)?@''-,1)	s%   D? =E ?EEAFFc                     | S r   r   r<   s    r   rX   z_TupleWrapper._values  r   r   c                 h    	 t         |   ||      }|S # t        $ r t        | ||      }Y |S w xY wr+  r.  r/  s      r   rU   z_TupleWrapper._track_value  r0  r1  c                 4    dt        | j                        dS )Nz_TupleWrapper(r   r|  r<   s    r   r   z_TupleWrapper.__repr__  s    "&t'7'7"8::r   c                 ,    t        | j                        S r   )hashr]  r<   s    r   ry   z_TupleWrapper.__hash__  s       !!r   c                      | j                   |k(  S r   r  r{   s     r   r}   z_TupleWrapper.__eq__  r  r   c                 R    t        t        j                  | j                              S r   )r-   r   r]  r<   s    r   r   z_TupleWrapper.__copy__  s    4#3#3455r   c                 T    t        t        j                  | j                  |            S r   )r-   r   r   r]  r   s     r   r   z_TupleWrapper.__deepcopy__  s    t'7'7>??r   c                 .    | j                   j                  S r   )r]  __dict__r<   s    r   r  z_TupleWrapper.__dict__"  s     $$$r   c                 4    | j                   | j                  ffS r   r`  r   s     r   r   z_TupleWrapper.__reduce_ex__-  ra  r   c                      | j                   |z  S )z:Avoid running self.__wrapped__ *= y, which mutates `self`.r  r   r   s     r   r   z_TupleWrapper.__imul__3      ar   c                      | j                   |z   S )z:Avoid running self.__wrapped__ += y, which mutates `self`.r  r  s     r   r   z_TupleWrapper.__iadd__7  r  r   c                     | j                   s0t        d| j                   d| j                  j                   d      t	        |   |fi |S )Nz&Unable to save because the namedtuple z` is not constructable from its _fields (i.e. __new__ is overridden). Expected keyword arguments zs. If you do not need to save this object, consider wrapping it in a custom object that does not inherit from tuple.)r  r   r]  r  r   r   )r   r   r   r   s      r   r   z!_TupleWrapper._trackable_children;  sa    ,,243C3C2D E((,(8(8(@(@'A B556 6 7&y;F;;r   c                     |dk7  r,t        | j                  |      rt        | j                  |      S t        t        |       |      r9t	        t        t        |       |      t
              rt        j                  | |      S t        |   |      S )Nr]  )	rQ   r]  rR   r    r   r~   rc  rd  r   )r   r0   r   s     r   rd  z_TupleWrapper.__getattribute__E  sw    })9)94!@ T%%t,,T
D!wtDz40(;
 $$T400W%d++r   )r   )r   r   r   r   r   r~   rX   rU   r   ry   r}   r   r   r  r   r   r   r   r   r3  r   rd  r   r   s   @r   r-   r-     s    5/9b  	;"
%
6@ % %!   +/--*B*B <, ,r   r-   c                 V    t        | t        j                  t        j                  f      S r   )r   r   FunctiondefunConcreteFunction)xs    r   r   r   V  s     	A--u/E/EF	GGr   c                     t        |      }t        |       |k  r$| j                  d gd|z   t        |       z
  z         || |<   y Nr   )intr   r   list_objectindex_stringr   
item_indexs       r   set_list_itemr  Z  sF    < *#vZ#k2B!BCD!+jr   c                     	 t        |      }t        |       |k  r$| j                  d gd|z   t        |       z
  z         || |<   y # t        $ r Y y w xY wr  )r  r   r   r   r  s       r   set_tuple_itemr  a  sa    \"J 	#vZ#k2B!BCD!+j 
 
s   A 	AA)(r   r"   r   r   r   ImportErrorthird_partytensorflow.python.eagerr   r   r  tensorflow.python.opsr   tensorflow.python.trackabler   r	   tensorflow.python.util.compatr
    tensorflow.python.util.tf_exportr   r   r&   r.   r5   r   r7   r   r?   Sequencer   MutableSequencer$   r,   r5  rZ  r+   r-   r   r  r  r   r   r   <module>r     sX       
%
 1 5 + , 3 9 6 60 'B/! 0!J >2F  G F'
 ' 9bAYT^^ Y BYxt?!?#;#; t?tD6##	D6NB$o&=&= BJz)5+<+< zzH,*E,=,= H,VH""W"  %$$%s   D D D 