o
    ?e.9                     @   s8  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%dg dZ&dee& deee& ee& e
e'ee& f f fddZ(dej)deej*ej*f deee& e
ej*e+f f fddZ,dee& dej-fddZ.d ee& d!e
ej*e+f d"e	ed#ef df d$e	e
ej*e/f df d%ej-de
ej*ef fd&d'Z0de&d!e
ej*e+f d"ed#ef d%ej-deej*e
e'ef f f
d(d)Z1de&d"e	ed#ef df d%ej-de
e'ef fd*d+Z2	d4d,ee& d$e	e
ej*ef df dee
ej*ef e
ej*ef f fd-d.Z3d/e
e'ee& f d%ej-de
e'e
e'ej*f f fd0d1Z4			d5dej)deeej*ej*f  d"eed#ef  d$ee
ej*ef  dd#f
d2d3Z5dS )6zExtracts 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                 C   sj   g }g }t t}| D ]$}t|j}t|jtjr |	| q|r*|| 	| q|	| q|||fS )z@Splits Trackables into 3 categories (tensor/pystate/registered).)
collectionsdefaultdictlistr   Zget_registered_saver_namer    
isinstancer   ZPythonStateappend)r!   tensor_trackablespystate_trackablesregistered_trackablestd
saver_name r-   g/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/checkpoint/save_util.py_split_trackables>   s   

r/   r   
object_mapc                 C   s   |   \}}t }| D ]\}}t|||< qt }t|D ]\}}	|||	< q"tj|||d}
g }|D ]5}g }| 	|D ]}|
tjjj||j |jd q@|
t||| || ||
|g t||d q7||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    )Zbreadth_first_traversalr   ObjectIdentityDictionaryitemsr   Zobject_path_to_string	enumerater   Zserialize_slot_variablesZlist_childrenr'   r
   TrackableObjectGraphZTrackableObjectZObjectReferencerefnamer   getZget_mapped_trackable)r   r0   r1   Z
node_pathsr3   objpathr2   r   nodeslot_variablesr!   r   r   childr-   r-   r.   _gather_trackable_dataS   s>   




rA   c                 C   s@   t  }t| D ]\}}|j|ksJ |jj|j|jd q|S )z@Name non-slot `Trackable`s and add them to `object_graph_proto`.)r?   children)r
   r8   r7   r   nodesaddr   r   )r!   object_graph_protoZcheckpoint_idr+   r-   r-   r.   _fill_object_graph_protov   s   rF   r(   r2   call_with_mapped_captures.cacherE   c                 C   s   t  }| D ]_}|dur(|j|v r(||j \}}}	|||< |j|j j|	 qt|jp/d}
t	
|jr8|
rBt||||\}}n	t|||}|j}|||< |dure|j|vre|||j|j jf||j< q|S )zCCreates dictionary of tensors to checkpoint, and updates the proto.N )r   r5   r    rC   r   
attributesZ	MergeFromr   Zget_saveable_namer   Z!trackable_has_serialize_to_tensor!_get_tensors_from_legacy_saveable_get_tensors_from_trackable)r(   r2   rG   rH   rE   serialized_tensorsr+   r   tensor_dictobject_protoZlegacy_namer-   r-   r.   #_get_and_write_tensors_to_serialize   s6   


rP   c           
      C   sl   t  }| j|| j< t  }| j|| j< t||\}}tj|||||dd\}}t	| j|}	|	|	
 fS )zGGets tensors to serialize from a Trackable with legacy SaveableObjects.N)Zsaveables_cache)r   r5   r   r   r    r   Z!get_checkpoint_factories_and_keysZgenerate_saveable_objectsr   ZSaveableCompatibilityConverter_serialize_to_tensors)
r!   r2   rG   rE   r3   r0   Zcheckpoint_factory_map_Znamed_saveable_objectsr   r-   r-   r.   rK      s*   		rK   c                 C   s   | j }|j}|rt|tjr||g }n| }i }| D ]4\}}t|}	t| j	|	}
|||
< t|t
jr=|
|_d|_|durQ|j| j jj|	|
t|d q|S )z+Gets tensors to serialize from a Trackable.rI   Nr:   checkpoint_keyZ	full_name)r    rQ   r&   r   ZConcreteFunctionr6   r   Zescape_local_namerT   r   saveable_object_libZSaveSpecr:   Z
slice_specrC   r   rJ   rD   r   get_full_name)r!   rG   rE   r   Zsave_fnZret_tensor_dictrN   Ztensor_nameZmaybe_tensorr4   rT   r-   r-   r.   rL      s2   

rL   r)   c           
   	   C   s   t  }i }| D ]q}|j}t|jtj}||v r"||j tj }n$t	d t
jdtjd}tj|i||< W d   n1 sAw   Y  t  | }	W d   n1 sYw   Y  |	||< ||i||< |j|j jjtj|t|d q||fS )z:Gets feed additions needed for checkpointing Python State.z/cpu:0rI   )ZdtypeNrS   )r   r5   r    r   rT   r   r   ZPYTHON_STATEr   Zdevicer   Zconstantr   stringZ
init_scope	serializerC   r   rJ   rD   r   rV   )
r)   rH   rE   rM   feed_additionsr+   r   rT   Zsave_stringvaluer-   r-   r.   %_get_and_write_pystate_feed_additions   s0   

r[   r*   c                 C   sX   t t}|  D ] \}}|D ]}|j|| |j< |j|j }||j_	|j|j_qq	|S )z@Generates dictionary of registered savers and updates the proto.)
r#   r$   dictr6   r    r   rC   r   Zregistered_saverr:   )r*   rE   registered_saversr,   Z
trackablesr+   rO   r-   r-   r.    _get_and_write_registered_savers  s   
r^   c                 C   s   t | |\}}t|\}}}t|}	t|||||	}
t||	}|du r1d}|
t|||||	 nt|||	\}}|
| t|	 |
|||	fS )zHGathers serialization objects, and creates a TrackableObjectGraph proto.N)	rA   r/   rF   rP   r^   updater[   r   Zadd_checkpoint_values_check)r   r0   rG   rH   r!   r2   r(   r)   r*   rE   rM   r]   rY   Znew_serialized_tensorsr-   r-   r.   serialize_graph_view$  sB   


r`   )N)NNN)6__doc__r#   typingr   r   r   r   r   r   r   r	   Ztensorflow.core.protobufr
   Ztensorflow.python.checkpointr   Zgraph_view_libr   r   r   Ztensorflow.python.frameworkr   r   r   Ztensorflow.python.saved_modelr   Ztensorflow.python.trackabler   r   r   Z!tensorflow.python.training.savingr   rU   r   Ztensorflow.python.typesr   Ztensorflow.python.utilr   
namedtupler   strr/   ZObjectGraphViewZ	TrackableintrA   r8   rF   anyrP   rK   rL   r[   r^   r`   r-   r-   r-   r.   <module>   s   (

#

*



)
"
