o
    "i`                  
   @   sp  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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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 )!    )
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   d/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/torch/distributed/checkpoint/_traverse.py_keep_visiting_tensors   s   r   
state_dictvisitorkeep_traversingc                    s\   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, 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   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#   2   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,   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
   
r   	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)r2   r3   r   r   r   extend_listV   s   
z set_element.<locals>.extend_list   )r   CONTAINER_TYPEr   r-   intranger4   typer&   r   r   
setdefault)	r1   r$   r   cur_containerr6   r+   prev_keyr0   def_valr   r   r   r   P   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   r9   r<   r:   r   r    r4   r   r   r   )r1   r$   rA   	cur_valuepartr   r   r   r   p   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:  )rF   z DistributedTensor size: z Tensor size: z Type: )r<   r   sizelocal_shards_print_nestedtensormetadatashard_offsetsr   _local_tensorr   r   r   )r   rE   rF   shardr   r   r   rJ      s$   
rJ   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.
    )rE   rF   N)rJ   r&   )r$   r   rF   r   r   r   r      s   r   r   )#typingr   r   r   r   r   r   r   r	   r
   r   r   +torch.distributed._shard.sharded_tensor.apir   torch.distributed._tensorr   %torch.distributed.checkpoint.metadatar   r&   r:   	PATH_ITEMr/   r   objectr-   r9   __all__r.   r   r   r   r   printrJ   r   r   r   r   r   <module>   s|   0
-
#

