Ë
    ÄÓ^j o  ã                   óÖ  — d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZmZ d dlmZmZ eeeef   z  Z eej$                  j&                  dej(                  ¬«      Zedddœd	eez  d
efd„«       Zedddœded
efd„«       Zedddœded
efd„«       Zedddœdeded
efd„«       Zedddœded
efd„«       Zeej6                  dddœdeded
eeef   fd„«       «       Zedddœded
efd„«       Zeej6                  dddœdeded
eeef   fd„«       «       Zedddœded
efd„«       Zedddœdeded
eeef   fd„«       Z eej6                  dddœded
efd„«       «       Z!eej6                  dddœdeded
efd„«       «       Z"edddœded
efd„«       Z#eddddœdede$d
efd„«       Z%edddœdeded
eeef   fd„«       Z&eddddœdedede$d
eeef   fd „«       Z'edddœded!ed
efd"„«       Z(edddœded!ed
efd#„«       Z)edddœded!eded
eeeef   fd$„«       Z*eddddœded!edede$d
eeeef   f
d%„«       Z+e	 d3dddœded!ed&ed
efd'„«       Z,e	 d3dddœded!ed&ed
efd(„«       Z-e	 d3dddœded!eded&ed
eeeef   f
d)„«       Z.e	 d3dddœded!eded&ed
eeeef   f
d*„«       Z/edddœded!ed
efd+„«       Z0edddœded!eded
eeeef   fd,„«       Z1edddœded!ed
efd-„«       Z2eej6                  dddœded!eded
eeeef   fd.„«       «       Z3edddœded!ed
efd/„«       Z4edddœded!eded
eeeef   fd0„«       Z5de#e%eeed1œZ6de&e'eee d1œZ7e(e)e,e-e2e4e0d2œZ8e*e+e.e/e3e5e1d2œZ9y)4é    N)ÚTuple)Úpartial)ÚFloat32ÚBooleanÚ
const_expr)ÚTÚdsl_user_op)ÚllvmÚnvvm)Úsrc_cÚ	calc_func©ÚlocÚipÚaÚreturnc          
      ó¤   — t        t        j                  t        j                  «       t        | «      j                  ||¬«      gdddd¬«      «      S )Nr   ztanh.approx.f32 $0, $1;z=f,fF)Úhas_side_effectsÚis_align_stack)r   r
   Ú
inline_asmr   Úf32Úir_value)r   r   r   s      úi/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_vendor/quack/activation.pyÚtanhr      sJ   € äÜ�‰Ü�E‰E‹GÜ�Q‹Z× Ñ  S¨RÐ Ó0Ð1Ø%ØØ"Ø ô	
ó	ð 	ó    Úxc                ó  — t        t        | t        «       «      rddt        d| z  «      z  z   S t        j
                  j                  d| «      }t        |d   «      t        |d   «      f}t        j
                  j                  |dd«      S )Nç      à?©r   r   r   é   ©r   Ú
isinstanceÚtupler   ÚcuteÚarchÚmul_packed_f32x2Úfma_packed_f32x2)r   r   r   Úx_halfÚtanh_x_halfs        r   Úsigmoid_tanhr*   %   su   € ä”j ¤EÓ*Ð*Ô+à�Sœ4  a¡›=Ñ(Ñ(Ð(ä—‘×+Ñ+¨J¸Ó:ˆÜ˜F 1™I“¬¨V°A©Y«Ð8ˆÜ�y‰y×)Ñ)¨+°zÀ:ÓNÐNr   c                ó¦  — t        t        | t        «       «      rEt        j                  j                  dt        j                  j                  |  d¬«      z   ||¬«      S t        j                  t        j                  «      }t        j                  j                  | | | f«      }t        j                  j                  |d   d¬«      t        j                  j                  |d   d¬«      f}t        j                  j                  |d«      }t        j                  j                  |d   «      t        j                  j                  |d   «      fS )Nç      ð?T©Úfastmathr   r   r    ©r,   r,   )r   r"   r#   r$   r%   Ú
rcp_approxÚmathÚexpÚlog2Úer&   Úexp2Úadd_packed_f32x2)r   r   r   Úlog2_eÚneg_xÚ	exp_neg_xÚdenoms          r   Úsigmoidr;   0   sû   € ä”j ¤EÓ*Ð*Ô+Ü�y‰y×#Ñ# C¬$¯)©)¯-©-¸¸ÀT¨-Ó*JÑ$JÐPSÐXZÐ#Ó[Ð[ä—‘œ4Ÿ6™6Ó"ˆÜ—	‘	×*Ñ*¨1°¨w¸¸Ð.@ÓAˆä�I‰I�N‰N˜5 ™8¨dˆNÓ3Ü�I‰I�N‰N˜5 ™8¨dˆNÓ3ð
ˆ	ô —	‘	×*Ñ*¨9°jÓAˆÜ�y‰y×#Ñ# E¨!¡HÓ-¬t¯y©y×/CÑ/CÀEÈ!ÁHÓ/MÐMÐMr   ÚoutÚdoutc                ó   — || | | z  z
  z  S ©N© )r<   r=   r   r   s       r   Údsigmoid_from_outputrA   ?   s   € ð �3˜˜s™‘?Ñ#Ð#r   c                ó8  — t        t        | t        «       «      r)t        j                  j                  | t        d«      «      S t        j                  j                  | d   t        d«      «      t        j                  j                  | d   t        d«      «      fS ©Nç        r   r    )r   r"   r#   r$   r%   Úfmaxr   ©r   r   r   s      r   ÚrelurG   E   sg   € ä”j ¤EÓ*Ð*Ô+Ü�y‰y�~‰~˜a¤¨£Ó.Ð.ä�y‰y�~‰~˜a ™d¤G¨C£LÓ1´4·9±9·>±>À!ÀAÁ$ÌÐPSËÓ3UÐUÐUr   c                óh  — t        t        | t        «       «      rFt        | dkD  «      }|r|n
