
    Αi                        S SK Jr  S SKrS SKrS SKrSSKJr  SSKJr  SSK	J
r
  \" \R                  5      r0 q0 q0 qSqS	qS
qSr/ SQrS rS rSSS jjr SS jr\R2                  S 5       rS rg)    )annotationsN   )
get_logger   )#retrieve_unique_id_for_process_mesh)_get_idx_in_axisF*       )      %   I   c                     [         $ )N_enable_random_control     g/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/distributed/auto_parallel/random.pyis_enable_auto_rand_ctrlr   '   s    !!r   c                     Sq g )NTr   r   r   r   enable_auto_rand_ctrlr   ,   s    !r   c                     [        5         U qUqg)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)seednames     r   parallel_manual_seedr   1   s    , KKr   c                   Uc   S5       eUc
  Uc   S5       eUb
  Ub   S5       e[        UR                  5      S:  a  [        SU 35      e[        n[        nU(       a  US-  n[        UR                  UR                  5      nUSU 3-   nU[        US-   -  -  n[        [        UR                  5      5       Hg  nUb  X;  d  Ub  X8   R                  5       (       d  S	n	O"[        UR                  UR                  UU 5      n	US
U SU	 3-  nU[        U   U	S-   -  -  nMi     U[        ;   a  [        U   U:X  d   e U$ U[        R                  5       ;  d   SU SU S[         35       eU[        U'   [        R                  " 5       (       a]  [        R                   " 5       n
[        R"                  " U5        [        R                   " 5       [$        U'   [        R&                  " U
5        U$ )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_rngr?   N   s,    #@%@@##z'= 9= (Z-C BD <"!UVbUcd
 	
 EE 4L44I eI;//M	\Y]++E3|))*+$)>":=+A+A+C+CL+((""	L 	4s!L>22aL1$455 ,$ )) /5888  -4466 	
+E72KM?Zlm~l  A	
6 ,1-(!!###113NKK171E1E1G.  0r   c              #  v  #    U [         ;   d   SU  S35       e[        R                  " 5       n[        R                  " [         U    5         S v   [        R                  " 5       [         U '   [        R                  " U5        g ! [        R                  " 5       [         U '   [        R                  " U5        f = f7f)NzThe rng state name z haven't been init. )r2   r/   r1   r3   )r   r>   s     r   	rng_staterA      s      && 
dV#78& ))+N
,T23-$*$8$8$:D!^, %+$8$8$:D!^,s   AB9B 3B94B66B9c                 .   [        5       (       d  g [        R                  5        Hm  u  pU [        ;   a  [        U    U:X  d   eM   [        R                  SU  SU 35        [        R                  R                  R                  X5        U[        U '   Mo     g )NzInit Auto Parallel RNG: z, with seed )
r   r-   items_inited_rng_name_to_seed_loggerinfor/   	frameworkrandomset_random_seed_generator)rng_namer   s     r   init_auto_parallel_rngrK      s    #%% ,113//+H5===LL*8*LG ##==hM15$X. 4r   )r
   )r   intr   strreturnNone)NNN)
__future__r   
contextlibloggingr/   utils.log_utilsr   r6   r   static.utilsr   INFOrE   r-   r2   rD   r   r   r   r)   r,   r   r   r   r?   contextmanagerrA   rK   r   r   r   <module>rW      s    #    ( = *
W\\
"     "
"
< <@@F - -6r   