U
    yh`                     @   sR  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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 )    )
Callablecast
CollectionListMappingMutableMappingOptionalTupleTypeVarUnionN)ShardedTensor)DTensor)STATE_DICT_TYPE.Ttraverse_state_dictset_elementget_elementprint_tensorvaluereturnc                 C   s   t | tjS N)
isinstancetorchTensor)r    r   X/var/www/html/venv/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``.
    Mapping, list, and tuple will be flattened and other value types are treated
    as the terminal values and will invoke ``visitor``.
    Mapping is treated as non terminal node and will be flattened.
    List and tuple, on the other hand, will not be flattened unless containing other
    mapping containers or tensors.
    r   c                    sb   t | trdS t | tr| }ndS |D ]6}t |ttfrF |sF dS d k	r&|r& dS q&dS )NFT)r   r   list)r   valuesentry)_is_terminalr    r   r   r$   2   s    

z)traverse_state_dict.<locals>._is_terminalN)pathr   r   c                    sz   t |tr2| D ]\}}| t|f | qnD |rF| | n0t |ttfrvt|D ]\}}| |f | q\d S r   )r   r   itemsstrr!   tuple	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 )z>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)r3   r4   r   r   r   extend_listV   s    z set_element.<locals>.extend_list   )r   CONTAINER_TYPEr   r.   intranger5   typer'   r   r   
setdefault)	r2   r%   r   Zcur_containerr7   r,   Zprev_keyr1   Zdef_valr   r   r   r   P   s&    

 


)r2   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 )z[Retrieve the value at ``path``from ``root_dict``, returning ``default_value`` if not found.)
r   r:   r=   r;   r   r!   r5   r   r   r   )r2   r%   r?   Z	cur_valuepartr   r   r   r   p   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:  )rC   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   rB   rC   Zshardr   r   r   rF      s"    
rF   )r%   r   rC   r   c                 C   s   t |t| |d 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.
    )rB   rC   N)rF   r'   )r%   r   rC   r   r   r   r      s    )N)#typingr   r   r   r   r   r   r   r	   r
   r   r   Z+torch.distributed._shard.sharded_tensor.apir   Ztorch.distributed._tensorr   Z%torch.distributed.checkpoint.metadatar   r'   r;   Z	PATH_ITEMr0   r   objectr.   r:   __all__r/   r   r   r   r   printrF   r   r   r   r   r   <module>   sZ   0.  # 