o
    "jN                     @   s   d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZmZ d dlmZ g ZG dd dejZG dd deZG dd	 d	eZG d
d deZG dd dZdS )    )unique_name)
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
ORIGI_INFOast_to_source_codecreate_assign_nodeget_attribute_full_name)gastc                       s   e Zd Z fddZ  ZS )BaseTransformerc                    s   t |tjsdt| d}t|t|td }t |}|}||urA|d urAt |t	t
fs2|f}|d urA|D ]}t|t| q8|S )NzExpected "gast.AST", but got "z".)
isinstancer   ASTtype
ValueErrorgetattrr	   supervisitlisttuplesetattr)selfnodemsgZorigin_inforesultZiter_resultn	__class__ f/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/jit/dy2static/base_transformer.pyr   "   s   zBaseTransformer.visit)__name__
__module____qualname__r   __classcell__r    r    r   r!   r   !   s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
RenameTransformerc                 C   s*   t |tjs
J d|| _d| _d| _d S )Nz0RenameTransformer only accepts gast.AST as input )r   r   r   rootold_namenew_namer   r   r    r    r!   __init__6   s   
zRenameTransformer.__init__c                 C   s   || _ || _| | j d S N)r)   r*   r   r(   )r   r)   r*   r    r    r!   rename>   s   zRenameTransformer.renamec                 C   s"   |  | |j| jkr| j|_|S r-   )generic_visitidr)   r*   r+   r    r    r!   
visit_NameC   s   
zRenameTransformer.visit_Namec                 C   s8   |  | t|}|| jkrt| jjd j}|S |S Nr   )r/   r   r)   r   parser*   bodyvalue)r   r   Zattr_full_nameZnew_name_noder    r    r!   visit_AttributeI   s   

z!RenameTransformer.visit_AttributeN)r"   r#   r$   r,   r.   r1   r6   r    r    r    r!   r&   5   s
    r&   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	NameNodeReplaceTransformerzG
    This class replaces specified gast.Name node by replace_node.
    c                 C   s8   t |tsJ t |tjsJ || _|| _| | d S r-   )r   strr   Nametarget_namereplace_noder   )r   Z	root_noder:   r;   r    r    r!   r,   W   s
   z#NameNodeReplaceTransformer.__init__c                 C   s   |j | jkr	| jS |S r-   )r0   r:   r;   r+   r    r    r!   r1   l   s   z%NameNodeReplaceTransformer.visit_Namec                    s&   |j } fdd}tt|||_ |S )Nc                    s   |  j kr	 jjS | S r-   )r:   r;   r0   )sr   r    r!   replacet   s   
z:NameNodeReplaceTransformer.visit_Nonlocal.<locals>.replace)namesr   map)r   r   r?   r>   r    r=   r!   visit_Nonlocalq   s   z)NameNodeReplaceTransformer.visit_NonlocalN)r"   r#   r$   __doc__r,   r1   rA   r    r    r    r!   r7   R   s
    r7   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )ForLoopTuplePreTransformera}  pre-process of for loop.
    >>> for A in B:
    >>>    C

    will be changed into :

    >>> UUID_iterator = _jst.Indexable(B)  # make iterator-only to indexable list.
    >>> 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                 C   s
   || _ d S r-   )r(   )r   r(   r    r    r!   r,      s   
z#ForLoopTuplePreTransformer.__init__c                 C   s   |  | j d S r-   )r   r(   r=   r    r    r!   	transform   s   z$ForLoopTuplePreTransformer.transformc                 C   s   |  | tt}tt}|j}t| dt|j	
  djd }tj|t d d d|_tj|t d d d|_	| |||jdd< ||gS )Nz = _jst.Indexable()r   r0   ctx
annotationtype_comment)r/   r   generater   r   targetr   r3   r
   iterstripr4   r9   StoreLoadtuple_to_stmts)r   r   Ztuple_targettuple_iteratorZorigin_tuple_nodeZassign_iterator_noder    r    r!   	visit_For   s.   


z$ForLoopTuplePreTransformer.visit_Forc                 C   s:   g }t |tjtjfsdS |jD ]
}|| | q|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   TupleListeltsappendtuple_node_to_unpack_structure)r   r   retelementr    r    r!   rX      s   
z9ForLoopTuplePreTransformer.tuple_node_to_unpack_structurec                 C   sF   t | |}t| }| d| d| d}t|jd }|gS )Nz = _jst.Unpack(z, rE   r   )r8   rX   r
   rM   r   r3   r4   )r   r   Z
