§
     ’ÞjŠ  ã                   ó
  — d Z ddlZddlZddlmZ ddlmZ  ej        ddgddg¬¦  «        dej	        fd„¦   «         Z
d	„ Z ej        ddgddg¬¦  «        d
ej	        dej	        fd„¦   «         Zdd„ZddlmZ  e¦   «          dS )a‹  Alias-free SnakeBeta activation of the H3 audio decoder (BigVGAN) in one Triton kernel: 2x upsampling (replicate padding, 12-tap
transposed Kaiser-sinc filter), SnakeBeta, then 2x downsampling (replicate padding, 12-tap low-pass filter). The unfused module runs a
dozen kernels per activation (the decoder has about a hundred and thirty of them) and writes two intermediates of twice its length.é    N)Ú	libdeviceÚlengthÚchannels)Údo_not_specializeÚdo_not_specialize_on_alignmentÚBLOCKc	           	      óB  — t          j        d¦  «        }	t          j        d¦  «        |z  t          j        d|¦  «        z   }
|
|k     }|	|z  }t          j        t          j        ||z   ¦  «                             t           j        ¦  «        ¦  «        }dt          j        t          j        ||z   ¦  «                             t           j        ¦  «        ¦  «        dz   z  }| |	                     t           j        ¦  «        |z  z   }t          j        |gt           j        ¬¦  «        }t          j	        d¦  «        D �]Š}t          j
        t          j        d|
z  |z   dz
  d¦  «        d|z  dz
  ¦  «        }|d	z   dz  }|d	z   d|z  z
  }t          j        |gt           j        ¬¦  «        }t          j	        d
¦  «        D ]¨}t          j
        t          j        ||z
  dz
  d¦  «        |dz
  ¦  «        }|t          j        ||z   |d¬¦  «                             t           j        ¦  «        t          j        ||z   d|z  z   ¦  «                             t           j        ¦  «        z  z  }Œ©d|z  }t          j        ||z  ¦  «        }||||z  |z  z   t          j        ||z   ¦  «                             t           j        ¦  «        z  z  }�ŒŒt          j        ||	                     t           j        ¦  «        |z  z   |
z   |                     |j        j        ¦  «        |¬¦  «         d S )Nr   é   ç      ð?ç•Ö&è.>)Údtypeé   é   é   é   é   ç        ©ÚmaskÚotherg       @©r   )ÚtlÚ
program_idÚarangeÚexpÚloadÚtoÚfloat32Úint64ÚzerosÚstatic_rangeÚminimumÚmaximumr   ÚsinÚstorer   Ú
element_ty)ÚXÚYÚALPHAÚBETAÚUPÚDOWNr   r   r   ÚrowÚnÚvalidÚchannelÚalphaÚinv_betaÚx_rowÚoutÚkÚmÚlastÚtapÚupÚjÚsourceÚsines                            úCC:\Users\johnn\OneDrive\Documents\AI\shared\kernels\audio_triton.pyÚ_snake_beta_aar>   
   s´  € å
