o
    Zh                  
   @   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d
edefddZefdedeeegdf deegef ddfddZefdedeeegdf deegef ddfddZdeded
eddfddZ	d#dededee dee fddZ de!fd
ededeegdf ddfdd Z"e!fded
edeegdf ddf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   U/var/www/auris/lib/python3.10/site-packages/torch/distributed/checkpoint/_traverse.py_keep_visiting_tensors   s   r   
state_dictvisitorkeep_traversingc                    \   dt dtf fdd dtdt ddf fdd|  D ]\}}t|f| q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                    sb   t | trdS t | tr| }ndS |D ]}t |ttfr# |s# 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_terminalpathNc                    s   t |tr| D ]\}}| t|f | q	d S  |r%| | d S t |ttfr=t|D ]\}}| |f | q0d S d S r   )r   r   itemsstrr   tuple	enumerater%   r   kvir$   _traverse_objr   r   r   r/   6   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
   
r   c                    r   )	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                    sh   t | tr
|  }n
t | tr| }ndS |D ]}t |ttfr& |s& dS d ur1|r1 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_terminalr%   Nc                    s~    |r| | d S t |tr%| D ]\}}| t|f | qd S t |tr;t|D ]\}}| |f | q.d S d S r   )r   r   r&   r'   r   r)   r*   r.   r   r   r/   a   s   

z0traverse_state_dict_v_2_3.<locals>._traverse_objr0   r4   r   r6   r   traverse_state_dict_v_2_3D   s
   
r7   	root_dictr%   c           	      C   s   t t| }dtt dtddfdd}tdt|D ];}||d  }|| }t tt|tkr/i ng }t	|t
rAt t|||}q||| || du rP|||< || }q|d }t|tkri|t tt || |||< dS )	z>Set ``value`` in ``root_dict`` along the ``path`` object path.lstidxr   Nc                 S   s*   t | |kr| d  t | |ksd S d S r   )lenappend)r9   r:   r   r   r   extend_listu   s   
z set_element.<locals>.extend_list   )r   CONTAINER_TYPEr   r1   intranger;   typer'   r   r   
setdefault)	r8   r%   r   Zcur_containerr=   r-   Zprev_keyr5   Zdef_valr   r   r   r   o   s$   



r   default_valuec                 C   sv   t t| }|D ],}t|tu rt|trt||k r|  S nt|tr(||vr,|  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@   rC   rA   r   r   r;   r   r   r   )r8   r%   rE   Z	cur_valuepartr   r   r   r      s   
r    prefix	print_func                 C   s   t | tu r'|| d|    |  D ]}t|j|jj d|d qd S t | tu rA|| d|    t| j	|d d S t
| tjrT|| d|    d S || dt |   d S )Nz ShardedTensor size:  )rI   z DistributedTensor size: z Tensor size: z Type: )rC   r
   sizeZlocal_shards_print_nestedZtensormetadataZshard_offsetsr   Z_local_tensorr   r   r   )r   rH   rI   Zshardr   r   r   rL      s$   
rL   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.
    )rH   rI   N)rL   r'   )r%   r   rI   r   r   r   r      s   r   r   )$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'   rA   Z	PATH_ITEMr(   r3   r   objectr1   r@   __all__r2   r   r   r7   r   r   printrL   r   r   r   r   r   <module>   s   
-
+
#

