+
    TV-j�  ã                   óœ   € ^ RI HtHt ^ RIHt ^ RIHt ]P                  R 4       t	R t
]
! 4       tR R ltRR ltRR R	 lltRR
 R lltR# )é    )ÚOptionalÚTupleNc                 óÂ   € V P                  \        P                  4      p \        P                  ! W,           4      p \        P
                  ! W^ ,          V^,          4      # )r   )ÚastypeÚmxÚfloat32ÚnnÚsoftplusÚclip)ÚdtÚdt_biasÚtime_step_limits   &&&Úb/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_lm/models/ssm.pyÚ
compute_dtr      s?   € à	�‰”2—:‘:Ó	€BÜ	�Š�R•\Ó	"€BÜ�7Š7�2 qÕ)¨?¸1Õ+=Ó>Ð>ó    c                  ó    € \         P                  P                  4       '       g   R # Rp \         P                  P	                  R. RORR.V R7      # )Na  
        auto n = thread_position_in_grid.z;
        auto h_idx = n % H;
        auto g_idx = n / G;
        constexpr int n_per_t = Ds / 32;

        auto x = X + n * Dh;
        out += n * Dh;
        auto i_state = state_in + n * Dh * Ds;
        auto o_state = state_out + n * Dh * Ds;

        // C and B have shape [batch, group, state_dim]
        // C and B need to be offset by group size
        auto C_ = C + g_idx * Ds;
        auto B_ = B + g_idx * Ds;

        auto ds_idx = thread_position_in_threadgroup.x;
        auto d_idx = thread_position_in_grid.y;

        auto dt_ = static_cast<float>(dt[n]);
        auto A = -fast::exp(static_cast<float>(A_log[h_idx]));
        auto dA = fast::exp(A * dt_);

        float acc = 0.0;
        auto x_ = static_cast<float>(x[d_idx]);

        for (int i = 0; i < n_per_t; ++i) {
            auto s_idx = n_per_t * ds_idx + i;
            auto idx = d_idx * Ds + s_idx;
            auto dB_by_x = x_ * dt_ * static_cast<float>(B_[s_idx]);
            auto state = dA * i_state[idx] + dB_by_x;
            o_state[idx] = static_cast<U>(state);
            acc += state * C_[s_idx];
        }
        acc = simd_sum(acc);
        if (thread_index_in_simdgroup == 0) {
            out[d_idx] = static_cast<T>(acc + x_ * D[h_idx]);
        }
    Ú
ssm_kernelÚoutÚ	state_out)ÚnameÚinput_namesÚoutput_namesÚsource)ÚXÚA_logÚBÚCÚDr   Ústate_in)r   ÚmetalÚis_availableÚfastÚmetal_kernel)r   s    r   Úmake_ssm_kernelr$      sO   € Ü�8‰8× Ñ ×"Ò"Ùð&€FôN �7‰7×ÑØÚCØ˜[Ð)Øð	  ó ð r   c                óF  € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R	\        \        \        3,          /	# )
é   Úhidden_statesr   r   r   r   r   r   Ústater   )r   Úarrayr   Úfloat)Úformats   "r   Ú__annotate__r,   C   s‹   € ÷ ñ Ü—8‘8ðä�8‰8ðô 
‡x�xðô 
‡x�xð	ô
 