tuple_nameZstructure_strZnode_strZassign_node_strassign_noder    r    r!   rP      s   z)ForLoopTuplePreTransformer.tuple_to_stmtsN)	r"   r#   r$   rB   r,   rD   rR   rX   rP   r    r    r    r!   rC   }   s    rC   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,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                 C   s   t |tjs
J d|| _|j| _|  r|jn|jj| _|j	| _	| 
 | _tt| _tt| _tt| _|  | _|  | _d | _d S )NzIInput node for the initialization of ForNodeVisitor is not gast.For node.)r   r   Forr   rK   is_for_iterrL   args	iter_argsr4   _get_iter_var_nameiter_var_namer   rJ   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   Zfor_noder    r    r!   r,      s&   



zForNodeVisitor.__init__c                 C   s<   |    |  r|  S |  r|  S |  r|  S d S r-   )_args_checkis_for_range_iter_parse_for_range_stmtsr^   _parse_for_stmtsis_for_enumerate_iter_parse_for_enumerate_stmtsr=   r    r    r!   r3     s   zForNodeVisitor.parsec                 C   2   t | jjtjot | jjjtjo| jjjjdkS )Nranger   r   rL   r   Callfuncr9   r0   r=   r    r    r!   rl     
   z ForNodeVisitor.is_for_range_iterc                 C   sp   t | jjtjtjtjtjfrdS t | jjtjr,t | jjj	tjr,| jjj	j
dkr,dS t | jjtjr6dS dS )NTnumpyF)r   r   rL   r   r9   	AttributerU   rT   rt   ru   attr	Subscriptr=   r    r    r!   r^     s   zForNodeVisitor.is_for_iterc                 C   rq   )N	enumeraters   r=   r    r    r!   ro   (  rv   z$ForNodeVisitor.is_for_enumerate_iterc                 C   sr   |   rt| j| _| jdkr| jdksJ dd S |  r4t| j| _| jdkr.| jdks2J dd S d | _d S )NrS      z'range() function takes 1 to 3 arguments   z+enumerate() function takes 1 to 2 arguments)rl   lenr`   rj   ro   r=   r    r    r!   rk   /  s   
zForNodeVisitor._args_checkc                 C   sN   g }| |   |  }|  }| ||}| j}| | | |||fS r-   )rW   _build_index_init_node_build_compare_node_build_step_node_build_cond_stmtr4   _build_index_increase_node)r   
init_stmtscompare_node	step_node	cond_stmt
body_stmtsr    r    r!   rm   =  s   
z%ForNodeVisitor._parse_for_range_stmtsc           	      C   s   g }| |   ||   ||   |  }|  }| ||}| j}| 	 \}}|g|dd< |D ]	}t
|| j| q7|| | |||fS r2   )extend_build_iter_noderW   r   _build_var_len_assign_noder   r   r   r4   _build_assign_var_slice_noder7   rb   r   	r   r   r   r   r   r   target_noder[   Z	body_noder    r    r!   rn   J  s    
zForNodeVisitor._parse_for_stmtsc           	      C   s   g }| |   ||   ||   ||   |  }|  }| ||}| j	}| 
 \}}|g|dd< |D ]	}t|| j| q>|| | ||   |||fS r2   )r   r   rW   r   r   _build_enum_init_noder   r   r   r4   r   r7   rb   r   _build_enum_increase_noder   r    r    r!   rp   b  s$   
