ó
    Këgj´  ã                   ó
  • S r SSKrSSKJr  SSKJr  SSKJr  SSKJ	r	   SSK
Jr   SSKJr   " S	 S
\R                   R"                  5      r          SS\R&                  S\R&                  S-  S\R&                  S-  S\R&                  S-  S\R&                  S-  S\S-  S\S-  S\R&                  S-  S\R,                  S-  S\R,                  S-  S\R,                  S-  4S jjr       SS\R&                  S\R&                  S\R&                  S-  S\R&                  S-  S\R&                  S-  S\S-  S\S-  S\R&                  S-  S\R,                  S-  4S jjrg! \ a    Sr GNLf = f! \ a    Sr GNTf = f)z<CUDA-based mixed-mode implementation for causal convolution.é    N)Ú	rearrange)Úcausal_conv1d_update_states)Úprepare_sequence_ids)Úinput_guard)Úcausal_conv1d_bwd_function)Úcausal_conv1d_fnc                   ó  • \ rS rSrSr\\" S/S9         SS\R                  S-  S\R                  S-  S\R                  S-  S	\R                  S-  S
\R                  S-  4
S jj5       5       r
\\S 5       5       rSrg)ÚFastCausalConv1dFné   a
  
Mixed-mode (Mix) Causal Convolution Implementation - Combining Triton Forward and CUDA Backward Propagation

This class implements forward propagation using FLA's Triton kernel, while using the optimized
implementation from TriDao's causal_conv1d CUDA package for backward propagation.
This hybrid strategy combines the advantages of both technologies:

- Forward: Uses FLA's Triton implementation, optimized for the FLA framework
- Backward: Uses TriDao's causal_conv1d_bwd_function CUDA implementation for faster speed

Performance Benefits:
- CUDA backward implementation is typically faster than the Triton version, reducing training time
- Maintains the flexibility and compatibility of forward propagation

Note:
- Input/Output format is (batch, seqlen, dim)
- Backward propagation requires causal_conv1d package: pip install causal-conv1d
- Supports SILU/Swish activation functions
- Current limitations (not yet supported):
    * output_final_state must be False
    * initial_states must be None
    * residual must be None
