
    x-jJ                         d dl mZ d dlmZmZ d dlmZ ddlmZm	Z	m
Z
mZmZmZmZ g Z G d dej                  Z G d d	e          Z G d
 de          Z G d d          ZdS )    )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                        e Zd Z fdZ xZS )BaseTransformerc                 v   t          |t          j                  s"dt          |           d}t	          |          t          |t          d           }t                                          |          }|}||ur>|<t          |t          t          f          s|f}||D ]}t          |t          |           |S )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.11/site-packages/paddle/jit/dy2static/transformers/base.pyr   zBaseTransformer.visit$   s    $)) 	"A4::AAACS//!dK66t$$d""{'>kD%=99 -*n&$ 9 9AA{K8888    )__name__
__module____qualname__r   __classcell__)r#   s   @r$   r   r   #   s8                r%   r   c                   $    e Zd ZdZd Zd Zd ZdS )NameNodeReplaceTransformerzG
    This class replaces specified gast.Name node by replace_node.
    c                     t          |t                    sJ t          |t          j                  sJ || _        || _        |                     |           d S N)r   strr   Nametarget_namereplace_noder   )r   	root_noder0   r1   s       r$   __init__z#NameNodeReplaceTransformer.__init__<   sZ    +s+++++ ,	22222&(

9r%   c                 4    |j         | j        k    r| j        S |S r-   )idr0   r1   )r   r   s     r$   
visit_Namez%NameNodeReplaceTransformer.visit_NameQ   s     7d&&&$$r%   c                 d     |j         } fd}t          t          ||                    |_         |S )Nc                 6    | j         k    rj        j        S | S r-   )r0   r1   r5   )sr   s    r$   replacez:NameNodeReplaceTransformer.visit_Nonlocal.<locals>.replaceY   s"    D$$$(++Hr%   )namesr   map)r   r   r;   r:   s   `   r$   visit_Nonlocalz)NameNodeReplaceTransformer.visit_NonlocalV   sC    
	 	 	 	 	
 #gu--..
r%   N)r&   r'   r(   __doc__r3   r6   r=    r%   r$   r+   r+   7   sK           *  
	 	 	 	 	r%   r+   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )ForLoopTuplePreTransformera  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                     || _         d S r-   )root)r   rC   s     r$   r3   z#ForLoopTuplePreTransformer.__init__t   s    			r%   c                 :    |                      | j                   d S r-   )r   rC   r   s    r$   	transformz$ForLoopTuplePreTransformer.transformw   s    

49r%   c                 0   |                      |           t          j        t                    }t          j        t                    }|j        }t          j        | dt          |j	                  
                                 d          j        d         }t          j        |t          j                    d d           |_        t          j        |t          j                    d d           |_	        |                     ||          |j        dd<   ||gS )Nz = _jst.Indexable()r   r5   ctx
annotationtype_comment)generic_visitr   generater
   r	   targetr   parser   iterstripbodyr/   StoreLoadtuple_to_stmts)r   r   tuple_targettuple_iteratororigin_tuple_nodeassign_iterator_nodes         r$   	visit_Forz$ForLoopTuplePreTransformer.visit_Forz   s   4   "+,BCC$-.FGG K#zYY1CDI1N1N1T1T1V1VYYY 
  

q  i
	
 
 
 I		
 
 
	 ,,->MM	!A#$d++r%   c                     g }t          |t          j        t          j        f          sdS |j        D ]*}|                    |                     |                     +|S )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$   ra   z9ForLoopTuplePreTransformer.tuple_node_to_unpack_structure   sd     $TY 788 	1y 	E 	EGJJt::7CCDDDD