‡x�xðô 	�‰ðô �X‰Xðô �8‰8ðô œ5¤%˜<Õ(ñr   c	                 ó  € V P                   w  ršr¼V P                  pVP                  pVP                   R	R w  pp\        WVV4      p\        WW#WEV.RV3RV3RV3RV3RV3RW¿,          3.^ WËV	,          3R
V	^W¼3VP                   .WÞ.R7      # )r&   NÚTÚUÚDhÚDsÚHÚG)ÚinputsÚtemplateÚgridÚthreadgroupÚoutput_shapesÚoutput_dtypeséþÿÿÿ)é    é   é   )ÚshapeÚdtyper   Ú_ssm_kernel)r'   r   r   r   r   r   r   r(   r   ÚnÚ_ÚhÚdÚ
input_typeÚ
state_typeÚhbÚdss   &&&&&&&&&        r   Ússm_update_kernelrI   C   sº   € ð ×$Ñ$�J€Aˆ!Ø×$Ñ$€JØ—‘€JØ�W‰W�R�Sˆ\�F€BˆÜ	�B Ó	1€BÜØ a¨A°5Ð9à�*ÐØ�*ÐØ�1ˆIØ�2ˆJØ�!ˆHØ�!•'ˆNð
ð �!˜•Uˆ^ØØ˜1˜a�| U§[¡[Ð1Ø!Ð.ôð r   c                 ó†  € V P                   R,          pVe    \        P                  ! V^4      pW,          p \        P                  ! V R,          VRR7      p \        P                  ! V R4      p \        P
                  ! V RR7      pVe8   \        P                  ! VR,          VR,          ,          V\        R4      ) 4      pV# )r=   ©ÚaxisÚinféÿÿÿÿ©.Nr:   ).NºNNN)r>   r   Úexpand_dimsÚrepeatÚtrilÚcumsumÚwherer*   )ÚxÚmaskÚlÚx_segsums   &&  r   ÚsegsumrZ   d   s—   € Ø	�‰��€AØÒÜ�~Š~˜d AÓ&ˆØ�HˆÜ
�	Š	�!�I•, ¨Ô+€AÜ
�Š��2‹€AÜ�yŠy˜ Ô$€HØÒÜ—8’8Ø�Õ  i¥Õ0°(¼UÀ5»\¸Mó
ˆð €Or   c                ó*  € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\        \         P                  ,          R	\        \        \        3,          R
\        \         P                  ,          R\        \         P                  ,          R\
        R\        \         P                  \         P                  3,          /# )r&   rV   r   r   r   r   r   r   r(   r   rW   ÚlengthsÚstepÚreturn)r   r)   r   r   r*   Úint)r+   s   "r   r,   r,   s   së   € ÷ cñ cÜ	‡x�xðcä�8‰8ðcô 
‡x�xðcô 
‡x�xð	cô
 
‡x�xðcô 	�‰ðcô �X‰Xðcô ”B—H‘HÕðcô œ5¤%˜<Õ(ðcô ”2—8‘8Õ
ðcô ”b—h‘hÕðcô ðcô Œ2�8‰8”R—X‘XÐÕñcr   c                ó&  a a
aaaaaaa€ S P                   w  opooVP                   w   poo\        WVV4      pSS,          o\        P                  ! V4      P	                  VP
                  4      ) pW^P                  ^^R4      ,          pVP                  SVS^4      S ,          pVVVVVV
VVV 3	R lp. p\        ^ VS4       F‘  pT! VRVVS,           13,          VRVVS,           13,          VRVVS,           13,          VRVVS,           13,          TV	f   RMV	RVVS,           13,          4      w  ppS
e
   S
S,
          o
VP                  V4       K“  	  \        P                  ! V^R7      S VP                  ^^S^4      ,          ,           pVV3# )aù  SSD-SSM forward pass.

Args:
    x: Input of shape (batch_size, seq_len, num_heads, head_dim).
    dt: Time deltas of shape (seq_len, num_heads,).
    A_log: State transition of shape (num_heads,).
    B: Input mixing of shape (batch_size, seq_len, num_groups, n).
    C: Output mixing of shape (batch_size, seq_len, num_groups, n).
    D: Residual connection.
    dt_bias: Bias for time deltas of shape (num_heads,).
    time_step_limit: Minimum and maximum value for time deltas.
    mask: Optional multiplicative mask.
    lengths: Optional lenghts of sequences, assumed to be the full length if unspecified.
    step: Step size for processing x.

Code modified from
https://github.com/cartesia-ai/edge/blob/main/cartesia-mlx/cartesia_mlx/layers/ssd/ops.py

c                 ó¢  <	€ V P                   ^,          p\        P                  ! VR4      p\        P                  ! V^^4      V,          p\        P                  ! VS^R7      p\        P
                  ! \        VP                  ^^4      VR7      4      p\        P                  ! Wx,          ^ 4      p	W�P                  ^^4      ,          p
\        P                  ! V
^^4      p
Sed   \        P                  ! \        P                  ! SS4      ^,
          ^ 4      p\        P                  ! VR4      p\        P                  ! W‹^R7      pMVRRRR1R3,          pVP                  ^ ^^^4      p\        P                  ! VSS,          ^R7      P                  ^^4      pW,          pVP                  ^^4      P                  ^^4      pWÂ,          pVe¬   \        P
                  ! \        P                  ! VRR7      4      pWÞR	,          V,          ,          pVP                  SVS^S^4      pVP                  S^SSSS34      V,          P                  R4      P                  ^^4      pW®R
,          V,          ,          p
Se4   Ve0   \        P                   ! \        P                  ! S^ 8  R4      WM4      pV
P#                  SP$                  4      V3# )r=   rK   )rW   NrP   )r   r&   é   r=   )r=   r&   rb   rN   r:   )rP   rN   rP   NNrO   )r>   r   Ú	transposeÚswapaxesrR   ÚexprZ   rS   ÚmaximumÚminimumrQ   Útake_along_axisrT   ÚreshapeÚsqueezeÚflattenrU   r   r?   )ÚdtxÚdtAr   r   r(   rW   ÚsÚCBÚdecayÚsurrogate_attention_matrixÚyÚposÚdtxdecayÚ
next_stateÚexp_dtA_cumsumÚy_prevÚbrD   ÚdhÚgrC   r\   Úrepeatsr]   rV   s   &&&&&&          €€€€€€€€€r   Ú_stepÚssm_attn.<locals>._step�   sC  ø€ Ø�I‰I�a�LˆÜ�LŠL˜˜LÓ)ˆä�[Š[˜˜A˜qÓ! AÕ%ˆÜ�YŠY�r˜7¨Ô+ˆä—’”v˜cŸl™l¨1¨aÓ0°tÔ<Ó=ˆä%'§W¢W¨R­Z¸Ó%;Ð"à&¯©°a¸Ó);Õ;ˆÜ�KŠK˜˜1˜aÓ ˆàÒÜ—*’*œRŸZšZ¨°Ó6¸Õ:¸AÓ>ˆCÜ—.’.  iÓ0ˆCÜ×&Ò& u¸Ô:‰Eà˜!˜Q ¡ Q˜,Õ'ˆEà—‘  1 a¨Ó+ˆÜ�IŠI�a˜˜a� aÔ(×1Ñ1°!°QÓ7ˆØ•;ˆØ×$Ñ$ Q¨Ó*×3Ñ3°A°qÓ9ˆà•\ˆ
àÒÜŸVšV¤B§I¢I¨c¸Ô$;Ó<ˆNØÐ)=Õ>ÀÕFÕFˆJØ—	‘	˜!˜Q  1 a¨Ó+ˆAà—‘  1 a¨°"°aÐ8Ó9¸AÕ=×FÑFÀrÓJ×RÑRÐSTÐVWÓXð ð  	Õ*¨VÕ3Õ3ˆAØÒ 5Ò#4ÜŸšÜ—’˜w¨™{¨IÓ6¸óˆJð �x‰x˜Ÿ™Ó  *Ð,Ð,r   rP   N.rK   rN   )
r>   r   r   re   r   r?   ri   ÚrangeÚappendÚconcatenate)rV   r   r   r   r   r   r   r(   r   rW   r\   r]   rX   rB   ÚArm   rl   r|   ÚysÚirr   rx   rD   ry   rz   rC   r{   s   f&&&&&&&&&ff         @@@@@@r   Ússm_attnr„   s   s|  ÿø€ ðB —'‘'�K€A€qˆ!ˆRØ—‘�J€A€qˆ!ˆQä	�B Ó	1€BØ�1�f€GÜ	�Š�‹×	Ñ	˜bŸh™hÓ	'Ð'€AØ
�y‰y˜˜A˜rÓ"Õ
"€CØ
�*‰*�Q˜˜1˜aÓ
  1Õ
$€C÷)-õ )-ðV 
€BÜ�1�a˜ÖˆÙØ��1�q˜4•x�<�Õ Ø��1�q˜4•x�<�Õ Øˆa��Q˜•X�ˆoÕØˆa��Q˜•X�ˆoÕØØ’L‰D d¨3°°A¸µH°Ð+<Õ&=ó
‰ˆˆ5ð ÒØ •nˆGØ
�	‰	�!Žñ ô 	�Š�r Ô" Q¨¯©°1°a¸¸AÓ)>Õ%>Õ>€AØˆeˆ8€Or   c                óÈ  € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\         P                  R\        \         P                  ,          R	\        \        \        3,          R
\        \         P                  ,          R\        \         P                  ,          /# )r&   r'   r   r   r   r   r   r   r(   r   rW   r\   )r   r)   r   r   r*   )r+   s   "r   r,   r,   Ù   s¶   € ÷ ,
ñ ,
Ü—8‘8ð,
ä�8‰8ð,
ô 
‡x�xð,
ô 
‡x�xð	,
ô
 
‡x�xð,
ô 	�‰ð,
ô �X‰Xð,
ô ”B—H‘HÕð,
ô œ5¤%˜<Õ(ð,
ô ”2—8‘8Õ
ð,
ô ”b—h‘hÕñ,
r   c                 ó(  € V P                   ^,          pV^8”  gQ   VeM   \        P                  ! 4       \        P                  8w  g%   \        P                  P                  4       '       g   \        V VVVVVVVVV	V
R7      # \        V VVVVVVVV4	      # )r=   )rW   r\   )r>   r   Údefault_deviceÚgpur    r!   r„   rI   )r'   r   r   r   r   r   r   r(   r   rW   r\   Úseq_lens   &&&&&&&&&&& r   Ú
ssm_updaterŠ   Ù   s    € ð ×!Ñ! !Õ$€Gà�!ŒØŠ=Ü×ÒÓ¤"§&¡&Ô(Ü�x‰x×$Ñ$×&Ò&äØØØØØØØØØØØô
ð 	
ô !ØØØØØØØØØó

ð 
	
r   )N)N©gü©ñÒMbP?g      Y@NNé   )Nr‹   NN)Útypingr   r   Úmlx.coreÚcorer   Úmlx.nnr	   Úcompiler   r$   r@   rI   rZ   r„   rŠ   © r   r   Ú<module>r“      sR   ðß "å Ý ð ‡�ñ?ó ð?ò/ñd Ó€õôB÷c÷L,
ñ ,
r   