ó
    <Ð˜jì)  ã                  ó
  • S SK Jr  S SKrS SKJr  S SKJr  S SKrS SKJrJ	r	  S SK
JrJr  S SKJs  Jr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJrJr  S S
KJr  S rS r S r!S r"S r#SS jr$ " S S\5      r% " S S\5      r&g)é    )ÚannotationsN©Úceil)Úpartial)ÚnnÚtensor)ÚModuleÚ
ModuleList)Úautocast)ÚFSQ)Ú	rearrangeÚrepeatÚreduceÚpackÚunpack)Úget_atc                ó
   • U S L$ ©N© )Úvals    Ú²C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\vector_quantize_pytorch/residual_fsq.pyÚexistsr      s   € Ø�dˆ?Ðó    c                ó   • U S   $ )Nr   r   )Úls    r   Úfirstr      s   € ØˆQ‰4€Kr   c                ó*   • [        U 5      (       a  U $ U$ r   )r   )r   Úds     r   Údefaultr      s   € Ü˜—+‘+ˆ3Ð$ 1Ð$r   c                ó"   • [        X-  5      U-  $ r   r   )ÚnumÚmults     r   Úround_up_multipler#      s   € Ü�‘
Ó˜dÑ"Ð"r   c                 ój   • [         R                  " 5       =(       a    [         R                  " 5       S:„  $ )Né   )ÚdistÚis_initializedÚget_world_sizer   r   r   Úis_distributedr)   $   s$   € Ü×ÒÓ ×>¤T×%8Ò%8Ó%:¸QÑ%>Ð>r   c                óš   • [         R                  " SUSU S9n[        5       (       a  [        R                  " U5        UR                  5       $ )Nr   r   )Údevice)ÚtorchÚrandintr)   r&   Ú
all_reduceÚitem)r+   Úmax_sizeÚrand_ints      r   Úget_maybe_sync_seedr2   '   s7   € Ü�}Š}˜Q ¨"°vÑ>€Hä×ÑÜ�Š˜Ô!à�=‰=‹?Ðr   c                  ót   ^ • \ rS rSrSrSSSSSSSS.   SU 4S	 jjjr\S
 5       rS rS r	  SS jr
