
    Wj              
          d dl mZmZmZmZ d dl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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"dS )    )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    t          | t          j                  S N)
isinstancetorchTensor)r   s    k/home/longshao/multi-rider-rag/.venv/lib/python3.11/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|                                 D ]\  }} t	          |          f|            dS )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dS t          | t                    r| }ndS |D ]<}t          |t          t          f          r |          s dS  |          r dS =dS )NFT)r   r   listr   valuesentry_is_terminalr   s      r   r%   z)traverse_state_dict.<locals>._is_terminal(   s    eW%% 	5t$$ 	FF4 	 	E%'411 ,,u:M:M uu*u/E/E*uutr   pathNc                 \   t          |t                    r9|                                D ]"\  }} | t          |          fz   |           #d S  |          r | |           d S t          |t          t
          f          r%t          |          D ]\  }} | |fz   |           d S d S r   )r   r   itemsstrr!   tuple	enumerater&   r   kvir%   _traverse_objr   s        r   r0   z*traverse_state_dict.<locals>._traverse_obj8   s    eW%% 	. 3 31dc!ffY.22223 3\%   	.GD%     e}-- 	.!%(( . .1daTk1----	. 	.. .r   STATE_DICT_ITEMboolOBJ_PATHr(   r)   r   r   r   keyr   r%   r0   s    ``  @@r   r   r      s    O         .H ._ . . . . . . . . . !&&(( * *
Us3xxk5)))) 	|||r   c                     dt           dt          ffddt          dt           ddffd|                                 D ]\  }} t	          |          f|            dS )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|                                 }nt          | t                    r| }ndS |D ]<}t          |t          t          f          r |          s dS  |          r dS =dS )NTF)r   r   r#   r!   r"   s      r   r%   z/traverse_state_dict_v_2_3.<locals>._is_terminalV   s    eW%% 	\\^^FFt$$ 	FF4 	 	E%'411 ,,u:M:M uu*u/E/E*uutr   r&   Nc                 N    |          r | |           d S t          |t                    r9|                                D ]"\  }} | t          |          fz   |           #d S t          |t                    r%t          |          D ]\  }} | |fz   |           d S d S r   )r   r   r(   r)   r!   r+   r,   s        r   r0   z0traverse_state_dict_v_2_3.<locals>._traverse_objf   s    < 	.GD%     w'' 	. 3 31dc!ffY.22223 3t$$ 	.!%(( . .1daTk1----	. 	.. .r   r1   r5   s    ``  @@r   traverse_state_dict_v_2_3r:   I   s    O         .H ._ . . . . . . . . . !&&(( * *
Us3xxk5)))) 	|||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          |                    ||                    } |||           ||         |||<   ||         }|d         }t          |          t          u r* |t          t          t                   |          |           |||<   dS )z>Set ``value`` in ``root_dict`` along the ``path`` object path.lstidxr   Nc                     t          |           |k    r*|                     d            t          |           |k    (d S d S r   )lenappend)r=   r>   s     r   extend_listz set_element.<locals>.extend_list}   s<    #hh#ooJJt #hh#oooooor      )r   CONTAINER_TYPEr!   r2   intranger@   typer)   r   r   
setdefault)	r;   r&   r   cur_containerrB   r/   prev_keyr6   def_vals	            r   r   r   w   sS    33Mo. S T     1c$ii   4 4A;1gd3ii3.>.>BGGmW-- 		4  8 87 K K MM
 Kx000X&.*1h')(3MM
r(CCyyCDo.>>DDDM#r   default_valuec                 \   t          t          |           }|D ]}}t          |          t          u r-t	          |t
                    rt          |          |k     r|c S nt	          |t                    r||vr|c S t          t          ||                   }~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..42G2G$$$$ 3HIw// 	!4y3H3H    499		D)$$$r    prefix	print_func                 F   t          |           t          u r_ || d|                                             |                                 D ]&}t	          |j        |j        j         d|           'd S t          |           t          u r: || d|                                             t	          | j	        |           d S t          | t          j                  r$ || d|                                             d S  || dt          |                       d S )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      sd   
 E{{m##	V@@%**,,@@AAA'')) 	 	E>/222#    	 	 
e	!	!	VDDejjllDDEEE	
 	
 	
 	
 	
 	
 
E5<	(	( 3	V995::<<99:::::	V11DKK1122222r   c                 D    t          |t          |           |           dS )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   r	   r   +torch.distributed._shard.sharded_tensor.apir
   %torch.distributed.checkpoint.metadatar   torch.distributed.tensorr   r)   rF   	PATH_ITEMr*   r4   r   objectr2   rE   __all__r3   r   r   r:   r   r   printrX   r    r   r   <module>ri      s   J I I I I I I I I I I I ' ' ' ' ' ' ' ' ' '  E E E E E E A A A A A A , , , , , , #s(O	C GCLL	? :;
O
O
O+/ +d + + + + :P*$ *$*$x1478*$ /56*$ 
	*$ *$ *$ *$` :P+$ +$+$x1478+$ /56+$ 
	+$ +$ +$ +$\&.7F	   H #% %%
% t8% X	% % % %( ',3 333 t$3 
	3 3 3 3: (-@ @
@@ t$@ 
	@ @ @ @ @ @r   