a
    ds                     @   sN  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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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   o/var/www/html/stable-diffusion-webui/venv/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``.
    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   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    
r   )	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 )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+   prev_keyr0   Zdef_valr   r   r   r   P   s$    



r   )r1   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 )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    )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:  )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
    Callback that can be used with travese_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    
r   )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   printrF   r   r   r   r   r   <module>   sV   0,% 