
    ϑiJ                         S SK Jr  S SKJrJr  S SKJr  SSKJrJ	r	J
r
JrJrJrJr  / r " S S\R                   5      r " S S	\5      r " S
 S\5      r " S S5      rg)    )unique_name)ORIGIN_INFOast_to_source_code)gast   )FOR_ITER_INDEX_PREFIXFOR_ITER_ITERATOR_PREFIXFOR_ITER_TARGET_PREFIXFOR_ITER_VAR_LEN_PREFIXFOR_ITER_VAR_NAME_PREFIXFOR_ITER_ZIP_TO_LIST_PREFIXcreate_assign_nodec                   (   ^  \ rS rSrU 4S jrSrU =r$ )BaseTransformer#   c                 B  > [        U[        R                  5      (       d  S[        U5       S3n[	        U5      e[        U[        S 5      n[        TU ]!  U5      nUnXQLa>  Ub;  [        U[        [        45      (       d  U4nUb  U H  n[        U[        U5        M     U$ )NzExpected "gast.AST", but got "z".)
isinstancer   ASTtype
ValueErrorgetattrr   supervisitlisttuplesetattr)selfnodemsgorigin_inforesultiter_resultn	__class__s          f/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/jit/dy2static/transformers/base.pyr   BaseTransformer.visit$   s    $))24:,bACS/!dK6t$"{'>kD%=99*n&$AA{K8 %      )__name__
__module____qualname____firstlineno__r   __static_attributes____classcell__)r$   s   @r%   r   r   #   s     r'   r   c                   *    \ rS rSrSrS rS rS rSrg)NameNodeReplaceTransformer7   z?
This class replaces specified gast.Name node by replace_node.
c                     [        U[        5      (       d   e[        U[        R                  5      (       d   eX l        X0l        U R                  U5        g N)r   strr   Nametarget_namereplace_noder   )r   	root_noder6   r7   s       r%   __init__#NameNodeReplaceTransformer.__init__<   sF    +s++++ ,		2222&(

9r'   c                 R    UR                   U R                  :X  a  U R                  $ U$ r3   )idr6   r7   )r   r   s     r%   
visit_Name%NameNodeReplaceTransformer.visit_NameQ   s%    77d&&&$$$r'   c                 ^   ^  UR                   nU 4S jn[        [        X25      5      Ul         U$ )Nc                 T   > U TR                   :X  a  TR                  R                  $ U $ r3   )r6   r7   r<   )sr   s    r%   replace:NameNodeReplaceTransformer.visit_Nonlocal.<locals>.replaceY   s(    D$$$((+++Hr'   )namesr   map)r   r   rD   rB   s   `   r%   visit_Nonlocal)NameNodeReplaceTransformer.visit_NonlocalV   s)    

	
 #g-.
r'   )r7   r6   N)	r)   r*   r+   r,   __doc__r9   r=   rF   r-   r(   r'   r%   r0   r0   7   s    *
	r'   r0   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
ForLoopTuplePreTransformerb   aT  pre-process of for loop.
>>> for A in B:
>>>    C

will be changed into :

>>> # make iterator-only to indexable list.
>>> UUID_iterator = _jst.Indexable(B)
>>> for UUID_target in UUID_iterator:
>>>     A = _jst.Unpack(UUID_target, structure)
>>>     C

make the later loop_transform have unified type:
>>> for target in iter:
>>>     body
c                     Xl         g r3   root)r   rN   s     r%   r9   #ForLoopTuplePreTransformer.__init__t   s    	r'   c                 :    U R                  U R                  5        g r3   )r   rN   r   s    r%   	transform$ForLoopTuplePreTransformer.transformw   s    

499r'   c                 6   U R                  U5        [        R                  " [        5      n[        R                  " [        5      nUR
                  n[        R                  " U S[        UR                  5      R                  5        S35      R                  S   n[        R                  " U[        R                  " 5       S S S9Ul        [        R                  " U[        R                  " 5       S S S9Ul	        U R                  XB5      UR                  SS& XQ/$ )Nz = _jst.Indexable()r   r<   ctx
annotationtype_comment)generic_visitr   generater
   r	   targetr   parser   iterstripbodyr5   StoreLoadtuple_to_stmts)r   r   tuple_targettuple_iteratororigin_tuple_nodeassign_iterator_nodes         r%   	visit_For$ForLoopTuplePreTransformer.visit_Forz   s    4 "++,BC$--.FG KK#zz01CDII1N1T1T1V0WWXY 

$q  ii

	
 II			
	 ,,->M		!A$++r'   c                     / n[        U[        R                  [        R                  45      (       d  gUR                   H#  nUR                  U R                  U5      5        M%     U$ )zCreate a sequence to represents the structure of nest.
For example: `a, (b,c), [d,e,f]` is represented by
`[1, [1,1], [1,1,1]]`. the `1` is just a notation.

Specially, `a` is represented by `1`.
r   )r   r   TupleListeltsappendtuple_node_to_unpack_structure)r   r   retelements       r%   ro   9ForLoopTuplePreTransformer.tuple_node_to_unpack_structure   sP     $TYY 788yyGJJt::7CD !
r'   c                     [        U R                  U5      5      n[        U5      R                  5       nU SU SU S3n[        R
                  " U5      R                  S   nU/$ )Nz = _jst.Unpack(z, rU   r   )r4   ro   r   r_   r   r]   r`   )r   r   
tuple_namestructure_strnode_strassign_node_strassign_nodes          r%   rc   )ForLoopTuplePreTransformer.tuple_to_stmts   sh    D??EF%d+113j
|2m_AF 	 jj166q9}r'   rM   N)r)   r*   r+   r,   rH   r9   rR   rh   ro   rc   r-   r(   r'   r%   rJ   rJ   b   s     ",0r'   rJ   c                       \ 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 rS rS rS rSrg)ForNodeVisitor   a  
This class parses python for statement, get transformed 3 statement components of for node
three key statements:
    1). init_stmts: list[node], prepare nodes of for loop, may not only one
    2). cond_stmt: node, condition node to judge whether continue loop
    3). body_stmts: list[node], updated loop body, sometimes we should change
        the original statement in body, not just append new statement