SrU =r$ )ÚResidualFSQé1   z=Follows Algorithm 1. in https://arxiv.org/pdf/2107.03312.pdf NFr   r%   T)ÚdimÚis_channel_firstÚquantize_dropoutÚquantize_dropout_cutoff_indexÚquantize_dropout_multiple_ofÚsoft_clamp_input_valueÚbound_hard_clampc       	   	     ó²  >• [         TU ]  5         [        U5      n[        X;5      nX³:g  nU(       a  [        R
                  " X;5      O[        R                  " 5       U l        U(       a  [        R
                  " X³5      O[        R                  " 5       U l        XÀl	        X@l
        X l        Xl        [        R                  " / 5      U l        [        U5      nUS:„  R!                  5       (       d   e/ n[#        U5       HQ  nUR%                  UR'                  5       U* -  5        [)        S	UUSU	S.U
D6nU R                  R%                  U5        MS     [!        U R                   Vs/ s H  nUR                  (       + PM     sn5      (       d   eU R                  S   R*                  U l        U R-                  S[.        R0                  " U5      SS9  U=(       a    US:„  U l        US:¼  d   eX`l        Xpl        U	(       a  [9        U5      (       a   eSSUS-
  -  -   n[;        U[<        [&        45      (       a  [        U5      nU R-                  SUSS9  g s  snf )
Nr%   T)Úlevelsr6   Úpreserve_symmetryr<   r   ÚscalesF)Ú
persistentr;   r   )ÚsuperÚ__init__Úlenr   r   ÚLinearÚIdentityÚ
project_inÚproject_outÚhas_projectionsr7   Únum_quantizersr>   r
   Úlayersr   ÚallÚrangeÚappendÚfloatr   Úcodebook_sizeÚregister_bufferr,   Ústackr8   r9   r:   r   Ú
isinstanceÚlist)Úselfr>   rJ   r6   r7   r8   r9   r:   r;   r<   ÚkwargsÚcodebook_dimÚrequires_projectionÚlevels_tensorr@   ÚindÚfsqÚ	__class__s                    €r   rC   ÚResidualFSQ.__init__4   s  ø€ ô 	‰ÑÔÜ˜6“{ˆÜ�cÓ(ˆà*Ñ1ÐÞ:Mœ"Ÿ)š) CÔ6ÔSU×S^ÒS^ÓS`ˆŒÞ;Nœ2Ÿ9š9 \Ô7ÔTV×T_ÒT_ÓTaˆÔØ2Ôà 0ÔØ,Ôð ŒÜ—m’m BÓ'ˆŒä˜v›ˆØ Ñ!×&Ñ&×(Ñ(Ð(Ð(àˆä˜Ö(ˆCØ�M‰M˜-×-Ñ-Ó/°C°4Ñ7Ô8äð ØØ"Ø$(Ø#3ñ	ð
 ñˆCð �K‰K×Ñ˜sÖ#ñ )ô °t·{²{ÓC²{°˜×+Ñ+×+±{ÑC×DÑDÐDÐDà!Ÿ[™[¨™^×9Ñ9ˆÔà×Ñ˜X¤u§{¢{°6Ó':ÈÐÑOà 0× G°^ÀaÑ5GˆÔà,°Ó1Ð1Ð1à-JÔ*Ø,HÔ)ö ÜÐ4×5Ñ5Ð5Ð5Ø%&¨!¨}¸qÑ/@Ñ*AÑ%BÐ"äÐ,¬t´U¨m×<Ñ<Ü%+Ð,BÓ%CÐ"à×ÑÐ5Ð7MÐ\aÐÒbùò- Ds   Å%Ic                ó„   • U R                    Vs/ s H  oR                  PM     nn[        R                  " USS9nU$ s  snf )Nr   ©r6   )rK   Úimplicit_codebookr,   rR   )rU   ÚlayerÚ	codebookss      r   rb   ÚResidualFSQ.codebooks}   s:   € à:>¿+º+ÓFº+°×,Ô,¹+ˆ	ÐFÜ—K’K 	°Ñ3ˆ	ØÐùò Gs   �=c                óØ  • UR                   S   UR                   S   p2[        U/S5      u  pX0R                  :  a<  U R                  S:”  d   S5       e[        R
                  " USU R                  U-
  4SS9nUS:H  nUR                  US5      n[        SU R                  U5      nUR                  [        US5      S5      n[        U R                  S	5      nXg-  n[        XdS
5      u  nU$ )Nr   éÿÿÿÿzb * qç        zmquantize dropout must be greater than 0 if you wish to reconstruct from a signal with less fine quantizations)Úvaluezq [c] d, b n q -> q b n dzb n q -> q b n 1zq d -> q 1 1 dzq b * d)Úshaper   rJ   r8   ÚFÚpadÚmasked_fillr   rb   r   r@   r   )rU   ÚindicesÚbatchÚquantize_dimÚpsÚmaskÚ	all_codesr@   s           r   Úget_codes_from_indicesÚ"ResidualFSQ.get_codes_from_indicesƒ   sþ   € à%Ÿm™m¨AÑ.°·±¸bÑ0Aˆ|ô ˜G˜9 gÓ.‰ˆð
 ×-Ñ-Ó-Ø×(Ñ(¨2Ó-ð  _ð  0_ó  _Ð-Ü—e’e˜G a¨×)<Ñ)<¸|Ñ)KÐ%LÐVXÑYˆGð ˜"‰}ˆØ×%Ñ% d¨AÓ.ˆäÐ6¸¿¹ÈÓPˆ	ð ×)Ñ)¬)°DÐ:LÓ*MÈrÓRˆ	ô ˜4Ÿ;™;Ð(8Ó9ˆØÑ&ˆ	ô ˜I¨9Ó5‰
ˆ	àÐr   c                ó`   • U R                  U5      n[        USS5      nU R                  U5      $ )Nzq ... -> ...Úsum)rr   r   rH   )rU   rl   ÚcodesÚcodes_summeds       r   Úget_output_from_indicesÚ#ResidualFSQ.get_output_from_indices¨   s1   € Ø×+Ñ+¨GÓ4ˆÜ˜e ^°UÓ;ˆØ×Ñ Ó-Ð-r   c                ó‚  • U R                   U R                  UR                  penU R                  (       a  [	        US5      n[        U/S5      u  pU R                  U5      n[        U R                  5      (       a!  U R                  nX-  R                  5       U-  nSn	Un
/ nU R                  =(       a(    U R                  =(       a    [        R                  " 5       nU(       a—  [        U5      (       d  [        U5      n[        R                   " U5      nUR#                  U R$                  U5      nUS:w  a  ['        US-   U5      S-
  n[        R(                  " UR*                  S S SU[        R,                  S9n[/        SS	S
9   [1        [3        U R4                  U R6                  5      5       He  u  nu  nnU(       a  UW:”  a  UR9                  W5        M)  U" U
U-  5      u  nnUU-  nU
UR;                  5       -
  n
U	U-   n	UR9                  U5        Mg     S S S 5        U R=                  U	5      n	[        R>                  " USS9nU R                  (       a5  [A        U	WS5      u  n	[A        X·S5      u  n[	        U	S5      n	[	        US5      nX›4nU(       d  U$ U RC                  U5      n/ UQUP7$ ! , (       d  f       Nž= f)Nzb d ... -> b ... dzb * drf   r%   é   g      ð¿)r+   ÚdtypeÚcudaF)Úenabledre   r_   zb ... d -> b d ...)"rJ   r:   r+   r7   r   r   rG   r   r;   ÚtanhÚtrainingr8   r,   Úis_grad_enabledr2   ÚrandomÚRandomÚ	randranger9   r#   Úfullrh   Úlongr   Ú	enumerateÚziprK   r@   rN   ÚdetachrH   rR   r   rr   )rU   ÚxÚreturn_all_codesÚ rand_quantize_dropout_fixed_seedÚ	num_quantÚquant_dropout_multiple_ofr+   ro   Úclamp_valueÚquantized_outÚresidualÚall_indicesÚshould_quantize_dropoutÚrandÚrand_quantize_dropout_indexÚnull_indicesÚquantizer_indexra   ÚscaleÚ	quantizedrl   Úretrq   s                          r   ÚforwardÚResidualFSQ.forward­   s“  € ð 8<×7JÑ7JÈD×LmÑLmÐop×owÑow¨fˆ	ð × × Ü˜!Ð1Ó2ˆAÜ˜!˜˜gÓ&‰EˆAð �O‰O˜AÓˆô �$×-Ñ-×.Ñ.Ø×5Ñ5ˆKØ‘×&Ñ&Ó(¨;Ñ6ˆAð ˆØˆàˆà"&§-¡-×"e°D×4IÑ4I×"eÌe×NcÒNcÓNeÐö
 #ô Ð:×;Ñ;Ü3FÀvÓ3NÐ0ä—=’=Ð!AÓBˆDà*.¯.©.¸×9[Ñ9[Ð]fÓ*gÐ'à(¨AÓ-Ü.?Ð@[Ð^_Ñ@_ÐazÓ.{Ð~Ñ.Ð+ä Ÿ:š: a§g¡g¨b¨q k°3ÀÔQV×Q[ÑQ[Ñ\ˆLô �f¨Ó.Ü3<¼SÀÇÁÈdÏkÉkÓ=ZÖ3[Ñ/�¡ %¨æ*¨ÐA\Ó/\Ø×&Ñ& |Ô4Ùá%*¨8°eÑ+;Ó%<Ñ"�	˜7à%¨Ñ-�	à# i×&6Ñ&6Ó&8Ñ8�Ø -°	Ñ 9�à×"Ñ" 7Ö+ñ 4\÷ /ð$ ×(Ñ(¨Ó7ˆô —k’k +°RÑ8ˆð × × Ü# M°2°wÓ?‰NˆMÜ! +°7Ó;‰LˆKä% mÐ5IÓJˆMÜ# KÐ1EÓFˆKð Ð*ˆæØˆJð ×/Ñ/°Ó<ˆ	ð !�Ð �iÑ Ð ÷] /Õ.ús   ÆBJ0Ê0
J>)rP   rI   r7   rK   r>   rJ   rG   rH   r8   r9   r:   )r>   z	list[int]r;   z#float | list[float] | Tensor | None)FN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rC   Úpropertyrb   rr   rx   r›   Ú__static_attributes__Ú__classcell__©r\   s   @r   r4   r4   1   sx   ø† ÙHð Ø Ø Ø()Ø'(ØFJØñGcð ðGcð !D÷Gcð GcðR ñó ðò
#òJ.ð !Ø+/÷	d!ò d!r   r4   c                  ój   ^ • \ rS rSrSSS.U 4S jjr\S 5       r\S 5       rS rS	 r	 SS
 jr
SrU =r$ )ÚGroupedResidualFSQi  r%   F)ÚgroupsÚaccept_image_fmapc               óD  >• [         TU ]  5         Xl        X l        X-  S:X  d   eX-  nX0l        [
        R                  " / 5      U l        [        U5       H)  nU R                  R                  [        SSU0UD65        M+     U R                  S   R                  U l        g )Nr   r6   r   )rB   rC   r6   r¨   r©   r   r
   ÚrvqsrM   rN   r4   rP   )rU   r6   r¨   r©   rV   Údim_per_groupÚ_r\   s          €r   rC   ÚGroupedResidualFSQ.__init__  s–   ø€ ô 	‰ÑÔØŒØŒØ‘ Ó"Ð"Ð"Ø™ˆà!2Ôä—M’M "Ó%ˆŒ	ä�v–ˆAØ�I‰I×Ñœ[ñ Ø#ðàñö ñ ð "ŸY™Y q™\×7Ñ7ˆÕr   c                ób   • [         R                  " [        S U R                   5       5      5      $ )Nc              3  ó8   #   • U  H  oR                   v •  M     g 7fr   )rb   )Ú.0Úrvqs     r   Ú	<genexpr>Ú/GroupedResidualFSQ.codebooks.<locals>.<genexpr>2  s   é € Ð Dº)°3§¦º)ùs   ‚)r,   rR   Útupler«   ©rU   s    r   rb   ÚGroupedResidualFSQ.codebooks0  s    € ä�{Š{œ5Ñ D¸$¿)º)Ó DÓDÓEÐEr   c                ó,   • U R                   (       a  S$ S$ )Nr%   re   )r©   r¶   s    r   Ú	split_dimÚGroupedResidualFSQ.split_dim4  s   € à×*×*ˆqÐ2°Ð2r   c                óz   • [        S [        U R                  U5       5       5      n[        R                  " U5      $ )Nc              3  óH   #   • U  H  u  pUR                  U5      v •  M     g 7fr   )rr   ©r±   r²   Úchunk_indicess      r   r³   Ú<GroupedResidualFSQ.get_codes_from_indices.<locals>.<genexpr>9  s#   é € ÐrÒZqÑDVÀC�c×0Ñ0°×?Ð?ÒZqùó   ‚ ")rµ   rˆ   r«   r,   rR   )rU   rl   rv   s      r   rr   Ú)GroupedResidualFSQ.get_codes_from_indices8  s1   € ÜÑrÔZ]Ð^b×^gÑ^gÐipÔZqÓrÓrˆÜ�{Š{˜5Ó!Ð!r   c                óŠ   • [        S [        U R                  U5       5       5      n[        R                  " X R
                  S9$ )Nc              3  óH   #   • U  H  u  pUR                  U5      v •  M     g 7fr   )rx   r½   s      r   r³   Ú=GroupedResidualFSQ.get_output_from_indices.<locals>.<genexpr>=  s#   é € ÐuÒ]tÑGYÀs˜×3Ñ3°M×BÐBÒ]tùrÀ   r_   )rµ   rˆ   r«   r,   Úcatr¹   )rU   rl   Úoutputss      r   rx   Ú*GroupedResidualFSQ.get_output_from_indices<  s5   € ÜÑuÔ]`Ðae×ajÑajÐlsÔ]tÓuÓuˆÜ�yŠy˜¯©Ñ7Ð7r   c                óÒ  ^• UR                   U R                  UR                  pTnX4   U R                  :X  d   eUR	                  U R
                  US9n[        UU R                  (       a  [        U5      OS S9m[        U4S j[        U R                  U5       5       5      n[        [        U6 5      nUtpxn	[        R                  " XtS9n[        R                  " U5      nXx/U	Q7n
U
$ )Nr_   )r‹   rŒ   c              3  ó:   >#   • U  H  u  pU" U40 TD6v •  M     g 7fr   r   )r±   r²   ÚchunkÚforward_kwargss      €r   r³   Ú-GroupedResidualFSQ.forward.<locals>.<genexpr>S  s   øé € ÐUÒCT±Z°S‘C˜Ñ0 Ö0ÒCTùs   ƒ)rh   r¹   r+   r6   rÊ   r¨   Údictr€   r2   rµ   rˆ   r«   r,   rÅ   rR   )rU   rŠ   r‹   rh   r¹   r+   Úoutr™   r’   Úmaybe_all_codesrš   rË   s              @r   r›   ÚGroupedResidualFSQ.forward@  sÎ   ø€ ð
 $%§7¡7¨D¯N©N¸A¿H¹H˜&ˆØÑ 4§8¡8Ó+Ð+Ð+ð �G‰G�D—K‘K yˆGÐ1ˆäØ/ØNRÏmÏmÔ/BÀ6Ô/JÐaeñ
ˆô ÔUÄ3ÀtÇyÁyÐRSÔCTÓUÓUˆÜ”C˜�IÓˆð 47Ð0ˆ	 ä—I’I˜iÑ9ˆ	Ü—k’k +Ó.ˆàÐ8¨Ñ8ˆØˆ
r   )r©   rP   r6   r¨   r«   )F)r�   rž   rŸ   r    rC   r¢   rb   r¹   rr   rx   r›   r£   r¤   r¥   s   @r   r§   r§     sX   ø† ð
 Ø!÷8ð 8ð4 ñFó ðFð ñ3ó ð3ò"ò8ð !÷ò r   r§   )i'  )'Ú
__future__r   r‚   Úmathr   Ú	functoolsr   r,   r   r   Útorch.nnr	   r
   Útorch.nn.functionalÚ
functionalri   Ú	torch.ampr   Útorch.distributedÚdistributedr&   Ú2vector_quantize_pytorch.finite_scalar_quantizationr   Úeinopsr   r   r   r   r   Úeinxr   r   r   r   r#   r)   r2   r4   r§   r   r   r   Ú<module>rÝ      sm   ðÝ "ã Ý Ý ã ß ß 'ß Ð Ý Ý  å Bç :Õ :å òòò%ò#ò
?ôô`!�&ô `!ôHI˜õ Ir   