t	        d«      t
        j                  j                  | t	        d«      «      fS t        | d   dkD  «      }t        | d   dkD  «      }|r|d   n
t	        d«      |r|d   n
t	        d«      f}|t        | «      fS )Nr   rD   r    )	r   r"   r#   r   r   r$   r%   rE   rG   )r   r=   r   r   Úx_posÚx0_posÚx1_posÚdxs           r   ÚdrelurM   M   sž   € ô
 ”j ¤EÓ*Ð*Ô+Ü˜˜A™“ˆÙ‰t¤'¨#£,´·	±	·±¸qÄ'È#Ã,Ó0OÐOÐOä˜˜1™ ™Ó"ˆÜ˜˜1™ ™Ó"ˆÙˆd�1Šg¤W¨S£\¹f°4¸²7Ì'ÐRUË,ÐWˆØ”4˜“7ˆ{Ðr   c                ó~  — t        t        | t        «       «      r,t        j                  j                  | t        d«      «      | z  S t        j                  j                  | d   t        d«      «      t        j                  j                  | d   t        d«      «      f}t        j                  j                  || «      S rC   )r   r"   r#   r$   r%   rE   r   r&   )r   r   r   Úrelu_xs       r   Úrelu_sqrP   \   s‚   € ä”j ¤EÓ*Ð*Ô+Ü�y‰y�~‰~˜a¤¨£Ó.°Ñ2Ð2ä—)‘)—.‘.  1¡¤w¨s£|Ó4´d·i±i·n±nÀQÀqÁTÌ7ÐSVË<Ó6XÐYˆÜ�y‰y×)Ñ)¨&°!Ó4Ð4r   c                óH  — t        t        | t        «       «      rt        | «      }|| z  }d||z  z  }||fS t        | «      }t        j
                  j                  || «      }t        j
                  j                  dt        j
                  j                  ||«      «      }||fS )a  
    ReLU squared backward pass: computes gradient w.r.t. x and recomputes forward
    Given: relu_sq_out = max(x, 0) * x, and dout = grad w.r.t. relu_sq_out
    Returns: (dx, relu_sq_out) where:
    - dx = dout * 2 * x if x > 0, else 0
    - relu_sq_out = max(x, 0) * x
    ç       @)rR   rR   )r   r"   r#   rG   r$   r%   r&   )r   r=   r   r   rO   Úrelu_sq_outrL   s          r   Údrelu_sqrT   e   s‘   € ô ”j ¤EÓ*Ð*Ô+Ü�a“ˆØ˜q‘jˆà�D˜6‘MÑ"ˆØ�;ˆÐä�a“ˆÜ—i‘i×0Ñ0°¸Ó;ˆÜ�Y‰Y×'Ñ'¨
´D·I±I×4NÑ4NÈtÐU[Ó4\Ó]ˆØ�;ˆÐr   c          
      óP  — t        j                  dt         j                  z  «      }d|z  }t        t	        | t
        «       «      r d| dt        | ||| | z  z  z   z  «      z   z  z  S t        j                  j                  | | «      }t        j                  j                  |||f||f«      }t        j                  j                  | |«      }t        |d   «      t        |d   «      f}t        j                  j                  || | «      }	t        j                  j                  d|	«      S )z’
    gelu(x) = 0.5 * x * (1 + tanh(sqrt(2/pi) * (x + 0.044715 * x^3)))
            = 0.5 * x * (1 + tanh(x * (0.797885 + 0.0356774 * x * x)))
    é   ç÷Hmâä¦?r   r,   r   r    r   ©r1   ÚsqrtÚpir   r"   r#   r   r$   r%   r&   r'   )
r   r   r   Úsqrt_2_over_piÚsqrt_2_over_pi_coeffÚx_sqÚx_sq_scaledÚzÚtanh_zÚx_tanh_zs
             r   Úgelu_tanh_approxrb   ~   s  € ô —Y‘Y˜q¤4§7¡7™{Ó+€NØ# nÑ4ÐÜ”j ¤EÓ*Ð*Ô+ØØð ”T˜!˜~Ð0DÈÈAÉÑ0NÑNÑOÓPÑPñRñ
ð 	
ô �y‰y×)Ñ)¨!¨QÓ/ˆÜ—i‘i×0Ñ0ØÐ'Ð)=Ð>ÀÐQ_Ð@`ó
ˆô �I‰I×&Ñ& q¨+Ó6ˆÜ�q˜‘t“*œd 1 Q¡4›jÐ)ˆÜ—9‘9×-Ñ-¨f°a¸Ó;ˆÜ�y‰y×)Ñ)¨*°hÓ?Ð?r   c                ó^  — t        j                  dt         j                  z  «      }d|z  }d|z  }t        t	        | t
        «       «      rM| | z  }t        | |||z  z   z  «      }dd|z  z   }	| |	z  }
d||z  z
  }|||z  z   }|	| d||z  z  z  z   }||z  }||
