o
    "jc                     @   s   d dl mZ ddlmZ ddlmZ g Zejdejdej	dej
dejd	ejd
ejdejdejdejdi
Zdd ZG dd deZdS )    )gast   )BaseTransformerast_to_source_codez==z!=<z<=>z>=iszis notinznot inc                 C   s   t t|  S N)cmpop_type_to_strtype)node r   i/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/jit/dy2static/logical_transformer.pycmpop_node_to_str$      r   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 )LogicalTransformerz
    Transform python boolean op into Paddle logical op.

    For example:
        a = x > 1 and y < 1

    Transformed code:
        a = _jst.And(lambda:x>1, lambda:y<1)
    c                 C   s
   || _ d S r   )root)selfr   r   r   r   __init__3   s   
zLogicalTransformer.__init__c                 C   s   |  | jS r   )visitr   )r   r   r   r   	transform6   r   zLogicalTransformer.transformc                 C   sH   |  | t|jtjr"t|j}d| d}t|jd j	}|S |S )Nz	_jst.Not()r   )
generic_visit
isinstanceopr   Notr   operandparsebodyvalue)r   r   argnew_node_strnew_noder   r   r   visit_UnaryOp9   s   

z LogicalTransformer.visit_UnaryOpc                 C   sR   |  | t|jtjr| |jd}|S t|jtjr%| |jd}|S td)NAndOrz9Only supports and/or syntax in control flow if statement.)	r   r   r   r   r&   _create_bool_op_nodevaluesr'   	TypeError)r   r   r$   r   r   r   visit_BoolOpC   s   
zLogicalTransformer.visit_BoolOpc                 C   s   t |dksJ dt | dt |dkr?| |dd |}t |dd dkr/|d }n
| |dd |}|g|g }dd |D }d| d	|d
  d|d  d}t|jd
 j}|S )a@  
        NOTE(liym27):
           The arguments of function convert_logical_XX should be callable so that they can be run
          according to the actual order. In `convert_logical_and(lambda:x>1, lambda:y<1)`, `lambda:y<1`
          must be run after `lambda:x>1`, If `x>1` is False, `y<1` should NOT be run.
        r   z8The length of BoolOp should be at least 2, but received .   Nc                 S   s   g | ]}t |qS r   r   ).0childr   r   r   
<listcomp>b   s    z;LogicalTransformer._create_bool_op_node.<locals>.<listcomp>z_jst.z(lambda:r   z	, lambda:r   )lenr(   r   r   r    r!   )r   nodesZapi_typeZpre_logic_nodeZpost_logic_nodeargsr#   r$   r   r   r   r(   O   s   
 z'LogicalTransformer._create_bool_op_nodeN)	__name__
__module____qualname____doc__r   r   r%   r+   r(   r   r   r   r   r   (   s    

r   N)Zpaddle.utilsr   Zbase_transformerr   utilsr   __all__EqNotEqLtLtEGtGtEIsIsNotInNotInr   r   r   r   r   r   r   <module>   s"   