
    ёi              	          S SK Jr  S SKJr  S SKJr  S SKrS SKJr  \(       a  S SK	J
r
   " S S\5      r\R                  S	\R                  \R                  R                  5       R!                  S
S5      \R"                  \R                  R                  5       R!                  SS5      0q\R                  \R"                  \R                  /qS rSS jrS rSS jrS rSSS jjrSSS jjr\ S   SS jj5       rg)    )annotations)IntEnum)TYPE_CHECKINGN)signature_safe_contextmanager)Iterablec                  (    \ rS rSrSrSrSrSrSrSr	g)	
SDPBackend   a  
An enum-like class that contains the different backends for scaled dot product attention.
This backend class is designed to be used with the sdpa_kernel context manager.

The following Enums are available:
    - ERROR: An error occurred when trying to determine the backend.
    - MATH: The math backend for scaled dot product attention.
    - FLASH_ATTENTION: The flash attention backend for scaled dot product attention.
    - EFFICIENT_ATTENTION: The efficient attention backend for scaled dot product attention.

See :func:`paddle.nn.attention.sdpa_kernel` for more details.

.. warning:: This class is in beta and subject to change.
r          N)
__name__
__module____qualname____firstlineno____doc__ERRORMATHFLASH_ATTENTIONEFFICIENT_ATTENTION__static_attributes__r       X/var/www/html/banglarbhumi/venv/lib/python3.13/site-packages/paddle/nn/attention/sdpa.pyr	   r	      s     EDOr   r	   TFLAGS_flash_attn_availableF"FLAGS_mem_efficient_attn_availablec                 r    [         R                  5        V Vs/ s H  u  pU(       d  M  U PM     snn $ s  snn f N)_backend_enableditems)backendenableds     r   _get_enabled_backendsr#   A   s*    ,<,B,B,DP,D(G,DPPPs   33c                l    [          H  nS[         U'   M     U  H  nU[         ;   d  M  S[         U'   M     g )NFT)r   backendsr!   s     r   _set_enabled_backendsr'   F   s5    #$)! $&&(,W% r   c                 *    [         R                  5       $ r   )_current_prioritycopyr   r   r   _get_backend_priorityr+   O   s    !!##r   c                $    U R                  5       qg r   )r*   r)   )prioritys    r   _set_backend_priorityr.   T   s     r   c                $   [        U [        5      (       a  U /n [        U [        [        45      (       d  [	        S5      eU  H/  n[        U[        5      (       a  M  [	        S[        U5       35      e   [        [        R                  U 5      5      $ )NzLbackends must be an instance of SDPBackend or a list of SDPBackend instancesz/All backends must be SDPBackend instances, got )
isinstancer	   listtuple	TypeErrortypedictfromkeysr%   s     r   _validate_backendsr7   Y   s    (J'':hu..Z
 	
 ':..A$w-Q   h'((r   c                Z   ^ [        5       nU (       a  [        5       m[        UU4S jS9nU$ )Nc                H   > U T;   a  TR                  U 5      $ [        S5      $ )Ninf)indexfloat)r!   curr_prioritys    r   <lambda>+_cur_sdpa_kernel_backends.<locals>.<lambda>r   s,    -' !. 3 3G < !u!r   )key)r#   r+   sorted)with_priorityr&   r=   s     @r   _cur_sdpa_kernel_backendsrC   k   s/    $&H-/
 Or   c                    [        [        U 5      5        U(       aB  [        U 5      n[        5       nU H  nXB;  d  M
  UR                  U5        M     [	        U5        g g r   )r'   r1   r+   appendr.   )r&   set_priorityuser_priorityprevious_priorityr!   s        r   _sdpa_kernelrI   z   sP    $x.)X13(G+$$W- ) 	m, r   c              #     #    [        U [        [        45      (       d   S5       e[        U 5      n U (       d  [	        S5      e[        US9n [        X5        0 v   [        X!5        g! [        X!5        f = f7f)a  
Context manager to select which backend to use for scaled dot product attention.

.. warning:: This function is beta and subject to change.

Args:
    backends (Union[list[SDPBackend], SDPBackend]): A backend or list of backends
        for scaled dot product attention.
    set_priority (bool, optional): Whether the ordering of the backends is
        interpreted as their priority order. Default: False.

Example:

    >>> import paddle
    >>> from paddle.nn.functional import scaled_dot_product_attention
    >>> from paddle.nn.attention import SDPBackend, sdpa_kernel

    >>> # Create dummy tensors
    >>> query = paddle.rand(shape=[2, 4, 8, 16])
    >>> key = paddle.rand(shape=[2, 4, 8, 16])
    >>> value = paddle.rand(shape=[2, 4, 8, 16])
    >>> # Example 1: Only enable math backend
    >>> with sdpa_kernel(SDPBackend.MATH):
    ...     out = scaled_dot_product_attention(query, key, value)
    >>> print(out.shape)
    [2, 4, 8, 16]
    >>> # Example 2: Enable multiple backends
    >>> with sdpa_kernel([SDPBackend.MATH, SDPBackend.EFFICIENT_ATTENTION]):
    ...     out = scaled_dot_product_attention(query, key, value)
    >>> print(out.shape)
    [2, 4, 8, 16]
    >>> # Example 3: Set priority order for multiple backends
    >>> with sdpa_kernel(
    ...     [SDPBackend.MATH, SDPBackend.EFFICIENT_ATTENTION],
    ...     set_priority=True,
    ... ):
    ...     out = scaled_dot_product_attention(query, key, value)
    >>> print(out.shape)
    [2, 4, 8, 16]
    >>> # doctest: +SKIP('FlashAttention may not be available in all environments')
    >>> # Example 4: Flash attention (skipped due to environment requirements)
    >>> with sdpa_kernel(SDPBackend.FLASH_ATTENTION):
    ...     out = scaled_dot_product_attention(query, key, value)
    >>> # doctest: -SKIP

This context manager can be used to select which backend to use for scaled dot product attention.
Upon exiting the context manager, the previous state of the flags will be restored.
zKBackend must be an instance of SDPBackend or a list of SDPBackend instancesz&At least one backend must be specified)rB   N)r0   r1   r	   r7   
ValueErrorrC   rI   )r&   rF   previous_backendss      r   sdpa_kernelrM      sv     h hz 233 U3 "(+HABB1M6X, 	&5&5s   A	A7A' A7'A44A7)r&   list[SDPBackend])r-   rN   )F)rB   bool)r&   zIterable[SDPBackend]rF   rO   )r&   zlist[SDPBackend] | SDPBackendrF   rO   )
__future__r   enumr   typingr   paddlepaddle.base.wrapped_decoratorr   collections.abcr   r	   r   r   	framework_global_flagsgetr   r   r)   r#   r'   r+   r.   r7   rC   rI   rM   r   r   r   <module>rY      s   #     G( . OOT 0 0 > > @ D D$e! ""F$4$4$B$B$D$H$H,e%  ""OO Q
-$
(
)$- BGB6+B6;?B6 B6r   