o
    "j                     @  s   d dl mZ d dlmZ d dlZd dlmZ ddlmZm	Z	m
Z
 ddlmZmZ er8dd	lmZmZ dd
lmZ d!ddZdd Zdd Zdd ZG dd dZd"ddZdd  ZdS )#    )annotations)TYPE_CHECKINGN)to_sequence   )
InnerErrormap_ifmap_if_extend   )SIRRuntimeCacheSymbol)	StatementStatementIR)SymbolicTraceContextvalueslist[Symbol] | list[object]statedict[str, Symbol]c                   s$   t | dd  fdddd d} | S )aH  
    Replaces Symbol objects with their corresponding values.

    Args:
        values: A list of values that may contain Symbol objects.
        state: A dict mapping Symbol names to their corresponding values.

    Returns:
        A new list with Symbol objects replaced by their corresponding values in the state dict.
    c                 S  s
   t | tS N
isinstancer   x r   d/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/jit/sot/symbolic/interpreter.py<lambda>.      
 z replace_symbol.<locals>.<lambda>c                   s
    | j  S r   namer   r   r   r   r   /   r   c                 S  s   | S r   r   r   r   r   r   r   0       predZtrue_fnZfalse_fn)r   )r   r   r   r   r   replace_symbol   s   
r"   c                 C  sJ   t jj rd S ddlm} |j}| }t| |D ]}|	|| qd S )Nr   )core)
paddlebaseZ	frameworkZuse_pir_apiZpaddle.frameworkr#   Zop_proto_and_checker_makerZkOpCreationCallstackAttrNamefor_each_ops_betweenZ	_set_attr)startendstackr#   Zop_makerZcallstack_attr_nameopr   r   r   _append_opstack_between5   s   r+   c                 c  s,    t j }| j| | }|E d H  d S r   )r$   staticdefault_main_programglobal_blockops)r'   r(   programr/   r   r   r   r&   B   s   
r&   c                  C  s   t j } t|  jS r   )r$   r,   r-   lenr.   r/   )r0   r   r   r   opnum_in_programJ   s   
r2   c                   @  sP   e Zd ZdZdddZdd
dZdddZdddZdd Zdd Z	dd Z
dS )Interpreterz;
    Interpreter is used to interpret and execute SIR.
    symbolic_contextr   c                 C  s
   || _ d S r   )_context)selfr4   r   r   r   __init__U   s   
zInterpreter.__init__r   strreturnr   c                 C  s   | j |S )z
        Returns the StatementIR object by given name.

        Args:
            name: The name of the StatementIR.

        Returns:
            The StatementIR object with the given name.
        )r5   get_sir)r6   r   r   r   r   r:   X   s   
zInterpreter.get_sirr   r   c                   s   |  |}|jD ]G}t }t|j}t| |j||}fdd tt|tt|j	kr3t
dt|t d |j t||j	dd  fdddd d	 qt|j	S )
aD  
        Runs the StatementIR with the given name using the provided state.

        Args:
            name: The name of the given StatementIR to run.
            state: A dict mapping Symbol names to their corresponding values.

        Returns:
            A list of the Symbol of the StatementIR after execution.
        c                   s   |  |j < d S r   r   vsr   r   r   _setv   s   z!Interpreter.run_sir.<locals>._setz*Number output mismatch, some error happen.r	   c                 S  s
   t |tS r   r   r;   r   r   r   r      r   z%Interpreter.run_sir.<locals>.<lambda>c                   s
    | |S r   r   r;   )r>   r   r   r      r   c                 S  s   d S r   r   r;   r   r   r   r      r   r    )r:   Z
statementsr2   r"   inputsgetattrtyper1   r   Zoutputsr   r+   Z
stmt_stackr   )r6   r   r   SIRstmtZbefore_stmt_opnumr?   Zoutsr   )r>   r   r   run_sird   s&   


zInterpreter.run_sirrC   r   c                 C  s$   |  |j}t||}| |j|S r   )r:   Zsir_nameprepare_staterD   )r6   rC   r?   rB   r   r   r   r   call   s   
zInterpreter.callc                 C  s   |\}}|j |i |S r   )api)r6   rC   r?   argskwargsr   r   r   rG      s   zInterpreter.apic                 C  s.   |\}}|d }t ||j|dd  i |S )Nr   r	   )r@   method)r6   rC   r?   rH   rI   varr   r   r   rJ      s   zInterpreter.methodc                 C  s.   |\}}|  }|d usJ d||i |S )NzSIR bound layer is None.)layer)r6   rC   r?   rH   rI   rL   r   r   r   rL      s   zInterpreter.layerN)r4   r   )r   r8   r9   r   )r   r8   r   r   )rC   r   )__name__
__module____qualname____doc__r7   r:   rD   rF   rG   rJ   rL   r   r   r   r   r3   P   s    



&r3   contextr   r   r8   c                   s   t jj fdd}|S )z
    Compile a SIR to a new function

    Args:
        context: The context to compile
        name: The name of the sir to compile

    c                   s(   t  }|}t|| }||S )z{
        This function will be decorated by paddle.to_static.
        so the args is variables, not eager tensors.
        )r3   r:   rE   rD   )rH   interpreterrB   r   rQ   r   r   r   wrapper   s   

zcompile_sir.<locals>.wrapper)r$   ZjitZnot_to_static)rQ   r   rT   r   rS   r   compile_sir   s   

rU   c                 C  sN   i }t  | jrt  | j}|r| }t| j|D ]	\}}|||j< q|S r   )r
   Zhas_keyr   Zget_free_varszipr?   )rB   r?   r   Zfree_var_seekerZsir_inpinpr   r   r   rE      s   rE   )r   r   r   r   )rQ   r   r   r8   )
__future__r   typingr   r$   Zpaddle.utilsr   utilsr   r   r   Zstatement_irr
   r   r   r   r4   r   r"   r+   r&   r2   r3   rU   rE   r   r   r   r   <module>   s    

O