Ë
    Ž\;jÐ-  ã                   óÜ   —  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y)c                   ó*   — e Zd ZdZddgZd„ Zd„ Zd„ Zy)ÚRegistryzA general registry object.ÚnameÚtabc                 ó    — || _         i | _        y ©N)r   r   ©Úselfr   s     úiG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/incubate/autograd/primreg.pyÚ__init__zRegistry.__init__   s   € ØˆŒ	Øˆ�ó    c                 óT   — || j                   vsJ d|› d�«       ‚|| j                   |<   y )Nzname "z"" should not be registered before.)r   )r	   r   Úvalues      r
   ÚregisterzRegistry.register   s5   € à˜Ÿ™Ñ ð	=à�D�6Ð;Ð<ó	=Ø àˆ�‰�Šr   c                 ó8   — | j                   j                  |«      S r   )r   Úgetr   s     r
   ÚlookupzRegistry.lookup   s   € Ø�x‰x�|‰|˜DÓ!Ð!r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r   r   r   © r   r
   r   r      s   „ Ù$à˜�€Iòòó"r   r   Ú	primop_fnÚ	orig2primÚ	prim2origÚ
primop_jvpÚprimop_transposeÚprimop_position_argnamesÚ	compositec                 ó,   — t         j                  | «      S r   )Ú
_primop_fnr   ©Úoptypes    r
   Ú	lookup_fnr$   ,   ó   € Ü×Ñ˜VÓ$Ð$r   c                 ó,   — t         j                  | «      S r   )Ú
_orig2primr   r"   s    r
   Úlookup_orig2primr(   0   r%   r   c                 ó,   — t         j                  | «      S r   )Ú
_prim2origr   r"   s    r
   Úlookup_prim2origr+   4   r%   r   c                 ó,   — t         j                  | «      S r   )Ú_primop_jvpr   r"   s    r
   Ú
lookup_jvpr.   8   s   € Ü×Ñ˜fÓ%Ð%r   c                 ó,   — t         j                  | «      S r   )Ú_primop_transposer   r"   s    r
   Úlookup_transposer1   <   s   € Ü×#Ñ# FÓ+Ð+r   c                 ó,   — t         j                  | «      S r   )Ú_composite_opsr   r"   s    r
   Úlookup_compositer4   @   s   € Ü× Ñ  Ó(Ð(r   c           	      óª  — t         j                  | j                  «      }|€J d| j                  › d�«       ‚|�^ }}g }|D ]�  }t        t	        | j
                  j                  | j                  |«      «      «      }t        |«      dk\  sJ dt        |«      › d�«       ‚t        |«      dkD  r|j                  |«       Œ}|j                  |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.

    z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 %×+Ñ+¨B¯G©GÓ4€DàÐðHà	�"—'‘'�ÐFÐGóHØà�O€[�!à€FÛˆÜ”C˜Ÿ™Ÿ™ b§h¡h¨t£nÓ5Ó6ˆä�‹I˜ŠNð	YàKÌCÐPTËIÈ;ÐVWÐXó	YØäˆt‹9�qŠ=Ø�M‰M˜$Õà�M‰M˜$˜q™'Õ"ð ð €Mr   c                 óB  — t         j                  | j                  «      }|€J d«       ‚|�^ }}t        t	        | j
                  j                  | j                  |«      «      «      }t        |«      dk\  sJ dt        |«      › d�«       ‚t        |«      dkD  r|}|S |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.

    z0args 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 %×+Ñ+¨B¯G©GÓ4€DØÐÐOÐOÓOÐØ�O€Qˆä”3�r—x‘x—|‘| R§Y¡Y¨{Ó%;Ó<Ó=€GäˆG‹˜Òð^à	MÌcÐRYËlÈ^Ð[\Ð]ó^Øä
ˆ7ƒ|�aÒØˆð €Mð ˜‘ˆà€Mr   c                 óŽ   ‡ — t        ‰ t        «      st        dt        ‰ «      › d�«      ‚t        j                  ‰ |«       ˆ 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                 ó4   •— t         j                  ‰| «       | S r   )r!   r   )ÚfÚop_types    €r
   ÚwrapperzREGISTER_FN.<locals>.wrapperº   s   ø€ Ü×Ñ˜G QÔ'Øˆr   )Ú
