o
    "j;                      @   s   d dl Z d dlmZ ddlmZ ddlmZ g ZG dd deZG dd	 d	eZ	G d
d deZ
G dd deZdd Zdd ZdS )    N)gast   )utils)BaseTransformerc                   @   sP   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S )BasicApiTransformerzD
    Class to transform basic API from dygraph to static graph.
    c                 C   s   || _ i | _d S N)rootclass_node_dictselfr    r   k/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/jit/dy2static/basic_api_transformer.py__init__   s   
zBasicApiTransformer.__init__c                 C   s6   t | j}|  t| j}|  | | j | jS r   )ToTensorTransformerr   	transformAttributeJstTransformervisit)r   Zto_tensor_transformerZattribute_transformerr   r   r   r   #   s   

zBasicApiTransformer.transformc                 C   s:   |  |rd S t|jD ]}t|tjr| | q|S r   )_update_class_node_dictr   walkvalue
isinstanceCall_visit_Call)r   node
child_noder   r   r   visit_Assign+   s   

z BasicApiTransformer.visit_Assignc                 C   s@   |j }t|D ]}t|tjrt|r d S | | q|S r   )r   r   r   r   r   r   is_dygraph_apir   )r   r   Z
value_noder   r   r   r   
visit_Expr4   s   

zBasicApiTransformer.visit_Exprc                 C   sJ   t |tjsJ tt|j}| |r#| |}t	
||}|S |S r   )r   r   r   astor	to_sourcegast_to_astfunc_is_dygraph_forward_get_class_noder   Zto_static_ast)r   r   	func_nameZ
class_nodeZstatic_noder   r   r   r   @   s   

zBasicApiTransformer._visit_Callc                 C   s
   || j v S r   r	   r   Zfunc_idr   r   r   r"   K      
z'BasicApiTransformer._is_dygraph_forwardc                 C   s
   | j | S r   r%   r&   r   r   r   r#   N   r'   z#BasicApiTransformer._get_class_nodec                 C   s   t |tjsJ |j}t |tjrAt|rdS t|rA|jj	}tj
|s(dS t||d tt|jd }|| j|< dS dS )NFr   r   T)r   r   Assignr   r   is_to_variabler   r   r!   attrZdygraph_class_to_static_apigetZupdate_args_of_funcr   r   r    targetsr	   )r   r   Z
node_valueZdygraph_apiZ
target_strr   r   r   r   Q   s   

z+BasicApiTransformer._update_class_node_dictN)__name__
__module____qualname____doc__r   r   r   r   r   r"   r#   r   r   r   r   r   r      s    	r   c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	r   zU
    Class to transform paddle.to_tensor and paddle.to_variable to paddle.assign
    c                 C   s   t |tjs
J d|| _d S )NFInput non-gast.AST node for the initialization of ToTensorTransformer.)r   r   ASTr   r   r   r   r   r   r   j   s   
zToTensorTransformer.__init__c                 C      |  | j | jS r   r   r   r   r   r   r   r   p      zToTensorTransformer.transformc                 C   s.   t |tjsJ t|rt|}| | |S r   )r   r   r   r)   to_assign_nodegeneric_visitr4   r   r   r   
visit_Callt   s
   
zToTensorTransformer.visit_CallN)r-   r.   r/   r0   r   r   r;   r   r   r   r   r   e   s
    r   c                   @   sR   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZdd Z	dd Z
