o
    "j_&                     @   s   d dl Z d dlZd dlZd dlm  mZ d dlmZ ddlm	Z	m
Z
 G dd dZe Zejdd Zejd	d
 Zejdd ZddddddddddddZd/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 )0    N)	framework   )op_infoop_mapc                   @   s$   e Zd Zdd Zdd Zdd ZdS )
PrimOptionc                 C   s
   d| _ d S )NFenable_primself r   _/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/incubate/autograd/utils.py__init__      
zPrimOption.__init__c                 C   s   | j S Nr   r	   r   r   r   
get_status   s   zPrimOption.get_statusc                 C   s
   || _ d S r   r   )r
   flagr   r   r   
set_status   r   zPrimOption.set_statusN)__name__
__module____qualname__r   r   r   r   r   r   r   r      s    r   c                   C   s   t  S )a  
    Note:
        **ONLY available in the static graph mode.**

    Shows whether the automatic differentiation mechanism based on
    automatic differential basic operators is ON. Defaults to OFF.

    Returns:
        flag(bool): Whether the automatic differentiation mechanism based on automatic differential basic operators is ON.

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle.incubate.autograd import enable_prim, disable_prim, prim_enabled

            >>> paddle.enable_static()
            >>> enable_prim()

            >>> print(prim_enabled())
            True

            >>> disable_prim()

            >>> print(prim_enabled())
            False

    )prim_optionr   r   r   r   r   prim_enabled&   s   r   c                   C      t d dS )a  
    Note:
        **ONLY available in the static graph mode.**

    Turns ON automatic differentiation mechanism based on automatic
    differential basic operators.

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle.incubate.autograd import enable_prim, prim_enabled

            >>> paddle.enable_static()
            >>> enable_prim()

            >>> print(prim_enabled())
            True

    TNr   r   r   r   r   r   r   H   s   r   c                   C   r   )a/  
    Note:
        **ONLY available in the static graph mode.**

    Turns OFF automatic differentiation mechanism based on automatic
    differential basic operators.

    Examples:

        .. code-block:: python

            >>> import paddle
            >>> from paddle.incubate.autograd import enable_prim, disable_prim, prim_enabled

            >>> paddle.enable_static()
            >>> enable_prim()

            >>> print(prim_enabled())
            True

            >>> disable_prim()

            >>> print(prim_enabled())
            False

    FNr   r   r   r   r   disable_primb   s   r   boolZint16Zint32Zint64Zfloat16Zfloat32Zfloat64Zuint8Zint8Z	complex64Z
complex128)r   r                              c                    s^   t |tsJ t|dkrd S t|dkr&|r |d gS  |d S  fdd|D S )Nr   r   c                    s   g | ]}  |qS r   )var).0nameblockr   r   
<listcomp>   s    z!get_var_block.<locals>.<listcomp>)
isinstancelistlenr%   )r)   namesis_tensor_listr   r(   r   get_var_block   s   r0   c                    &    j d u rg S  fddt j D S )Nc                       g | ]}t  j |qS r   )r0   r)   inputr&   nopr   r   r*      s    z&get_input_var_list.<locals>.<listcomp>)input_namessortedr6   r   r6   r   get_input_var_list   s
   

r:   c                 C   s<   d| vr| }n|  dd }|   \}}| | fS )N=r   )splitstrip)itemresarg_typearg_namer   r   r   
_solve_arg   s
   rB   c                 C   sb   t | j }d| v r||d  v r|d | }|| jvr d S |dkr,t| |S | |S )NattrsZDataType)r   typekeysZ
attr_namesdtypesdtypeattr)r7   r@   rA   
op_contentr   r   r   _get_attr_value   s   


rJ   c              
   C   sH  t | }|d d}t }g }|D ]}t|\}}t| j }	|dv rt|dkr*dnd}
|	|
rt|	|
 |}|sItd| d| d	| j d
dD ](}||}|durs|| j	v rst
| j| |rstd| d| d| j d
qK|dv rd|	 v r||	d  v r|||	d | < q|||< qt| ||}|| q||fS )z&get attrs' values for api args' valuesargs,)IntArrayZScalarrM   Z	int_arrayZscalarzNo value found for z of z type for operator .)Ztensor_nameZtensors_nameNzTensor type of zL is not supported in composite op. Please set other type value of input arg z for operator )ZTensorTensor[]inputs)r   r<   collectionsOrderedDictrB   r   rD   get
ValueErrorr8   r0   r)   r3   rE   rJ   append)r7   phi_namerK   Z	args_listrP   rC   r>   r@   rA   rI   Z
tensor_keyZtensor_contentZarg_name_newZ
attr_valuer   r   r   _get_args_values   sB   




rW   c                 C   s   | j du rg S | jtv rt| j d }n| j}t| |\}}g }| D ].\}}|| j v rM|dkr@|t| j| |dd q$|t| j| | q$|d q$|rZ|	| |S )z
    Generate all args inputs of composite op. Because inputs of composite op is
    the same as phi op desribed in ops.yaml. So we need to map origin op to phi op
    and then push input data and attrs of origin op to correspondng phi op.
    NrV   rO   T)r/   )
r8   rD   r   rW   itemsrU   r0   r)   r3   extend)r7   rV   rP   rC   r?   r>   Ztensor_typer   r   r   prepare_python_api_arguments   s(   



rZ   c                    r1   )Nc                    r2   r   )r0   r)   outputr4   r6   r   r   r*     s    z'get_output_var_list.<locals>.<listcomp>)output_namesr9   r6   r   r6   r   get_output_var_list  s
   

r]   c                 C   s   | j }|du r	g S | j}g }t| drBt| d  D ]"}t| d | }||vr1|d qt| j| |}|| q|S t	|dkrZt| j| |d }|| |S t
d)zlorigin op outputs must be mapped into outputs of composite rule. map info has been defined in op_compat.yamlNZoutputsr   r   zgWhen replace op with composite rule, there must exist output map info from origin op to composite rule.)r\   rD   r   rS   rE   rU   r0   r)   r[   r-   rT   )r7   Zorigin_output_namesr'   r?   r>   Zorigin_output_nameZorigin_output_varr   r   r   map_output_for_composite  s2   

r^   c                 C   s<   | d u st | tjjjr| gS g }| D ]}|t|7 }q|S r   )r+   paddlebaser   Variableflatten)inp	flattenedpartr   r   r   rb   7  s   rb   c                 C   s   t | }dd |D S )Nc                 S   s   g | ]}|d ur|qS r   r   )r&   r%   r   r   r   r*   B  s    z+flatten_and_remove_none.<locals>.<listcomp>)rb   )rc   rd   r   r   r   flatten_and_remove_none@  s   rf   c                 C   s*   t | tjr	| fS t | tjrt| S | S r   )r+   r   ra   typingSequencetuple)Zxsr   r   r   
as_tensorsE  s
   rj   r   )rQ   rg   r_   Zpaddle.framework.dtyper   rG   rF   Zpaddle.baseZphi_ops_mapr   r   r   r   Zstatic_onlyr   r   r   ZINT_DTYPE_2_STRINGr0   r:   rB   rJ   rW   rZ   r]   r^   rb   rf   rj   r   r   r   r   <module>   sJ   
!


		/!
 	