
    yjV_                       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
 d dlmZ d dlmZ d dlmZ d d	lmZ g d
Z G d d          Z G d d          Z G d d          Z G d d          Zd Zed             Zd5dZd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d& Z*d' Z+d( Z,d) Z-d* Z.d+ Z/d, Z0ed6d/            Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6dS )7    )annotationsN)Sequence)	lru_cache)Any)pir)core)get_used_external_value)signature_safe_contextmanager)Uz	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.linear_v2z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_selectz	pd_op.varc                  &    e Zd Zd	dZd
dZddZdS )ValueWrapperreturnNonec                H   t          |t                    r1t          |j        t          d           t          j        f          sJ n8t          |t          d           t          j        f          st          d          t          |t                    r|j        n|| _        d S )Nz0Value Wrapper is only support None and pir.Value)
isinstancer   _valuetyper   Value	TypeError)selfvalues     n/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/autograd/backward_utils.py__init__zValueWrapper.__init__y   s    e\** 	elT$ZZ,CDDDDDDed4jj#)%<== F   '1&E&EPell5    intc                    t          | j        t          j                  r| j                                        S t	          | j                  S N)r   r   r   r   hashr   s    r   __hash__zValueWrapper.__hash__   s<    dk39-- 	%;##%%%$$$r   boolc                    t          |t                    st          j        d|j         d           dS | j        |j        | j        d u o|j        d u S | j                            |j                  S )NzMIn ValueWrapper.__eq__ expected type of `other` is ValueWrapper but received .F)r   r   warningswarn	__class__r   is_samer   others     r   __eq__zValueWrapper.__eq__   s    %.. 	Mr`e`orrr   5;%,"6;$&?5<4+??{""5<000r   Nr   r   )r   r   )r   r    )__name__
__module____qualname__r   r   r)    r   r   r   r   x   sT        Q Q Q Q% % % %	1 	1 	1 	1 	1 	1r   r   c                      e Zd Z	 ddddZd Zd Zd Zd Zd Zdd	Z	d
 Z
ddZddZd Zd Zd Zd Zd ZddZdS )	ValueDictNdefault_factoryc               h    i | _         || _        ||                                D ]\  }}|| |<   d S d S r   )_items_default_factoryitems)r   iterr2   keyvals        r   r   zValueDict.__init__   sQ     +- / JJLL    SS		    r   c                v    t                      }| j                                        |_        | j        |_        |S r   )r0   r4   copyr5   r   rets     r   r;   zValueDict.copy   s0    kk[%%''
#4
r   c                D    |                                 D ]
\  }}|| |<   d S r   )r6   )r   
other_dictr8   r9   s       r   updatezValueDict.update   s6    "((** 	 	HCDII	 	r   c              #  T   K   | j                                         D ]}|j        V  d S r   )r4   keysr   r   r8   s     r   rB   zValueDict.keys   s>      ;##%% 	 	C*	 	r   c                4    | j                                         S r   )r4   valuesr   s    r   rE   zValueDict.values   s    {!!###r   c              #  ^   K   | j                                         D ]\  }}|j        |fV  d S r   )r4   r6   r   r   r8   r9   s      r   r6   zValueDict.items   sF      ))++ 	" 	"HC*c/!!!!	" 	"r   c                d    |                      |          s|S | j        t          |                   S r   )__contains__r4   r   r   r8   defaults      r   getzValueDict.get   s2      %% 	N{<,,--r   c                    |                      |          st          | d          | j                            t	          |                    S Nz is not in ValueDict)rI   KeyErrorr4   popr   rC   s     r   rP   zValueDict.pop   sK      %% 	9c777888{|C00111r   c                F    |                      |          s|| |<   | |         S r   )rI   rJ   s      r   
setdefaultzValueDict.setdefault   s+      %% 	 DICyr   r9   r   c                4    || j         t          |          <   d S r   )r4   r   rG   s      r   __setitem__zValueDict.__setitem__   s    ),L%%&&&r   c                    |                      |          s1| j        |                                 | |<   nt          | d          | j        t	          |                   S rN   )rI   r5   rO   r4   r   rC   s     r   __getitem__zValueDict.__getitem__   sd      %% 	=$0 1133S		#;;;<<<{<,,--r   c                *    t          | j                  S r   )r    r4   r   s    r   __bool__zValueDict.__bool__   s    DK   r   c                *    t          | j                  S r   )lenr4   r   s    r   __len__zValueDict.__len__   s    4;r   c                *    |                                  S r   )rB   r   s    r   __iter__zValueDict.__iter__   s    yy{{r   c                .    t          |          | j        v S r   )r   r4   rC   s     r   rI   zValueDict.__contains__   s    C  DK//r   r   strc                p    d                     d |                                 D                       }d| dS )N, c              3  *   K   | ]\  }}| d | V  dS )z: Nr.   ).0r8   r9   s      r   	<genexpr>z%ValueDict.__repr__.<locals>.<genexpr>   s0      KK(#sooooKKKKKKr   z
ValueDict())joinr6   r   	items_strs     r   __repr__zValueDict.__repr__   s;    IIKKdjjllKKKKK	(I((((r   r   )r9   r   r   r_   )r+   r,   r-   r   r;   r@   rB   rE   r6   rL   rP   rR   rT   rV   rX   r[   r]   rI   ri   r.   r   r   r0   r0      s1        
  	
  
  
  
  
       $ $ $" " ". . . .
2 2 2
   
- - - -. . .! ! !       0 0 0) ) ) ) ) )r   r0   c                  x    e Zd Z	 dddZd Zd Zdd	Zd
 Zd Zd Z	ddZ
