a
    h                     @   s|  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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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 )     )
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                 C   s   t | tjS N)
isinstancetorchTensor)r    r   T/var/www/auris/lib/python3.9/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 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   c                    sb   t | trdS t | tr| }ndS |D ]6}t |ttfrF |sF dS d ur&|r& dS q&dS )NFT)r   r   listr   valuesentry_is_terminalr   r   r   r$   &   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   r0   6   s    
z*traverse_state_dict.<locals>._traverse_objSTATE_DICT_ITEMboolOBJ_PATHr'   r(   r   r   r   keyr   r   r$   r0   r   r   r   r      s    
r   c                    sV   t td fdd tt dd fdd|  D ]\}}t|f| q8d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   c                    sh   t | tr|  }nt | tr$| }ndS |D ]6}t |ttfrL |sL dS d ur,|r, dS q,dS )NTF)r   r   r!   r   r    r#   r   r   r$   Q   s    


z/traverse_state_dict_v_2_3.<locals>._is_terminalNr%   c                    sv    |r| | n^t |trF| D ]\}}| t|f | q&n,t |trrt|D ]\}}| |f | qXd S r   )r   r   r'   r(   r   r*   r+   r/   r   r   r0   a   s    

z0traverse_state_dict_v_2_3.<locals>._traverse_objr1   r5   r   r7   r   traverse_state_dict_v_2_3D   s    
r8   )	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u 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)r:   r;   r   r   r   extend_listu   s    z set_element.<locals>.extend_list   )r   CONTAINER_TYPEr   r2   intranger<   typer(   r   r   
setdefault)	r9   r&   r   Zcur_containerr>   r.   prev_keyr6   Zdef_valr   r   r   r   o   s$    



r   )r9   r&   default_valuer   c                 C   sv   t t| }|D ]X}t|tu r>t|tr4t||k rX|  S nt|trP||v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   rA   rD   rB   r   r   r<   r   r   r   )r9   r&   rG   Z	cur_valuepartr   r   r   r      s    

r    )r   prefix	print_funr   c                 C   s   t | tu rL|| d|    |  D ]}t|j|jj d|d q*nlt | tu r~|| d|    t| j	|d n:t
| tjr|| d|    n|| dt |   d S )Nz ShardedTensor size:  )rK   z DistributedTensor size: z Tensor size: z Type: )rD   r
   sizeZlocal_shards_print_nestedZtensormetadataZshard_offsetsr   Z_local_tensorr   r   r   )r   rJ   rK   Zshardr   r   r   rN      s"    
rN   )r&   r   rK   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.
    )rJ   rK   N)rN   r(   )r&   r   rK   r   r   r   r      s    r   )N)$collections.abcr   r   r   typingr   r   r   r   r	   r   Z+torch.distributed._shard.sharded_tensor.apir
   Z%torch.distributed.checkpoint.metadatar   Ztorch.distributed.tensorr   r(   rB   Z	PATH_ITEMr)   r4   r   objectr2   rA   __all__r3   r   r   r8   r   r   printrN   r   r   r   r   r   <module>   sf   -,# 