isinstanceÚstrÚ	TypeErrorr:   r9   r   )rR   Úposition_argnamesrS   s   `  r
   ÚREGISTER_FNrX   œ   sE   ø€ ô2 �gœsÔ#ÜÐ7¼¸W»°ÀaÐHÓIÐIä×&Ñ& wÐ0AÔBôð €Nr   c                 ób   ‡ — 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                 ó@   •‡ — ˆ ˆfd„}t         j                  ‰|«       y )Nc                 óh   •— | j                   ‰k(  sJ d| j                   › d‰› �«       ‚ ‰| g|¢­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Þ   óJ   ø€ à—‘˜7Ò"ðhàDÀRÇWÁWÀIÐM]Ð^eÐ]fÐgóhØ"á�RÐ)˜$Ò) &Ñ)Ð)r   )r'   r   ©rQ   r`   rR   s   ` €r
   rS   z#REGISTER_ORIG2PRIM.<locals>.wrapperÝ   ó   ù€ õ	*ô 	×Ñ˜G VÕ,r   ©rT   rU   rV   r:   ©rR   rS   s   ` r
   ÚREGISTER_ORIG2PRIMrf   Á   s4   ø€ ô2 �gœsÔ#ÜÐ7¼¸W»°ÀaÐHÓIÐIô-ð €Nr   c                 ób   ‡ — 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                 ó@   •‡ — ˆ ˆfd„}t         j                  ‰|«       y )Nc                 ó`   •— | j                   ‰k(  sJ d| j                   › d‰› �«       ‚ ‰|i |¤ŽS r\   r]   r^   s      €€r
   r`   z3REGISTER_COMPOSITE.<locals>.wrapper.<locals>._lower  sE   ø€ à—‘˜7Ò"ðhàDÀRÇWÁWÀIÐM]Ð^eÐ]fÐgóhØ"á�dÐ%˜fÑ%Ð%r   )r3   r   rb   s   ` €r
   rS   z#REGISTER_COMPOSITE.<locals>.wrapper  s   ù€ õ	&ô 	×Ñ ¨Õ0r   rd   re   s   ` r
   ÚREGISTER_COMPOSITErj   é   s4   ø€ ô2 �gœsÔ#ÜÐ7¼¸W»°ÀaÐHÓIÐIô1ð €Nr   c                 ób   ‡ — 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                 ó@   •‡ — ˆ ˆfd„}t         j                  ‰|«       y )Nc                 óh   •— | j                   ‰k(  sJ d| j                   › d‰› �«       ‚ ‰| g|¢­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     s4   ø€ ô0 �gœsÔ#ÜÐ7¼¸W»°ÀaÐHÓIÐIô-ð €Nr   c                 ób   ‡ — 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                 óB   •‡ — ˆ ˆfd„}t         j                  ‰|«       ‰ S )Nc                 óh   •— | j                   ‰k(  sJ d| j                   › d‰› �«       ‚ ‰| g|¢­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   ù€ õ	*ô 	×Ñ˜W dÔ+Øˆr   rd   re   s   ` r
   ÚREGISTER_JVPrs   8  ó4   ø€ ô, �gœsÔ#ÜÐ7¼¸W»°ÀaÐHÓIÐIôð €Nr   c                 ób   ‡ — 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                 óB   •‡ — ˆ ˆfd„}t         j                  ‰|«       ‰ S )Nc                 ój   •— | j                   ‰k(  sJ d| j                   › d‰› �«       ‚ ‰| |g|¢­i |¤ŽS r\   r]   )rB   Údot_checkerrC   r_   rQ   rR   s       €€r
   Ú
_transposez7REGISTER_TRANSPOSE.<locals>.wrapper.<locals>._transposex  sL   ø€ à—‘˜7Ò"ðhàDÀRÇWÁWÀIÐM]Ð^eÐ]fÐgóhØ"á�R˜Ð6 tÒ6¨vÑ6Ð6r   )r0   r   )rQ   ry   rR   s   ` €r
   rS   z#REGISTER_TRANSPOSE.<locals>.wrapperw  s   ù€ õ	7ô 	×"Ñ" 7¨JÔ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¨   ð÷ "ñ "ñ& �kÓ"€
Ù�kÓ"€
Ù�kÓ"€
Ù�|Ó$€ÙÐ/Ó0Ð Ù$Ð%?Ó@Ð Ù˜+Ó&€ò%ò%ò%ò&ò,ò)ò+ò\'òT"òJ%òP%òP$òN#óL#r   