
    sg              
          d dl mZmZmZmZmZmZmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZ d dlmZ e
eef   Zeedf   Z e	d      ZeZeeef   Zg dZd	ed
e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e   d
ee   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cast
CollectionListMappingMutableMappingOptionalTupleTypeVarUnionN)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    Y/var/www/html/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_terminal0   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   r3   z*traverse_state_dict.<locals>._traverse_obj@   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(   r3   s    ``  @@r   r   r   $   s^    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_terminal[   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   r3   z0traverse_state_dict_v_2_3.<locals>._traverse_objk   s    D% w' 31dc!fY.23t$!%( .1daTk1-. %r   r4   r8   s    ``  @@r   traverse_state_dict_v_2_3r=   N   s^    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        k(  ri ng       }t        |t              r!t        t        |j                  ||            }e |||       ||   |||<   ||   }~ |d   }t        |      t        k(  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@   rA   s     r   extend_listz set_element.<locals>.extend_list   s&    #h#oJJt #h#or      )r   CONTAINER_TYPEr   r5   intrangerC   typer,   r   r   
setdefault)	r>   r)   r   cur_containerrE   r2   prev_keyr9   def_vals	            r   r   r   y   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        t           |      S )z[Retrieve the value at ``path``from ``root_dict``, returning ``default_value`` if not found.)
r   rH   rK   rI   r   r$   rC   r   r	   r   )r>   r)   rP   	cur_valueparts        r   r   r      s     ^Y/I ::i.#i.42G$$Iw/4y3H  49	: Y''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:  )rV   z DistributedTensor size: z Tensor size: z Type: )rK   r   sizelocal_shards_print_nestedtensormetadatashard_offsetsr   _local_tensorr   r   r   )r   rU   rV   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                 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.
    )rU   rV   N)r[   r,   )r)   r   rV   s      r   r   r      s     %D	Y?r   r   )$typingr   r   r   r   r   r   r	   r
   r   r   r   +torch.distributed._shard.sharded_tensor.apir   %torch.distributed.checkpoint.metadatar   torch.distributed.tensorr   r,   rI   	PATH_ITEMr7   r   objectr5   rH   __all__r6   r   r   r=   r   r   printr[   r    r   r   <module>rk      s      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	F "&((
( A;( a[	(( ',333 t$3 
	3: (-@
@@ t$@ 
	@r   