
    BVh.9                        d Z ddlZddlmZmZmZmZmZmZm	Z	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 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" ddl#m$Z$  ejJ                  dg d      Z&dee&   deee&   ee&   e
e'ee&   f   f   fdZ(dejR                  deejT                  ejT                  f   deee&   e
ejT                  e+f   f   fdZ,dee&   dejZ                  fdZ.dee&   de
ejT                  e+f   de	ed ef   df   d!e	e
ejT                  e/f   df   d"ejZ                  de
ejT                  ef   fd#Z0de&de
ejT                  e+f   ded ef   d"ejZ                  deejT                  e
e'ef   f   f
d$Z1de&de	ed ef   df   d"ejZ                  de
e'ef   fd%Z2	 d+d&ee&   d!e	e
ejT                  ef   df   dee
ejT                  ef   e
ejT                  ef   f   fd'Z3d(e
e'ee&   f   d"ejZ                  de
e'e
e'ejT                  f   f   fd)Z4	 	 	 d,dejR                  deeejT                  ejT                  f      deed ef      d!ee
ejT                  ef      dd f
d*Z5y)-zExtracts tensors for checkpointing while updating a TrackableObjectGraph.

The tensors are extracted from `Trackable._serialize_to_tensors`.
    N)AnyCallableListOptionalTupleMappingUnionDict)trackable_object_graph_pb2)
graph_view)save_util_v1)saveable_compat)util)constant_op)dtypes)ops)registration)base)python_state)trackable_utils)saveable_object)saveable_object_util)core)object_identity_TrackableData)	trackablenode_idobject_namechildren_protoslot_variable_protoobject_to_savetrackable_datareturnc                 N   g }g }t        j                  t              }| D ]  }t        j                  |j
                        }t        |j
                  t        j                        r|j                  |       X|r||   j                  |       o|j                  |        |||fS )z@Splits Trackables into 3 categories (tensor/pystate/registered).)
collectionsdefaultdictlistr   get_registered_saver_namer!   
isinstancer   PythonStateappend)r"   tensor_trackablespystate_trackablesregistered_trackablestd
saver_names         V/home/dcms/DCMS/lib/python3.12/site-packages/tensorflow/python/checkpoint/save_util.py_split_trackablesr2   >   s    
 %11$7 #b778I8IJJ"##\%=%=>#	J'..r2r"# 
.0E	EE    r   
object_mapc                    | j                         \  }}t        j                         }|j                         D ]  \  }}t	        j
                  |      ||<    t        j                         }t        |      D ]
  \  }}	|||	<    t        j                  |||      }
g }|D ]  }g }| j                  |      D ]S  }|j                  t        j                  j                  j                  ||j                     |j                                U |j                  t#        |||   ||   ||
j%                  |g       t        j&                  ||                    ||fS )zGReturns a list of generated TrackableData based on the ObjectGraphView.)trackable_objectsnode_idsobject_names)r   
local_name)r   r   r   r    r!   )breadth_first_traversalr   ObjectIdentityDictionaryitemsr   object_path_to_string	enumerater   serialize_slot_variableslist_childrenr+   r   TrackableObjectGraphTrackableObjectObjectReferencerefnamer   getget_mapped_trackable)r   r4   r6   
node_pathsr8   objpathr7   r   nodeslot_variablesr"   r   r   childs                  r1   _gather_trackable_datarN   S   ss   
 #-"D"D"FZ 99;,##% Dic4'==dCLD557( !23 mgtHTN00)!. .$ JiN)))4 3
$
9
9
I
I?8EII#6&+jj  233 .# +%*..y"=00JGI JJ 
	!!r3   c                     t        j                         }t        |       D ]G  \  }}|j                  |k(  sJ |j                  j                  |j                  |j                         I |S )z@Name non-slot `Trackable`s and add them to `object_graph_proto`.)rL   children)r   rA   r>   r   nodesaddr    r   )r"   object_graph_protocheckpoint_idr/   s       r1   _fill_object_graph_protorU   v   sq     2FFH$^4 $mR::&&&  --"" ! $$
 
r3   r,   r7   call_with_mapped_captures.cacherS   c                 h   t        j                         }| D ]  }|Y|j                  |v rK||j                     \  }}}	|||<   |j                  |j                     j
                  j                  |	       _t        j                  |j                        xs d}
t        j                  |j                        r|
rt        ||||      \  }}nt        |||      }|j                  }|||<   ||j                  |vs|||j                  |j                     j
                  f||j                  <    |S )zCCreates dictionary of tensors to checkpoint, and updates the proto. )r   r;   r!   rQ   r   
attributes	MergeFromr   get_saveable_namer   !trackable_has_serialize_to_tensor!_get_tensors_from_legacy_saveable_get_tensors_from_trackable)r,   r7   rV   rW   rS   serialized_tensorsr/   r   tensor_dictobject_protolegacy_names              r1   #_get_and_write_tensors_to_serializerd      sE    '??A ;bR..%7-223D3D-E*il&1#rzz*55??M!33B4E4EFL"K BB
  A