r%   c                     t          |                     |                    }t          |                                          }| d| d| d}t	          j        |          j        d         }|gS )Nz = _jst.Unpack(z, rH   r   )r.   ra   r   rR   r   rP   rS   )r   r   
tuple_namestructure_strnode_strassign_node_strassign_nodes          r$   rV   z)ForLoopTuplePreTransformer.tuple_to_stmts   sx    D??EEFF%d++1133FF
FFmFFF 	 j116q9}r%   N)	r&   r'   r(   r>   r3   rF   r[   ra   rV   r?   r%   r$   rA   rA   b   si         "    , , ,0      r%   rA   c                       e 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 Zd Zd ZdS )ForNodeVisitora  
    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                 <   t          |t          j                  s
J d            || _        |j        | _        |                                 r|j        n|j        j        | _        |j	        | _	        | 
                                | _        t          j        t                    | _        t          j        t                     | _        t          j        t$                    | _        |                                 | _        |                                 | _        d | _        d S )NzIInput node for the initialization of ForNodeVisitor is not gast.For node.)r   r   Forr   rO   is_for_iterrQ   args	iter_argsrS   _get_iter_var_nameiter_var_namer   rN   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$   r3   zForNodeVisitor.__init__   s   (DH-- 	
 	
W	
 	
- 	 o "--//GHMMX]5G 	 M	 "4466
 )12GHH "-!56M!N!N%0%9'&
 &
" ,,.. "4466  r%   c                    |                                   |                                 r|                                 S |                                 r|                                 S |                                 r|                                 S d S r-   )_args_checkis_for_range_iter_parse_for_range_stmtsrn   _parse_for_stmtsis_for_enumerate_iter_parse_for_enumerate_stmtsrE   s    r$   rP   zForNodeVisitor.parse   s    !!## 	..000 	((***'')) 	224444r%   c                     t          | j        j        t          j                  oBt          | j        j        j        t          j                  o| j        j        j        j        dk    S )Nranger   r   rQ   r   Callfuncr/   r5   rE   s    r$   r~   z ForNodeVisitor.is_for_range_iter   sL    ty~ty11 249>.	::2	#&'1	
r%   c                    t          | j        j        t          j        t          j        t          j        t          j        f          rdS t          | j        j        t          j                  rEt          | j        j        j	        t          j                  r| j        j        j	        j
        dk    rdS t          | j        j        t          j                  rdS dS )NTnumpyF)r   r   rQ   r   r/   	Attributer^   r]   r   r   attr	SubscriptrE   s    r$   rn   zForNodeVisitor.is_for_iter   s    INTY	4:N
 
 	 4ty~ty11		49>.??		 	#(G334	77 	45r%   c                     t          | j        j        t          j                  oBt          | j        j        j        t          j                  o| j        j        j        j        dk    S )N	enumerater   rE   s    r$   r   z$ForNodeVisitor.is_for_enumerate_iter  sL    ty~ty11 649>.	::6	#&+5	
r%   c                 P   |                                  r;t          | j                  | _        | j        dk    r| j        dk    s
J d            d S |                                 r;t          | j                  | _        | j        dk    r| j        dk    s
J d            d S d | _        d S )Nr      z'range() function takes 1 to 3 arguments   z+enumerate() function takes 1 to 2 arguments)r~   lenrp   rz   r   rE   s    r$   r}   zForNodeVisitor._args_check  s    !!## 	$"4>22D#q((T-=-B-B-B9 .C-BB-B-B '')) 	$"4>22D#q((T-=-B-B-B= .C-BB-B-B  $Dr%   c                 8   g }|                     |                                            |                                 }|                                 }|                     ||          }| j        }|                     |                     |                     |||fS r-   )r`   _build_index_init_node_build_compare_node_build_step_node_build_cond_stmtrS   _build_index_increase_node)r   
init_stmtscompare_node	step_node	cond_stmt
body_stmtss         r$   r   z%ForNodeVisitor._parse_for_range_stmts#  s    
$5577888//11))++	)))\BB	Y
$99)DDEEE9j00r%   c                 H   g }|                     |                                            |                    |                                            |                    |                                            |                                 }|                                 }|                     ||          }| j        }| 	                                \  }}|g|dd<   |D ]}t          || j        |           |                    |                     |                     |||fS Nr   )extend_build_iter_noder`   r   _build_var_len_assign_noder   r   r   rS   _build_assign_var_slice_noder+   rr   r   	r   r   r   r   r   r   target_noderi   	body_nodes	            r$   r   zForNodeVisitor._parse_for_stmts0  s-   
$//11222$5577888$99;;<<<//11))++	)))\BB	Y
 $(#D#D#F#F [&-
1Q3# 	 	I&4-{    	$99)DDEEE9j00r%   c                    g }|                     |                                            |                    |                                            |                    |                                            |                    |                                            |                                 }|                                 }|                     ||          }| j	        }| 
                                \  }}|g|dd<   |D ]}t          || j        |           |                    |                     |                     |                    |                                            |||fS r   )r   r   r`   r   r   _build_enum_init_noder   r   r   rS   r   r+   rr   r   _build_enum_increase_noder   s	            r$   r   z)ForNodeVisitor._parse_for_enumerate_stmtsH  sk   
