
    ȅi              
          S SK JrJrJrJr  S SKJrJrJr  S SK	r	S SK
Jr  S SKJr  S SKJr  \\\4   r\\S4   r\" S5      r\r\\\4   r/ S	QrS
\S\4S jr\4S\S\\\/S4   S\\/\4   SS4S jjr\4S\S\\\/S4   S\\/\4   SS4S jjrS\S\S
\SS4S jr SS\S\S\S-  S\S-  4S jjrS\ 4S
\S\S\\/S4   SS4S jjr!\ 4S\S
\S\\/S4   SS4S jjr"g)    )Callable
CollectionMappingMutableMapping)castTypeVarUnionN)ShardedTensor)STATE_DICT_TYPE)DTensor.T)traverse_state_dictset_elementget_elementprint_tensorvaluereturnc                 6    [        U [        R                  5      $ N)
isinstancetorchTensor)r   s    `/home/james-whalen/.local/lib/python3.13/site-packages/torch/distributed/checkpoint/_traverse.py_keep_visiting_tensorsr      s    eU\\**    
state_dictvisitorkeep_traversingc                    ^^^^ S[         S[        4UU4S jjmS[        S[         SS4UUU4S jjmU R                  5        H  u  p4T" [	        U5      4U5        M     g)a  
Invoke ``visitor`` for each value recursively in ``state_dict``.
Mapping will be traversed and ``visitor`` will be applied to the leaf elements.
``visitor`` will only be applied to elements in a list or a tuple, if the
container contains tensors or mappings.
r   r   c                    > [        U [        5      (       a  g[        U [        5      (       a  U nOgU HA  n[        U[        [        45      (       a  T" U5      (       d    gTc  M2  T" U5      (       d  MA    g   g)NFT)r   r   listr   valuesentry_is_terminalr   s      r   r%   )traverse_state_dict.<locals>._is_terminal&   sh    eW%%t$$FE%'411,u:M:M*u/E/E	 
 r   pathNc                 4  > [        U[        5      (       a0  UR                  5        H  u  p#T" U [        U5      4-   U5        M     g T" U5      (       a	  T" X5        g [        U[        [
        45      (       a!  [        U5       H  u  pCT" X4-   U5        M     g g r   )r   r   itemsstrr!   tuple	enumerater'   r   kvir%   _traverse_objr   s        r   r1   *traverse_state_dict.<locals>._traverse_obj6   s    eW%%dc!fY.2 &%  D e}--!%(dTk1- ) .r   STATE_DICT_ITEMboolOBJ_PATHr)   r*   r   r   r   keyr   r%   r1   s    ``  @@r   r   r      sa    O    .H ._ . . . !&&(
s3xk5) )r   c                    ^^^^ S[         S[        4UU4S jjmS[        S[         SS4UUU4S jjmU R                  5        H  u  p4T" [	        U5      4U5        M     g)a$  
Traversal is short-circuited when if finds a collection for which ``keep_visiting_tensors`` evaluates
to false for all elements.
By default, all collections with at least one ``torch.Tensor`` element are traversed.
Visitor takes a path argument that is a tuple of the keys used to reach it.
r   r   c                   > [        U [        5      (       a  U R                  5       nO[        U [        5      (       a  U nOgU HA  n[        U[        [        45      (       a  T" U5      (       d    gTc  M2  T" U5      (       d  MA    g   g)NTF)r   r   r#   r!   r"   s      r   r%   /traverse_state_dict_v_2_3.<locals>._is_terminalQ   sp    eW%%\\^Ft$$FE%'411,u:M:M*u/E/E	 
 r   r'   Nc                 (  > T" U5      (       a	  T" X5        g [        U[        5      (       a0  UR                  5        H  u  p#T" U [        U5      4-   U5        M     g [        U[        5      (       a!  [        U5       H  u  pCT" X4-   U5        M     g g r   )r   r   r)   r*   r!   r,   r-   s        r   r1   0traverse_state_dict_v_2_3.<locals>._traverse_obja   s{    D w''dc!fY.2 &t$$!%(dTk1- ) %r   r3   r7   s    ``  @@r   traverse_state_dict_v_2_3r>   D   sa    O    .H ._ . . . !&&(
s3xk5) )r   	root_dictr'   c                    [        [        U 5      nS[        [           S[        SS4S jn[        S[        U5      5       H}  nXS-
     nX   n[        [        [        U5      [        L a  0 O/ 5      n[        U[        5      (       a!  [        [        UR                  Xh5      5      nMh  U" X65        X6   c  XU'   X6   nM     US   n[        U5      [        L a  U" [        [        [           U5      U5        X#U'   g)z>Set ``value`` in ``root_dict`` along the ``path`` object path.lstidxr   Nc                 h    [        U 5      U::  a#  U R                  S 5        [        U 5      U::  a  M"  g g r   )lenappend)rA   rB   s     r   extend_list set_element.<locals>.extend_listu   s&    #h#oJJt #h#or      )r   CONTAINER_TYPEr!   r4   intrangerD   typer*   r   r   
setdefault)	r?   r'   r   cur_containerrF   r0   prev_keyr8   def_vals	            r   r   r   o   s     3Mo. S T  1c$i A;gd3i3.>BGmW--  8 8 KM
 0&.*1h')3M !  r(CCyCDo.>D#r   default_valuec                 0   [        [        U 5      nU Hn  n[        U5      [        L a)  [	        U[
        5      (       a  [        U5      U:  a  Us  $ O[	        U[        5      (       a  XC;  a  Us  $ [        [        X4   5      nMp     [        [        S-  U5      $ )z[Retrieve the value at ``path``from ``root_dict``, returning ``default_value`` if not found.N)	r   rJ   rM   rK   r   r!   rD   r   r   )r?   r'   rR   	cur_valueparts        r   r   r      s     ^Y/I:i..#i.42G$$ 3HIw//43H  9	  D)$$r    prefix	print_func                    [        U 5      [        L a_  U" U SU R                  5        35        U R                  5        H/  n[	        UR
                  UR                  R                   S3US9  M1     g [        U 5      [        L a0  U" U SU R                  5        35        [	        U R                  US9  g [        U [        R                  5      (       a  U" U SU R                  5        35        g U" U S[        U 5       35        g )Nz ShardedTensor size:  )rX   z DistributedTensor size: z Tensor size: z Type: )rM   r
   sizelocal_shards_print_nestedtensormetadatashard_offsetsr   _local_tensorr   r   r   )r   rW   rX   shards       r   r]   r]      s    
 E{m#VH1%**,@A'')E>>//02# * 
e	!VH5ejjl^DE	
 
E5<<	(	(VHN5::<.9:VHGDK=12r   c                 ,    [        U[        U 5      US9  g)z
Use this callback with traverse_state_dict to print its content.

By default the content is printed using the builtin ``print`` but this can
be change by passing a different ``print_fun` callable.
)rW   rX   N)r]   r*   )r'   r   rX   s      r   r   r      s     %D	Y?r   r   )#collections.abcr   r   r   r   typingr   r   r	   r   +torch.distributed._shard.sharded_tensor.apir
   %torch.distributed.checkpoint.metadatar   torch.distributed.tensorr   r*   rK   	PATH_ITEMr+   r6   r   objectr4   rJ   __all__r5   r   r   r>   r   r   printr]   r    r   r   <module>rn      s   I I ' '  E A , #s(O	C CL	? :;
O+/ +d + :P'*'*x1478'* /56'* 
	'*Z :P(*(*x1478(* /56(* 
	(*V&.7F	H #%%
% t8% X	%( ',333 t$3 
	3: (-@
@@ t$@ 
	@r   