
    x-j                        d dl mZ d dlZ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i adad	ad
adZg dZd Zd ZdddZ	 ddZej        d             Zd ZdS )    )annotationsN   )
get_logger   )#retrieve_unique_id_for_process_mesh)_get_idx_in_axisF*       )      %   I   c                     t           S )N_enable_random_control     g/var/www/html/banglarbhumi/venv/lib/python3.11/site-packages/paddle/distributed/auto_parallel/random.pyis_enable_auto_rand_ctrlr   '   s    !!r   c                 
    da d S )NTr   r   r   r   enable_auto_rand_ctrlr   ,   s    !r   seedintnamestrreturnNonec                *    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 among mesh, and would NOT affect other process like Parameter initialization.

    Examples:
        # seed relative to training step
        auto_parallel_random_seed((step + 13) * 257)
        ...
        engine.prepare()
    N)r   _basic_seed_basic_name)r   r   s     r   parallel_manual_seedr"   1   s    , KKKKr   c                   |
J d            ||
J d            ||
J d            t          |j                  dk    rt          d|           t          }t          }|r|dz  }t          |j        |j                  }|d| z   }|t          |dz   z  z  }t          t          |j                            D ]d}|||vs|||         	                                sd	}	nt          |j        |j        ||           }	|d
| d|	 z  }|t          |         |	dz   z  z  }e|t          v rt          |         |k    sJ n|t                                          vsJ d| d| dt                       |t          |<   t          j                    rVt          j                    }
t          j        |           t          j                    t$          |<   t          j        |
           |S )NzMust provide process meshz/Must provide one of dims mapping or placements.z8Cannot provide dims mapping and placements at same time.   zGAuto Parallel Random Control for Mesh's rank > 4 is NOT supported! Got _zmesh:r   _dim:zSeed Conflict! current seed: z, current sharding expr: z, generated seed: )lenshapeNotImplementedErrorr    r!   r   process_ids_mesh_offsetrangeis_shardr   _dim_offsets_rng_name_to_seedvaluespaddlein_dynamic_modeget_rng_stater   _rng_name_to_statesset_rng_state)rankdims_mappingprocess_mesh
placementsseed_name_	unique_idsharding_exprirelative_idxorig_rng_states              r   determinate_rngrC   N   s|    ##%@####z'='=9 (>'== (Z-C-CB .D-CD <""!dVbdd
 
 	
 EE  4L4 I /I///M	\Y]++E3|)**++ 6 6$,)>)>":a=+A+A+C+C"LL+("	 L 	222L222aL1$455 ))) /588888-4466666 AE  A  AM  A  Am~  A  A 766 ,1-(!## 	1#133NK171E1G1G. 000r   c              #  l  K   | t           v sJ d|  d            t          j                    }t          j        t           |                     	 d V  t          j                    t           | <   t          j        |           d S # t          j                    t           | <   t          j        |           w xY w)NzThe rng state name z haven't been init. )r6   r3   r5   r7   )r   rB   s     r   	rng_staterE      s       &&&&8d888 '&& )++N
,T2333-$*$8$:$:D!^,,,,, %+$8$:$:D!^,,,,s   B 1B3c                 <   t                      sd S t                                          D ]q\  } }| t          v rt          |          |k    sJ "t                              d|  d|            t          j        j        	                    | |           |t          | <   rd S )NzInit Auto Parallel RNG: z, with seed )
r   r1   items_inited_rng_name_to_seed_loggerinfor3   	frameworkrandomset_random_seed_generator)rng_namer   s     r   init_auto_parallel_rngrO      s    #%%  ,1133 6 6$///+H5=====LLG8GGGG   #==hMMM15$X..6 6r   )r
   )r   r   r   r   r   r   )NNN)
__future__r   
contextlibloggingr3   utils.log_utilsr   r:   r   static.utilsr   INFOrI   r1   r6   rH   r   r    r!   r-   r0   r   r   r"   rC   contextmanagerrE   rO   r   r   r   <module>rW      s@   # " " " " "       ( ( ( ( ( ( = = = = = = * * * * * *
*W\
"
"     " " "
" " "
    < <@@ @ @ @F - - -6 6 6 6 6r   