fS t        j                  j                  | | «      }t        j                  j                  |||f||f«      }t        j                  j                  | |«      }t        |d   «      t        |d   «      f}t        j                  j                  |dd«      }	t        j                  j                  | |	«      }
t        j                  j                  ||d    |d    fd«      }t        j                  j                  |||f||f«      }t        j                  j                  ||«      }t        j                  j                  | |«      }t        j                  j                  |d|	«      }t        j                  j                  ||«      }||
fS )	a©  
    GELU tanh approximation backward pass: computes gradient w.r.t. x and recomputes forward
    Given: gelu_out = 0.5 * x * (1 + tanh(x * (c1 + c2 * x^2))), and dout = grad w.r.t. gelu_out
    Returns: (dx, gelu_out)

    Derivative uses the chain rule:
    d/dx[gelu(x)] = 0.5 * (1 + tanh(z)) + 0.5 * x * sech^2(z) * dz/dx
    where z = x * (c1 + c2 * x^2), dz/dx = c1 + 3 * c2 * x^2
    and sech^2(z) = 1 - tanh^2(z)
    rV   rW   g      @r   r    r   r   r/   rX   )r   r=   r   r   r[   r\   Úsqrt_2_over_pi_coeff_3r]   r`   Úhalf_tanh_z_plus_oneÚgelu_outÚsech2_zÚdz_dxÚdgelurL   r^   r_   Úsech2_dz_dxÚx_sech2_dz_dxs                      r   Údgelu_tanh_approxrl   ˜   s'  € ô —Y‘Y˜q¤4§7¡7™{Ó+€NØ# nÑ4ÐØ Ð#7Ñ7Ðä”j ¤EÓ*Ð*Ô+à�1‰uˆä�a˜>Ð,@À4Ñ,GÑGÑHÓIˆØ" S¨6¡\Ñ1ÐØÐ+Ñ+ˆð �f˜v‘oÑ%ˆàÐ!7¸$Ñ!>Ñ>ˆà$ q¨C°7¸U±?Ñ,CÑ'DÑDˆà�E‰\ˆØ�8ˆ|Ðô �y‰y×)Ñ)¨!¨QÓ/ˆÜ—i‘i×0Ñ0ØÐ'Ð)=Ð>ÀÐQ_Ð@`ó
ˆô �I‰I×&Ñ& q¨+Ó6ˆÜ�q˜‘t“*œd 1 Q¡4›jÐ)ˆÜ#Ÿy™y×9Ñ9¸&À*ÈjÓYÐÜ—9‘9×-Ñ-¨aÐ1EÓFˆô —)‘)×,Ñ,¨V°v¸a±y°jÀ6È!Á9À*Ð5MÈzÓZˆä—	‘	×*Ñ*ØÐ)Ð+AÐBÀ^ÐUcÐDdó
ˆô —i‘i×0Ñ0°¸%Ó@ˆÜŸ	™	×2Ñ2°1°kÓBˆÜ—	‘	×*Ñ*¨=¸*ÐFZÓ[ˆä�Y‰Y×'Ñ'¨¨eÓ4ˆØ�8ˆ|Ðr   c                óÀ  — t        t        | t        «       «      r^t        | dkD  «      }|sLt        j
                  j                  t        t        j
                  j                  | d¬«      «      dz   d¬«      S | S t        j                  t
        j                  «      }t        j                  j                  | ||f«      }t        j
                  j                  |d   d¬«      t        j
                  j                  |d   d¬«      f}t        j                  j                  |d«      }t        j
                  j                  |d   d¬«      t        j
                  j                  |d   d¬«      f}t        j                  d«      }	t        j                  j                  ||	|	f«      }
t        | d   dkD  «      }t        | d   dkD  «      }|s|
d   n| d   |s|
d   fS | d   fS )	Nç      4@Tr-   r,   r   r    r/   rR   )r   r"   r#   r   r$   r1   Úlogr   r2   r3   r4   r%   r&   r6   )r   r   r   Ú
use_linearr7   Úx_log2eÚx_expÚx_exp_p1Úlog_x_exp_p1Úln2Ú
softplus_xÚuse_linear_0Úuse_linear_1s                r   Úsoftplusry   ×   sœ  € ô ”j ¤EÓ*Ð*Ô+Ü˜Q ™XÓ&ˆ
ñ ô �I‰I�M‰Mœ'¤$§)¡)§-¡-°¸D -Ó"AÓBÀSÑHÐSWˆMÓXð	
ð ð	
ô —‘œ4Ÿ6™6Ó"ˆÜ—)‘)×,Ñ,¨Q°¸Ð0@ÓAˆÜ—‘—‘˜w q™z°D�Ó9¼4¿9¹9¿=¹=ÈÐQRÉÐ^b¸=Ó;cÐdˆÜ—9‘9×-Ñ-¨e°ZÓ@ˆä�I‰I�N‰N˜8 A™;°ˆNÓ6Ü�I‰I�N‰N˜8 A™;°ˆNÓ6ð
ˆô �h‰h�s‹mˆÜ—Y‘Y×/Ñ/°¸sÀC¸jÓIˆ
Ü˜q ™t d™{Ó+ˆÜ˜q ™t d™{Ó+ˆá!-ˆJ�qŠM°1°Q±4Ù!-ˆJ�q‰Mð
ð 	
à34°Q±4ð
ð 	
r   c                óz   — t        | dkD  «      }||t        j                  j                  |  d¬«      z  z
  }|s|S |S )Nrn   Tr-   )r   r$   r1   r2   )r<   r=   r   r   rp   rL   s         r   Údsoftplus_from_outputr{   ô   sA   € ô ˜˜t™Ó$€Jà	�”t—y‘y—}‘} c T°D�}Ó9Ñ9Ñ	9€BÙˆ2Ð) TÐ)r   c                ó¤   — t        t        | t        «       «      r| t        | «      z  S t        j
                  j                  | t        | «      «      S )z:
    silu(x) = x * sigmoid(x) = x * rcp(1 + exp(-x)).
    ©r   r"   r#   r;   r$   r%   r&   rF   s      r   Úsilur~   ý   s?   € ô
 ”j ¤EÓ*Ð*Ô+Ø”7˜1“:‰~Ðä�y‰y×)Ñ)¨!¬W°Q«ZÓ8Ð8r   F)Úalready_halvedr   r   r   c                óT  — t        t        | t        «       «      r$t        | «      rd| z  n| }|t        |«      z  |z   S t        | «      r t        j
                  j                  d| «      n| }t        |d   «      t        |d   «      f}t        j
                  j                  |||«      S )z¿
    silu(x) = x * sigmoid(x) = x * (1 + tanh(x / 2)) / 2 = (0.5 * x) * tanh(0.5 * x) + (0.5 * x)
    This compiles down to 3 SASS instructions: FMUL to get 0.5 * x, MUFU.TANH, and FFMA.
    r   r   r   r    r!   )r   r   r   r   r(   r)   s         r   Ú	silu_tanhr�     s•   € ô ”j ¤EÓ*Ð*Ô+Ü&¨>Ð'9Ô:��q’Àˆàœ˜V›Ñ$ vÑ-Ð-ä>HÈ^ÐI[Ô>\”—‘×+Ñ+¨J¸Ô:ÐbcˆÜ˜F 1™I“¬¨V°A©Y«Ð8ˆÜ�y‰y×)Ñ)¨&°+¸vÓFÐFr   c                ó®  — t        t        | t        «       «      r"t        | «      }| |z  }|||z  z
  |z   |z  }||fS t        | «      }t        j
                  j                  | |«      }t        j
                  j                  ||d    |d    f|«      }t        j
                  j                  ||«      }t        j
                  j                  ||«      }||fS )z‰
    SiLU backward pass: computes d_silu(x) * dout and recomputes silu(x).

    d_silu(x) = sigmoid(x) * (1 + x * (1 - sigmoid(x))).
    r   r    )	r   r"   r#   r;   r$   r%   r&   r'   r6   )	r   r=   r   r   Ú	sigmoid_xÚsilu_xÚd_silu_x_doutÚ sigmoid_x_minus_silu_x_sigmoid_xÚ,sigmoid_x_minus_silu_x_sigmoid_x_plus_silu_xs	            r   Údsilurˆ     sÜ   € ô ”j ¤EÓ*Ð*Ô+Ü˜A“Jˆ	Ø�Y‘ˆØ" V¨iÑ%7Ñ7¸&Ñ@ÀDÑHˆØ˜fÐ$Ð$ä˜A“Jˆ	Ü—‘×+Ñ+¨A¨yÓ9ˆÜ+/¯9©9×+EÑ+EØ˜ ™˜
 V¨A¡Y JÐ/°ó,