h13E Gi 0
');=k##i$/y!R..e;
[

"
"2::
.
9
9";eB/;6 
r3   c                    t        j                         }| j                  || j                  <   t        j                         }| j                  || j                  <   t        j                  ||      \  }}t        j                  |||||d      \  }}t        j                  | j                  |      }	|	|	j                         fS )zGGets tensors to serialize from a Trackable with legacy SaveableObjects.N)saveables_cache)r   r;   r   r   r!   r   !get_checkpoint_factories_and_keysgenerate_saveable_objectsr   SaveableCompatibilityConverter_serialize_to_tensors)
r"   r7   rV   rS   r8   r4   checkpoint_factory_map_named_saveable_objectsr   s
             r1   r^   r^      s     !99;,+9+E+E,~''(779*)7)F)F*^%%&*LLJ ! ,,
 



#  ! 99

'
')?A  
I335	55r3   c                    | j                   }|j                  }|r$t        |t        j                        r
 ||g       }n |       }i }|j                         D ]  \  }}t        j                  |      }	t        j                  | j                  |	      }
|||
<   t        |t        j                        r|
|_        d|_        |k|j                  | j                     j                   j#                  |	|
t%        j&                  |              |S )z+Gets tensors to serialize from a Trackable.rY   rE   checkpoint_key	full_name)r!   rj   r)   r   ConcreteFunctionr<   r   escape_local_namerp   r   saveable_object_libSaveSpecrE   
slice_specrQ   r   rZ   rR   r   get_full_name)r"   rV   rS   r   save_fnret_tensor_dictra   tensor_namemaybe_tensorr9   rp   s              r1   r_   r_      s
    ++)++'$//0/<OiO +#2#8#8#: 3k< 22;?J$33N4N4N4>@N".K , 3 < <=(l "l%~556AAEE'&&y1 F 33" 
r3   r-   c                    t        j                         }i }| D ]I  }|j                  }t        j                  |j
                  t        j                        }||v r!||j                     t        j                     }nXt        j                  d      5  t        j                  dt        j                        }t        j                  |i||<   ddd       t        j                         5  |j                         }	ddd       	|<   ||i||<   |j                   |j"                     j$                  j'                  t        j                  |t)        j*                  |             L ||fS # 1 sw Y   xY w# 1 sw Y   ~xY w)z:Gets feed additions needed for checkpointing Python State.z/cpu:0rY   )dtypeNro   )r   r;   r!   r   rp   r   r   PYTHON_STATEr   devicer   constantr   string
init_scope	serializerQ   r   rZ   rR   r   rw   )
r-   rW   rS   r`   feed_additionsr/   r   rp   save_stringvalues
             r1   %_get_and_write_pystate_feed_additionsr      s]    '??A. 1b!!I$33BNN4@4M4MONE"++,\-F-FGk::h D!**2V]]C(55{CiD 
	 $!!#e$"'N;%3[$Ay!RZZ(3377&&%$$Y/ 8 1!1* 
^	++D D$ $s   ;E*(E6*E3	6E?	r.   c                 8   t        j                  t              }| j                         D ]m  \  }}|D ]c  }|j                  ||   |j
                  <   |j                  |j                     }||j                  _	        |j
                  |j                  _        e o |S )z@Generates dictionary of registered savers and updates the proto.)
r%   r&   dictr<   r!   r   rQ   r   registered_saverrE   )r.   rS   registered_saversr0   
trackablesr/   rb   s          r1    _get_and_write_registered_saversr     s    
 "--d3 5 ; ; = Aj* A686G6G
#BNN3'--bjj9l+5l##(24..l##/AA 
r3   c           	      H   t        | |      \  }}t        |      \  }}}t        |      }	t        |||||	      }
t	        ||	      }|!d}|
j                  t        |||||	             n!t        |||	      \  }}|
j                  |       t        j                  |	       |
|||	fS )zHGathers serialization objects, and creates a TrackableObjectGraph proto.N)	rN   r2   rU   rd   r   updater   r   add_checkpoint_values_check)r   r4   rV   rW   r"   r7   r,   r-   r.   rS   r`   r   r   new_serialized_tensorss                 r1   serialize_graph_viewr   $  s     4J
K.(' ?')> 0?: 7/1 ]NA!  	..@.3.@	B +N 45 ""#56
n.?

 r3   )N)NNN)6__doc__r%   typingr   r   r   r   r   r   r	   r
   tensorflow.core.protobufr   tensorflow.python.checkpointr   graph_view_libr   r   r   tensorflow.python.frameworkr   r   r   tensorflow.python.saved_modelr   tensorflow.python.trackabler   r   r   !tensorflow.python.training.savingr   rt   r   tensorflow.python.typesr   tensorflow.python.utilr   
namedtupler   strr2   ObjectGraphView	TrackableintrN   rA   rU   anyrd   r^   r_   r   r   r    r3   r1   <module>r      s    M M M ? E 5 8 - 3 . + 6 , 4 7 T B ( 2 (''(8 ; *F(F
4n!5T.))*+ ,F* ".. "67 " 4dnnc&9!::; "F
(
44
'N+'4>>3&''  %Xc3h%7%=>' dnnc)*D01	'
 3GG' 
$..#
'T6"64>>3&'6  (S16 3GG	6
 4>>4S>)*6<#"#$Xc3h%7%=># 3GG# 
#s(^	#R ,^,,dnnc)*D01, 4#$d4>>3+>&??@	,DT.%9 9:2GG 
#tC'(
()& EI>B15	3..3!?@A3  (c(:;3 D,-.	3 ;>	3r3   