U
    ©Ê¹jt  ã                   @   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   úe/var/www/html/bwave/python/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``.
    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ýü,  þ% ýüýüýü