Ð(ô 8<·y±y×7QÑ7QØ,¨fó8
Ð4ô Ÿ	™	×2Ñ2Ø8¸$ó
ˆð ˜fÐ$Ð$r   c                óš  — t        t        | t        «       «      rZt        | «      r!d| z  }t        |«      }d|z  dz   }||z  |z   }nt        | «      }	d|	z  dz   }| |	z  | z   }|||z  z
  |z   |z  }
|
|fS t        | «      rt        j
                  j                  d| «      }t        |d   «      t        |d   «      f}t        j
                  j                  |dd«      }t        j
                  j                  |||«      }n^t        | d   «      t        | d   «      f}	t        j
                  j                  |	dd«      }t        j
                  j                  | |	| «      }t        j
                  j                  ||d    |d    f|«      }t        j
                  j                  ||«      }t        j
                  j                  ||«      }
|
|fS )zE
    SiLU backward using sigmoid(x) = 0.5 * (1 + tanh(0.5 * x)).
    r   r   r   r    )	r   r"   r#   r   r$   r%   r&   r'   r6   )r   r=   r   r   r   r(   r)   rƒ   r„   Útanh_xr…   r†   r‡   s                r   Ú
dsilu_tanhr‹   9  s¿  € ô ”j ¤EÓ*Ð*Ô+Ü˜.Ð(Ô)Ø˜1‘WˆFÜ˜v›,ˆKØ˜kÑ)¨CÑ/ˆIØ˜kÑ)¨FÑ2‰Fä˜!“WˆFØ˜f™ sÑ*ˆIØ˜‘Z !‘^ˆFØ" V¨iÑ%7Ñ7¸&Ñ@ÀDÑHˆØ˜fÐ$Ð$ä˜.Ð(Ô)Ü—Y‘Y×/Ñ/°
¸AÓ>ˆFÜ  q¡	›?¬D°¸±«OÐ<ˆKÜŸ	™	×2Ñ2°;À
ÈJÓWˆIÜ—Y‘Y×/Ñ/°¸ÀVÓL‰Fä˜1˜Q™4“j¤$ q¨¡t£*Ð-ˆFÜŸ	™	×2Ñ2°6¸:ÀzÓRˆIÜ—Y‘Y×/Ñ/°°6¸1Ó=ˆFÜ+/¯9©9×+EÑ+EØ˜ ™˜
 V¨A¡Y JÐ/°ó,
Ð(ô 8<·y±y×7QÑ7QØ,¨fó8
Ð4ô Ÿ	™	×2Ñ2Ø8¸$ó
ˆð ˜fÐ$Ð$r   Úyc                ó¤   — t        t        | t        «       «      rt        | «      |z  S t        j
                  j                  t        | «      |«      S r?   )r   r"   r#   r~   r$   r%   r&   ©r   rŒ   r   r   s       r   Úswiglur�   g  s=   € ä”j ¤EÓ*Ð*Ô+Ü�A‹w˜‰{Ðä�y‰y×)Ñ)¬$¨q«'°1Ó5Ð5r   c                ó¤   — t        t        | t        «       «      rt        | «      |z  S t        j
                  j                  t        | «      |«      S r?   )r   r"   r#   r�   r$   r%   r&   rŽ   s       r   Úswiglu_tanhr‘   o  s>   € ä”j ¤EÓ*Ð*Ô+Ü˜‹|˜aÑÐä�y‰y×)Ñ)¬)°A«,¸Ó:Ð:r   c                óZ  — t        t        | t        «       «      r4t        | «      }| |z  }||z  }|||z  z
  |z  |z   }||z  }	|}
