o
    ñpiÔ&  ã                   @  s  d dl mZ 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d2d
d„ƒZejd3dd„ƒZejd3dd„ƒZd	dddddddddddœZd4d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d0d1„ ZdS )5é    )ÚannotationsN)Ú	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   úe/home/app/PaddleOCR-VL/.venv_paddleocr/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   ÚreturnÚboolc                   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   ÚNonec                   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	   K   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_prime   s   r   Z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   r3   c                   ó&   ˆ j d u rg S ‡ fdd„tˆ j ƒD ƒS )Nc                   ó   g | ]}t ˆ jˆ  |¡ƒ‘qS r   )r3   r,   Úinput©r)   Ún©Úopr   r   r-   £   s    ÿz&get_input_var_list.<locals>.<listcomp>)Úinput_namesÚsortedr9   r   r9   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
   rE   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)r:   rC   rD   Ú
op_contentr   r   r   Ú_get_attr_value±   s   


rM   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 r”d|	 ¡ v r||	d  ¡ v r|||	d | < q|||< qt| ||ƒ}| |¡ q||fS )z&get attrs' values for api args' valuesÚargsú,)ÚIntArrayZScalarrP   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ÚOrderedDictrE   r   rG   ÚgetÚ
ValueErrorr;   r3   r,   r6   rH   rM   Úappend)r:   Úphi_namerN   Z	args_listrS   rF   rA   rC   rD   rL   Z
tensor_keyZtensor_contentZarg_name_newÚ
attr_valuer   r   r   Ú_get_args_valuesÀ   sB   

ÿ

ÿÿ€
r[   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 described in ops.yaml. So we need to map origin op to phi op
    and then push input data and attrs of origin op to corresponding phi op.
    NrY   rR   T)r2   )
r;   rG   r   r[   ÚitemsrX   r3   r,   r6   Úextend)r:   rY   rS   rF   rB   rA   Ztensor_typer   r   r   Úprepare_python_api_argumentsï   s(   


ÿÿ
r^   c                   r4   )Nc                   r5   r   )r3   r,   Úoutputr7   r9   r   r   r-     s    ÿÿz'get_output_var_list.<locals>.<listcomp>)Úoutput_namesr<   r9   r   r9   r   Úget_output_var_list  s
   

þra   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`   rG   r   rV   rH   rX   r3   r,   r_   r0   rW   )r:   Zorigin_output_namesr*   rB   rA   Zorigin_output_nameZorigin_output_varr   r   r   Úmap_output_for_composite  s2   
ÿöÿ
ýÿrb   c                 C  sD   | d u st | tjjjtjjfƒr| gS g }| D ]}|t|ƒ7 }q|S r   )r.   ÚpaddleÚbaser   ÚVariableÚpirÚValueÚflatten)ÚinpÚ	flattenedÚpartr   r   r   rh   :  s   
ÿrh   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-   G  s    z+flatten_and_remove_none.<locals>.<listcomp>)rh   )ri   rj   r   r   r   Úflatten_and_remove_noneE  s   rl   c                 C  s2   t | tjtjjfƒr| fS t | tjƒrt| ƒS | S r   )	r.   r   re   rc   rf   rg   ÚtypingÚSequenceÚtuple)Úxsr   r   r   Ú
as_tensorsJ  s
   rq   )r   r   )r   r   r   )Ú
__future__r   rT   rm   rc   Zpaddle.framework.dtyper   rJ   rI   Zpaddle.baseZphi_ops_mapr   r   r   r   Zstatic_onlyr   r	   r   ZINT_DTYPE_2_STRINGr3   r=   rE   rM   r[   r^   ra   rb   rh   rl   rq   r   r   r   r   Ú<module>   sL   !õ
		/!
 