
    ͑i                    j    S SK Jr  S SKJrJr  S SKJr  \(       a  S SKJr  S SK	J
r
  / r " S S5      rg)	    )annotations)TYPE_CHECKINGAny)core)Callable)Tensorc                  B    \ rS rSrSr      SS jrS	S jrS
S jrSrg)saved_tensors_hooks   a  
Dynamic graph, registers a pair of pack / unpack hooks for saved tensors.

Parameters:
    pack_hook (function): The pack hook will be called every time the forward
        operation inputs/outputs tensors need be saved for backward. Then you
        can save it to CPU or Disk. The input of `pack_hook` is a tensor need
        be saved. The output of `pack_hook` is then stored information instead
        of the original tensor. `pack_hook` will also be called while any
        tensor need be saved by `PyLayerContext.save_for_backward`. If a tensor
        saved for backward is no need buffer, `pack_hook` will not be called.
        Only the tensor saved for backward is DenseTensor, `pack_hook` will be
        called.
    unpack_hook (function): The unpack hook will be called every time the
        backward need use the saved inputs/outputs tensors. Then you can reload
        the tensor and return it to paddle framework. The input of `unpack_hook`
        is the information returned by `pack_hook`. The output of `unpack_hook`
        is a tensor reloaded by the information, and the tensor must has the same
        content as the original tensor passed as input to the corresponding
        `pack_hook`.

Returns:
        None

Examples:
    .. code-block:: python
        :name: code-example1

        >>> # Example1
        >>> import paddle

        >>> def pack_hook(x):
        ...     print("Packing", x)
        ...     return x.numpy()

        >>> def unpack_hook(x):
        ...     print("UnPacking", x)
        ...     return paddle.to_tensor(x)

        >>> a = paddle.ones([3,3])
        >>> b = paddle.ones([3,3]) * 2
        >>> a.stop_gradient = False
        >>> b.stop_gradient = False
        >>> with paddle.autograd.saved_tensors_hooks(pack_hook, unpack_hook):
        ...     y = paddle.multiply(a, b)
        >>> y.sum().backward()

    .. code-block:: python
        :name: code-example2

        >>> # Example2
        >>> import paddle
        >>> from paddle.autograd import PyLayer

        >>> class cus_multiply(PyLayer):
        ...     @staticmethod
        ...     def forward(ctx, a, b):
        ...         y = paddle.multiply(a, b)
        ...         ctx.save_for_backward(a, b)
        ...         return y
        ...
        ...     @staticmethod
        ...     def backward(ctx, dy):
        ...         a,b = ctx.saved_tensor()
        ...         grad_a = dy * a
        ...         grad_b = dy * b
        ...         return grad_a, grad_b

        >>> def pack_hook(x):
        ...     print("Packing", x)
        ...     return x.numpy()

        >>> def unpack_hook(x):
        ...     print("UnPacking", x)
        ...     return paddle.to_tensor(x)

        >>> a = paddle.ones([3,3])
        >>> b = paddle.ones([3,3]) * 2
        >>> a.stop_gradient = False
        >>> b.stop_gradient = False
        >>> with paddle.autograd.saved_tensors_hooks(pack_hook, unpack_hook):
        ...     y = cus_multiply.apply(a, b)
        >>> y.sum().backward()
c                    Xl         X l        g N	pack_hookunpack_hook)selfr   r   s      c/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/autograd/saved_tensors_hooks.py__init__saved_tensors_hooks.__init__q   s    
 #&    c                l    [         R                  R                  U R                  U R                  5        g r   )r   eagerregister_saved_tensors_hooksr   r   )r   s    r   	__enter__saved_tensors_hooks.__enter__y   s#    

//NND,,	
r   c                @    [         R                  R                  5         g r   )r   r   reset_saved_tensors_hooks)r   argss     r   __exit__saved_tensors_hooks.__exit__~   s    

,,.r   r   N)r   zCallable[[Tensor], Any | None]r   zCallable[[Any], Tensor | None]returnNone)r    r!   )r   objectr    r!   )	__name__
__module____qualname____firstlineno____doc__r   r   r   __static_attributes__ r   r   r
   r
      s4    Sj'1' 4' 
	'

/r   r
   N)
__future__r   typingr   r   paddle.baser   collections.abcr   paddler   __all__r
   r)   r   r   <module>r0      s*    # % (
d/ d/r   