
    zjO,                         G d  d          Z  e d          Z e d          Z e d          Z e d          Z e d          Z e d          Z e d          Zd	 Zd
 Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )c                   ,    e Zd ZdZddgZd Zd Zd ZdS )RegistryzA general registry object.nametabc                 "    || _         i | _        d S N)r   r   selfr   s     p/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/incubate/autograd/primreg.py__init__zRegistry.__init__   s    	    c                 H    || j         vsJ d| d            || j         |<   d S )Nzname "z"" should not be registered before.)r   )r	   r   values      r
   registerzRegistry.register   s<    48###=T=== $## r   c                 6    | j                             |          S r   )r   getr   s     r
   lookupzRegistry.lookup   s    x||D!!!r   N)__name__
__module____qualname____doc__	__slots__r   r   r    r   r
   r   r      sP        $$I    " " " " "r   r   	primop_fn	orig2prim	prim2orig
primop_jvpprimop_transposeprimop_position_argnames	compositec                 6    t                               |           S r   )
_primop_fnr   optypes    r
   	lookup_fnr$   ,       V$$$r   c                 6    t                               |           S r   )
_orig2primr   r"   s    r
   lookup_orig2primr(   0   r%   r   c                 6    t                               |           S r   )
_prim2origr   r"   s    r
   lookup_prim2origr+   4   r%   r   c                 6    t                               |           S r   )_primop_jvpr   r"   s    r
   
lookup_jvpr.   8   s    f%%%r   c                 6    t                               |           S r   )_primop_transposer   r"   s    r
   lookup_transposer1   <   s    ##F+++r   c                 6    t                               |           S r   )_composite_opsr   r"   s    r
   lookup_compositer4   @   s      (((r   c           	         t                               | j                  }|J d| j         d            |^ }}g }|D ]}t          t	          | j        j        |                     |                              }t          |          dk    sJ dt          |           d            t          |          dk    r|	                    |           |	                    |d                    |S )a4  
    Returns the position inputs of `op` as registered with REGISTER_FN.

    Args:
        op(Operator): The op that needs to get the inputs

    Returns:
        Tensor(s): Inputs of the op

    Examples:
        .. code-block:: python

            >>> from paddle.incubate.autograd.primops import _simple_binop
            >>> from paddle.base.layer_helper import LayerHelper
            >>> from paddle.incubate.autograd.primreg import REGISTER_FN

            >>> # doctest: +SKIP('Depends on external code.')
            >>> @REGISTER_FN('div_p', 'X', 'Y', 'Z')
            >>> def div(x, y, out=None):
            ...     return _simple_binop(LayerHelper('div_p', **locals()))

    The registered inputs are ['X', 'Y'] for div_p and accordingly this
    function will return inputs in the order of X then Y.

    Nzargs of z, should not be None in op_position_inputs().    z>len(vars) should be greater than or equal to 0, but len(vars)=.   )
