
    ͑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
  S SKJr  S SKJr  S SKJr  S S	KJr  / S
Qr " S S5      r " S S5      r " S S5      r " S S5      rS r\S 5       rS2S jrS rS rS rS rS rS r S r!S r"S r#S r$S  r%S! r&S" r'S# r(S$ r)S% r*S& r+S' r,S( r-S) r.S* r/S+ r0\S3S, j5       r1S- r2S. r3S/ r4S0 r5S1 r6g)4    )annotationsN)Sequence)	lru_cache)Any)pir)core)get_used_external_value)signature_safe_contextmanager)Sz	pd_op.absz	pd_op.addz
pd_op.amaxz
pd_op.aminzpd_op.anglezpd_op.argsortzpd_op.assignzpd_op.batch_norm_z
pd_op.castz
pd_op.ceilzpd_op.concatz	pd_op.coszpd_op.cumprodzpd_op.cumsumzpd_op.dividez	pd_op.dotzpd_op.dropoutzpd_op.elementwise_powz	pd_op.erfz	pd_op.expzpd_op.expandzpd_op.floorz
pd_op.fmaxz
pd_op.fminzpd_op.gatherzpd_op.gather_ndz
pd_op.geluzpd_op.group_normzpd_op.hardsigmoidzpd_op.hardswishz
pd_op.kronzpd_op.kthvaluezpd_op.layer_normzpd_op.leaky_reluz	pd_op.logzpd_op.logcumsumexpzpd_op.logsumexpzpd_op.matmulz	pd_op.maxzpd_op.maximumz
pd_op.meanzpd_op.minimumzpd_op.multiplyz	pd_op.padz	pd_op.powz
pd_op.prodzpd_op.reduce_asz
pd_op.reluzpd_op.relu6zpd_op.reshapez
pd_op.rollzpd_op.rsqrtzpd_op.scalezpd_op.scatterzpd_op.scatter_nd_addzpd_op.sigmoidz
pd_op.siluz	pd_op.sinzpd_op.softmaxzpd_op.softsignzpd_op.splitz
pd_op.sqrtzpd_op.squarezpd_op.squeezezpd_op.stackzpd_op.subtractz	pd_op.sumzpd_op.swigluzpd_op.swishzpd_op.take_along_axisz
pd_op.tanhz
pd_op.tilez
pd_op.topkzpd_op.transposezpd_op.trunczpd_op.unsqueezezpd_op.wherezpd_op.p_normzpd_op.index_putzpd_op.index_addz	pd_op.eluzpd_op.masked_fillzpd_op.masked_selectc                  2    \ rS rSrSS jrSS jrS	S jrSrg)
ValueWrapperv   c                b   [        U[        5      (       a7  [        UR                  [        S 5      [        R
                  45      (       d   eO5[        U[        S 5      [        R
                  45      (       d  [        S5      e[        U[        5      (       a  UR                  U l        g UU l        g )Nz0Value Wrapper is only support None and pir.Value)
isinstancer   _valuetyper   Value	TypeError)selfvalues     ^/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/autograd/backward_utils.py__init__ValueWrapper.__init__w   s|    e\**ellT$Z,CDDDDed4j#))%<==F  '1&E&Eell5    c                    [        U R                  [        R                  5      (       a  U R                  R	                  5       $ [	        U R                  5      $ N)r   r   r   r   hashr   s    r   __hash__ValueWrapper.__hash__   s9    dkk399--;;##%%$$r   c                :   [        U[        5      (       d%  [        R                  " SUR                   S35        gU R
                  b  UR
                  c#  U R
                  S L =(       a    UR
                  S L $ U R
                  R                  UR
                  5      $ )NzMIn ValueWrapper.__eq__ expected type of `other` is ValueWrapper but received .F)r   r   warningswarn	__class__r   is_samer   others     r   __eq__ValueWrapper.__eq__   s~    %..MM_`e`o`o_ppqr ;;%,,"6;;$&?5<<4+??{{""5<<00r   )r   NreturnNone)r+   int)r+   bool)__name__
__module____qualname____firstlineno__r   r   r(   __static_attributes__ r   r   r   r   v   s    Q%	1r   r   c                      \ rS rSr SSS.S jjrS rS rS rS rS	 r	SS
 jr
S rSS jrSS jrS rS rS rS rS rSS jrSrg)	ValueDict   Ndefault_factoryc               `    0 U l         X l        Ub  UR                  5        H	  u  p4X@U'   M     g g r   )_items_default_factoryitems)r   iterr9   keyvals        r   r   ValueDict.__init__   s5     +- / JJLS	 ) r   c                z    [        5       nU R                  R                  5       Ul        U R                  Ul        U$ r   )r6   r;   copyr<   r   rets     r   rC   ValueDict.copy   s0    k[[%%'
#44
r   c                >    UR                  5        H	  u  p#X0U'   M     g r   )r=   )r   
other_dictr?   r@   s       r   updateValueDict.update   s    "((*HCI +r   c              #  j   #    U R                   R                  5        H  nUR                  v   M     g 7fr   )r;   keysr   r   r?   s     r   rL   ValueDict.keys   s&     ;;##%C** &s   13c                6    U R                   R                  5       $ r   )r;   valuesr   s    r   rP   ValueDict.values   s    {{!!##r   c              #  r   #    U R                   R                  5        H  u  pUR                  U4v   M     g 7fr   )r;   r=   r   r   r?   r@   s      r   r=   ValueDict.items   s,     ))+HC**c/! ,s   57c                b    U R                  U5      (       d  U$ U R                  [        U5         $ r   )__contains__r;   r   r   r?   defaults      r   getValueDict.get   s,      %%N{{<,--r   c                    U R                  U5      (       d  [        U S35      eU R                  R                  [	        U5      5      $ Nz is not in ValueDict)rV   KeyErrorr;   popr   rM   s     r   r^   ValueDict.pop   s>      %%cU"6788{{|C011r   c                >    U R                  U5      (       d  X U'   X   $ r   )rV   rW   s      r   
setdefaultValueDict.setdefault   s"      %%Iyr   c                2    X R                   [        U5      '   g r   )r;   r   rS   s      r   __setitem__ValueDict.__setitem__   s    ),L%&r   c                    U R                  U5      (       d.  U R                  b  U R                  5       X'   O[        U S35      eU R                  [	        U5         $ r\   )rV   r<   r]   r;   r   rM   s     r   __getitem__ValueDict.__getitem__   sV      %%$$0 113	#&:;<<{{<,--r   c                ,    [        U R                  5      $ r   )r.   r;   r   s    r   __bool__ValueDict.__bool__   s    DKK  r   c                ,    [        U R                  5      $ r   )lenr;   r   s    r   __len__ValueDict.__len__   s    4;;r   c                "    U R                  5       $ r   )rL   r   s    r   __iter__ValueDict.__iter__   s    yy{r   c                2    [        U5      U R                  ;   $ r   )r   r;   rM   s     r   rV   ValueDict.__contains__   s    C DKK//r   c                Z    SR                  S U R                  5        5       5      nSU S3$ )N, c              3  4   #    U  H  u  pU S U 3v   M     g7f)z: Nr4   ).0r?   r@   s      r   	<genexpr>%ValueDict.__repr__.<locals>.<genexpr>   s     Kl(#Ruols   z
ValueDict())joinr=   r   	items_strs     r   __repr__ValueDict.__repr__   s+    IIKdjjlKK	I;a((r   )r<   r;   r   )r@   r   r+   str)r/   r0   r1   r2   r   rC   rI   rL   rP   r=   rY   r^   ra   rd   rg   rj   rn   rq   rV   r   r3   r4   r   r   r6   r6      sa     
  	
 $".
2

-.! 0)r   r6   c                      \ rS rSr S SS jjrS rS rSS jrS rS r	S	 r
SS
 jrSS jrSS jrS rS rS rS rSS jrSrg)ValueSet   Nc                ^    [        5       U l        Ub  U H  nU R                  U5        M     g g r   )set_setadd)r   r>   r@   s      r   r   ValueSet.__init__   s-     (+u	  r   c                X    [        5       nU R                  R                  5       Ul        U$ r   )r   r   rC   rD   s     r   rC   ValueSet.copy   s     j99>>#
r   c                z    U R                  U5      (       d%  U R                  R                  [        U5      5        g g r   )rV   r   r   r   r   r@   s     r   r   ValueSet.add   s-      %%IIMM,s+, &r   c                8    U H  nU R                  U5        M     g r   )r   )r   r'   r@   s      r   rI   ValueSet.update   s    CHHSM r   c                J    U R                   R                  5       R                  $ r   )r   r^   r   r   s    r   r^   ValueSet.pop   s    yy}}%%%r   c                L    U R                   R                  [        U5      5        g r   )r   remover   r   s     r   r   ValueSet.remove   s    		c*+r   c                L    U R                   R                  [        U5      5        g r   )r   discardr   r   s     r   r   ValueSet.discard   s    		,s+,r   c                F    [        U R                  UR                  -  5      $ r   r   r   r&   s     r   __and__ValueSet.__and__       		EJJ.//r   c                F    [        U R                  UR                  -
  5      $ r   r   r&   s     r   __sub__ValueSet.__sub__  r   r   c                F    [        U R                  UR                  -  5      $ r   r   r&   s     r   __or__ValueSet.__or__  r   r   c                ,    [        U R                  5      $ r   )r.   r   r   s    r   rj   ValueSet.__bool__  s    DIIr   c                ,    [        U R                  5      $ r   )rm   r   r   s    r   rn   ValueSet.__len__  s    499~r   c              #  N   #    U R                    H  nUR                  v   M     g 7fr   )r   r   r   s     r   rq   ValueSet.__iter__  s     99C** s   #%c                2    [        U5      U R                  ;   $ r   )r   r   r   s     r   rV   ValueSet.__contains__  s    C DII--r   c                >    SR                  S U  5       5      nSU S3$ )Nrv   c              3  8   #    U  H  n[        U5      v   M     g 7fr   )repr)rx   items     r   ry   $ValueSet.__repr__.<locals>.<genexpr>  s     :TTd4jjTs   z	ValueSet(r{   )r|   r}   s     r   r   ValueSet.__repr__  s%    II:T::	9+Q''r   )r   r   )r>   z1Sequence[ValueWrapper] | set[ValueWrapper] | None)r'   r   )r'   r   r   )r/   r0   r1   r2   r   rC   r   rI   r^   r   r   r   r   r   rj   rn   rq   rV   r   r3   r4   r   r   r   r      sX    HLE
-&,-000.(r   r   c                  .    \ rS rSrSrS rSS jrS rSrg)	Statei  z
record relationship of forward op/value and backward op/value
one state must be binding with a block, if block has parent block,
state will include parent block info.

c                :   Xl         [        [        S9U l        [        [        S9U l        [
        R                  " [        5      U l        [        [        S9U l        [        [        S9U l	        [
        R                  " [        5      U l
        [        5       U l        g )Nr8   )blockr6   listvalue_to_valuegradvalue_to_sumvaluegradcollectionsdefaultdictop_to_opgradvaluegrad_to_valuesumvaluegrad_to_valueopgrad_to_op!inside_value_to_outside_value_map)r   r   s     r   r   State.__init__"  so    
"+D"A%.t%D"'33D9 #,D"A%.t%D"'33D9 2;.r   c                "   [        [        S9U l        [        [        S9U l        [        R
                  " [        5      U l        U R                  R                  5        H)  u  pU/ :w  d  M  US    H  nU/U R                  U'   M     M+     U R                  R                  5        H)  u  pU/ :w  d  M  US    H  nU/U R                  U'   M     M+     U R                  R                  5        H   u  pU/ :w  d  M  U/U R                  US   '   M"     g )Nr8   r   )r6   r   r   r   r   r   r   r   r=   r   r   )r   kvr   s       r   turn_mapState.turn_map4  s    "+D"A%.t%D"'33D9++113DABwqTE67SD++E2 " 4 ..446DABwqTE9:D..u5 " 7 %%++-DABw+,#!!!A$' .r   c                   [        U5      nU R                  R                  5       Ul        U R                  R                  5       Ul        U R                  R                  5       Ul        U R
                  R                  5       Ul        U R                  R                  5       Ul        U R                  R                  5       Ul        U R                  R                  5       Ul        U$ r   )	r   r   rC   r   r   r   r   r   r   )r   	new_blockstates      r   rC   
State.copyE  s    i #'#:#:#?#?#A &*&@&@&E&E&G# "..335 $(#:#:#?#?#A &*&@&@&E&E&G#!..335 22779 	/ r   )r   r   r   r   r   r   r   r   Nr*   )	r/   r0   r1   r2   __doc__r   r   rC   r3   r4   r   r   r   r     s    =$."r   r   c                    U HM  nU HD  nUR                  5       (       d  M  UR                  5       (       d  M1  SUR                  ;   d  MC      g   MO     g )NT)is_dense_tensor_typeinitializedshape)opinputsr=   r   s       r   _check_vjp_dynamic_shaper   [  sC    D))++$$&&$**$  r   c              #    #    [         R                  " 5       nU R                  5       S:X  a  SnONU=(       aE    [         R                  " 5       =(       a)    [	        X5      =(       a    U R                  5       [
        ;  n U(       a  U(       a  [         R                  " S5        S v   U(       a  [         R                  " S5        g g ! U(       a  [         R                  " S5        f f = f7f)Ncf.tuple_pushTF)r   _is_bwd_prim_enabledname_enable_prim_skip_dynamic_shaper   ALLOW_DYNAMIC_SHAPE_VJP_OPS_set_prim_backward_enabled)r   r   origin_prim	skip_prims       r   dynamic_shape_prim_vjp_guardr   g  s     ++-K	wwyO#	  =446=(4= 	!<<	 	29++E2++D1 ;++D1 s   A;C(>(C &C( C%%C(c                j    [        X5      (       d#  [        SU SU SU S[        U 5       SU 3
5      eg )NzThe type of 'z' in z	 must be z, but received z. )r   r   r   )input
input_nameexpected_typeop_nameextra_messages        r   
check_typer   }  sL    e++J<uWIY}o_]abg]h\iiklykz{
 	
 ,r   c                R    U c  / $ [        U [        5      (       a  [        U 5      $ U /$ r   )r   r   r   )xs    r   _as_listr     s)    y	 H--476A36r   c                .   ^ [        U4S jU  5       5      $ )Nc              3  ,   >#    U  H	  oT;   v   M     g 7fr   r4   )rx   r   	value_sets     r   ry   some_in_set.<locals>.<genexpr>  s     2z!I~zs   )any)
value_listr   s    `r   some_in_setr     s    2z222r   c                \    U R                  5       S:H  =(       d    U R                  5       S:H  $ )Npd_op.ifpd_op.while)r   r   s    r   is_control_flowr     s#    779
"@bggi=&@@r   c                N    U R                  5       R                  S5      u  pUS:H  $ )Nr!   builtin)r   split)r   dialect_nameopnames      r   is_builtin_opr     s$    779??3/L9$$r   c                   U R                    Hw  n[        U5      (       a"  UR                  5        H  n[        X15        M     UR	                  5        H.  nUR
                  (       d  M  XA;  d  M  UR                  U5        M0     My     g r   )opsr   blocks"update_no_grad_set_by_stopgradientresultsstop_gradientr   )r   no_grad_setr   	sub_blockr   s        r   r   r     s`    ii2YY[	29J )ZZ\E"""u'?& "	 r   c                6   U R                  5       S:X  a  [        U 5      $ U R                  5       S:X  a8  U R                  5       [        U R                  5       R	                  5       5      -   $ U R                  5       S:X  a  [        U 5      $ U R                  5       $ )Nr   r   pd_op.pylayer)r   r	   operands_sourceas_while_opbodyr   s    r   get_real_op_inputsr    s    	wwyJ&r**	m	#!!#&=NN!!#'
 
 	
 
o	%&r**!!##r   c                   U R                  5       nU R                  5       S:X  a6  U R                  5        H"  nUR                  UR	                  5       5        M$     U R                  5       S:X  a{  U R                  5       R                  5       R                   HO  nUR                  5       S:X  d  M  UR                  5        H"  nUR                  UR	                  5       5        M$     MQ     U$ )Npd_op.array_write_r   )r   r   operandsappendsourcer  r  r   )r   outputsr   internal_ops       r   get_real_op_outputsr    s    jjlG	wwy((ANN188:& 	wwyM!>>+00266K!%99$--/ANN188:. 0 7 Nr   c           
     $   [         R                  " [        5      n/ nU  Vs/ s H  o3U;  d  M
  UR                  U5      PM       n[	        U5      n/ nU Hb  n[        U5       HP  n[        R                  " U5      (       a  M   UR                  5       U;   d  M6  XR                  5       ==   S-  ss'   MR     Md     [         R                  " 5       nU H  nX   S:X  d  M  UR                  U5        M      U(       as  UR                  5       nUR                  U5        [        U5       H:  nUR                  5       nX==   S-  ss'   X   S:X  d  M)  UR                  U5        M<     U(       a  Ms  [        U5      [        U5      :w  a  [        S5      e/ n	[        U5       H  nUR                  5       S:X  d  M  UR                  U5      n
UR                  U5      n[        USUR                  U5       5       H]  n[!        UR#                  5       [%        [        U5      5      5      (       d  M6  UR                  5       S:w  d  ML  UR                  U5      nM_     X:w  d  M  U	R                  X45        M     U	 H  u  pX[   XZ   sXZ'   X['   M     U$ s  snf )z<
if topo graph is op1 -> op2 -> op3
return [op3, op2, op1]

   r   zHinverse_sort_op wrong, sorted_list size is not equal to origin_list sizezpd_op.increment_Nr   )r   r   r-   r  r   r  r   is_fake_valueget_defining_opdequepopleftrm   
ValueErrorreversedr   indexr   r  r   )old_opspending_countr   r   ops_setsorted_listr   queuex_opchange_listidx_1idx_2op_ins                r   inverse_sort_opr#    sR     ++C0M
C#4Gq|]SZZ]G4#hGK#B'A$$Q''A,=,=,?7,J//12a72 ( 
 E!LL  ]]_2#B'A$$&D1$"a'T"	 ( % ;3s8#V
 	
 K
 {#779**%%b)E%%b)E!+.E0A0A"0E"FG**, !3E!:;  

7'--e4E H ~""E>2 $  $ 	/K. $ m 5s
   	JJc                    U  H_  nUR                  5       S;   a    g[        U5      (       d  M+  UR                  5        H   n[        UR                  5      (       d  M      g   Ma     g)zP
when program has inplace op , it's difficult to find the actual pending_count.
)r	  zpd_op.assign_out_TF)r   r   r   is_inplace_netr   )op_listr   r   s      r   r%  r%     sR     779CC2!%)),, %	  r   c                   UR                   U   / :w  a0  UR                   U   S   nUR                  U   R                  U5        UR                  5        Hd  nUR                  U   / :w  d  M  UR                  U   S   n/ UR
                  U'   XRR                  ;   d  MJ  [        SUR                  5        35      e   U R                  U5        g)z
remove op from block
r   z.input_grad in [%s] is value which need to sum N)
r   r   r   r   r   r   r   r  r   	remove_op)r   r   r   fwd_op	valuegradr   s         r   r(  r(    s     "###B'*6"))"-ZZ\	##I."4,,Y7:E.0E$$U+333 DRWWYKP  " 
OOBr   c                    [        U 5      S:w  a2  U S   R                  5        H  nUR                  5       (       a  M    g   gg)Nr   FT)rm   r   	use_empty)while_tuple_opsopresults     r   while_prune_checkr/  &  sA    
?q '*224H%%'' 5 r   c                   / n[        [        U5      5      nU H  nUR                  5       S:X  ai  UR                  S5      R	                  5       (       aC  UR                  S5      R                  5       nUR                  U5        UR                  U5        M~  M  [        U5      (       d  M  UR                  5        H  n[        XwR                  U5        M     M     U H  n[        XU5        M     g)z/
remove ops which are not in use recursively,

zpd_op.full_liker   r  N)r#  r   r   resultr,  operand_sourcer  r  r   r   remove_useless_full_like_opsr   r(  )r   r   r   
remove_opsinverse_opsr   full_opr  s           r   r3  r3  /  s    
 J!$s),K779))yy|%%''++A.>>@!!"%!!'* ( R  YY[	,YuM )  %U# r   c                |    U R                    H,  nUR                  5        H  nUR                  SL d  M      g   M.     gNFT)r   r   r   )r   r   r   s      r   all_stop_gradient_truer9  E  s6    iiZZ\E""e+ "  r   c                8    U  H  nU H  nUSL d  M
      g   M     gr8  r4   )list_of_listlist_r   s      r   all_input_stop_gradient_truer=  M  s&    "M% #  r   c                4    U  H  nU H	  nUc  M      g   M     gr8  r4   )r;  r<  r   s      r   all_output_grad_noner?  U  s$    E    r   c                b    [         R                  " U 5      =(       d    U R                  5       S:H  $ )Nr  )r   has_vjpr   r   s    r   
op_has_vjprB  ]  s#    
 <<;rwwyO;;r   c                    / nU R                   bU  U R                   R                   (       a"  XR                   R                   R                  -  nXR                   R                  -  nXR                  -  nU$ )z
when block is sub_block, forward op should include its parent block ops
(sub block nest should Add on demand to avoid block copy)
)parent_blockr   )r   	total_opss     r   parent_total_opsrF  e  sd    
 I%**++88<<<I''+++	Ir   c                *    U nX!;   a  X   nX!;   a  M  U$ r   r4   )r   mapoutputs      r   return_map_valuerJ  u  s    F
- -Mr   c                    / n[        [        U 5      5       H=  nX   U;   a  UR                  [        X   U5      5        M*  UR                  X   5        M?     U$ r   )rangerm   r  rJ  )r   rH  rI  is       r   return_map_value_listrN  |  sN    F3u:8s?MM*58S9:MM%(#	 
 Mr   c                   U R                  5       S:w  a  [        5       [        5       4$ [        U R                  5       R	                  5       5      S-   [        U R                  5       5      :X  d   S5       e[        5       n[        5       n[        U R                  5       R	                  5       U R                  5       SS 5       H  u  p4XAU'   X2U'   M     X4$ )zh
return while op's relationship of (block_argument to input value) and (input value to block_argument).
r   r  zRwhile op's block_arguments size + 1 should same to while op's operands_source sizeN)r   r6   rm   r  block_argumentsr  zip)while_oparg_to_value_mapvalue_to_arg_mapargr   s        r   argument_to_valuerV    s     }}-'{IK''x##%55781<  "A   	] 
 !{ {..0  "12&
 !&"% --r   c                    U R                  5       S;   aH  [        [        [        U 5      5      5       Vs/ s H  nSPM     nnU R                  5       S:X  a  SUS'   U$ U R	                  5       nU$ s  snf )zu
return whether op's inputs has grad, usually handled from yaml.
some op has uncertain inputs need special handling.
)zbuiltin.combiner   r   r  r   zdist_op.moe_global_mesh_tensorzdist_op.moe_sub_mesh_tensorszdist_op.dist_reshapeTr   Fr   )r   rL  rm   r  get_input_grad_semantics)r   _grad_semantic_infos      r   get_grad_semantic_infor[    s~    
 
wwy 	 	 -2#6H6L2M,NO,Nqd,NO779
"$)q!   88: Ps   A/c                b    U R                  5        H  nUR                  5       S:X  d  M  Us  $    g )Nzbuiltin.split)all_used_opsr   )r   r   s     r   get_split_opr^    s-      "779'I # r   c                0    [         R                  " U 5        g r   )loggingwarning)messages    r   warning_oncerc    s    OOGr   c                p   UR                  5       S:w  d  UR                  5       S:w  a  [        S5      e[        UR                  5       5      [        UR                  5       5      :w  a  [        S5      e[        U R	                  5       5      [        UR                  5       5      :w  a  [        S5      e[        [        UR                  5       5      5       H_  nUR                  U5      R                  nUR                  U5      R                  nU(       a	  U(       a  MI  SU R                  U5      l        Ma     g)z
Update if_op's stop_gradient based on true_yield_op and false_yield_op.

Args:
true_yield_op: true block of if_op's last op.
false_yield_op: false block of if_op's last op.
if_op: update it's op_results()'s stop_gradient.
cf.yieldzparam is not yield opz&Mismatched yield operands_source sizesz8Mismatched if op_results size with yield operands_sourceFN)	r   r  rm   r  r   rL  r2  r   r1  )if_optrue_yield_opfalse_yield_oprM  
stop_grad1
stop_grad2s         r   update_if_output_stopgradientrk    s    	
* J.011 =((*+s&&(0  ABB 5==?s=#@#@#BCCF
 	

 3}44678"11!4BB
#2215CC
 ,1ELLO) 9r   c                    UR                  5       S:w  a  [        S5      e[        U R                  5       5      S-   [        UR	                  5       5      :w  aA  [        S[        U R                  5       5      S-   [        UR	                  5       5      4 35      e[        S[        UR	                  5       5      5       H@  nUR                  U5      R                  nU(       a  M'  SU R                  US-
  5      l        MB     g)z
Update while_op's stop_gradient based on yield_op.

Args:
yield_op: The yield operation associated with the while loop.
while_op: The while operation whose op_results()'s stop_gradient needs to be updated.
re  z!yield_op is not a yield operationr  zDMismatched while op_results  size %d with yield operands_source %d. FN)	r   r  rm   r   r  rL  r2  r   r1  )rR  yield_oprM  	stop_grads       r    update_while_output_stopgradientro    s     }}*$<== 8"c(*B*B*D&EERSVW_WgWgWiSjmnSnpst|  uM  uM  uO  qP  TP  SQ  R
 	

 1c(22456++A.<<	 y38HOOAE"0 7r   c                |    [        UR                  5       5       H  u  p#UR                  U 5      (       d  M  Us  $    g)Nr   )	enumerater  r%   )r   rm  rM  r   s       r   find_index_of_yieldrr     s5    (224599UH 6 r   c                   U / :X  a  U $ U S   S   R                  5       nUR                  5       S:X  d   eUR                  S5      R                  5       nUR                  S5      R	                  5       R                  5       R                  5       n/ nU H  nUR	                  5       R                  5       R                  5       S:X  ak  UR	                  5       R                  5       n[        XV5      nUS:w  d   eUR                  UR                  5       R                  R                  U5      5        M  UR                  U5        M     USS  $ )Nr   zcf.tuple_popr  re  r   )r  r   r2  r1  	first_useownerr  rr  r  get_parent_block	parent_op)tuple_pop_outputsr   stack_optuple_push_inputstuple_push_inputs_with_ifr   rm  r  s           r   update_tuple_pop_origin_inputsr|    s%   B  	1	a	 	0	0	2B779&&&  #335H *446<<>NNP ""??""$))+z9(..0H'8EB;;%,,))+55<<UC &,,U3 # %QR((r   c                    U R                  5       R                  5       nUR                  R                  5       S:w  a2  X:X  a  gUR                  nUR                  R                  5       S:w  a  M2  X:X  a  gg)Nzbuiltin.moduleTF)r  rv  rw  r   rD  )r   r   value_blocks      r   value_in_blockr    si    '')::<K
//


 $4
4"" //


 $4
4
 r   ) )rb  r   )7
__future__r   r   r`  r"   collections.abcr   	functoolsr   typingr   paddler   paddle.baser   paddle.base.libpaddle.pirr	   paddle.base.wrapped_decoratorr
   r   r   r6   r   r   r   r   r   r   r   r   r   r   r  r  r#  r%  r(  r/  r3  r9  r=  r?  rB  rF  rJ  rN  rV  r[  r^  rc  rk  ro  rr  r|  r  r4   r   r   <module>r     s!   #    $     HT n1 1:J) J)Z7( 7(t> >B 2 2*
73A%
'
$
BJ.$,< ...  "2J96).
r   