$//11222$5577888$99;;<<<$4466777//11))++	)))\BB	Y
#'#D#D#F#F [&-
1Q3# 	 	I&4-{    	$99)DDEEE$88::;;;9j00r%   c                    |                                  rB| j        dk    rd}n,t          | j        d                                                   }| j        }n	d}| j        }| d| }t          j        |          j	        d         }|S )Nr   0r    = )
r~   rz   r   rp   rR   rr   rs   r   rP   rS   )r   index_init_value_strindex_init_var_nameindex_init_node_source_strindex_init_nodes        r$   r   z%ForNodeVisitor._build_index_init_nodea  s    !!## 	51$$'*$$'9N1%( (%'' % #'"4#& "&"4 #==';== 	# *%?@@EaHr%   c                    t          | j        t          j                  rjt          | j        j        t          j                  rF| j        j        j        dk    r1t          | j        j        j                  	                                }n&t          | j                  	                                }| j
         d| d}t          j        |          j        d         }|S )Nr   z = _jst.Len(rH   r   )r   rw   r   r   r   r   r   r   valuerR   rt   rP   rS   )r   rr   convert_len_node_source_strconvert_len_nodes       r$   r   z)ForNodeVisitor._build_var_len_assign_nodew  s     t~ty11		G4>.??		G #(G33.#) egg M /t~>>DDFFM %CC=CCC 	$  :&ABBGJr%   c                    g }t          | j        t          j                  rt          | j        j        t          j                  r| j        j        j        dk    rt          | j                                                  }| j	         d| d}t          j
        |          j        d         }|                    |           t          j        | j	        t          j                    dd          | _        |S )a  
        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(rH   r   NrI   )r   rw   r   r   r   r/   r5   r   rR   ru   rP   rS   r`   rU   )r   	new_nodesrr   zip_to_list_strzip_to_list_nodes        r$   r   zForNodeVisitor._build_iter_node  s     	dndi00 	ZN6
 6
 	 ~"%.. 24> B B H H J J1KK=KKK   $(:o#>#>#CA#F   !1222!%1	#!%	" " " r%   c                     |                                  r8| j        dk    r-t          | j        d                                                   }nd}| j         d| }t          j        |          j        d         }|S )Nr   r   r   r   )	r   rz   r   rp   rR   ry   r   rP   rS   )r   init_value_strenum_init_node_source_strenum_init_nodes       r$   r   z$ForNodeVisitor._build_enum_init_node  s    %%'' 	!D,<,A,A/q0ABBHHJJNN N'+'9$N$Nn$N$N!$=>>CAFr%   c                     |                                  r&| j        dk    r| j        d         n| j        d         }n.t          j        | j        t          j                    d d           }|S )Nr   r   rI   )r~   rz   rp   r   r/   rt   rU   )r   r   s     r$   r   z"ForNodeVisitor._build_compare_node  s{    !!## 	 #q(( q!!^A& L  9)IKK!	  L r%   c                     |                                  r/| j        dk    r| j        d         nt          j        dd           }nt          j        dd           }|S )Nr   r   r   r   kind)r~   rz   rp   r   Constantr   r   s     r$   r   zForNodeVisitor._build_step_node  sj    !!## 	: #q(( q!!]666 I AD999Ir%   c                    t          |t          j        t          j        f          s2t	          dt          |                                           d          t          |t          j                  s|j        dk     rqt          j        t          j	        | 
                                r| j        n| j        t          j                    d d           t          j                    g|g          S t          j        t          j	        | 
                                r| j        n| j        t          j                    d d           t          j                    g|g          S )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   rI   )leftopscomparators)r   r   r   UnaryOpNotImplementedErrorr   rR   r   Comparer/   r~   rr   rs   rU   GtLt)r   r   r   s      r$   r   zForNodeVisitor._build_cond_stmt  sh   )dmT\%BCC 	%X5G	5R5R5X5X5Z5ZX X X  
 i.. %	)/A2E2E
 <Y  11330**!/	#!%	 	 	 WYYK)N   & <Y  11330**!/	#!%	 	 	 WYYK)N   r%   c                     t          j        t          j        |                                 r| j        n| j        t          j                    d d           t          j                    |          S )NrI   rO   opr   )r   	AugAssignr/   r~   rr   rs   rT   Addr   s     r$   r   z)ForNodeVisitor._build_index_increase_node  sp    ~9 --//,D&&+JLL!	 	 	 xzz
 
 
 	
r%   c                    t          | j                                                   d| j         d}t	          j        |          j        d         j        }t          j	        t                    }t          ||          \  }}||fS )N[]r   )r   rw   rR   rs   r   rP   rS   r   r   rN   r   r   )r   var_slice_strvar_slice_nodenew_iter_var_namer   ri   s         r$   r   z+ForNodeVisitor._build_assign_var_slice_node  s    -dn==CCEE]]HZ]]]M227:@'01IJJ#5~$
 $
 [ K''r%   c                     t          j        t          j        | j        t          j                    d d           t          j                    t          j        dd                     S )NrI   r   r   r   )r   r   r/   ry   rT   r   r   rE   s    r$   r   z(ForNodeVisitor._build_enum_increase_node  sa    ~9%JLL!	   xzz-ad333	
 	
 	
 		
r%   c                     |                                  r| j        j        S |                                 r| j        j        S |                                 r| j        j        d         j        S d S )Nr   )r~   rO   r5   rn   r   r_   rE   s    r$   rq   z!ForNodeVisitor._get_iter_var_name#  sj    !!## 	*;>! 	*;>!'')) 	*;#A&))tr%   c                 ~    |                                  r| j        S |                                 r| j        d         S d S r   )rn   rp   r   rE   s    r$   rv   zForNodeVisitor._get_iter_node,  sD     	%>!'')) 	%>!$$tr%   c                 \    |                                  r| j        j        d         j        S d S r   )r   rO   r_   r5   rE   s    r$   rx   z!ForNodeVisitor._get_enum_idx_name3  s.    %%'' 	*;#A&))tr%   N)r&   r'   r(   r>   r3   rP   r~   rn   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   rv   rx   r?   r%   r$   rk   rk      sj         /  /  / b	 	 	
 
 
   
 
 
$ $ $1 1 11 1 101 1 12  ,     *  >     	 	 	, , ,\
 
 
 ( ( (

 

 

        r%   rk   N)paddle.baser   paddle.jit.dy2static.utilsr   r   paddle.utilsr   utilsr   r	   r
   r   r   r   r   __all__NodeTransformerr   r+   rA   rk   r?   r%   r$   <module>r      s}   $ # # # # #                                   d*   (( ( ( ( ( ( ( (VE E E E E E E EPL L L L L L L L L Lr%   