o
    ?e/                     @   s   d 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 dd
lmZ edg dG dd deZdS )zManages a Checkpoint View.    N)trackable_object_graph_pb2)trackable_view)errors_impl)
tf_logging)base)py_checkpoint_reader)object_identity)	tf_exportztrain.CheckpointView)v1c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )CheckpointViewaa  Gathers and serializes a checkpoint view.

  This is for loading specific portions of a module from a
  checkpoint, and be able to compare two modules by matching components.

  Example usage:

  >>> class SimpleModule(tf.Module):
  ...   def __init__(self, name=None):
  ...     super().__init__(name=name)
  ...     self.a_var = tf.Variable(5.0)
  ...     self.b_var = tf.Variable(4.0)
  ...     self.vars = [tf.Variable(1.0), tf.Variable(2.0)]

  >>> root = SimpleModule(name="root")
  >>> root.leaf = SimpleModule(name="leaf")
  >>> ckpt = tf.train.Checkpoint(root)
  >>> save_path = ckpt.save('/tmp/tf_ckpts')
  >>> checkpoint_view = tf.train.CheckpointView(save_path)

  Pass `node_id=0` to `tf.train.CheckpointView.children()` to get the dictionary
  of all children directly linked to the checkpoint root.

  >>> for name, node_id in checkpoint_view.children(0).items():
  ...   print(f"- name: '{name}', node_id: {node_id}")
  - name: 'a_var', node_id: 1
  - name: 'b_var', node_id: 2
  - name: 'vars', node_id: 3
  - name: 'leaf', node_id: 4
  - name: 'root', node_id: 0
  - name: 'save_counter', node_id: 5

  c              
   C   sl   t |}z|tj}W n tjy' } ztd| dtj d|d}~ww t	 }|
| || _dS )zConfigure the checkpoint view.

    Args:
      save_path: The path to the checkpoint.

    Raises:
      ValueError: If the save_path does not lead to a TF2 checkpoint.
    zThe specified checkpoint "zS" does not appear to be object-based (saved with TF2) since it is missing the key "zg". Likely it was created with the TF1 name-based saver and does not contain an object dependency graph.N)r   ZNewCheckpointReaderZ
get_tensorr   ZOBJECT_GRAPH_PROTO_KEYr   ZNotFoundError
ValueErrorr   ZTrackableObjectGraphZParseFromString_object_graph_proto)selfZ	save_pathreaderZobject_graph_stringZnot_found_errorZobject_graph_proto r   m/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/checkpoint/checkpoint_view.py__init__@   s    



zCheckpointView.__init__c                 C   s   dd | j j| jD S )zReturns all child trackables attached to obj.

    Args:
      node_id: Id of the node to return its children.

    Returns:
      Dictionary of all children attached to the object with name to node_id.
    c                 S   s   i | ]}|j |jqS r   )
local_namenode_id).0childr   r   r   
<dictcomp>a   s    z+CheckpointView.children.<locals>.<dictcomp>)r   nodeschildren)r   r   r   r   r   r   X   s   	zCheckpointView.childrenc                 C   s   t |   S )z8Returns a list of trackables by node_id attached to obj.)list_descendants_with_pathskeys)r   r   r   r   descendantsf   s   zCheckpointView.descendantsc                 C   s   i }t dg}d|d< |d}|rN| }| jj| }|jD ]+}|jdks.|j| v r/q ||}|j| vrA|	|j |d |j
 ||j< q |s|S )zReturns a dict of descendants by node_id and paths to node.

    The names returned by this private method are subject to change.
    r   root.)collectionsdequegetpopleftr   r   r   r   r   appendr   )r   Zall_nodes_with_pathsto_visitpathr   objr   r   r   r   r   k   s    



z&CheckpointView._descendants_with_pathsc                 C   s
  t |tjstd| dt| di }||d< td|fg}t }t	|}|r|
 \}}||}| | D ]>\}	}
|
|v sI|
dkrJq=|	|v r{||
}|du rg||	 ||
< ||
||	 f q=|||	 ur{td| d||	  d q=|| |s+|S )	a>  Returns all matching trackables between CheckpointView and Trackable.

    Matching trackables represents trackables with the same name and position in
    graph.

    Args:
      obj: `Trackable` root.

    Returns:
      Dictionary containing all overlapping trackables that maps `node_id` to
      `Trackable`.

    Example usage:

    >>> class SimpleModule(tf.Module):
    ...   def __init__(self, name=None):
    ...     super().__init__(name=name)
    ...     self.a_var = tf.Variable(5.0)
    ...     self.b_var = tf.Variable(4.0)
    ...     self.vars = [tf.Variable(1.0), tf.Variable(2.0)]

    >>> root = SimpleModule(name="root")
    >>> leaf = root.leaf = SimpleModule(name="leaf")
    >>> leaf.leaf3 = tf.Variable(6.0, name="leaf3")
    >>> leaf.leaf4 = tf.Variable(7.0, name="leaf4")
    >>> ckpt = tf.train.Checkpoint(root)
    >>> save_path = ckpt.save('/tmp/tf_ckpts')
    >>> checkpoint_view = tf.train.CheckpointView(save_path)

    >>> root2 = SimpleModule(name="root")
    >>> leaf2 = root2.leaf2 = SimpleModule(name="leaf2")
    >>> leaf2.leaf3 = tf.Variable(6.0)
    >>> leaf2.leaf4 = tf.Variable(7.0)

    Pass `node_id=0` to `tf.train.CheckpointView.children()` to get the
    dictionary of all children directly linked to the checkpoint root.

    >>> checkpoint_view_match = checkpoint_view.match(root2).items()
    >>> for item in checkpoint_view_match:
    ...   print(item)
    (0, ...)
    (1, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=5.0>)
    (2, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=4.0>)
    (3, ListWrapper([<tf.Variable 'Variable:0' shape=() dtype=float32,
    numpy=1.0>, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>]))
    (6, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>)
    (7, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>)

    zExpected a Trackable, got z	 of type r   r   NzjInconsistent references when matching the checkpoint into this object graph. The referenced objects are: (z and z).)