||z  }|	|
|fS t        | «      }t        j
                  j                  | |«      }t        j
                  j                  ||«      }t        j
                  j                  ||d    |d    f|«      }t        j
                  j                  |||«      }t        j
                  j                  ||«      }	|}
t        j
                  j                  ||«      }|	|
|fS )a¬  
    SwiGLU backward pass: computes gradients w.r.t. x (gate) and y (up projection)
    Given: swiglu_out = silu(x) * y, and dout = grad w.r.t. swiglu_out
    Returns: (dx, dy, swiglu_out) where dx = dout * y * d_silu(x), dy = dout * silu(x)

    d_silu(x) = sigmoid(x) * (1 + x * (1 - sigmoid(x)))

    This has been optimized to use fewer instructions (i.e. we expand things out
    to use FFMA instead of FADD and FMUL).
    r   r    ©r   r"   r#   r;   r$   r%   r&   r'   )r   rŒ   r=   r   r   rƒ   r„   Úsilu_x_doutr…   rL   ÚdyÚ
swiglu_outr†   s                r   Údswiglur—   w  s2  € ô& ”j ¤EÓ*Ð*Ô+Ü˜A“Jˆ	Ø�Y‘ˆØ˜t‘mˆð # V¨iÑ%7Ñ7¸4Ñ?À+ÑMˆØ˜QÑˆØˆØ˜a‘Zˆ
Ø�2�zÐ!Ð!ô ˜A“Jˆ	Ü—‘×+Ñ+¨A¨yÓ9ˆÜ—i‘i×0Ñ0°¸Ó>ˆä+/¯9©9×+EÑ+EØ˜ ™˜
 V¨A¡Y JÐ/°ó,
Ð(ô Ÿ	™	×2Ñ2Ø,¨d°Kó
ˆô �Y‰Y×'Ñ'¨°qÓ9ˆØˆÜ—Y‘Y×/Ñ/°¸Ó:ˆ
Ø�2�zÐ!Ð!r   c                ó€  — t        t        | t        «       «      r\t        | «      rt        | «      }| |z  }nt	        | «      }d|z  dz   }| |z  | z   }||z  }	|||z  z
  |z  |	z   }
|
|z  }|	}||z  }|||fS t        | «      r,t        | «      }t
        j                  j                  | |«      }n^t	        | d   «      t	        | d   «      f}t
        j                  j                  |dd«      }t
        j                  j                  | || «      }t
        j                  j                  ||«      }	t
        j                  j                  ||d    |d    f|«      }t
        j                  j                  |||	«      }
t
        j                  j                  |
|«      }|	}t
        j                  j                  ||«      }|||fS )zG
    SwiGLU backward using sigmoid(x) = 0.5 * (1 + tanh(0.5 * x)).
    r   r   r    r   )	r   r"   r#   r*   r   r$   r%   r&   r'   )r   rŒ   r=   r   r   r   rƒ   r„   rŠ   r”   r…   rL   r•   r–   r†   s                  r   Údswiglu_tanhr™   «  s²  € ô ”j ¤EÓ*Ð*Ô+Ü˜.Ð(Ô)Ü$ Q›ˆIØ˜‘]‰Fä˜!“WˆFØ˜f™ sÑ*ˆIØ˜‘Z !‘^ˆFØ˜t‘mˆØ" V¨iÑ%7Ñ7¸4Ñ?À+ÑMˆØ˜QÑˆØˆØ˜a‘Zˆ
à�2�zÐ!Ð!ä˜.Ð(Ô)Ü$ Q›ˆIÜ—Y‘Y×/Ñ/°°9Ó=‰Fä˜1˜Q™4“j¤$ q¨¡t£*Ð-ˆFÜŸ	™	×2Ñ2°6¸:ÀzÓRˆIÜ—Y‘Y×/Ñ/°°6¸1Ó=ˆFÜ—i‘i×0Ñ0°¸Ó>ˆä+/¯9©9×+EÑ+EØ˜ ™˜
 V¨A¡Y JÐ/°ó,
Ð(ô Ÿ	™	×2Ñ2Ø,¨d°Kó
ˆô �Y‰Y×'Ñ'¨°qÓ9ˆØˆÜ—Y‘Y×/Ñ/°¸Ó:ˆ
Ø�2�zÐ!Ð!r   Úalphac                óH  — t        t        | t        «       «      rt        || z  «      }| |z  }||z  |z   S t        j
                  j                  ||f| «      }t        |«      }t        j
                  j                  | |«      }t        j
                  j                  |||«      S )zñThe swiglu variant used in gpt-oss, which has a scaling factor on x and bias of 1 to y.
    https://github.com/openai/gpt-oss/blob/7be9334950053a888e24887a57dac797a17d6e00/gpt_oss/torch/model.py#L249
    x * sigmoid(alpha * x) * (y + 1)
    r“   )r   rŒ   rš   r   r   Úsigmoid_alpha_xr„   Úalpha_xs           r   Ú
