
    ϑiO,                          " S  S5      r \ " S5      r\ " S5      r\ " S5      r\ " S5      r\ " S5      r\ " S5      r\ " S5      rS	 rS
 r	S r
S rS rS rS rS rS rS rS rS rS rS rg)c                   2    \ rS rSrSrSS/rS rS rS rSr	g	)
Registry   zA general registry object.nametabc                     Xl         0 U l        g Nr   r   selfr   s     `/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/incubate/autograd/primreg.py__init__Registry.__init__   s    	    c                 T    XR                   ;  d   SU S35       eX R                   U'   g )Nzname "z"" should not be registered before.)r   )r   r   values      r   registerRegistry.register   s3    88# 	
TF<=	
# r   c                 8    U R                   R                  U5      $ r   )r   getr
   s     r   lookupRegistry.lookup   s    xx||D!!r   r	   N)
__name__
__module____qualname____firstlineno____doc__	__slots__r   r   r   __static_attributes__ r   r   r   r      s    $I"r   r   	primop_fn	orig2prim	prim2orig
primop_jvpprimop_transposeprimop_position_argnames	compositec                 ,    [         R                  U 5      $ r   )
_primop_fnr   optypes    r   	lookup_fnr+   ,       V$$r   c                 ,    [         R                  U 5      $ r   )
_orig2primr   r)   s    r   lookup_orig2primr/   0   r,   r   c                 ,    [         R                  U 5      $ r   )
_prim2origr   r)   s    r   lookup_prim2origr2   4   r,   r   c                 ,    [         R                  U 5      $ r   )_primop_jvpr   r)   s    r   
lookup_jvpr5   8   s    f%%r   c                 ,    [         R                  U 5      $ r   )_primop_transposer   r)   s    r   lookup_transposer8   <   s    ##F++r   c                 ,    [         R                  U 5      $ r   )_composite_opsr   r)   s    r   lookup_compositer;   @   s      ((r   c           	         [         R                  U R                  5      nUc   SU R                   S35       eUGt p#/ nU H  n[        [	        U R
                  R                  U R                  U5      5      5      n[        U5      S:  d   S[        U5       S35       e[        U5      S:  a  UR                  U5        M  UR                  US   5        M     U$ )a  
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_inputsrO   D   s    4 %++BGG4D 
277)GH O[FCbhhtn564yA~ 	
LSQUYKWXY	
~ t9q=MM$MM$q'"  Mr   c                 F   [         R                  U R                  5      nUc   S5       eUGt p#[        [	        U R
                  R                  U R                  U5      5      5      n[        U5      S:  d   S[        U5       S35       e[        U5      S:  a  UnU$ US   nU$ )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().r=   zDlen(outvars) should be greater than or equal to 0, but len(outvars)=r>   r?   )	r@   r   rA   rB   rC   rD   rE   outputrG   )rI   rJ   rL   output_nameoutvarsrQ   s         r   op_position_outputrT   r   s    4 %++BGG4DOOOOQ3rxx||RYY{%;<=Gw<1 
NsSZ|n\]^ 7|a M Mr   c                    ^  [        T [        5      (       d  [        S[        T 5       S35      e[        R                  T U5        U 4S jnU$ )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 r>   c                 4   > [         R                  TU 5        U $ r   )r(   r   )fop_types    r   wrapperREGISTER_FN.<locals>.wrapper   s    GQ'r   )
isinstancestr	TypeErrorrA   r@   r   )rY   position_argnamesrZ   s   `  r   REGISTER_FNr`      sH    2 gs##7WaHII&&w0AB Nr   c                 n   ^  [        T [        5      (       d  [        S[        T 5       S35      eU 4S jnU$ )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)

rV   r>   c                 B   >^  U U4S jn[         R                  TU5        g )Nc                 j   > U R                   T:X  d   SU R                    ST 35       eT" U /UQ70 UD6$ Nz3op.type should be equal to op_type, but op.type is z and op_type is rA   rI   rJ   kwargsrX   rY   s      r   _lower3REGISTER_ORIG2PRIM.<locals>.wrapper.<locals>._lower   J    77g% EbggYN^_f^gh% R)$)&))r   )r.   r   rX   rh   rY   s   ` r   rZ   #REGISTER_ORIG2PRIM.<locals>.wrapper       	* 	GV,r   r\   r]   r^   rA   rY   rZ   s   ` r   REGISTER_ORIG2PRIMrp      s7    2 gs##7WaHII- Nr   c                 n   ^  [        T [        5      (       d  [        S[        T 5       S35      eU 4S jnU$ )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

rV   r>   c                 B   >^  U U4S jn[         R                  TU5        g )Nc                 b   > U R                   T:X  d   SU R                    ST 35       eT" U0 UD6$ rd   re   rf   s      r   rh   3REGISTER_COMPOSITE.<locals>.wrapper.<locals>._lower  sE    77g% EbggYN^_f^gh% d%f%%r   )r:   r   rk   s   ` r   rZ   #REGISTER_COMPOSITE.<locals>.wrapper  s    	& 	0r   rn   ro   s   ` r   REGISTER_COMPOSITErv      s7    2 gs##7WaHII1 Nr   c                 n   ^  [        T [        5      (       d  [        S[        T 5       S35      eU 4S jnU$ )ar  
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)
        ...
rV   r>   c                 B   >^  U U4S jn[         R                  TU5        g )Nc                 j   > U R                   T:X  d   SU R                    ST 35       eT" U /UQ70 UD6$ rd   re   rf   s      r   rh   3REGISTER_PRIM2ORIG.<locals>.wrapper.<locals>._lower-  rj   r   )r1   r   rk   s   ` r   rZ   #REGISTER_PRIM2ORIG.<locals>.wrapper,  rm   r   rn   ro   s   ` r   REGISTER_PRIM2ORIGr|     s7    0 gs##7WaHII- Nr   c                 n   ^  [        T [        5      (       d  [        S[        T 5       S35      eU 4S jnU$ )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)

rV   r>   c                 D   >^  U U4S jn[         R                  TU5        T $ )Nc                 j   > U R                   T:X  d   SU R                    ST 35       eT" U /UQ70 UD6$ rd   re   rf   s      r   _jvp+REGISTER_JVP.<locals>.wrapper.<locals>._jvpR  rj   r   )r4   r   )rX   r   rY   s   ` r   rZ   REGISTER_JVP.<locals>.wrapperQ  s    	* 	Wd+r   rn   ro   s   ` r   REGISTER_JVPr   8  7    , gs##7WaHII Nr   c                 n   ^  [        T [        5      (       d  [        S[        T 5       S35      eU 4S jnU$ )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

rV   r>   c                 D   >^  U U4S jn[         R                  TU5        T $ )Nc                 j   > U R                   T:X  d   SU R                    ST 35       eT" X/UQ70 UD6$ rd   re   )rI   dot_checkerrJ   rg   rX   rY   s       r   
_transpose7REGISTER_TRANSPOSE.<locals>.wrapper.<locals>._transposex  sJ    77g% EbggYN^_f^gh% R6t6v66r   )r7   r   )rX   r   rY   s   ` r   rZ   #REGISTER_TRANSPOSE.<locals>.wrapperw  s    	7 	""7J7r   rn   ro   s   ` r   REGISTER_TRANSPOSEr   ^  r   r   N)r   r(   r.   r1   r4   r7   r@   r:   r+   r/   r2   r5   r8   r;   rO   rT   r`   rp   rv   r|   r   r   r   r   r   <module>r      s    " "& k"
k"
k"
|$/0 $%?@ +&%%%&,)+\'T"J%P%P$N#L#r   