o
    "j                     @   s   d dl Z d dlZddlmZ ddlmZ ddlmZ ee jZ	i a
i adadad	ad
Zg dZdd Zdd ZdddZdd Zdd ZdS )    N   )
get_logger   )"retrive_unique_id_for_process_mesh)_get_idx_in_axisF*       )      %   I   c                   C   s   t S )N_enable_random_control r   r   h/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/distributed/auto_parallel/random.pyis_enable_auto_rand_ctrl#   s   r   c                   C   s   da d S )NTr   r   r   r   r   enable_auto_rand_ctrl(   s   r   c                 C   s   t   | a|adS )a  Enable auto parallel random control.
    Random control maintain the randomness when tensor is distributed across devices on a Mesh(any order).
        * Independency: If tensor is **Sharded** on a Mesh dimension, Devices along that Mesh dimension should have Different randomness.

        * Consistency:  Meanwhile if the tensor is **Replicated** on another Mesh dimension, randomness of Devices along that Mesh dimension should be Consistent.

    For instance: rank0 ~ rank7 consist a Mesh of shape of [2, 4]; A 2D tensor is distributed in that Mesh using dims_mapping [-1, 1].
    Randomness for rank0-rank1-rank2-rank3 (rank4-rank5-rank6-rank7) should be Independent;
    Randomness for rank0 and rank4 (rank1 and rank5, ...) should be Consistent.

    This function should be called only once before auto parallel compiles the computation graph (e.g. auto_parallel.engine.prepare() or fit()).

    This seed only affects how randomness-relative **operators** (dropout, fuse op with dropout inside, etc) are execute amonge mesh, and would NOT affect other processe like Parameter initialization.

    Examples:
        # seed relative to training step
        auto_parallel_random_seed((step + 13) * 257)
        ...
        engine.prepare()
    N)r   _basic_seed_basic_name)seednamer   r   r   parallel_manual_seed-   s   r   c           	      C   s  t |jdkrtdt|t}t}|r|d7 }t|j|j}|d|  }|t	|d  7 }t
t |jD ]&}||vr@d}n	t|j|j|| }|d| d| 7 }|t| |d  7 }q7|tv rlt| |ksjJ |S |t vs{J d	||t|t|< |S )
N   zIAuto Parallel Random Control for Mesh's rank > 4 is NOT supported! Got {}_zmesh:r   Z_dim:zMSeed Confilt! current seed: {}, current sharding expr: {}, generated seed: {})lenshapeNotImplementedErrorformatstrr   r   r   Zprocess_ids_mesh_offsetranger   _dim_offsets_rng_name_to_seedvalues)	rankZdims_mappingprocess_meshZseed_Zname_	unique_idZsharding_expriZrelative_idxr   r   r   determinate_rngJ   sH   	r+   c                  C   sh   t  sd S t D ](\} }| tv rt|  |ksJ q	td|  d|  tjj	| | |t| < q	d S )NzInit Auto Parallel RNG: z, with seed )
r   r%   items_inited_rng_name_to_seed_loggerinfopaddleZ	frameworkrandomZset_random_seed_generator)Zrng_namer   r   r   r   init_auto_parallel_rng   s   
r2   )r   )loggingr0   Zutils.log_utilsr   r(   r   Zstatic.utilsr   INFOr.   r%   r-   r   r   r   r"   r$   r   r   r   r+   r2   r   r   r   r   <module>   s$   

6