swiglu_oairž   Ý  s�   € ô ”j ¤EÓ*Ð*Ô+Ü! %¨!¡)Ó,ˆØ�_Ñ$ˆØ˜‰z˜FÑ"Ð"ä—)‘)×,Ñ,¨e°U¨^¸QÓ?ˆÜ! 'Ó*ˆÜ—‘×+Ñ+¨A¨Ó?ˆÜ�y‰y×)Ñ)¨&°!°VÓ<Ð<r   c                ó¸  — t        t        | t        «       «      r!d| z  }|t        ||z  «      z  |z   }||z  |z   S t        j
                  j                  d| «      }t        j
                  j                  ||f|«      }t        |d   «      t        |d   «      f}t        j
                  j                  |||«      }t        j
                  j                  |||«      S )z8Tanh-based swiglu_oai kept for SASS/accuracy comparison.r   r   r   r    r!   )	r   rŒ   rš   r   r   r(   r„   Úalpha_x_halfÚtanh_alpha_x_halfs	            r   Úswiglu_oai_tanhr¢   ð  sÅ   € ô
 ”j ¤EÓ*Ð*Ô+Ø�q‘ˆØœ$˜u v™~Ó.Ñ.°Ñ7ˆØ˜‰z˜FÑ"Ð"ä—‘×+Ñ+¨J¸Ó:ˆÜ—y‘y×1Ñ1°5¸%°.À&ÓIˆÜ! ,¨q¡/Ó2´D¸Àa¹Ó4IÐJÐÜ—‘×+Ñ+¨FÐ4EÀvÓNˆÜ�y‰y×)Ñ)¨&°!°VÓ<Ð<r   c                óþ  — t        t        | t        «       «      r@t        || z  «      }| |z  }||z  }|||||z  z
  z  z   |z  }	|	|z  |	z   }
|}||z  |z   }|
||fS t        j
                  j                  ||f| «      }t        |«      }t        j
                  j                  | |«      }t        j
                  j                  ||«      }t        j
                  j                  ||d    |d    f|«      }t        j
                  j                  ||f||«      }t        j
                  j                  ||«      }	t        j
                  j                  |	||	«      }
|}t        j
                  j                  |||«      }|
||fS )au  
    Swiglu OAI backward pass: computes gradients w.r.t. x and y
    Given: swiglu_oai_out = x * sigmoid(alpha * x) * (y + 1), and dout = grad w.r.t. swiglu_oai_out
    Returns: (dx, dy, swiglu_oai_out)

    Derivative of x * sigmoid(alpha * x) w.r.t. x:
    d/dx[x * sigmoid(alpha * x)] = sigmoid(alpha * x) + alpha * x * sigmoid(alpha * x) * (1 - sigmoid(alpha * x))
    r   r    r“   )r   rŒ   r=   rš   r   r   rœ   r„   r”   r…   rL   r•   r–   r�   Úsilu_x_minus_productÚsigmoid_plus_alpha_diffs                   r   Údswiglu_oair¦     s„  € ô ”j ¤EÓ*Ð*Ô+Ü! %¨!¡)Ó,ˆØ�_Ñ$ˆØ˜t‘mˆØ(¨5°F¸VÀoÑ=UÑ4UÑ+VÑVÐZ^Ñ^ˆØ˜QÑ Ñ.ˆØˆØ˜a‘Z &Ñ(ˆ
Ø�2�zÐ!Ð!ä—)‘)×,Ñ,¨e°U¨^¸QÓ?ˆÜ! 'Ó*ˆÜ—‘×+Ñ+¨A¨Ó?ˆÜ—i‘i×0Ñ0°¸Ó>ˆÜ#Ÿy™y×9Ñ9Ø�o aÑ(Ð(¨?¸1Ñ+=Ð*=Ð>Àó 
Ðô #'§)¡)×"<Ñ"<Ø�EˆNÐ0°/ó#
Ðô Ÿ	™	×2Ñ2Ð3JÈDÓQˆÜ�Y‰Y×'Ñ'¨°q¸-ÓHˆØˆÜ—Y‘Y×/Ñ/°¸¸6ÓBˆ
Ø�2�zÐ!Ð!r   c                ó„  — t        t        | t        «       «      rKd|z  | z  }ddt        |«      z  z   }| |z  }||z  }	|||||z  z
  z  z   |z  }
|
|z  |
z   }|	}||z  |z   }|||fS t        j
                  j                  d|z  d|z  f| «      }t        |d   «      t        |d   «      f}t        j
                  j                  |dd«      }t        j
                  j                  | |«      }t        j
                  j                  ||«      }	t        j
                  j                  ||d    |d    f|«      }t        j
                  j                  ||f||«      }t        j
                  j                  ||«      }
t        j
                  j                  |
||
«      }|	}t        j
                  j                  |||«      }|||fS )z9Tanh-based dswiglu_oai kept for SASS/accuracy comparison.r   r   r    r   r!   )r   rŒ   r=   rš   r   r   r    rœ   r„   r”   r…   rL   r•   r–   r¡   r¤   r¥   s                    r   Údswiglu_oai_tanhr¨   (  sÏ  € ô
 ”j ¤EÓ*Ð*Ô+Ø˜e™ qÑ(ˆØ ¤d¨<Ó&8Ñ 8Ñ8ˆØ�_Ñ$ˆØ˜t‘mˆØ(¨5°F¸VÀoÑ=UÑ4UÑ+VÑVÐZ^Ñ^ˆØ˜QÑ Ñ.ˆØˆØ˜a‘Z &Ñ(ˆ
Ø�2�zÐ!Ð!ä—y‘y×1Ñ1°C¸%±KÀ3ÈÁ;Ð2PÐRSÓTˆÜ! ,¨q¡/Ó2´D¸Àa¹Ó4IÐJÐÜŸ)™)×4Ñ4Ð5FÈ
ÐT^Ó_ˆÜ—‘×+Ñ+¨A¨Ó?ˆÜ—i‘i×0Ñ0°¸Ó>ˆÜ#Ÿy™y×9Ñ9Ø�o aÑ(Ð(¨?¸1Ñ+=Ð*=Ð>Àó 
Ðô #'§)¡)×"<Ñ"<Ø�EˆNÐ0°/ó#
Ðô Ÿ	™	×2Ñ2Ð3JÈDÓQˆÜ�Y‰Y×'Ñ'¨°q¸-ÓHˆØˆÜ—Y‘Y×/Ñ/°¸¸6ÓBˆ
Ø�2�zÐ!Ð!r   c                ó¬   — t        t        | t        «       «      rt        | «      }||z  S t        | «      }t        j
                  j                  ||«      S )z:GLU: Gated Linear Unit
    glu(x, y) = sigmoid(x) * y
    r}   )r   rŒ   r   r   rƒ   s        r   Úglurª   J  sI   € ô
 ”j ¤EÓ*Ð*Ô+Ü˜A“Jˆ	Ø˜1‰}Ðä˜A“Jˆ	Ü�y‰y×)Ñ)¨)°QÓ7Ð7r   c                óz  — t        t        | t        «       «      r$t        | «      }||z  }||z  }||z
  |z  }|}	||	|fS t        | «      }t        j
                  j                  ||«      }t        j
                  j                  ||«      }t        ||«      }
