U
    Mh                     @   s4  d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	Z	d dl
mZmZ d dlmZmZmZ dddd	d
gZeee ddd
Zeee ee dddZeedddZejfeeeedddZeedddZd eee eddd	ZededeeedddZeedddZee	jedddZdS )!    N)AnyListOptionalSet)
deprecated)_ShardingIterDataPipeSHARDING_PRIORITIES)DataPipeDataPipeGraphtraverse_dpsapply_random_seedapply_shardingapply_shuffle_seedapply_shuffle_settingsget_all_graph_pipes)graphreturnc                 C   s   t | t S N)_get_all_graph_pipes_helperset)r    r   Q/var/www/html/venv/lib/python3.8/site-packages/torch/utils/data/graph_settings.pyr      s    )r   id_cacher   c                 C   sL   g }|   D ]:\}\}}||kr"q|| || |t|| q|S r   )itemsaddappendextendr   )r   r   resultsZdp_iddatapipe	sub_graphr   r   r   r      s    

r   )r   r   c                 C   s,   t | trdS t| dr(t| jr(dS dS )NTr   F)
isinstancer   hasattrinspectismethodr   r   r   r   r   _is_sharding_datapipe(   s
    
r%   )r   num_of_instancesinstance_idr   c                    s(   t | }d fdd	  | | S )z
    Apply dynamic sharding over the ``sharding_filter`` DataPipe that has a method ``apply_sharding``.

    RuntimeError will be raised when multiple ``sharding_filter`` are presented in the same branch.
    Nc                    s   |   D ]\}}d }t|rt|d k	r8td| d| t|j}t|jdk r`| n|jd |}|d kr|} || qd S )NzoSharding twice on a single pipeline is likely unintended and will cause data loss. Sharding already applied to z while trying to apply to    )sharding_group)valuesr%   RuntimeErrorr"   	signaturer   len
parameters)r   Zprev_appliedZdpr   Zappliedsig_helperr'   r&   r)   r   r   r1   ;   s    zapply_sharding.<locals>._helper)N)r   )r   r&   r'   r)   r   r   r0   r   r   0   s    	c                 C   s8   t | drt | dsdS t| jr0t| js4dS dS )Nset_shuffleset_seedFT)r!   r"   r#   r2   r3   r$   r   r   r   _is_shuffle_datapipeR   s
    r4   )r   shuffler   c                 C   sb   |dkr| S t | }t|}dd |D }|sJ|rJtd |  } | g}|D ]}|| qN| S )aE  
    Traverse the graph of ``DataPipes`` to find and set shuffle attribute.

    Apply the method to each `DataPipe` that has APIs of ``set_shuffle``
    and ``set_seed``.

    Args:
        datapipe: DataPipe that needs to set shuffle attribute
        shuffle: Shuffle option (default: ``None`` and no-op to the graph)
    Nc                 S   s   g | ]}t |r|qS r   )r4   ).0piper   r   r   
<listcomp>j   s      z*apply_shuffle_settings.<locals>.<listcomp>z`shuffle=True` was set, but the datapipe does not contain a `Shuffler`. Adding one at the end. Be aware that the default buffer size might not be sufficient for your task.)r   r   warningswarnr5   r2   )r   r5   r   	all_pipesZ	shufflersZshufflerr   r   r   r   Z   s    z`apply_shuffle_seed` is deprecated since 1.12 and will be removed in the future releases. Please use `apply_random_seed` instead.)category)r   rngr   c                 C   s
   t | |S r   )r   )r   r=   r   r   r   r   y   s    c                 C   s   t | drt| jrdS dS )Nr3   TF)r!   r"   r#   r3   r$   r   r   r   _is_random_datapipe   s    r>   c                 C   s   t | }t|}t }g }|D ]2}t||kr0qt|r|| |t| q|D ].}ttj	dtj
dj|d }|| qV| S )a6  
    Traverse the graph of ``DataPipes`` to find random ``DataPipe`` with an API of ``set_seed``.

    Then set the random seed based on the provided RNG to those ``DataPipe``.

    Args:
        datapipe: DataPipe that needs to set randomness
        rng: Random number generator to generate random seeds
    r   )Zdtype)	generator)r   r   r   idr>   r   r   inttorchemptyZint64Zrandom_itemr3   )r   r=   r   r;   cacheZrandom_datapipesr7   Zrandom_seedr   r   r   r      s    

 )N) r"   r9   typingr   r   r   r   typing_extensionsr   rB   Z(torch.utils.data.datapipes.iter.shardingr   r   Ztorch.utils.data.graphr	   r
   r   __all__r   rA   r   boolr%   DEFAULTr   r4   r   FutureWarningr   r>   	Generatorr   r   r   r   r   <module>   s<   	"