ddZddZd Zd Zd Zd ZddZdS )ValueSetNr7   1Sequence[ValueWrapper] | set[ValueWrapper] | Nonec                h    t                      | _        ||D ]}|                     |           d S d S r   )set_setadd)r   r7   r9   s      r   r   zValueSet.__init__   sG     (+uu	    r   c                ^    t                      }| j                                        |_        |S r   )rl   rp   r;   r<   s     r   r;   zValueSet.copy   s#    jj9>>##
r   c                    |                      |          s)| j                            t          |                     d S d S r   )rI   rp   rq   r   r   r9   s     r   rq   zValueSet.add   sD      %% 	-IMM,s++,,,,,	- 	-r   r(   ro   c                :    |D ]}|                      |           d S r   )rq   )r   r(   r9   s      r   r@   zValueSet.update   s,     	 	CHHSMMMM	 	r   c                >    | j                                         j        S r   )rp   rP   r   r   s    r   rP   zValueSet.pop   s    y}}%%r   c                T    | j                             t          |                     d S r   )rp   remover   rt   s     r   rx   zValueSet.remove   s&    	c**+++++r   c                T    | j                             t          |                     d S r   )rp   discardr   rt   s     r   rz   zValueSet.discard   s&    	,s++,,,,,r   c                :    t          | j        |j        z            S r   rl   rp   r'   s     r   __and__zValueSet.__and__      	EJ.///r   c                :    t          | j        |j        z
            S r   r|   r'   s     r   __sub__zValueSet.__sub__  r~   r   c                :    t          | j        |j        z            S r   r|   r'   s     r   __or__zValueSet.__or__  r~   r   c                *    t          | j                  S r   )r    rp   r   s    r   rX   zValueSet.__bool__
  s    DIr   c                *    t          | j                  S r   )rZ   rp   r   s    r   r[   zValueSet.__len__  s    49~~r   c              #  0   K   | j         D ]}|j        V  d S r   )rp   r   rt   s     r   r]   zValueSet.__iter__  s2      9 	 	C*	 	r   c                .    t          |          | j        v S r   )r   rp   rt   s     r   rI   zValueSet.__contains__  s    C  DI--r   r   r_   c                L    d                     d | D                       }d| dS )Nra   c              3  4   K   | ]}t          |          V  d S r   )repr)rc   items     r   rd   z$ValueSet.__repr__.<locals>.<genexpr>  s(      ::Td4jj::::::r   z	ValueSet(re   )rf   rg   s     r   ri   zValueSet.__repr__  s3    II::T:::::	'9''''r   r   )r7   rm   )r(   ro   )r(   rl   rj   )r+   r,   r-   r   r;   rq   r@   rP   rx   rz   r}   r   r   rX   r[   r]   rI   ri   r.   r   r   rl   rl      s       HL      
- - -   & & &, , ,- - -0 0 0 00 0 0 00 0 0 0      . . .( ( ( ( ( (r   rl   c                  &    e Zd ZdZd ZddZd ZdS )	Statez
    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                   || _         t          t                    | _        t          t                    | _        t          j        t                    | _        t          t                    | _        t          t                    | _	        t          j        t                    | _
        t                      | _        d S )Nr1   )blockr0   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   zState.__init__$  s    
"+D"A"A"A%.t%D%D%D"'3D99 #,D"A"A"A%.t%D%D%D"'3D99 2;...r   r   r   c                   t          t                    | _        t          t                    | _        t	          j        t                    | _        | j                                        D ]!\  }}|g k    r|d         D ]}|g| j        |<   "| j	                                        D ]!\  }}|g k    r|d         D ]}|g| j        |<   "| j
                                        D ]\  }}|g k    r|g| j        |d         <   d S )Nr1   r   )r0   r   r   r   r   r   r   r   r6   r   r   )r   kvr   s       r   turn_mapzState.turn_map6  s&   "+D"A"A"A%.t%D%D%D"'3D99+1133 	9 	9DAqBwwqT 9 9E67SD+E22.4466 	< 	<DAqBwwqT < <E9:D.u55%++-- 	. 	.DAqBww+,#!!A$'	. 	.r   c                   t          |          }| j                                        |_        | j                                        |_        | j                                        |_        | j                                        |_        | j                                        |_        | j                                        |_        | j                                        |_        |S r   )	r   r   r;   r   r   r   r   r   r   )r   	new_blockstates      r   r;   z