t        j
                  j                  |
|«      }|}	||	|fS )a/  
    GLU backward pass: computes gradients w.r.t. x (gate) and y (up projection)
    Given: glu_out = sigmoid(x) * y, and dout = grad w.r.t. glu_out
    Returns: (dx, dy, glu_out) where:
    - dx = dout * y * sigmoid(x) * (1 - sigmoid(x))
    - dy = dout * sigmoid(x)
    - glu_out = sigmoid(x) * y
    )r   r"   r#   r;   r$   r%   r&   Úsub_packed_f32x2)r   rŒ   r=   r   r   rƒ   Úsigmoid_x_doutÚglu_outrL   r•   Úy_minus_glu_outs              r   Údglur°   W  s»   € ô ”j ¤EÓ*Ð*Ô+Ü˜A“Jˆ	Ø" TÑ)ˆØ˜a‘-ˆð
 �'‰k˜^Ñ+ˆØˆà�2�wˆÐä˜A“Jˆ	ÜŸ™×3Ñ3°I¸tÓDˆÜ—)‘)×,Ñ,¨Y¸Ó:ˆä*¨1¨gÓ6ˆÜ�Y‰Y×'Ñ'¨¸ÓHˆØˆØ�2�wˆÐr   c                óä   — t        t        | t        «       «      r,t        j                  j                  | t        d«      «      |z  S t        | «      }t        j                  j                  ||«      S )zPReGLU: ReLU Gated Linear Unit
    reglu(x, y) = relu(x) * y = max(x, 0) * y
    rD   )	r   r"   r#   r$   r%   rE   r   rG   r&   )r   rŒ   r   r   rO   s        r   Úreglur²   z  sT   € ô
 ”j ¤EÓ*Ð*Ô+Ü�y‰y�~‰~˜a¤¨£Ó.°Ñ2Ð2ä�a“ˆÜ�y‰y×)Ñ)¨&°!Ó4Ð4r   c                óR  — t        t        | t        «       «      rXt        | dkD  «      }t        j
                  j                  | t        d«      «      }|r||z  n
t        d«      }||z  }||z  }	|||	fS t        | d   dkD  «      }
t        | d   dkD  «      }t        | «      }t        j
                  j                  ||«      }|
r|d   n
t        d«      |r|d   n
t        d«      f}t        j
                  j                  ||«      }t        j
                  j                  ||«      }	|||	fS )a!  
    ReGLU backward pass: computes gradients w.r.t. x (gate) and y (up projection)
    Given: reglu_out = relu(x) * y, and dout = grad w.r.t. reglu_out
    Returns: (dx, dy, reglu_out) where:
    - dx = dout * y if x > 0, else 0
    - dy = dout * relu(x)
    - reglu_out = relu(x) * y
    r   rD   r    )
r   r"   r#   r   r$   r%   rE   r   rG   r&   )r   rŒ   r=   r   r   rI   rO   rL   r•   Ú	reglu_outrJ   rK   Údout_ys                r   Údreglur¶   †  s  € ô ”j ¤EÓ*Ð*Ô+Ü˜˜A™“ˆÜ—‘—‘ ¤7¨3£<Ó0ˆÙ ˆd�QŠh¤g¨c£lˆØ�F‰]ˆØ˜Q‘Jˆ	Ø�2�yÐ Ð ä˜˜1™ ™Ó"ˆÜ˜˜1™ ™Ó"ˆÜ�a“ˆÜ—‘×+Ñ+¨D°!Ó4ˆÙ"ˆv�aŠy¬°«ÁV¸¸qº	ÔQXÐY\ÓQ]Ð_ˆÜ�Y‰Y×'Ñ'¨¨fÓ5ˆÜ—I‘I×.Ñ.¨v°qÓ9ˆ	Ø�2�yÐ Ð r   c                ó¤   — t        t        | t        «       «      rt        | «      |z  S t        j
                  j                  t        | «      |«      S )zhGeGLU: GELU Gated Linear Unit
    geglu(x, y) = gelu(x) * y
    Uses the tanh approximation of GELU
    )r   r"   r#   rb   r$   r%   r&   rŽ   s       r   Úgeglur¸   ¥  sC   € ô ”j ¤EÓ*Ð*Ô+Ü Ó" QÑ&Ð&ä�y‰y×)Ñ)Ô*:¸1Ó*=¸qÓAÐAr   c                ód  — t        t        | t        «       «      r#t        | |«      \  }}||z  }||z  }||z  }	|||	fS t        | |«      \  }}t        j
                  j                  ||«      }t        j
                  j                  ||«      }t        j
                  j                  ||«      }	|||	fS )a  
    GeGLU backward pass: computes gradients w.r.t. x (gate) and y (up projection)
    Given: geglu_out = gelu(x) * y, and dout = grad w.r.t. geglu_out
    Returns: (dx, dy, geglu_out) where:
    - dx = dout * y * d_gelu(x)
    - dy = dout * gelu(x)
    - geglu_out = gelu(x) * y
    )r   r"   r#   rl   r$   r%   r&   )