Úx)Úno_guard_contiguousNÚresidualÚ
cu_seqlensÚcu_seqlens_cpuÚchunk_indicesÚseq_idxc                 óâ  • US;  a  [        S5      eUSL d   S5       eUb   S5       eUb   S5       eUb  UR                  5       OS nUb8  Uc5  [        X‰S9R                  [        R
                  5      R                  S5      nUb  UR                  5       OS nSS	KJn  US
;   U l	        U" UUUS S UUUU	U
S9
u  pÞU R                  XX;U5        X`l        US L=(       a    UR                  U l        US 4$ )N)NÚsiluÚswishz'activation must be None, silu, or swishFz7output_final_state must be False for FastCausalConv1dFnz2initial_states must be None for FastCausalConv1dFnz,residual must be None for FastCausalConv1dFn©r   r   )Úcausal_conv1d_fwd)r   r   )
r   ÚweightÚbiasr   Úinitial_stateÚoutput_final_stateÚ
activationr   r   r   )ÚNotImplementedErrorÚ
contiguousr   ÚtoÚtorchÚint32Ú	unsqueezeÚfla.modules.conv.triton.opsr   r   Úsave_for_backwardÚreturn_final_statesÚrequires_gradÚreturn_dinitial_states)Úctxr   r   r   r   Úinitial_statesr   r   r   r   r   r   r   ÚoutÚ_s                  Ú§C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\fla/modules/conv/cuda/ops.pyÚforwardÚFastCausalConv1dFn.forward4   s)  € ð  Ð4Ó4Ü%Ð&OÓPÐPØ! UÒ*ÐeÐ,eÓeÐ*ØÑ%Ð[Ð'[Ó[Ð%ØÑÐOÐ!OÓOÐà$(Ñ$4ˆt�‰Ô ¸$ˆØÑ! g¡oÜ*¨:ÑU×XÑXÜ—‘óß&™Y q›\ð à*1Ñ*=�'×$Ñ$Ô&À4ˆõ 	Bà#Ð'8Ñ8ˆŒÙ"ØØØØØØ1Ø!Ø!Ø)Ø'ñ
‰ˆð 	×Ñ˜a¨¸ÔGØ"4Ôà $Ð&×G¨>×+GÑ+Gð 	Ô"ð �DˆyÐó    c                 óæ  • U R                   u  p4pVn[        R                  " U[        R                  S9n[	        US5      n[	        US5      n[	        US5      nU R
                  (       a  US   OS n	UR                  S5      S:w  a%  UR                  S5      S:w  a  UR                  5       n[        UUUUUUU	UU R                  U R                  5
      u  pŠp¼[	        US5      nUU
Ub  UOS S S S S S S S S 4$ )N)Úmemory_formatúb t d -> b d tr   é   é   úb d t -> b t d)Úsaved_tensorsr    Ú
empty_likeÚcontiguous_formatr   r%   Ústrider   r   r'   r   )r(   ÚdoutÚargsr   r   r   r   r)   ÚdxÚdfinal_statesÚdweightÚdbiasÚdinitial_statess                r,   ÚbackwardÚFastCausalConv1dFn.backwardh   s  € ð 47×3DÑ3DÑ0ˆ�4 .Ü×Ò˜a¬u×/FÑ/FÑGˆÜ�aÐ)Ó*ˆÜ�rÐ+Ó,ˆÜ˜Ð/Ó0ˆØ#&×#:×#:˜˜QšÀˆà�;‰;�q‹>˜QÓ 4§;¡;¨q£>°QÓ#6Ø—?‘?Ó$ˆDô /IØØØØØØØØØ×&Ñ&Ø�N‰Nó/
Ñ+ˆ�Uô �rÐ+Ó,ˆàØØÑ%‰E¨4ØØØØØØØØð
ð 	
r/   © )	NNNFNNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ústaticmethodr   r    ÚTensorÚ
LongTensorr-   rA   Ú__static_attributes__rC   r/   r,   r
   r
      sË   † ñð. Ù c UÑ+ð
 Ø(,ØØ ØØ.2Ø26Ø15Ø+/ñ0ð
 —,‘, Ñ%ð0ð ×$Ñ$ tÑ+ð0ð ×(Ñ(¨4Ñ/ð0ð ×'Ñ'¨$Ñ.ð0ð ×!Ñ! DÑ(ô0ó ,ó ð0ðd Øñ&
ó ó ó&
r/   r
   r   r   r   r   r   r   r   r   r   r   r   c                 ó\   • [         c   S5       e[        R                  U UUUUUUUUU	U
5      $ )a   
x: (batch, seqlen, dim)
weight: (dim, width)
bias: (dim,)
seq_idx: (batch, seqlen)
initial_states: (batch, dim, width - 1)
final_states_out: (batch, dim, width - 1), to be written to
activation: either None or "silu" or "swish"

out: (batch, seqlen, dim)
z+causal_conv1d_bwd_function is not available)r   r
   Úapply)r   r   r   r   r   r   r   r   r   r   r   s              r,   Úfast_causal_conv1d_fnrO   “   sJ   € ô0 &Ñ1Ð`Ð3`Ó`Ð1Ü×#Ñ#Ø	ØØØØØØØØØØóð r/   c	           
      óæ  • [         c   S5       eU	R                  S5      n
Uc  U
b
  Ub   S5       eUR                  S   nU R                  S5      S:w  a  U R	                  5       n [        U S5      nUb8  U
c5  [        XxS9R                  [        R                  5      R                  S5      n
[        UUUUU
S S	S
9n[        US5      nU(       a  [        U UUUS9nOS nUb  UR                  U5        XÞ4$ )Nz&causal_conv1d_fn_cuda is not availabler   zQFor CUDA backend, initial_state must be None if cu_seqlens or seq_idx is providedéÿÿÿÿr4   r2   r   r   F)r   r   r   r   r   r)   r%   r5   )r   Ú	state_lenr   r   )Úcausal_conv1d_fn_cudaÚgetÚshaper9   r   r   r   r   r    r!   r"   r   Úadd_)r   r   r   r   r   r   r   r   r   Úkwargsr   ÚWÚx_conv1dÚyÚfinal_states                  r,   Úcausal_conv1d_cudar\   »   s  € ô !Ñ,ÐVÐ.VÓVÐ,Ø�j‰j˜Ó#€GØÑ Ñ!4ØÑ$ÐyÐ&yÓyÐ$Ø�‰�RÑ€AØ‡x�x�ƒ|�qÓØ�L‰L‹NˆÜ˜Ð,Ó-€HØÑ '¡/Ü& zÑQ×TÑTÔUZ×U`ÑU`Óa×kÑkÐlmÓnˆäØ
ØØØØØØ!ñ	€Aô 	�!Ð%Ó&€AÞÜ1ØØØ'Ø!ñ	
‰ð ˆØÑØ	�‰ˆxÔàˆ>Ðr/   )
NNNNFNNNNN)NNNFNNN)rH   r    Úeinopsr   Úfla.modules.conv.tritonr   Úfla.ops.utilsr   Ú	fla.utilsr   Úcausal_conv1d.cpp_functionsr   ÚImportErrorÚcausal_conv1dr   rS   ÚautogradÚFunctionr
   rJ   ÚboolÚstrrK   rO   r\   rC   r/   r,   Ú<module>rh      s  ðñ Cã Ý å ?Ý .Ý !ð&ÝFð!ÝGô
t
˜Ÿ™×0Ñ0ô t
ðr #'Ø $Ø$(Ø)-Ø&+Ø!Ø&*Ø.2Ø-1Ø'+ñ%Ø‡|�|ð%à�L‰L˜4Ñð%ð �,‰,˜Ñ
ð%ð �l‰l˜TÑ!ð	%ð
 —<‘< $Ñ&ð%ð ˜t™ð%ð �d‘
ð%ð —‘˜tÑ#ð%ð ×$Ñ$ tÑ+ð%ð ×#Ñ# dÑ*ð%ð ×Ñ Ñ$õ%ðV !%Ø$(Ø)-Ø&+Ø!Ø&*Ø.2ñ.Ø‡|�|ð.à�L‰Lð.ð �,‰,˜Ñ
ð.ð �l‰l˜TÑ!ð	.ð
 —<‘< $Ñ&ð.ð ˜t™ð.ð �d‘
ð.ð —‘˜tÑ#ð.ð ×$Ñ$ tÑ+ö.øðQ ó &Ø!%Óð&ûð
 ó !Ø Óð!ús"    E' §E6 Å'E3Å2E3Å6FÆF