_primop_position_argnamesr   typelistmapblockvarinputlenappend)opargsinput_names_inputsr   varss          r
   op_position_inputsrH   D   s    4 %++BG44DH27HHH  O[!F # #Cbhhtnn55664yyA~~~YSQUYYYYY ~~ t99q==MM$MM$q'""""Mr   c                 r   t                               | j                  }|
J d            |^ }}t          t	          | j        j        |                     |                              }t          |          dk    sJ dt          |           d            t          |          dk    r|}n|d         }|S )a  
    Returns the output of `op` as registered with REGISTER_FN.

    Args:
        op(Operator): The op that needs to get the output

    Returns:
        Tensor(s): Output of the op

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('Depends on external code.')
            >>> from paddle.incubate.autograd.primops import _simple_binop
            >>> from paddle.base.layer_helper import LayerHelper
            >>> from paddle.incubate.autograd.primreg import REGISTER_FN

            >>> @REGISTER_FN('div_p', 'X', 'Y', 'Z')
            >>> def div(x, y, out=None):
            ...     return _simple_binop(LayerHelper('div_p', **locals()))

    The registered output is ['Z'] for div_p and accordingly this
    function will return output Z.

    Nz0args should not be None in op_position_output().r6   zDlen(outvars) should be greater than or equal to 0, but len(outvars)=r7   r8   )	r9   r   r:   r;   r<   r=   r>   outputr@   )rB   rC   rE   output_nameoutvarsrJ   s         r
   op_position_outputrM   r   s    4 %++BG44DOOQ3rx|RYY{%;%;<<==Gw<<1^sSZ||^^^  7||aMr   c                      t           t                    s t          dt                      d          t                               |            fd}|S )a  
    Decorator for registering the Python function for a primitive op.

    Args:
        op_type(str): The op name
        position_argnames(list[str]): Input and output names of the op

    Returns:
        wrapper: Inner wrapper function

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('Depends on external code.')
            >>> from paddle.incubate.autograd.primops import _simple_binop
            >>> from paddle.base.layer_helper import LayerHelper
            >>> from paddle.incubate.autograd.primreg import REGISTER_FN

            >>> @REGISTER_FN('tanh_p', 'X', 'Y')
            >>> def tanh(x, out=None):
            ...    return _simple_unop(LayerHelper('tanh_p', **locals()))

    op_type must be str, but got r7   c                 >    t                               |            | S r   )r!   r   )fop_types    r
   wrapperzREGISTER_FN.<locals>.wrapper   s    GQ'''r   )
isinstancestr	TypeErrorr:   r9   r   )rR   position_argnamesrS   s   `  r
   REGISTER_FNrX      so    2 gs## JHWHHHIII&&w0ABBB     Nr   c                 |     t           t                    s t          dt                      d           fd}|S )a  
    Decorator for registering the lower function for an original op into sequence of primitive ops.

    Args:
        op_type(str): The op name

    Returns:
        wrapper: Inner wrapper function

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('Depends on external code.')
            >>> from paddle.base.layer_helper import LayerHelper
            >>> from paddle.incubate.autograd.utils import get_input_var_list
            >>> from paddle.incubate.autograd import primops
            >>> from paddle.incubate.autograd.primreg import REGISTER_ORIG2PRIM

            >>> @REGISTER_ORIG2PRIM('tanh')
            >>> def tanh_orig2prim(op):
            ...     x, = get_input_var_list(op)
            ...     return primops.tanh(x)

    rO   r7   c                 L      fd}t                               |           d S )Nc                 \    | j         k    sJ d| j          d              | g|R i |S Nz3op.type should be equal to op_type, but op.type is z and op_type is r:   rB   rC   kwargsrQ   rR   s      r
   _lowerz3REGISTER_ORIG2PRIM.<locals>.wrapper.<locals>._lower   V    7g%%%hbghh_fhh &%% 1R)$)))&)))r   )r'   r   rQ   r`   rR   s   ` r
   rS   z#REGISTER_ORIG2PRIM.<locals>.wrapper   @    	* 	* 	* 	* 	* 	* 	GV,,,,,r   rT   rU   rV   r:   rR   rS   s   ` r
   REGISTER_ORIG2PRIMrf      sX    2 gs## JHWHHHIII- - - - - Nr   c                 |     t           t                    s t          dt                      d           fd}|S )a  
    Decorator for registering the lower function for an original op into sequence of primitive ops.

    Args:
        op_type(str): The op name

    Returns:
        wrapper: Inner wrapper function

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('Depends on external code.')
            >>> import paddle
            >>> from paddle.incubate.autograd.primreg import REGISTER_COMPOSITE

            >>> @REGISTER_COMPOSITE('softmax')
            >>> def softmax_composite(x, axis):
            ...     molecular = paddle.exp(x)
            ...     denominator = paddle.broadcast_to(sum(molecular, axis=axis, keepdim=True), x.shape)
            ...     res = paddle.divide(molecular, denominator)
            ...     return res

    rO   r7   c                 L      fd}t                               |           d S )Nc                 T    | j         k    sJ d| j          d              |i |S r\   r]   r^   s      r
   r`   z3REGISTER_COMPOSITE.<locals>.wrapper.<locals>._lower  sK    7g%%%hbghh_fhh &%% 1d%f%%%r   )r3   r   rb   s   ` r
   rS   z#REGISTER_COMPOSITE.<locals>.wrapper  s@    	& 	& 	& 	& 	& 	& 	00000r   rd   re   s   ` r
   REGISTER_COMPOSITErj      sX    2 gs## JHWHHHIII1 1 1 1 1 Nr   c                 |     t           t                    s t          dt                      d           fd}|S )a  
    Decorator for registering the lower function for an primitive op into sequence of original ops.

    Args:
        op_type(str): The op name

    Returns:
        wrapper: Inner wrapper function

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('Depends on external code.')
            >>> import paddle
            >>> from paddle.incubate.autograd.primreg import REGISTER_PRIM2ORIG
            >>> from paddle.incubate.autograd.utils import get_input_var_list

            >>> @REGISTER_PRIM2ORIG('tanh_p')
            >>> def tanh_prim2orig(op):
            ...     x, = get_input_var_list(op)
            ...     return paddle.tanh(x)
            ...
    rO   r7   c                 L      fd}t                               |           d S )Nc                 \    | j         k    sJ d| j          d              | g|R i |S r\   r]   r^   s      r
   r`   z3REGISTER_PRIM2ORIG.<locals>.wrapper.<locals>._lower-  ra   r   )r*   r   rb   s   ` r
   rS   z#REGISTER_PRIM2ORIG.<locals>.wrapper,  rc   r   rd   re   s   ` r
   REGISTER_PRIM2ORIGrn     sX    0 gs## JHWHHHIII- - - - - Nr   c                 |     t           t                    s t          dt                      d           fd}|S )a,  
    Decorator for registering the JVP function for a primitive op.

    Args:
        op_type(str): The op name

    Returns:
        wrapper: Inner wrapper function

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('Depends on external code.')
            >>> from paddle.incubate.autograd import primops
            >>> from paddle.incubate.autograd.primreg import REGISTER_JVP

            >>> @REGISTER_JVP('add_p')
            >>> def add_jvp(op, x_dot, y_dot):
            ...     return primops.add(x_dot, y_dot)

    rO   r7   c                 L      fd}t                               |            S )Nc                 \    | j         k    sJ d| j          d              | g|R i |S r\   r]   r^   s      r
   _jvpz+REGISTER_JVP.<locals>.wrapper.<locals>._jvpR  ra   r   )r-   r   )rQ   rr   rR   s   ` r
   rS   zREGISTER_JVP.<locals>.wrapperQ  s?    	* 	* 	* 	* 	* 	* 	Wd+++r   rd   re   s   ` r
   REGISTER_JVPrs   8  X    , gs## JHWHHHIII     Nr   c                 |     t           t                    s t          dt                      d           fd}|S )a/  
    Decorator for registering the transpose function for a primitive op
    that denotes a linear operation in the forward AD graph.

    Args:
        op_type(str): The op name

    Returns:
        wrapper: Inner wrapper function

    Examples:
        .. code-block:: python

            >>> # doctest: +SKIP('Depends on external code.')
            >>> from paddle.incubate.autograd.primreg import REGISTER_TRANSPOSE

            >>> @REGISTER_TRANSPOSE('add_p')
            >>> def add_transpose(op, z_bar):
            ...     return z_bar, z_bar

    rO   r7   c                 L      fd}t                               |            S )Nc                 ^    | j         k    sJ d| j          d              | |g|R i |S r\   r]   )rB   dot_checkerrC   r_   rQ   rR   s       r
   
_transposez7REGISTER_TRANSPOSE.<locals>.wrapper.<locals>._transposex  sX    7g%%%hbghh_fhh &%% 1R6t666v666r   )r0   r   )rQ   ry   rR   s   ` r
   rS   z#REGISTER_TRANSPOSE.<locals>.wrapperw  s?    	7 	7 	7 	7 	7 	7 	""7J777r   rd   re   s   ` r
   REGISTER_TRANSPOSErz   ^  rt   r   N)r   r!   r'   r*   r-   r0   r9   r3   r$   r(   r+   r.   r1   r4   rH   rM   rX   rf   rj   rn   rs   rz   r   r   r
   <module>r{      s   " " " " " " " "& Xk""
Xk""
Xk""
h|$$H/00 $H%?@@ +&&% % %% % %% % %& & &, , ,) ) )+ + +\' ' 'T" " "J% % %P% % %P$ $ $N# # #L# # # # #r   