r   rŒ   r=   r   r   Údgelu_x_doutÚgelu_xrL   r•   Ú	geglu_outs
             r   Údgeglur½   ±  s²   € ô ”j ¤EÓ*Ð*Ô+ä0°°DÓ9Ñˆ�fà˜AÑˆØ�d‰]ˆØ˜Q‘Jˆ	Ø�2�yÐ Ð ô  1°°DÓ9Ñˆ�fä�Y‰Y×'Ñ'¨°aÓ8ˆÜ�Y‰Y×'Ñ'¨°Ó5ˆÜ—I‘I×.Ñ.¨v°qÓ9ˆ	Ø�2�yÐ Ð r   )Nr~   z	silu-tanhrG   rP   rb   )r�   zswiglu-tanhrž   zswiglu_oai-tanhr²   r¸   rª   )g¬Zd;û?):r1   Útypingr   Ú	functoolsr   Úcutlass.cuter$   Úcutlassr   r   r   Úcutlass.cutlass_dslr   r	   Úcutlass._mlir.dialectsr
   r   ÚF32_or_F32x2r%   Úcalc_packed_f32x2_opr¬   Úfloatr   r*   r;   rA   rG   ÚjitrM   rP   rT   rb   rl   ry   r{   r~   Úboolr�   rˆ   r‹   r�   r‘   r—   r™   rž   r¢   r¦   r¨   rª   r°   r²   r¶   r¸   r½   Ú
act_fn_mapÚdact_fn_mapÚgate_fn_mapÚdgate_fn_mapr@   r   r   ú<module>rÍ      s¼  ðó Ý Ý å ß 0Ñ 0ß .ß -ð ˜˜w¨Ð/Ñ0Ñ0€ñ Ø‡I�I×"Ñ"Ø
Ø×#Ñ#ôÐ ð Ø$(¨Tò 
ˆE�G‰Oð 
°gò 
ó ð
ð Ø)-°$ò O�Lð O¸<ò Oó ðOð Ø$(¨Tò Nˆ|ð N°lò Nó ðNð Ø=AÀdò $˜gð $¨Wð $Èwò $ó ð$ð
 Ø!%¨$ò VˆLð V°<ò Vó ðVð Ø‡�à04¸ò
Øð
Ø'ð
à
ˆ<˜Ð%Ñ&ò
ó 
ó ð
ð Ø$(¨Tò 5ˆ|ð 5°lò 5ó ð5ð Ø‡�à04¸òØðØ'ðà
ˆ<˜Ð%Ñ&òó 
ó ðð. Ø-1°dò @˜ð @¸|ò @ó ð@ð2 à04¸ò;Øð;Ø'ð;à
ˆ<˜Ð%Ñ&ò;ó ð;ð| Ø‡�Ø%)¨dò 
�ð 
°|ò 
ó 
ó ð
ð6 Ø‡�Ø>BÀtò *˜wð *¨gð *ÐPWò *ó 
ó ð*ð Ø!%¨$ò 9ˆLð 9°<ò 9ó ð9ð Ø9>ÀDÈTò G�ð G°$ð GÐVbò Gó ðGð ð
 	Øò%Øð%à
ð%ð ˆ<˜Ð%Ñ&ò%ó ð%ð@ ð
 !ØØò*%Øð*%à
ð*%ð ð	*%ð ˆ<˜Ð%Ñ&ò*%ó ð*%ðZ Ø48¸Tò 6ˆlð 6˜|ð 6Àlò 6ó ð6ð Ø9=À$ò ;�<ð ; Lð ;È<ò ;ó ð;ð ð 	Øò0"Øð0"àð0"ð ð0"ð ˆ<˜ |Ð3Ñ4ò0"ó ð0"ðf ð !ØØò."Øð."àð."ð ð."ð
 ð."ð ˆ<˜ |Ð3Ñ4ò."ó ð."ðb à5:ð=ØCGÈDò=Øð=Ø$ð=Ø-2ð=àò=ó ð=ð$ à5:ð=ØCGÈDò=Øð=Ø$ð=Ø-2ð=àò=ó ð=ð  àINð#"ØW[Ð`dò#"Øð#"Ø$ð#"Ø,8ð#"ØAFð#"à
ˆ<˜ |Ð3Ñ4ò#"ó ð#"ðL àINð"ØW[Ð`dò"Øð"Ø$ð"Ø,8ð"ØAFð"à
ˆ<˜ |Ð3Ñ4ò"ó ð"ðB Ø15¸$ò 	8ˆ<ð 	8˜Lð 	8À<ò 	8ó ð	8ð àAEÈ$òØðØ$ðØ,8ðà
ˆ<˜ |Ð3Ñ4òó ððD Ø37¸Dò 5ˆ\ð 5˜lð 5À\ò 5ó ð5ð Ø‡�àAEÈ$ò!Øð!Ø$ð!Ø,8ð!à
ˆ<˜ |Ð3Ñ4ò!ó 
ó ð!ð: Ø37¸Dò Bˆ\ð B˜lð BÀ\ò Bó ðBð àAEÈ$ò!Øð!Ø$ð!Ø,8ð!à
ˆ<˜ |Ð3Ñ4ò!ó ð!ðD ØØØØØ(ñ€
ð ØØØØØ)ñ€ð ØØØ&ØØØñ€ð ØØØ'ØØØñ�r   