State.copyG  s    i  #'#:#?#?#A#A &*&@&E&E&G&G# ".3355 $(#:#?#?#A#A &*&@&E&E&G&G#!.3355 27799 	/ r   Nr*   )r+   r,   r-   __doc__r   r   r;   r.   r   r   r   r     sP         = = =$. . . ."    r   r   c                    |D ]<}|D ]7}|                                 r!|                                rd|j        v r  dS 8=d S )NT)is_dense_tensor_typeinitializedshape)opinputsr6   r   s       r   _check_vjp_dynamic_shaper   ]  sp       	 	D))++$$&& $*$$ttt	 r   c              #    K   t          j                    }|                                 dk    rd}n@|o=t          j                    o*t	          | |          o|                                 t
          v}	 |r|rt          j        d           d V  |rt          j        d           d S d S # |rt          j        d           w w xY w)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   i  s      +--K	wwyyO##		  =466=(V44= 		!<<	 	2 	39 	3+E222 	2+D11111	2 	2; 	2+D1111	2s   2B( (C c                |    t          | |          s+t          d| d| d| dt          |            d| 
          d S )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     sf    e]++ 
{J{{W{{}{{]abg]h]h{{ly{{
 
 	

 
r   c                X    | g S t          | t                    rt          |           n| gS r   )r   r   r   )xs    r   _as_listr     s-    y	 H--64777A36r   c                :    t          fd| D                       S )Nc              3      K   | ]}|v V  	d S r   r.   )rc   r   	value_sets     r   rd   zsome_in_set.<locals>.<genexpr>  s'      22!qI~222222r   )any)
value_listr   s    `r   some_in_setr     s&    2222z222222r   c                b    |                                  dk    p|                                  dk    S )Npd_op.ifpd_op.while)r   r   s    r   is_control_flowr     s'    7799
"@bggii=&@@r   c                b    |                                                      d          \  }}|dk    S )Nr"   builtin)r   split)r   dialect_nameopnames      r   is_builtin_opr     s+    7799??3//L&9$$r   c                    | j         D ]o}t          |          r'|                                D ]}t          ||           |                                D ]"}|j        r||vr|                    |           #pd S r   )opsr   blocks"update_no_grad_set_by_stopgradientresultsstop_gradientrq   )r   no_grad_setr   	sub_blockr   s        r   r   r     s    i ' '2 	KYY[[ K K	29kJJJJZZ\\ 	' 	'E" 'uK'?'?&&&	'	' 'r   c                   |                                  dk    rt          |           S |                                  dk    rH|                                 t          |                                                                           z   S |                                  dk    rt          |           S |                                 S )Nr   r   pd_op.pylayer)r   r	   operands_sourceas_while_opbodyr   s    r   get_real_op_inputsr     s    	wwyyJ&r***	m	#	#!!##&=NN!!##'
 '
 
 	
 
o	%	%&r***!!###r   c                   |                                  }|                                 dk    r>|                                 D ])}|                    |                                           *|                                 dk    r|                                                                 j        D ]X}|                                dk    r>|                                D ])}|                    |                                           *Y|S )Npd_op.array_write_r   )r   r   operandsappendsourcer   r   r   )r   outputsr   internal_ops       r   get_real_op_outputsr     s    jjllG	wwyy((( 	' 	'ANN188::&&&&	wwyyM!!>>++00226 	/ 	/K!!%999$--// / /ANN188::....Nr   c           
     j   t          j        t                    }g fd| D              t                    }g }D ]`}t	          |          D ]N}t          j        |          s8|                                |v r"||                                xx         dz  cc<   Oat          j                    }D ]#}||         dk    r|	                    |           $|r|
                                }|	                    |           t	          |          D ]G}|                                }||xx         dz  cc<   ||         dk    r|	                    |           H|t          |          t                    k    rt          d          g }t          |          D ]}|                                dk    r|                    |          }	|                    |          }