Œ-˜Ñ
Ô
€CÝ
Œ�aÑÔ˜5Ñ ¥2¤9¨Q°Ñ#6Ô#6Ñ6€AØ�ŠJ€EØ�H‰n€GÝŒF•2”7˜5 7™?Ñ+Ô+×.Ò.­r¬zÑ:Ô:Ñ;Ô;€EØ•b”f�RœW T¨G¡^Ñ4Ô4×7Ò7½¼
ÑCÔCÑDÔDÀtÑKÑL€HØ�—’•r”xÑ Ô  6Ñ)Ñ)€EÝ
Œ(�E�7¥"¤*Ð
-Ñ
-Ô
-€CÝŒ_˜RÑ Ô ð Pñ PˆåŒJ•r”z ! a¡%¨!¡)¨a¡-°Ñ3Ô3°Q¸±ZÀ!±^ÑDÔDˆà�B‘˜1‰}ˆØ�"‰f�q˜4‘xÑˆÝŒX�u�g¥R¤ZÐ0Ñ0Ô0ˆÝ” Ñ#Ô#ð 	{ð 	{ˆAÝ”Z¥¤
¨4°!©8°a©<¸Ñ ;Ô ;¸VÀa¹ZÑHÔHˆFØ•"”'˜% &™.¨u¸CÐ@Ñ@Ô@×CÒCÅBÄJÑOÔOÕRTÔRYÐZ\Ð_bÑZbÐefÐijÑejÑZjÑRkÔRk×RnÒRnÕoqÔoyÑRzÔRzÑzÑzˆBˆBØ�2‰XˆÝŒ}˜U R™ZÑ(Ô(ˆØ��X ‘_ tÑ+Ñ+­r¬w°t¸a±xÑ/@Ô/@×/CÒ/CÅBÄJÑ/OÔ/OÑOÑOˆ‰Ý„HˆQ�—’�œÑ!Ô! FÑ*Ñ*¨QÑ.°·²°q´wÔ7IÑ0JÔ0JÐQVÐWÑWÔWÐWÐWÐWó    c                 ó$  — |                       ¦   «         } t          j        | ¦  «        }| j        \  }}}t	          ||z  t          j        |d¦  «        f         | ||||                     d¦  «        |                     d¦  «        ||d¬¦	  «	         |S )z{x [batch, channels, length], alpha and beta [channels] (log space), 12-tap filters: the activation's output, shaped like x.i   éÿÿÿÿ)r   )Ú
contiguousÚtorchÚ
empty_likeÚshaper>   ÚtritonÚcdivÚreshape)	Úxr1   ÚbetaÚ	up_filterÚdown_filterr4   Úbatchr   r   s	            r=   Úsnake_beta_aarN   $   s¶   € à	�Š‰Œ€AÝ
Ô
˜1Ñ
Ô
€CØœgÑ€Eˆ8�VÝ�E˜HÑ$¥f¤k°&¸#Ñ&>Ô&>Ð?Ô@ÀÀCÈÐPTÐV_×VgÒVgÐhjÑVkÔVkÐmx÷  nAò  nAð  BDñ  nEô  nEð  GMØAIÐQTðVñ Vô Vð Và€Jr?   Ú	LOG_SCALEc                 óR  — t          j        d¦  «        }t          j        d¦  «        |z  t          j        d|¦  «        z   }||k     }	||z  }
t          j        ||
z   ¦  «                             t           j        ¦  «        }t          j        ||
z   ¦  «                             t           j        ¦  «        }|r(t          j        |¦  «        }t          j        |¦  «        }t          j        d|dz   ¦  «        }| |                     t           j	        ¦  «        |z  z   |z   }t          j        ||	d¬¦  «                             t           j        ¦  «        }t          j
        ||z  ¦  «        }t          j        ||||z  |z  z                        | j        j        ¦  «        |	¬¦  «         dS )	zôx += sin(a x)^2 / (b + 1e-9) in place, one row of (batch * channels) per program along axis 0: a and b per channel, stored in
    log scale (exp taken here in FP32) or directly. FP32 arithmetic from the loaded values, one rounding at the store.r   r
   r   r   r   r   r   N)r   r   r   r   r   r   r   r   Údiv_rnr   r$   r%   r   r&   )r'   r)   r*   r   r   rO   r   r-   r.   r/   r0   r1   rJ   r2   ÚptrrI   Úwaves                    r=   Ú_snakerT   .   sd  € õ Œ-˜Ñ
Ô
€CÝ
Œ�aÑÔ˜5Ñ ¥2¤9¨Q°Ñ#6Ô#6Ñ6€AØ�ŠJ€EØ�H‰n€GÝŒG�E˜G‘OÑ$Ô$×'Ò'­¬
Ñ3Ô3€EÝŒ7�4˜'‘>Ñ"Ô"×%Ò%¥b¤jÑ1Ô1€DØð #Ý”˜eÑ$Ô$ˆÝŒ}˜TÑ"Ô"ˆÝŒy˜˜d T™kÑ*Ô*€HØ
ˆc�fŠf•R”XÑÔ Ñ'Ñ
'¨!Ñ
+€CÝ
Œ�˜% sÐ+Ñ+Ô+×.Ò.­r¬zÑ:Ô:€AÝŒ=˜ ™Ñ#Ô#€DÝ„HˆS�1�t˜d‘{ XÑ-Ñ-×1Ò1°!´'Ô2DÑEÔEÈEÐRÑRÔRÐRÐRÐRr?   Tc           
      ó  — | j         \  }}}t          ||z  t          j        |d¦  «        f         | |                     d¦  «        |                     d¦  «        |||dd¬¦  «         t
          j        j                             | ¦  «         | S )zaIn place on x (batch, channels, length), contiguous; alpha, beta (1, channels, 1) or (channels,).i   rA   F)rO   r   Úenable_fp_fusion)	rE   rT   rF   rG   rH   rC   ÚautogradÚgraphÚincrement_version)rI   r1   rJ   Ú	log_scalerM   r   r   s          r=   Úsnake_r[   B   s�   € àœgÑ€Eˆ8�VÝ
ˆE�HÑ�fœk¨&°$Ñ7Ô7Ð8Ô9¸!¸U¿]º]È2Ñ=NÔ=NÐPT×P\ÒP\Ð]_ÑP`ÔP`ÐbhÐjrð  Hð  PTØLQðSñ Sô Sð Så	„NÔ×*Ò*¨1Ñ-Ô-Ð-Ø€Hr?   )Ú!install_triton_compilation_logger)T)Ú__doc__rC   rF   Útriton.languageÚlanguager   Útriton.language.extrar   ÚjitÚ	constexprr>   rN   rT   r[   Ú%shared.kernels.triton_compilation_logr\   © r?   r=   ú<module>re      s:  ððGð Gð €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +ð €„˜x¨Ð4ÐV^Ð`jÐUkÐlÑlÔlðXÈÌð Xð Xð Xñ mÔlðXð2ð ð ð €„˜x¨Ð4ÐV^Ð`jÐUkÐlÑlÔlðS¸¼ð SÈRÌ\ð Sð Sð Sñ mÔlðSð&ð ð ð ð TÐ SÐ SÐ SÐ SÐ Sà !Ð !Ñ #Ô #Ð #Ð #Ð #r?   