z)ForNodeVisitor._parse_for_enumerate_stmtsc                 C   s^   |   r| jdkrd}n	t| jd  }| j}nd}| j}| d| }t|j	d }|S )NrS   0r    = )
rl   rj   r
   r`   rM   rb   rc   r   r3   r4   )r   Zindex_init_value_strZindex_init_var_nameZindex_init_node_source_strZindex_init_noder    r    r!   r   {  s   
z%ForNodeVisitor._build_index_init_nodec                 C   sp   t | jtjr t | jjtjr | jjjdkr t| jjj	 }nt| j	 }d
| j|}t|jd }|S )Nrw   z{} = _jst.Len({})r   )r   rg   r   rt   ru   rx   ry   r
   r5   rM   formatrd   r3   r4   )r   rb   Zconvert_len_node_source_strZconvert_len_noder    r    r!   r     s    z)ForNodeVisitor._build_var_len_assign_nodec                 C   s   g }t | jtjrAt | jjtjrA| jjjdkrAt| j }dj	| j
|d}t|jd }|| tj| j
t ddd| _|S )a  
        Process special cases for iter_node inclue:
          - 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{target} = list({value}))rK   r5   r   NrF   )r   rg   r   rt   ru   r9   r0   r
   rM   r   re   r3   r4   rW   rO   )r   Z	new_nodesrb   Zzip_to_list_strZzip_to_list_noder    r    r!   r     s$   


zForNodeVisitor._build_iter_nodec                 C   sN   |   r| jdkrt| jd  }nd}| j d| }t|jd }|S )NrS   r   r   r   )	ro   rj   r
   r`   rM   ri   r   r3   r4   )r   Zinit_value_strZenum_init_node_source_strZenum_init_noder    r    r!   r     s   z$ForNodeVisitor._build_enum_init_nodec                 C   sJ   |   r| jdkr| jd }|S | jd }|S tj| jt d d d}|S )NrS   r   rF   )rl   rj   r`   r   r9   rd   rO   )r   r   r    r    r!   r     s   
z"ForNodeVisitor._build_compare_nodec                 C   sD   |   r| jdkr| jd }|S tjdd d}|S tjdd d}|S )Nr|   r}   rS   r5   kind)rl   rj   r`   r   Constantr   r   r    r    r!   r     s   
zForNodeVisitor._build_step_nodec                 C   s   t |tjtjfstdt| t |tjs|jdk r<tj	tj
|  r*| jn| jt d d dt g|gdS tj	tj
|  rG| jn| jt d d dt g|gd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: '{}'. Please fix code to be compatible with Dynamic-to-Static.r   rF   )leftopscomparators)r   r   r   UnaryOpNotImplementedErrorr   r
   rM   r5   Comparer9   rl   rb   rc   rO   GtLt)r   r   r   r    r    r!   r     s@   
zForNodeVisitor._build_cond_stmtc                 C   s6   t jt j|  r| jn| jt  d d dt  |dS )NrF   rK   opr5   )r   	AugAssignr9   rl   rb   rc   rN   Addr   r    r    r!   r     s   z)ForNodeVisitor._build_index_increase_nodec                 C   sJ   d t| j | j}t|jd j}t	
t}t||\}}||fS )Nz{}[{}]r   )r   r
   rg   rM   rc   r   r3   r4   r5   r   rJ   r   r   )r   Zvar_slice_strZvar_slice_nodeZnew_iter_var_namer   r[   r    r    r!   r   $  s   
z+ForNodeVisitor._build_assign_var_slice_nodec                 C   s2   t jt j| jt  d d dt  t jdd ddS )NrF   rS   r   r   )r   r   r9   ri   rN   r   r   r=   r    r    r!   r   /  s   z(ForNodeVisitor._build_enum_increase_nodec                 C   s:   |   r| jjS |  r| jjS |  r| jjd jS d S )NrS   )rl   rK   r0   r^   ro   rV   r=   r    r    r!   ra   ;  s   z!ForNodeVisitor._get_iter_var_namec                 C   s$   |   r| jS |  r| jd S d S r2   )r^   r`   ro   r=   r    r    r!   rf   D  s
   
zForNodeVisitor._get_iter_nodec                 C   s   |   r| jjd jS d S r2   )ro   rK   rV   r0   r=   r    r    r!   rh   K  s   z!ForNodeVisitor._get_enum_idx_nameN)r"   r#   r$   rB   r,   r3   rl   r^   ro   rk   rm   rn   rp   r   r   r   r   r   r   r   r   r   r   ra   rf   rh   r    r    r    r!   r\      s0    1
,	r\   N)Zpaddle.baser   Zpaddle.jit.dy2static.utilsr   r   r   r   r   r   r	   r
   r   r   Zpaddle.utilsr   __all__NodeTransformerr   r&   r7   rC   r\   r    r    r    r!   <module>   s   0+G