t          |d|                    |                             D ]k}t!          |                                t%          t	          |                              r-|                                dk    r|                    |          }
l|	|
k    r|	                    |	|
f           |D ]\  }	}
||
         ||	         c||	<   ||
<   |S )zH
    if topo graph is op1 -> op2 -> op3
    return [op3, op2, op1]

    c                B    g | ]}|v                     |          S r.   )r   )rc   r   r   s     r   
<listcomp>z#inverse_sort_op.<locals>.<listcomp>  s(    444qq||SZZ]]|||r      r   zHinverse_sort_op wrong, sorted_list size is not equal to origin_list sizezpd_op.increment_Nr   )r   r   r   ro   r   r   is_fake_valueget_defining_opdequer   popleftrZ   
ValueErrorreversedr   indexr   r   rl   )old_opspending_countops_setsorted_listr   r   queuex_opchange_listidx_1idx_2op_inr   s               @r   inverse_sort_opr     s     +C00M
C4444G4444#hhGK 8 8#B'' 	8 	8A$Q'' 8A,=,=,?,?7,J,Ja//11222a7222	8 E  !!LL
 #]]__2#B'' 	# 	#A$$&&D$1$T"a''T"""  # ;3s88##V
 
 	
 K
 {## 3 37799***%%b))E%%b))E!+.E0A0A"0E0E.E"FGG 5 5**,, !3E!:!:;; 5
 

77'--e44E~~""E5>222# 
 
u 	/EK..
 r   c                    | D ]Y}|                                 dv r dS t          |          r/|                                D ]}t          |j                  r  dS ZdS )zX
    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     s}         7799CCC442 	     !%),,  444  5r   c                   |j         |         g k    r3|j         |         d         }|j        |                             |           |                                D ]]}|j        |         g k    rJ|j        |         d         }g |j        |<   ||j        v r$t          d|                                           ^| 	                    |           dS )z
    remove op from block
    r   z.input_grad in [%s] is value which need to sum N)
