
    `i              
          d dl mZmZmZ d dl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#dS )    )
CollectionMappingMutableMapping)CallablecastOptional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    z/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/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   r1   z*traverse_state_dict.<locals>._traverse_obj6   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&   r1   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_terminalQ   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   r1   z0traverse_state_dict_v_2_3.<locals>._traverse_obja   s    < 	.GD%     w'' 	. 3 31dc!ffY.22223 3t$$ 	.!%(( . .1daTk1----	. 	.. .r   r2   r6   s    ``  @@r   traverse_state_dict_v_2_3r;   D   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          k    ri ng           }t          |t                    r*t          t          |                    ||                    } |||           ||         |||<   ||         }|d         }t          |          t          k    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_listu   s<    #hh#ooJJt #hh#oooooor      )r   CONTAINER_TYPEr"   r3   intrangerA   typer*   r   r   
setdefault)	r<   r'   r   cur_containerrC   r0   prev_keyr7   def_vals	            r   r   r   o   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                 l   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          t                   |          S )z[Retrieve the value at ``path``from ``root_dict``, returning ``default_value`` if not found.)
r   rF   rI   rG   r   r"   rA   r   r   r   )r<   r'   rN   	cur_valueparts        r   r   r      s     ^Y//I : :::i.. %#i..42G2G$$$$ 3HIw// 	!4y3H3H    499		Y'''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:  )rT   z DistributedTensor size: z Tensor size: z Type: )rI   r   sizelocal_shards_print_nestedtensormetadatashard_offsetsr   _local_tensorr   r   r   )r   rS   rT   shards       r   rY   rY      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.
    )rS   rT   N)rY   r*   )r'   r   rT   s      r   r   r      s%     %D		Y??????r   r   )$collections.abcr   r   r   typingr   r   r   r	   r
   r   +torch.distributed._shard.sharded_tensor.apir   %torch.distributed.checkpoint.metadatar   torch.distributed.tensorr   r*   rG   	PATH_ITEMr+   r5   r   objectr3   rF   __all__r4   r   r   r;   r   r   printrY   r    r   r   <module>rj      s   ? ? ? ? ? ? ? ? ? ? ; ; ; ; ; ; ; ; ; ; ; ; ; ;  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'* 
	'* '* '* '*Z :P(* (*(*x1478(* /56(* 
	(* (* (* (*V&.7F	   F "&( ((
( A;( a[	( ( ( (( ',3 333 t$3 
	3 3 3 3: (-@ @
@@ t$@ 
	@ @ @ @ @ @r   