isinstancer   Z	Trackabler   typer    r!   setr   TrackableViewr#   r   itemsr"   r$   loggingwarningadd)r   r'   overlapping_nodesr%   visitedviewZcurrent_node_idZcurrent_trackableZtrackable_childrenZ
child_nameZchild_node_idZcurrent_assignmentr   r   r   match   s<   2



zCheckpointView.matchc                 C   sp   |  |}g }g }|  D ]}|| vr|| qt| D ]}|t| vr2|| q"|||fS )a:  Returns diff between CheckpointView and Trackable.

    This method is intended to be used to compare the object stored in a
    checkpoint vs a live model in Python. For example, if checkpoint
    restoration fails the `assert_consumed()` or
    `assert_existing_objects_matched()` checks, you can use this to list out
    the objects/checkpoint nodes which were not restored.

    Example Usage:

    >>> class SimpleModule(tf.Module):
    ...   def __init__(self, name=None):
    ...     super().__init__(name=name)
    ...     self.a_var = tf.Variable(5.0)
    ...     self.b_var = tf.Variable(4.0)
    ...     self.vars = [tf.Variable(1.0), tf.Variable(2.0)]

    >>> root = SimpleModule(name="root")
    >>> leaf = root.leaf = SimpleModule(name="leaf")
    >>> leaf.leaf3 = tf.Variable(6.0, name="leaf3")
    >>> leaf.leaf4 = tf.Variable(7.0, name="leaf4")
    >>> ckpt = tf.train.Checkpoint(root)
    >>> save_path = ckpt.save('/tmp/tf_ckpts')
    >>> checkpoint_view = tf.train.CheckpointView(save_path)

    >>> root2 = SimpleModule(name="root")
    >>> leaf2 = root2.leaf2 = SimpleModule(name="leaf2")
    >>> leaf2.leaf3 = tf.Variable(6.0)
    >>> leaf2.leaf4 = tf.Variable(7.0)

    Pass `node_id=0` to `tf.train.CheckpointView.children()` to get the
    dictionary of all children directly linked to the checkpoint root.

    >>> checkpoint_view_diff = checkpoint_view.diff(root2)
    >>> checkpoint_view_match = checkpoint_view_diff[0].items()
    >>> for item in checkpoint_view_match:
    ...   print(item)
    (0, ...)
    (1, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=5.0>)
    (2, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=4.0>)
    (3, ListWrapper([<tf.Variable 'Variable:0' shape=() dtype=float32,
    numpy=1.0>, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>]))
    (6, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>)
    (7, <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>)

    >>> only_in_checkpoint_view = checkpoint_view_diff[1]
    >>> print(only_in_checkpoint_view)
    [4, 5, 8, 9, 10, 11, 12, 13, 14]

    >>> only_in_trackable = checkpoint_view_diff[2]
    >>> print(only_in_trackable)
    [..., <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=5.0>,
    <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=4.0>,
    ListWrapper([<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>,
    <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>]),
    <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=6.0>,
    <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=7.0>,
    <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=1.0>,
    <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>]

    Args:
      obj: `Trackable` root.

    Returns:
      Tuple of (
      - Overlaps: Dictionary containing all overlapping trackables that maps
      `node_id` to `Trackable`, same as CheckpointView.match().
      - Only in CheckpointView: List of `node_id` that only exist in
      CheckpointView.
      - Only in Trackable: List of `Trackable` that only exist in Trackable.
      )

    )	r3   r   r   r$   r   r+   r   ZObjectIdentitySetvalues)r   r'   r0   Zonly_in_checkpoint_viewZonly_in_trackabler   Z	trackabler   r   r   diff   s   
K


zCheckpointView.diffN)
__name__
__module____qualname____doc__r   r   r   r   r3   r5   r   r   r   r   r      s    "Vr   )r9   r    Ztensorflow.core.protobufr   Ztensorflow.python.checkpointr   Ztensorflow.python.frameworkr   Ztensorflow.python.platformr   r-   Ztensorflow.python.trackabler   Ztensorflow.python.trainingr   Ztensorflow.python.utilr   Z tensorflow.python.util.tf_exportr	   objectr   r   r   r   r   <module>   s    