r   r   rx   r   r   r   r   r   r   	remove_op)r   r   r   fwd_op	valuegradr   s         r   r   r     s     "###B'*6"))"---ZZ\\  	#I."44,Y7:E.0E$U+333 PRWWYYPP   
OOBr   c                    t          |           dk    r6| d                                         D ]}|                                s dS dS dS )Nr   FT)rZ   r   	use_empty)while_tuple_opsopresults     r   while_prune_checkr  (  s_    
?q  '*2244 	 	H%%'' uut5r   c                   g }t          t          |                    }|D ]}|                                dk    ry|                    d                                          rQ|                    d                                          }|                    |           |                    |           t          |          r-|	                                D ]}t          ||j        |           |D ]}t          | ||           dS )z7
    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   r
  r
  1  s   
 J!$s)),,K N N7799)))yy||%%'' +++A..>>@@!!"%%%!!'***R   	NYY[[ N N	,Y	uMMMM $ $%U####$ $r   c                b    | j         D ]&}|                                D ]}|j        du r  dS 'dS NFT)r   r   r   )r   r   r   s      r   all_stop_gradient_truer  G  sR    i  ZZ\\ 	 	E"e++uuu ,	 4r   c                *    | D ]}|D ]
}|du r  dS dS r  r.   )list_of_listlist_r   s      r   all_input_stop_gradient_truer  O  sE      " 	 	M%%uuu &	 4r   c                &    | D ]}|D ]}|  dS 	dS r  r.   )r  r  r   s      r   all_output_grad_noner  W  s@       	 	E uuu !	 4r   c                Z    t          j        |           p|                                 dk    S )Nr   )r   has_vjpr   r   s    r   
op_has_vjpr  _  s&    
 <;rwwyyO;;r   c                    g }| j         /| j         j         r|| j         j         j        z  }|| j         j        z  }|| j        z  }|S )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_opsr  g  sU    
 I%* 	=+8<<IU'++	Ir   c                *    | }||v r||         }||v |S r   r.   )r   mapoutputs      r   return_map_valuer!  w  s)    F
