
    קg              
          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#dS )    )
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    b/var/www/html/ai-engine/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_terminal0   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   r3   z*traverse_state_dict.<locals>._traverse_obj@   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(   r3   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_terminal[   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   r3   z0traverse_state_dict_v_2_3.<locals>._traverse_objk   s    < 	.GD%     w'' 	. 3 31dc!ffY.22223 3t$$ 	.!%(( . .1daTk1----	. 	.. .r   r4   r8   s    ``  @@r   traverse_state_dict_v_2_3r=   N   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@   rA   s     r   extend_listz set_element.<locals>.extend_list   s<    #hh#ooJJt #hh#oooooor      )r   CONTAINER_TYPEr   r5   intrangerC   typer,   r   r   
setdefault)	r>   r)   r   cur_containerrE   r2   prev_keyr9   def_vals	            r   r   r   y   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   rH   rK   rI   r   r$   rC   r   r	   r   )r>   r)   rP   	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:  )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[      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.
    )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 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   