
    9j              
          d dl mZmZmZmZ d dlmZmZ d dlm	Z	 d dl
Z
d dlmZ d dlmZ d dlmZ eez  Zeedf   Z ed	      ZeZeeef   Zg d
Zdede	e
j6                     fdZefdedeeegdf   deegef   ddfdZefdedeeegdf   deegef   ddfdZdedededdfdZ 	 ddedededz  dedz  fdZ!de"fdededeegdf   ddfdZ#e"fdededeegdf   ddfdZ$y)    )Callable
CollectionMappingMutableMapping)castTypeVar)TypeIsN)ShardedTensor)STATE_DICT_TYPE)DTensor.T)traverse_state_dictset_elementget_elementprint_tensorvaluereturnc                 6    t        | t        j                        S N)
isinstancetorchTensor)r   s    f/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/distributed/checkpoint/_traverse.py_keep_visiting_tensorsr      s    eU\\**    
state_dictvisitorkeep_traversingc                     dt         dt        ffddt        dt         ddffd| j                         D ]  \  }} t	        |      f|        y)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                     t        | t              ryt        | t              r| }ny|D ]/  }t        |t        t        f      r
 |      s y& |      s/ y y)NFT)r   r   listr   valuesentry_is_terminalr   s      r   r%   z)traverse_state_dict.<locals>._is_terminal)   s^    eW%t$F 	E%'41,u:M*u/E		
 r   pathNc                    t        |t              r/|j                         D ]  \  }} | t        |      fz   |        y  |      r
 | |       y t        |t        t
        f      r!t        |      D ]  \  }} | |fz   |        y y r   )r   r   itemsstrr!   tuple	enumerater&   r   kvir%   _traverse_objr   s        r   r0   z*traverse_state_dict.<locals>._traverse_obj9   s    eW% 31dc!fY.23% D% e}-!%( .1daTk1-. .r   STATE_DICT_ITEMboolOBJ_PATHr(   r)   r   r   r   keyr   r%   r0   s    ``  @@r   r   r      se    O   .H ._ . . !&&( *
Us3xk5)* 	|r   c                     dt         dt        ffddt        dt         ddffd| j                         D ]  \  }} t	        |      f|        y)a8  
    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                     t        | t              r| j                         }nt        | t              r| }ny|D ]/  }t        |t        t        f      r
 |      s y& |      s/ y y)NTF)r   r   r#   r!   r"   s      r   r%   z/traverse_state_dict_v_2_3.<locals>._is_terminalW   sf    eW%\\^Ft$F 	E%'41,u:M*u/E		
 r   r&   Nc                 
    |      r
 | |       y t        |t              r/|j                         D ]  \  }} | t        |      fz   |        y t        |t              r!t        |      D ]  \  }} | |fz   |        y y r   )r   r   r(   r)   r!   r+   r,   s        r   r0   z0traverse_state_dict_v_2_3.<locals>._traverse_objg   s    D% w' 31dc!fY.23t$!%( .1daTk1-. %r   r1   r5   s    ``  @@r   traverse_state_dict_v_2_3r:   J   se    O   .H ._ . . !&&( *
Us3xk5)* 	|r   	root_dictr&   c                    t        t        |       }dt        t           dt        ddfd}t        dt        |            D ]{  }||dz
     }||   }t        t        t        |      t        u ri ng       }t        |t              r!t        t        |j                  ||            }d |||       ||   |||<   ||   }} |d   }t        |      t        u r |t        t        t           |      |       |||<   y)z>Set ``value`` in ``root_dict`` along the ``path`` object path.lstidxr   Nc                 b    t        |       |k  r!| j                  d        t        |       |k  r y y r   )lenappend)r=   r>   s     r   extend_listz set_element.<locals>.extend_list~   s&    #h#oJJt #h#or      )r   CONTAINER_TYPEr!   r2   intranger@   typer)   r   r   
setdefault)	r;   r&   r   cur_containerrB   r/   prev_keyr6   def_vals	            r   r   r   x   s    3Mo. S T  1c$i  4A;1gd3i3.>BGmW-  8 87 KM
 x0X&.*1h')(3M4  r(CCyCDo.>DM#r   default_valuec                    t        t        |       }|D ]`  }t        |      t        u r"t	        |t
              rt        |      |k  r|c S t	        |t              r||vr|c S t        t        ||         }b t        t        dz  |      S )z[Retrieve the value at ``path``from ``root_dict``, returning ``default_value`` if not found.N)	r   rE   rH   rF   r   r!   r@   r   r   )r;   r&   rM   	cur_valueparts        r   r   r      s     ^Y/I ::i.#i.42G$$Iw/4y3H  49	: D)$$r    prefix	print_func                    t        |       t        u r` || d| j                                 | j                         D ]1  }t	        |j
                  |j                  j                   d|       3 y t        |       t        u r3 || d| j                                 t	        | j                  |       y t        | t        j                        r || d| j                                 y  || dt        |               y )Nz ShardedTensor size:  )rS   z DistributedTensor size: z Tensor size: z Type: )rH   r
   sizelocal_shards_print_nestedtensormetadatashard_offsetsr   _local_tensorr   r   r   )r   rR   rS   shards       r   rX   rX      s    
 E{m#VH1%**,@A'') 	E>>//02#	 
e	!VH5ejjl^DE	
 
E5<<	(VHN5::<.9:VHGDK=12r   c                 2    t        |t        |       |       y)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.
    )rR   rS   N)rX   r)   )r&   r   rS   s      r   r   r      s     %D	Y?r   r   )%collections.abcr   r   r   r   typingr   r   typing_extensionsr	   r   +torch.distributed._shard.sharded_tensor.apir
   %torch.distributed.checkpoint.metadatar   torch.distributed.tensorr   r)   rF   	PATH_ITEMr*   r4   r   objectr2   rE   __all__r   r   r3   r   r:   r   r   printrX   r    r   r   <module>rj      s   J I   $  E A , #I	C CL	? :;
O+/ +fU\\6J + :P*$*$x1478*$ /56*$ 
	*$` :P+$+$x1478+$ /56+$ 
	+$\&.7F	H #%%
% t8% X	%( ',333 t$3 
	3: (-@
@@ t$@ 
	@r   