C--V C--Mr   c                    g }t          t          |                     D ]Q}| |         |v r*|                    t          | |         |                     6|                    | |                    R|S r   )rangerZ   r   r!  )r   r  r   is       r   return_map_value_listr%  ~  ss    F3u:: $ $8s??MM*58S99::::MM%(####Mr   c                ,   |                                  dk    rt                      t                      fS t          |                                                                           dz   t          |                                           k    s
J d            t                      }t                      }t          |                                                                 |                                 dd                   D ]\  }}|||<   |||<   ||fS )zp
    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   r0   rZ   r   block_argumentsr   zip)while_oparg_to_value_mapvalue_to_arg_mapargr   s        r   argument_to_valuer-    s     }}-''{{IKK''x##%%5577881<  ""A A    	]  
 !{{ {{..00  ""122&  & &
U !&"%---r   c                    |                                  dv rQd t          t          t          |                               D             }|                                  dk    rd|d<   n|                                 }|S )z
    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_reshapec                    g | ]}d S )Tr.   )rc   _s     r   r   z*get_grad_semantic_info.<locals>.<listcomp>  s    OOOqdOOOr   r   Fr   )r   r#  rZ   r   get_input_grad_semantics)r   grad_semantic_infos     r   get_grad_semantic_infor3    s    
 
wwyy 	 	 	 POE#6H6L6L2M2M,N,NOOO7799
""$)q!88::r   c                l    |                                  D ]}|                                dk    r|c S d S )Nzbuiltin.split)all_used_opsr   )r   r   s     r   get_split_opr6    sC      ""  7799''III (4r   messager_   c                .    t          j        |            d S r   )loggingwarning)r7  s    r   warning_oncer;    s    OGr   c                   |                                 dk    s|                                 dk    rt          d          t          |                                          t          |                                          k    rt          d          t          |                                           t          |                                          k    rt          d          t          t          |                                                    D ]T}|                    |          j        }|                    |          j        }|r|sd|                     |          _        UdS )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   rZ   r   r   r#  r	  r   r  )if_optrue_yield_opfalse_yield_opr$  
stop_grad1
stop_grad2s         r   update_if_output_stopgradientrC    s]    	
**  J..0111 =((**++s&&((0 0   ABBB 5==??s=#@#@#B#BCCCCF
 
 	

 3}44667788 2 2"11!44B
#22155C
  	2 	2,1ELLOO)2 2r   c                b   |                                 dk    rt          d          t          |                                           dz   t          |                                          k    rUt          dt          |                                           dz   t          |                                          f           t          dt          |                                                    D ];}|                    |          j        }|sd|                     |dz
            _        <dS )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.
    r=  z!yield_op is not a yield operationr   zDMismatched while op_results  size %d with yield operands_source %d. FN)	r   r   rZ   r   r   r#  r	  r   r  )r)  yield_opr$  	stop_grads       r    update_while_output_stopgradientrG    sK    }}*$$<=== 8"c(*B*B*D*D&E&EEE RSVW_WgWgWiWiSjSjmnSnpst|  uM  uM  uO  uO  qP  qP  SQ  R  R
 
 	

 1c(22445566 9 9++A..<	  	938HOOAE""09 9r   c                    t          |                                          D ]\  }}|                    |           r|c S dS )Nr   )	enumerater   r&   )r   rE  r$  r   s       r   find_index_of_yieldrJ    sP    (224455  199U 	HHH	2r   c                *   | g k    r| S | d         d                                          }|                                dk    sJ |                    d                                           }|                    d                                                                                                          }g }|D ]}|                                                                                                dk    r~|                                                                }t          ||          }|dk    sJ |                    |	                                j
                            |                     |                    |           |dd          S )Nr   zcf.tuple_popr   r=  r   )r   r   r	  r  	first_useownerr   rJ  r   get_parent_block	parent_op)tuple_pop_outputsr   stack_optuple_push_inputstuple_push_inputs_with_ifr   rE  r   s           r   update_tuple_pop_origin_inputsrT  	  s|   B  	1	a	 	0	0	2	2B7799&&&&  ##3355H **4466<<>>NNPP "" 	4 	4??""$$))++z99((..00H'x88EB;;;;%,,))++5<<UCC    &,,U3333 %QRR((r   c                    |                                                                  }|j                                        dk    r,||k    rdS |j        }|j                                        dk    ,||k    rdS dS )Nzbuiltin.moduleTF)r   rN  rO  r   r  )r   r   value_blocks      r   value_in_blockrW     s    ''))::<<K
/


 
 $4
4
4K4" /


 
 $4
4
4
 t5r   )r   )r7  r_   )7
__future__r   r   r9  r#   collections.abcr   	functoolsr   typingr   paddler   paddle.baser   paddle.base.libpaddle.pirr	   paddle.base.wrapped_decoratorr
   r   r   r0   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r  r  r!  r%  r-  r3  r6  r;  rC  rG  rJ  rT  rW  r.   r   r   <module>r`     s   # " " " " "       $ $ $ $ $ $                              H G G G G GV V V r1 1 1 1 1 1 1 1:J) J) J) J) J) J) J) J)Z7( 7( 7( 7( 7( 7( 7( 7(t> > > > > > > >B   2 2 2*
 
 
 
7 7 73 3 3A A A% % %
' ' '
$ 
$ 
$
 
 
B B BJ    .  $ $ $,      < < <       . . ..  .      "2 "2 "2J9 9 96  ) ) ).
 
 
 
 
r   