In this process, the semantics of for does not change.

Now only can parse 3 type statements (Here var is Tensor(Tensor) or python variable):
    1). for x in range(var[*]|var.numpy()[*])
    2). for x in var|var.numpy()
    3). for i, x enumerate(var|var.numpy())
c                 ^   [        U[        R                  5      (       d   S5       eXl        UR                  U l        U R                  5       (       a  UR                  OUR                  R                  U l        UR                  U l	        U R                  5       U l        [        R                  " [        5      U l        [        R                  " [         5      U l        [        R                  " [$        5      U l        U R)                  5       U l        U R-                  5       U l        S U l        g )NzIInput node for the initialization of ForNodeVisitor is not gast.For node.)r   r   Forr   r\   is_for_iterr^   args	iter_argsr`   _get_iter_var_nameiter_var_namer   r[   r   iter_idx_namer   iter_var_len_namer   iter_zip_to_list_name_get_iter_node	iter_node_get_enum_idx_nameenum_idx_nameargs_length)r   for_nodes     r%   r9   ForNodeVisitor.__init__   s    (DHH-- 	
W	
- 	 oo "--//HMMX]]5G5G 	 MM	 "446
 )112GH "-!5!56M!N%0%9%9'&
" ,,. "446  r'   c                    U R                  5         U R                  5       (       a  U R                  5       $ U R                  5       (       a  U R	                  5       $ U R                  5       (       a  U R                  5       $ g r3   )_args_checkis_for_range_iter_parse_for_range_stmtsr   _parse_for_stmtsis_for_enumerate_iter_parse_for_enumerate_stmtsrQ   s    r%   r]   ForNodeVisitor.parse   sk    !!##..00((**''))2244r'   c                 D   [        U R                  R                  [        R                  5      =(       al    [        U R                  R                  R
                  [        R                  5      =(       a-    U R                  R                  R
                  R                  S:H  $ )Nranger   r   r^   r   Callfuncr5   r<   rQ   s    r%   r    ForNodeVisitor.is_for_range_iter   s_    tyy~~tyy1 2499>>..		:2		##&&'1	
r'   c                 n   [        U R                  R                  [        R                  [        R
                  [        R                  [        R                  45      (       a  g[        U R                  R                  [        R                  5      (       al  [        U R                  R                  R                  [        R
                  5      (       a/  U R                  R                  R                  R                  S:X  a  g[        U R                  R                  [        R                  5      (       a  gg)NTnumpyF)r   r   r^   r   r5   	Attributerl   rk   r   r   attr	SubscriptrQ   s    r%   r   ForNodeVisitor.is_for_iter   s    IINNTYY		4::N
 
 tyy~~tyy11499>>..??		##((G3		77r'   c                 D   [        U R                  R                  [        R                  5      =(       al    [        U R                  R                  R
                  [        R                  5      =(       a-    U R                  R                  R
                  R                  S:H  $ )N	enumerater   rQ   s    r%   r   $ForNodeVisitor.is_for_enumerate_iter  s_    tyy~~tyy1 6499>>..		:6		##&&+5	
r'   c                 n   U R                  5       (       aB  [        U R                  5      U l        U R                  S:  a  U R                  S::  d   S5       eg U R	                  5       (       aB  [        U R                  5      U l        U R                  S:  a  U R                  S::  d   S5       eg S U l        g )Nr      z'range() function takes 1 to 3 arguments   z+enumerate() function takes 1 to 2 arguments)r   lenr   r   r   rQ   s    r%   r   ForNodeVisitor._args_check  s    !!##"4>>2D##q(T-=-=-B 9B-B ''))"4>>2D##q(T-=-=-B =B-B  $Dr'   c                    / nUR                  U R                  5       5        U R                  5       nU R                  5       nU R	                  X25      nU R
                  nUR                  U R                  U5      5        XU4$ r3   )rn   _build_index_init_node_build_compare_node_build_step_node_build_cond_stmtr`   _build_index_increase_node)r   
init_stmtscompare_node	step_node	cond_stmt
body_stmtss         r%   r   %ForNodeVisitor._parse_for_range_stmts#  sw    
$5578//1))+	)))B	YY
$99)DEj00r'   c                    / nUR                  U R                  5       5        UR                  U R                  5       5        UR                  U R	                  5       5        U R                  5       nU R                  5       nU R                  X25      nU R                  nU R                  5       u  pgU/USS& U H  n[        XR                  U5        M     UR                  U R                  U5      5        XU4$ Nr   )extend_build_iter_nodern   r   _build_var_len_assign_noder   r   r   r`   _build_assign_var_slice_noder0   r   r   	r   r   r   r   r   r   target_noderx   	body_nodes	            r%   r   ForNodeVisitor._parse_for_stmts0  s    
$//12$5578$99;<//1))+	)))B	YY
 $(#D#D#F &-
1Q#I&--{ $ 	$99)DEj00r'   c                 l   / nUR                  U R                  5       5        UR                  U R                  5       5        UR                  U R	                  5       5        UR                  U R                  5       5        U R                  5       nU R                  5       nU R                  X25      nU R                  nU R                  5       u  pgU/USS& U H  n[        XR                  U5        M     UR                  U R                  U5      5        UR                  U R                  5       5        XU4$ r   )r   r   rn   r   r   _build_enum_init_noder   r   r   r`   r   r0   r   r   _build_enum_increase_noder   s	            r%   r   )ForNodeVisitor._parse_for_enumerate_stmtsH  s   
$//12$5578$99;<$4467//1))+	)))B	YY
#'#D#D#F &-
1Q#I&--{ $
 	$99)DE$88:;j00r'   c                 ,   U R                  5       (       aF  U R                  S:X  a  SnO&[        U R                  S   5      R	                  5       nU R
                  nOSnU R                  nU SU 3n[        R                  " U5      R                  S   nU$ )Nr   0r    = )
r   r   r   r   r_   r   r   r   r]   r`   )r   index_init_value_strindex_init_var_nameindex_init_node_source_strindex_init_nodes        r%   r   %ForNodeVisitor._build_index_init_nodea  s    !!##1$'*$'9NN1%(%' % #'"4"4#& "&"4"4 ##3';&<= 	# **%?@EEaHr'   c                 &   [        U R                  [        R                  5      (       a  [        U R                  R                  [        R
                  5      (       a\  U R                  R                  R                  S:X  a8  [        U R                  R                  R                  5      R                  5       nO#[        U R                  5      R                  5       nU R                   SU S3n[        R                  " U5      R                  S   nU$ )Nr   z = _jst.Len(rU   r   )r   r   r   r   r   r   r   r   valuer_   r   r]   r`   )r   r   convert_len_node_source_strconvert_len_nodes       r%   r   )ForNodeVisitor._build_var_len_assign_nodew  s     t~~tyy114>>..??##((G3.##))eg  /t~~>DDFM %%&l=/C 	$  ::&ABGGJr'   c                 N   / n[        U R                  [        R                  5      (       a  [        U R                  R                  [        R
                  5      (       a  U R                  R                  R                  S:X  a  [        U R                  5      R                  5       nU R                   SU S3n[        R                  " U5      R                  S   nUR                  U5        [        R
                  " U R                  [        R                  " 5       SSS9U l        U$ )z
Process special cases for iter_node include:
  - Case 1 (for zip):

    - for i, val in enumerate(zip(x, y))  # original code:

    - __for_loop_iter_zip_0 = list(zip(x, y))
    - for i, val in enumerate(__for_loop_iter_zip_0)
zipz = list(rU   r   NrV   )r   r   r   r   r   r5   r<   r   r_   r   r]   r`   rn   rb   )r   	new_nodesr   zip_to_list_strzip_to_list_nodes        r%   r   ForNodeVisitor._build_iter_node  s     	dnndii00ZNN6
 6
 ~~""%%. 24>> B H H J112(=/K   $(::o#>#C#CA#F   !12!%11		#!%	" r'   c                 
   U R                  5       (       a7  U R                  S:w  a'  [        U R                  S   5      R	                  5       nOSnU R
                   SU 3n[        R                  " U5      R                  S   nU$ )Nr   r   r   r   )	r   r   r   r   r_   r   r   r]   r`   )r   init_value_strenum_init_node_source_strenum_init_nodes       r%   r   $ForNodeVisitor._build_enum_init_node  sx    %%''D,<,<,A/q0ABHHJN N'+'9'9&:#n=M$N!$=>CCAFr'   c                     U R                  5       (       a2  U R                  S:X  a  U R                  S   nU$ U R                  S   nU$ [        R                  " U R
                  [        R                  " 5       S S S9nU$ )Nr   r   rV   )r   r   r   r   r5   r   rb   )r   r   s     r%   r   "ForNodeVisitor._build_compare_node  s    !!## ##q( q!   ^^A&    99))IIK!	L r'   c                     U R                  5       (       a8  U R                  S:X  a  U R                  S   nU$ [        R                  " SS S9nU$ [        R                  " SS S9nU$ )Nr   r   r   r   kind)r   r   r   r   Constantr   r   s     r%   r   ForNodeVisitor._build_step_node  sq    !!## ##q( q!  	 ]]6   AD9Ir'   c           	         [        U[        R                  [        R                  45      (       d&  [	        S[        U5      R                  5        S35      e[        U[        R                  5      (       d  UR                  S:  a~  [        R                  " [        R                  " U R                  5       (       a  U R                  OU R                  [        R                  " 5       S S S9[        R                  " 5       /U/S9$ [        R                  " [        R                  " U R                  5       (       a  U R                  OU R                  [        R                  " 5       S S S9[        R                  " 5       /U/S9$ )NzDynamic-to-Static only supports the step value is a constant or negative constant in 'for-range' statements, such as '2', '-3'. But received: 'z;'. Please fix code to be compatible with Dynamic-to-Static.r   rV   )leftopscomparators)r   r   r   UnaryOpNotImplementedErrorr   r_   r   Comparer5   r   r   r   rb   GtLt)r   r   r   s      r%   r   ForNodeVisitor._build_cond_stmt  s7   )dmmT\\%BCC%55G	5R5X5X5Z4[  \WX 
 i..)//A2E
 <<YY  1133 **!//		#!%	 WWYK)N & <<YY  1133 **!//		#!%	 WWYK)N r'   c           	          [         R                  " [         R                  " U R                  5       (       a  U R                  OU R
                  [         R                  " 5       S S S9[         R                  " 5       US9$ )NrV   r\   opr   )r   	AugAssignr5   r   r   r   ra   Addr   s     r%   r   )ForNodeVisitor._build_index_increase_node  sa    ~~99 --// &&++JJL!	 xxz
 	
r'   c                    [        U R                  5      R                  5        SU R                   S3n[        R
                  " U5      R                  S   R                  n[        R                  " [        5      n[        X25      u  pEXE4$ )N[]r   )r   r   r_   r   r   r]   r`   r   r   r[   r   r   )r   var_slice_strvar_slice_nodenew_iter_var_namer   rx   s         r%   r   +ForNodeVisitor._build_assign_var_slice_node  s{    -dnn=CCEFaHZHZG[[\]M277:@@'001IJ#5$
  ''r'   c           	          [         R                  " [         R                  " U R                  [         R                  " 5       S S S9[         R
                  " 5       [         R                  " SS S9S9$ )NrV   r   r   r   )r   r   r5   r   ra   r   r   rQ   s    r%   r   (ForNodeVisitor._build_enum_increase_node  sP    ~~99%%JJL!	 xxz--ad3	
 		
r'   c                     U R                  5       (       a  U R                  R                  $ U R                  5       (       a  U R                  R                  $ U R	                  5       (       a#  U R                  R
                  S   R                  $ g )Nr   )r   r\   r<   r   r   rm   rQ   s    r%   r   !ForNodeVisitor._get_iter_var_name#  si    !!##;;>>!;;>>!''));;##A&)))r'   c                     U R                  5       (       a  U R                  $ U R                  5       (       a  U R                  S   $ g r   )r   r   r   rQ   s    r%   r   ForNodeVisitor._get_iter_node,  s<    >>!''))>>!$$r'   c                 t    U R                  5       (       a#  U R                  R                  S   R                  $ g r   )r   r\   rm   r<   rQ   s    r%   r   !ForNodeVisitor._get_enum_idx_name3  s/    %%'';;##A&)))r'   )r   r`   r   r   r   r   r   r   r   r   r\   N)r)   r*   r+   r,   rH   r9   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   r(   r'   r%   r{   r{      sw     / b	
 
$11012, *> 	,\
 (

r'   r{   N)paddle.baser   paddle.jit.dy2static.utilsr   r   paddle.utilsr   utilsr   r	   r
   r   r   r   r   __all__NodeTransformerr   r0   rJ   r{   r(   r'   r%   <module>r	     sd    $    d** (( (VE EPL Lr'   