dd Zd
S )NameloadJstTransformera9  
    change name and attribute load to __jst.Ld(name) pattern.
    for example:
        a.dtype -->  __jst.Ld(__jst.Ld(a).dtype)

    In paddle science and deepxde, we have to support changing tensor into variable
    in arbitrary occasion such as global tensor.

    NOTE: we only deal with ctx=Load() case.
    c                 C   s
   || _ d S r   )r   r
   r   r   r   r      r'   zNameloadJstTransformer.__init__c                 C   r5   r   r6   r7   r   r   r   r      r8   z NameloadJstTransformer.transformc                 C   s(   t dt|  djd j}|S )Nz_jst.Ld()r   )r   parser   ast_to_source_codestripbodyr   r4   r   r   r   _surround_with_ld   s   z(NameloadJstTransformer._surround_with_ldc                    s(    fdd|j D |_  |j|_|S )z`
        Can't convert name of function call, bacause this will affect CallTransformer.
        c                    s   g | ]}  |qS r   )r   ).0argr7   r   r   
<listcomp>   s    z5NameloadJstTransformer.visit_Call.<locals>.<listcomp>)argsr   r!   r4   r   r7   r   r;      s   z!NameloadJstTransformer.visit_CallNc                    s    fdd}|S )Nc                    sD   t |  sJ r| r| S |  t | jtjr | } | S r   )r   r:   ctxr   LoadrB   r   	node_typer   skip_fnr   r   r      s   

zDNameloadJstTransformer.create_visit_with_convert_load.<locals>.visitr   )r   rK   rL   r   r   rJ   r   create_visit_with_convert_load   s   	z5NameloadJstTransformer.create_visit_with_convert_loadc                 C   s   dd }|  tj||S )Nc                 S   s   t | dr
dS dS )Nz_jst.TF)r   r?   
startswithrI   r   r   r   rL      s
   
z7NameloadJstTransformer.visit_Attribute.<locals>.skip_fn)rM   r   	Attribute)r   r   rL   r   r   r   visit_Attribute   s   z&NameloadJstTransformer.visit_Attributec                 C      |  tj|S r   )rM   r   	Subscriptr4   r   r   r   visit_Subscript      z&NameloadJstTransformer.visit_Subscriptc                 C   rQ   r   )rM   r   Namer4   r   r   r   
visit_Name   rT   z!NameloadJstTransformer.visit_Namer   )r-   r.   r/   r0   r   r   rB   r;   rM   rP   rS   rV   r   r   r   r   r<   |   s    
r<   c                   @   r1   )	r   a	  
    change some special attribute into __jst.XXX(obj, "attr_name") format.
    for example:
        a.size  -->  __jst.attr(a, "size")

    because `size` have different behavier when in dygraph / static graph mode
    NOTE: we only deal with ctx=Load() case.
    c                 C   s&   t |tjs
J ddh| _|| _d S )Nr2   size)r   r   r3   interested_namer   r4   r   r   r   r      s   
z AttributeJstTransformer.__init__c                 C   r5   r   r6   r7   r   r   r   r      r8   z!AttributeJstTransformer.transformc                 C   s~   t |tjsJ t |jtsJ t |jtjr8|j| jv r8|j}|j}t	dt
|  d| djd j}| | |S )Nz
_jst.Attr(z, "z")r   )r   r   rO   r*   strrG   rH   rX   r   r>   r   r?   r@   rA   r:   )r   r   r*   r   r   r   r   rP      s    
z'AttributeJstTransformer.visit_AttributeN)r-   r.   r/   r0   r   r   rP   r   r   r   r   r      s
    		r   c                 C   s8   t | tjsJ t| j }t| r|dS dS )NZto_variableF)	r   r   r   r   r?   r!   r@   r   endswith)r   Zapi_namer   r   r   r)      s
   

r)   c                 C   s   t | tjsJ tdjd j}|| _| jr#| jd g| _g | _| S t	| jD ]!\}}|j
dks6|j
dkrId| j| _
| j| g| _g | _ | S q(| S )Nzpaddle.assignr   r   datax)r   r   r   r>   rA   r   r!   rF   keywords	enumeraterD   )r   Z
assign_apiidxkwr   r   r   r9      s    r9   )r   Zpaddle.utilsr    r   Zbase_transformerr   __all__r   r   r<   r   r)   r9   r   r   r   r   <module>   s   KB+
