U
    yh	                     @   sd   U d dl mZmZ d dlmZ g Zee ed< eedddZeeeee	e	e	e	f  ddd	Z
d
S )    )ListTuple)ChunkStorageMetadata__all__)shard1shard2c                 C   sd   t | j}t|D ]L}| j| |j| |j|  kr: dS |j| | j| | j|  kr dS qdS )zCheck if two shards overlap.FT)lenoffsetsrangesizes)r   r   Zndimsi r   Y/var/www/html/venv/lib/python3.8/site-packages/torch/distributed/checkpoint/resharding.py"_check_shard_metadata_pair_overlap	   s    
r   )saved_shardcurrent_shardreturnc                 C   s   g }t t| j|j| j|jD ]d\}\}}}}t|| || }|t|| }	||krdd}
|| }n|| }
d}|||
||	f q|S )a[  
    Return the overlapping region between saved_shard and current_shard.

    There returned list has the same number of elements as the tensor's dimension.
    For each element, we produce a tuple with the following contents:
        (dimension, `saved_shard` offset, `current_shard` offset, length)

    Offsets are relative to each shard.
    r   )	enumeratezipr	   r   minmaxappend)r   r   ZnarrowsdimZsaved_shard_offsetZcurrent_shard_offsetZsaved_shard_sizeZcurrent_shard_sizeZmin_range_endlengthZoffset_for_saved_tensorZoffset_for_current_tensorr   r   r   +_shards_get_overlap_region_wrt_saved_tensor   s8    
	

r   N)typingr   r   Z%torch.distributed.checkpoint.metadatar   r   str__annotations__r   intr   r   r   r   r   <module>   s      