U
    *-et                     @   sR  d dl Z 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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dd	d
dgZeedddZefeeeegdf eegef ddddZeeedddd	Zdeeee ee ddd
Zde feeeegdf ddddZ!e feeeegdf ddddZ"dS )    N)
Callable
CollectionListMappingMutableMappingOptionalTupleTypeVarUnioncast)STATE_DICT_TYPE)ShardedTensor)DTensor.Ttraverse_state_dictset_elementget_elementprint_tensorvaluereturnc                 C   s   t | tjS N)
isinstancetorchTensor)r    r   g/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/torch/distributed/checkpoint/_traverse.py_keep_visiting_tensors    s    r   )
state_dictvisitorkeep_traversingr   c                    sV   t td fdd tt dd fdd|  D ]\}}t|f| q8dS )a}  
    Invoke ``visitor`` for each value recursively in ``state_dict``.
    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   c                    sh   t | tr|  }nt | tr$| }ndS |D ]6}t |ttfrL |sL dS d k	r,|r, dS q,dS )NTF)r   r   valueslist)r   r!   entry)_is_terminalr    r   r   r$   2   s    


z)traverse_state_dict.<locals>._is_terminalN)pathr   r   c                    sv    |r| | n^t |trF| D ]\}}| t|f | q&n,t |trrt|D ]\}}| |f | qXd S r   )r   r   itemsstrr"   	enumerate)r%   r   kvi)r$   _traverse_objr   r   r   r,   B   s    

z*traverse_state_dict.<locals>._traverse_obj)STATE_DICT_ITEMboolOBJ_PATHr&   r'   )r   r   r    keyr   r   )r$   r,   r    r   r   r   %   s    
)	root_dictr%   r   r   c           	      C   s   t t| }tt tdddd}tdt|D ]v}||d  }|| }t tt|tkrZi ng }t	|t
r~t t|||}q.||| || dkr|||< || }q.|d }t|tkr|t tt || |||< dS )zH
    Set ``value`` in ``root_dict`` along the ``path`` object path.
    N)lstidxr   c                 S   s   t | |kr| d  q d S r   )lenappend)r2   r3   r   r   r   extend_listX   s    z set_element.<locals>.extend_list   )r   CONTAINER_TYPEr   r-   intranger4   typer'   r   r   
setdefault)	r1   r%   r   Zcur_containerr6   r+   Zprev_keyr0   Zdef_valr   r   r   r   P   s&    

 


)r1   r%   default_valuer   c                 C   sv   t t| }|D ]X}t|tkr>t|tr4t||k rX|  S nt|trP||krX|  S t t|| }qt tt	 |S )ze
    Retrieve the value at ``path``from ``root_dict``, returning ``default_value`` if not found.
    )
r   r9   r<   r:   r   r"   r4   r   r   r   )r1   r%   r>   Z	cur_valuepartr   r   r   r   r   s    

 )r   prefix	print_funr   c                 C   s   t | tkrL|| d|    |  D ]}t|j|jj d|d q*nlt | tkr~|| d|    t| j	|d n:t
| tjr|| d|    n|| dt |   d S )Nz ShardedTensor size:  )rB   z DistributedTensor size: z Tensor size: z Type: )r<   r   sizeZlocal_shards_print_nestedZtensormetadataZshard_offsetsr   Z_local_tensorr   r   r   )r   rA   rB   Zshardr   r   r   rE      s"    
rE   )r%   r   rB   r   c                 C   s   t |t| |d dS )z
    Callback that can be used 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.
    )rA   rB   N)rE   r'   )r%   r   rB   r   r   r   r      s    
)N)#r   typingr   r   r   r   r   r   r   r	   r
   r   Z%torch.distributed.checkpoint.metadatar   Z+torch.distributed._shard.sharded_tensor.apir   Ztorch.distributed._tensorr   r'   r:   Z	PATH_ITEMr/   r   objectr-   r9   __all__r.   r   r   r   r   printrE   r   r   r   r   r   <module>   sZ   0,  % 