ó
    oM‡já¢  ã                   ó¤  • S SK r S SKrS SKJr  S SKJs  Jr  SSKJrJ	r	  SSK
Jr  SSKJr  SSKJrJrJr  SSKJr  SS	KJr  SS
KJrJr  SSKJrJrJr  \R:                  " \5      r " S S\R@                  5      r! " S S\RD                  5      r# " S S\RH                  5      r% " S S\RH                  5      r& " S S\RH                  5      r' " S S\RH                  5      r( " S S\RH                  5      r) " S S5      r* " S S\RH                  \5      r+ " S S \RH                  5      r, " S! S"\RH                  5      r- " S# S$\\\\5      r.g)%é    Né   )ÚConfigMixinÚregister_to_config)Úlogging)Úapply_forward_hooké   )ÚAttentionMixinÚAttentionModuleMixinÚFeedForward)Údispatch_attention_fn)ÚAutoencoderKLOutput)Ú
ModelMixinÚget_parameter_dtypeé   )ÚAutoencoderMixinÚDecoderOutputÚDiagonalGaussianDistributionc                   óº   ^ • \ rS rSrSr    SS\S\S\\\\\4   -  S\\\\\4   -  S\S\S	\S
S4U 4S jjjrS\	R                  S
\	R                  4S jrSrU =r$ )ÚMiniMaxH3VideoCausalConv3dé"   a  
3D convolution used throughout the MiniMax-H3 video encoder.

Spatial padding is symmetric and uses `spatial_padding_mode` (`"reflect"` in the released checkpoint); temporal
padding is causal, i.e. `kernel_size_t - 1` zero frames are prepended and nothing is appended.
Úin_channelsÚout_channelsÚkernel_sizeÚstrideÚspatial_paddingÚtemporal_paddingÚspatial_padding_modeÚreturnNc                 óH   >• [         TU ]  XX4SS9  XPl        X`l        Xpl        g )Nr   )r   r   Úpadding)ÚsuperÚ__init__r   r   r   )	Úselfr   r   r   r   r   r   r   Ú	__class__s	           €ÚÅC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\diffusers/models/autoencoders/autoencoder_kl_minimax_h3.pyr"   Ú#MiniMaxH3VideoCausalConv3d.__init__*   s,   ø€ ô 	‰Ñ˜ÀÐdeÐÑfØ.ÔØ 0ÔØ$8Õ!ó    Úhidden_statesc           	      ón  • U R                   S:”  a0  U R                   n[        R                  " XX"USS4U R                  S9nU R                  S:”  a&  [        R                  " USSSSU R                  S4SS9n[        R
                  " XR                  U R                  U R                  SU R                  S9$ )Nr   ©ÚmodeÚconstant)r   r    Údilation)
r   ÚFÚpadr   r   Úconv3dÚweightÚbiasr   r-   )r#   r(   r    s      r%   ÚforwardÚ"MiniMaxH3VideoCausalConv3d.forward9   s¢   € Ø×Ñ !Ó#Ø×*Ñ*ˆGÜŸEšEØ¨¸7ÀAÀqÐIÐPT×PiÑPiñˆMð × Ñ  1Ó$ÜŸEšE -°!°Q¸¸1¸d×>SÑ>SÐUVÐ1WÐ^hÑiˆMÜ�xŠx˜§{¡{°D·I±IÀdÇkÁkÐ[\Ðgk×gtÑgtÑuÐur'   )r   r   r   )r   r   r   Úreflect)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚintÚtupleÚstrr"   ÚtorchÚTensorr3   Ú__static_attributes__Ú__classcell__©r$   s   @r%   r   r   "   s²   ø† ñð ./Ø Ø !Ø$-ñ9àð9ð ð9ð ˜5  c¨3 Ñ/Ñ/ð	9ð
 �e˜C  c˜MÑ*Ñ*ð9ð ð9ð ð9ð "ð9ð 
÷9ð 9ðv U§\¡\ð v°e·l±l÷ vò vr'   r   c                   ó`   ^ • \ rS rSrSrS\R                  S\R                  4U 4S jjrSrU =r	$ )ÚMiniMaxH3VideoGroupNorméD   zÄ
Group normalization applied to each latent frame in isolation (`use_t_isolated_gn` in the original config): the
temporal axis is folded into the batch axis so statistics never mix across frames.
r(   r   c                 ó   >• UR                   u  p#pEnUR                  SSSSS5      R                  5       nUR                  X$-  USXV5      n[        TU ]  U5      nUR                  X$X5U5      nUR                  SSSSS5      R                  5       $ )Nr   r   r   r   é   )ÚshapeÚpermuteÚ
contiguousÚviewr!   r3   )r#   r(   Ú
batch_sizeÚnum_channelsÚ
num_framesÚheightÚwidthr$   s          €r%   r3   ÚMiniMaxH3VideoGroupNorm.forwardJ   s–   ø€ Ø>K×>QÑ>QÑ;ˆ
 *°eØ%×-Ñ-¨a°°A°q¸!Ó<×GÑGÓIˆØ%×*Ñ*¨:Ñ+BÀLÐRSÐU[ÓcˆÜ™™¨Ó6ˆØ%×*Ñ*¨:À<ÐY^Ó_ˆØ×$Ñ$ Q¨¨1¨a°Ó3×>Ñ>Ó@Ð@r'   © )
r6   r7   r8   r9   r:   r>   r?   r3   r@   rA   rB   s   @r%   rD   rD   D   s,   ø† ñð
A U§\¡\ð A°e·l±l÷ Aõ Ar'   rD   c                   óˆ   ^ • \ rS rSr   SS\S\S\S\S\SS4U 4S	 jjjrS
\R                  S\R                  4S jr
SrU =r$ )ÚMiniMaxH3VideoResnetBlock3déS   r   r   Únorm_num_groupsÚnorm_epsr   r   Nc           	      óþ   >• [         TU ]  5         Xl        X l        [	        X1USS9U l        [        UUSSSUS9U l        [	        X2USS9U l        [        UUSSSUS9U l	        S U l
        X:w  a  [        XSS9U l
        g g )NT©ÚepsÚaffiner   r   r   ©r   r   r   r   ©r   )r!   r"   r   r   rD   Únorm1r   Úconv1Únorm2Úconv2Úconv_shortcut)r#   r   r   rV   rW   r   r$   s         €r%   r"   Ú$MiniMaxH3VideoResnetBlock3d.__init__T   s¢   ø€ ô 	‰ÑÔØ&ÔØ(Ôä,¨_ÈxÐ`dÑeˆŒ
Ü/ØØØØØØ!5ñ
ˆŒ
ô -¨_ÐPXÐaeÑfˆŒ
Ü/ØØØØØØ!5ñ
ˆŒ
ð "ˆÔØÓ&Ü!;¸KÐcdÑ!eˆDÕð 'r'   r(   c                 ó"  • Un[         R                  " U R                  U5      5      nU R                  U5      n[         R                  " U R	                  U5      5      nU R                  U5      nU R                  b  U R                  U5      nX!-   $ ©N)r.   Úsilur^   r_   r`   ra   rb   )r#   r(   Úresiduals      r%   r3   Ú#MiniMaxH3VideoResnetBlock3d.forwardv   sv   € Ø ˆÜŸš˜tŸz™z¨-Ó8Ó9ˆØŸ
™
 =Ó1ˆÜŸš˜tŸz™z¨-Ó8Ó9ˆØŸ
™
 =Ó1ˆØ×ÑÑ)Ø×)Ñ)¨(Ó3ˆHØÑ'Ð'r'   )r_   ra   rb   r   r^   r`   r   ©é    ç�íµ ÷Æ°>r5   ©r6   r7   r8   r9   r;   Úfloatr=   r"   r>   r?   r3   r@   rA   rB   s   @r%   rT   rT   S   s{   ø† ð
  "ØØ$-ñ fàð fð ð fð ð	 fð
 ð fð "ð fð 
÷ fð  fðD( U§\¡\ð (°e·l±l÷ (ò (r'   rT   c                   óŒ   ^ • \ rS rSrSr   SS\S\S\S\S\SS	4U 4S
 jjjrS\R                  S\R                  4S jr
SrU =r$ )ÚMiniMaxH3VideoDownsample3dé�   zÒ
Strided 3x3x3 downsampling convolution. A spatial stride of 2 is preceded by an asymmetric bottom/right pad of 1
(the convolution itself carries no spatial padding), so the output is exactly `ceil(size / 2)`.
r   r   Útemporal_strideÚspatial_strider   r   Nc           
      óf   >• [         TU ]  5         X@l        XPl        [	        UUSX4U4SSUS9U l        g )Nr   r   r   )r   r   r   r   r   )r!   r"   rr   r   r   Úconv)r#   r   r   rq   rr   r   r$   s         €r%   r"   Ú#MiniMaxH3VideoDownsample3d.__init__‡   sB   ø€ ô 	‰ÑÔØ,ÔØ$8Ô!Ü.ØØØØ#°^ÐDØØØ!5ñ
ˆ�	r'   r(   c                 ó„   • U R                   S:X  a   [        R                  " USU R                  S9nU R	                  U5      $ )Nr   )r   r   r   r   r   r   r*   )rr   r.   r/   r   rt   )r#   r(   s     r%   r3   Ú"MiniMaxH3VideoDownsample3d.forwardœ   s8   € Ø×Ñ !Ó#ÜŸEšE -Ð1CÈ$×JcÑJcÑdˆMØ�y‰y˜Ó'Ð'r'   )rt   r   rr   )r   r   r5   )r6   r7   r8   r9   r:   r;   r=   r"   r>   r?   r3   r@   rA   rB   s   @r%   ro   ro   �   sw   ø† ñð  !ØØ$-ñ
àð
ð ð
ð ð	
ð
 ð
ð "ð
ð 
÷
ð 
ð*( U§\¡\ð (°e·l±l÷ (ò (r'   ro   c                   ó”   ^ • \ rS rSr   SS\S\S\S\S\S\S\S	\S
S4U 4S jjjrS\R                  S
\R                  4S jr
SrU =r$ )ÚMiniMaxH3VideoDownBlock3dé¢   r   r   Ú
num_layersÚtemporal_downsample_factorÚspatial_downsample_factorrV   rW   r   r   Nc	                 ó6  >• [         T
U ]  5         [        R                  " [	        U5       V	s/ s H  n	[        U	S:X  a  UOUUUUUS9PM     sn	5      U l        S U l        XE-  S:”  a'  [        R                  " [        UUUUUS9/5      U l        SU l	        g s  sn	f )Nr   )r   r   rV   rW   r   r   )rq   rr   r   F)
r!   r"   ÚnnÚ
ModuleListÚrangerT   ÚresnetsÚdownsamplersro   Úgradient_checkpointing)r#   r   r   r{   r|   r}   rV   rW   r   Úir$   s             €r%   r"   Ú"MiniMaxH3VideoDownBlock3d.__init__£   s³   ø€ ô 	‰ÑÔÜ—}’}ô ˜zÔ*ó	ò +�Aô ,Ø/0°A«v¡¸<Ø!-Ø$3Ø%Ø)=ôñ +ñ	ó
ˆŒð !ˆÔØ%ÑAÀAÓEÜ "§¢ä.Ø$Ø$Ø(BØ'@Ø-Añðó
!ˆDÔð ',ˆÕ#ùò3	s   ­Br(   c                 ó  • U R                    HI  n[        R                  " 5       (       a$  U R                  (       a  U R	                  X!5      nMA  U" U5      nMK     U R
                  b  U R
                   H  nU" U5      nM     U$ re   )r‚   r>   Úis_grad_enabledr„   Ú_gradient_checkpointing_funcrƒ   )r#   r(   ÚresnetÚdownsamplers       r%   r3   Ú!MiniMaxH3VideoDownBlock3d.forwardË   so   € Ø—l”lˆFÜ×$Ò$×&Ñ&¨4×+F×+FØ $× AÑ AÀ&Ó X’á & }Ó 5’ñ	 #ð
 ×ÑÑ(Ø#×0Ô0�Ù +¨MÓ :’ñ  1àÐr'   )rƒ   r„   r‚   ri   rl   rB   s   @r%   ry   ry   ¢   s‘   ø† ð  "ØØ$-ñ&,àð&,ð ð&,ð ð	&,ð
 %(ð&,ð $'ð&,ð ð&,ð ð&,ð "ð&,ð 
÷&,ð &,ðP	 U§\¡\ð 	°e·l±l÷ 	ò 	r'   ry   c                   óÆ   ^ • \ rS rSrSr         SS\S\S\\S4   S\S\\S4   S	\\S4   S
\S\S\SS4U 4S jjjr	S\
R                  S\
R                  4S jrSrU =r$ )ÚMiniMaxH3VideoEncoder3dé×   zÎ
Causal 3D CNN encoder. `block_out_channels` gives the channel count of every level; the per-level
`spatial_downsample_factors` / `temporal_downsample_factors` multiply out to the total compression ratios.
r   r   Úblock_out_channels.Úlayers_per_blockÚspatial_downsample_factorsÚtemporal_downsample_factorsrV   rW   r   r   Nc
                 ó|  >• [         TU ]  5         [        UUS   SSSU	S9U l        US   4[	        US S 5      -   n
[
        R                  " [        [        U5      5       Vs/ s H  n[        X«   X;   UXk   X[   UUU	S9PM     sn5      U l
        [        XsS   USS	9U l        [        US   USSSU	S9U l        g s  snf )
Nr   r   r   r   r\   éÿÿÿÿ)r   r   r{   r|   r}   rV   rW   r   TrY   )r!   r"   r   Úconv_inr<   r   r€   r�   Úlenry   Údown_blocksrD   Únorm_outÚconv_out)r#   r   r   r�   r‘   r’   r“   rV   rW   r   Úblock_in_channelsr…   r$   s               €r%   r"   Ú MiniMaxH3VideoEncoder3d.__init__Ý   sÿ   ø€ ô 	‰ÑÔä1ØØ˜qÑ!ØØØØ!5ñ
ˆŒð 0°Ñ2Ð4´uÐ=OÐPSÐQSÐ=TÓ7UÑUÐÜŸ=š=ô œsÐ#5Ó6Ô7óò 8�Aô *Ø 1Ñ 4Ø!3Ñ!6Ø/Ø/JÑ/MØ.HÑ.KØ$3Ø%Ø)=ô	ñ 8ñó
ˆÔô  0°ÐTVÑAWÐ]eÐnrÑsˆŒÜ2Ø˜rÑ"ØØØØØ!5ñ
ˆ�ùò!s   Á!"B9r(   c                 óÆ   • U R                  U5      nU R                   H  nU" U5      nM     [        R                  " U R	                  U5      5      nU R                  U5      $ re   )r–   r˜   r.   rf   r™   rš   )r#   r(   Ú
down_blocks      r%   r3   ÚMiniMaxH3VideoEncoder3d.forward  sP   € ØŸ™ ]Ó3ˆØ×*Ô*ˆJÙ& }Ó5ŠMñ +äŸš˜tŸ}™}¨]Ó;Ó<ˆØ�}‰}˜]Ó+Ð+r'   )r–   rš   r˜   r™   )	r   é0   ©é€   é   r£   é   r¤   i   r   ©r   r   r   r   r   r   ©r   r   r   r   r   r   rj   rk   r5   )r6   r7   r8   r9   r:   r;   r<   rm   r=   r"   r>   r?   r3   r@   rA   rB   s   @r%   rŽ   rŽ   ×   sÊ   ø† ñð ØØ.MØ !Ø6HØ7IØ!ØØ$-ñ0
àð0
ð ð0
ð " # s (™Oð	0
ð
 ð0
ð %*¨#¨s¨(¡Oð0
ð &+¨3°¨8¡_ð0
ð ð0
ð ð0
ð "ð0
ð 
÷0
ð 0
ðd, U§\¡\ð ,°e·l±l÷ ,ò ,r'   rŽ   c            	       óœ   ^ • \ rS rSrSrSS\S\S\SS4U 4S jjjrS	\R                  S\
\R                  \R                  4   4S
 jrSrU =r$ )ÚMiniMaxH3VideoRotaryPosEmbedi  a   
3-axis rotary embedding for the ViT decoder. Coordinates are length-normalized to `[-1, 1)` per axis and scaled by
`2 * pi`, and the resulting `(t, h, w)` angles are concatenated and then duplicated, so the first `rope_dim_ratio *
attention_head_dim` channels of every head are rotated.
ÚdimÚthetaÚnum_axesr   Nc           	      óè   >• [         TU ]  5         USU-  -  S:w  a  [        SU SSU-   S35      eSU[        R                  " SSSU-  U-  [        R
                  S9-  -  nU R                  S	US
S9  g )Nr   r   z`dim` z% must be divisible by `2 * num_axes` Ú.ç      ð?r   )ÚdtypeÚinv_freqF)Ú
persistent)r!   r"   Ú
ValueErrorr>   ÚarangeÚfloat32Úregister_buffer)r#   r©   rª   r«   r°   r$   s        €r%   r"   Ú%MiniMaxH3VideoRotaryPosEmbed.__init__  s‚   ø€ Ü‰ÑÔØ�!�h‘,Ñ 1Ó$Ü˜v c UÐ*OÐPQÐT\ÑP\È~Ð]^Ð_Ó`Ð`Ø˜¤%§,¢,¨q°!°Q¸±\ÀCÑ5GÌuÏ}É}Ñ"]Ñ]Ñ]ˆØ×Ñ˜Z¨¸eÐÒDr'   Úposition_idsc                 ó  • S[         R                  -  US S 2S S 2S S 2S 4   -  U R                  S S S S S 24   -  nUR                  SS5      R	                  S5      R                  S5      nUR                  5       UR                  5       4$ )Nç       @r   r   )ÚmathÚpir°   ÚflattenÚtileÚ	unsqueezeÚcosÚsin)r#   r·   Úangless      r%   r3   Ú$MiniMaxH3VideoRotaryPosEmbed.forward%  sx   € Ø”t—w‘w‘ ªa²²A°t¨mÑ!<Ñ<¸t¿}¹}ÈTÐSWÐY]Ò_`ÐM`Ñ?aÑaˆØ—‘  1Ó%×*Ñ*¨1Ó-×7Ñ7¸Ó:ˆØ�z‰z‹|˜VŸZ™Z›\Ð)Ð)r'   rR   )ç      Y@r   )r6   r7   r8   r9   r:   r;   rm   r"   r>   r?   r<   r3   r@   rA   rB   s   @r%   r¨   r¨     sb   ø† ññE˜Cð E¨ð EÀð EÈT÷ Eð Eð* E§L¡Lð *°U¸5¿<¹<ÈÏÉÐ;UÑ5V÷ *ò *r'   r¨   c            	       óœ   • \ rS rSrSrSr S
SSS\R                  S\\R                  \R                  4   S-  S\R                  4S jjr	S	r
g)ÚMiniMaxH3VideoAttnProcessori+  NÚattnÚMiniMaxH3VideoAttentionr(   Ú
rotary_embr   c           	      ó„  • UR                  U5      R                  SUR                  S45      nUR                  U5      R                  SUR                  S45      nUR	                  U5      R                  SUR                  S45      nUR                  UR                  5       5      R                  UR                  5      nUR                  UR                  5       5      R                  UR                  5      nUbþ  Uu  pxUR                  UR                  5      nUR                  UR                  5      nUR                  S   n	USS U	24   USU	S 24   pºUSS U	24   USU	S 24   pÜU
R                  SSS9u  pïUR                  SSS9u  nn[        R                  " U* U/SS9n[        R                  " U* U/SS9n[        R                  " X§-  UU-  -   U/SS9n[        R                  " XÇ-  UU-  -   U/SS9n[        UUUS U R                  U R                   S9nUR#                  SS5      nUR$                  S   " U5      $ )Nr   r•   .©r©   )Ú	attn_maskÚbackendÚparallel_configr   r   )Úto_qÚ	unflattenÚheadsÚto_kÚto_vÚnorm_qrm   Útor¯   Únorm_krH   Úchunkr>   Úcatr   Ú_attention_backendÚ_parallel_configr¼   Úto_out)r#   rÆ   r(   rÈ   ÚqueryÚkeyÚvaluer¿   rÀ   Ú
rotary_dimÚquery_rotaryÚ
query_passÚ
key_rotaryÚkey_passÚquery_firstÚquery_secondÚ	key_firstÚ
key_secondÚquery_rotatedÚkey_rotateds                       r%   Ú__call__Ú$MiniMaxH3VideoAttnProcessor.__call__/  s-  € ð —	‘	˜-Ó(×2Ñ2°1°t·z±zÀ2Ð6FÓGˆØ�i‰i˜Ó&×0Ñ0°°T·Z±ZÀÐ4DÓEˆØ—	‘	˜-Ó(×2Ñ2°1°t·z±zÀ2Ð6FÓGˆð —‘˜EŸK™K›MÓ*×-Ñ-¨e¯k©kÓ:ˆØ�k‰k˜#Ÿ)™)›+Ó&×)Ñ)¨#¯)©)Ó4ˆàÑ!Ø!‰HˆCØ—&‘&˜Ÿ™Ó%ˆCØ—&‘&˜Ÿ™Ó%ˆCØŸ™ 2™ˆJØ',¨S°+°:°+Ð-=Ñ'>ÀÀcÈ:É;ÐFVÑ@W˜*Ø#& s¨K¨Z¨KÐ'7Ñ#8¸#¸cÀ:Á;Ð>NÑ:O˜Ø(4×(:Ñ(:¸1À"Ð(:Ð(EÑ%ˆKØ$.×$4Ñ$4°Q¸BÐ$4Ð$?Ñ!ˆI�zÜ!ŸIšI¨ }°kÐ&BÈÑKˆMÜŸ)š) j [°)Ð$<À"ÑEˆKÜ—I’I˜|Ñ1°MÀCÑ4GÑGÈÐTÐZ\Ñ]ˆEÜ—)’)˜ZÑ-°¸cÑ0AÑAÀ8ÐLÐRTÑUˆCä-ØØØØØ×+Ñ+Ø ×1Ñ1ñ
ˆð &×-Ñ-¨a°Ó3ˆØ�{‰{˜1Š~˜mÓ,Ð,r'   rR   re   )r6   r7   r8   r9   rØ   rÙ   r>   r?   r<   ré   r@   rR   r'   r%   rÅ   rÅ   +  sd   † ØÐØÐð @Dñ	%-à'ð%-ð —|‘|ð%-ð ˜%Ÿ,™,¨¯©Ð4Ñ5¸Ñ<ð	%-ð
 
�‰÷%-ð %-r'   rÅ   c                   óÎ   ^ • \ rS rSr\r\/rSS\S\S\S\S\	SS4U 4S	 jjjr
 SS
\R                  S\\R                  \R                  4   S-  S\R                  4S jjrSrU =r$ )rÇ   iW  r©   rÐ   Údim_headrZ   r2   r   Nc                 ó  >• [         TU ]  5         X l        X0l        XPl        X#-  n[
        R                  " X4SS9U l        [
        R                  " X4SS9U l        [
        R                  " XUS9U l
        [
        R                  " XUS9U l        [
        R                  " XUS9U l        [
        R                  " [
        R                  " XaUS9[
        R                  " S5      /5      U l        U R!                  [#        5       5        g )NF©rZ   Úelementwise_affine)r2   ç        )r!   r"   rÐ   rì   Úuse_biasr   ÚRMSNormrÓ   rÕ   ÚLinearrÎ   rÑ   rÒ   r€   ÚDropoutrÚ   Úset_processorrÅ   )r#   r©   rÐ   rì   rZ   r2   Ú	inner_dimr$   s          €r%   r"   Ú MiniMaxH3VideoAttention.__init__[  sº   ø€ Ü‰ÑÔØŒ
Ø ŒØŒØÑ$ˆ	ä—j’j ÀuÑMˆŒÜ—j’j ÀuÑMˆŒÜ—I’I˜c°4Ñ8ˆŒ	Ü—I’I˜c°4Ñ8ˆŒ	Ü—I’I˜c°4Ñ8ˆŒ	Ü—m’m¤R§Y¢Y¨yÀDÑ%IÌ2Ï:Ê:ÐVYË?Ð$[Ó\ˆŒà×ÑÔ6Ó8Õ9r'   r(   rÈ   c                 ó&   • U R                  XU5      $ re   )Ú	processor)r#   r(   rÈ   s      r%   r3   ÚMiniMaxH3VideoAttention.forwardk  s   € ð �~‰~˜d°:Ó>Ð>r'   )	rì   rÐ   rÕ   rÓ   rÑ   rÚ   rÎ   rÒ   rñ   )çñhãˆµøä>Tre   )r6   r7   r8   r9   rÅ   Ú_default_processor_clsÚ_available_processorsr;   rm   Úboolr"   r>   r?   r<   r3   r@   rA   rB   s   @r%   rÇ   rÇ   W  s‘   ø† Ø8ÐØ8Ð9Ðñ:˜Cð :¨ð :°sð :Àð :ÐUYð :Ðei÷ :ð :ð" cgñ?Ø"Ÿ\™\ð?Ø7<¸U¿\¹\È5Ï<É<Ð=WÑ7XÐ[_Ñ7_ð?à	�‰÷?ó ?r'   rÇ   c                   óÎ   ^ • \ rS rSr   SS\S\S\S\S\S\SS	4U 4S
 jjjr SS\R                  S\
\R                  \R                  4   S	-  S\R                  4S jjrSrU =r$ )ÚMiniMaxH3VideoTransformerBlockiq  r©   rÐ   rì   Úffn_multrZ   r2   r   Nc                 ó†  >• [         TU ]  5         [        R                  " XSS9U l        [        XX5US9U l        [        R                  " [        R                  " U5      5      U l
        [        R                  " XSS9U l        [        XSUS9U l        [        R                  " [        R                  " U5      5      U l        g )NTrî   )r©   rÐ   rì   rZ   r2   Úswiglu)ÚmultÚactivation_fnr2   )r!   r"   r   rò   r^   rÇ   rÆ   Ú	Parameterr>   ÚzerosÚscale1r`   r   ÚffÚscale2)r#   r©   rÐ   rì   r  rZ   r2   r$   s          €r%   r"   Ú'MiniMaxH3VideoTransformerBlock.__init__r  s‡   ø€ ô 	‰ÑÔÜ—Z’Z ÀÑFˆŒ
Ü+°È8ÐcgÑhˆŒ	Ü—l’l¤5§;¢;¨sÓ#3Ó4ˆŒÜ—Z’Z ÀÑFˆŒ
Ü˜cÀÈtÑTˆŒÜ—l’l¤5§;¢;¨sÓ#3Ó4ˆ�r'   r(   rÈ   c                 óf  • U R                  UR                  5       5      R                  UR                  5      nXR	                  X25      U R
                  -  -   nU R                  UR                  5       5      R                  UR                  5      nXR                  U5      U R                  -  -   nU$ re   )	r^   rm   rÔ   r¯   rÆ   r  r`   r	  r
  )r#   r(   rÈ   Únorm_hidden_statess       r%   r3   Ú&MiniMaxH3VideoTransformerBlock.forwardƒ  s•   € ð "ŸZ™Z¨×(;Ñ(;Ó(=Ó>×AÑAÀ-×BUÑBUÓVÐØ%¯	©	Ð2DÓ(QÐTX×T_ÑT_Ñ(_Ñ_ˆØ!ŸZ™Z¨×(;Ñ(;Ó(=Ó>×AÑAÀ-×BUÑBUÓVÐØ%¯©Ð0BÓ(CÀdÇkÁkÑ(QÑQˆØÐr'   )rÆ   r	  r^   r`   r  r
  )rG   rû   Tre   )r6   r7   r8   r9   r;   rm   rþ   r"   r>   r?   r<   r3   r@   rA   rB   s   @r%   r   r   q  s¥   ø† ð ØØñ5àð5ð ð5ð ð	5ð
 ð5ð ð5ð ð5ð 
÷5ð 5ð$ cgñØ"Ÿ\™\ðØ7<¸U¿\¹\È5Ï<É<Ð=WÑ7XÐ[_Ñ7_ðà	�‰÷ó r'   r   c                   óº   ^ • \ rS rSrSr            SS\S\S\S\S\S\S	\S
\S\S\S\S\SS4U 4S jjjrS\R                  S\R                  4S jr
SrU =r$ )ÚMiniMaxH3VideoViTDecoder3diŽ  aT  
Non-causal ViT decoder. Every latent voxel becomes one token; `num_register_tokens` learned register tokens plus a
single all-zero token are appended (all at position `0`), attended over with full self-attention, and dropped again
before the patch projection expands each token into a `patch_size_t x patch_size x patch_size` pixel block.
r   r   Ú
patch_sizeÚpatch_size_tr{   Únum_attention_headsÚattention_head_dimÚnum_register_tokensr  Ú
rope_thetaÚrope_dim_ratiorW   r   Nc                 ó:  >• [         TU ]  5         Xg-  nX0l        X@l        X l        X€l        [        [        X{-  5      U
S9U l        [        R                  " X5      U l        [        R                  " [        R                  " SX�5      5      U l        [        R                   " [#        U5       Vs/ s H  n[%        UUUU	US9PM     sn5      U l        [        R(                  " USUS9U l        [        R                  " XÒU-  U-  U-  5      U l        SU l        g s  snf )N)rª   r   )r©   rÐ   rì   r  rZ   T)rï   rZ   F)r!   r"   r  r  r   r  r¨   r;   Úroper   ró   Úproj_inr  r>   r  Úregister_tokensr€   r�   r   Útransformer_blocksÚ	LayerNormr™   Úproj_outr„   )r#   r   r   r  r  r{   r  r  r  r  r  r  rW   r©   Ú_r$   s                  €r%   r"   Ú#MiniMaxH3VideoViTDecoder3d.__init__•  s  ø€ ô 	‰ÑÔØ!Ñ6ˆØ$ŒØ(ÔØ(ÔØ#6Ô ä0´Ð5GÑ5XÓ1YÐakÑlˆŒ	Ü—y’y Ó2ˆŒÜ!Ÿ|š|¬E¯KªK¸Ð;NÓ,TÓUˆÔÜ"$§-¢-ô ˜zÔ*ó	ò +�Aô /ØØ-Ø/Ø%Ø ôñ +ñ	ó#
ˆÔô Ÿš S¸TÀxÑPˆŒÜŸ	š	 #°lÑ'BÀZÑ'OÐR\Ñ'\Ó]ˆŒà&+ˆÕ#ùò	s   Â.Dr(   c                 ój  • UR                   u  p#pEnUR                  SSSSS5      R                  X$U-  U-  U5      nU R                  U5      nUR                   S   nU R                  R                  USS5      n[        R                  " US S 2S S2S S 24   5      n	[        R                  " XU	/SS9nXEU4 V
s/ s H;  n
S[        R                  " S	U
[        R                  UR                  S
9U
-  -  S-
  PM=     nn
[        R                  " [        R                  " USS06SS9R                  SS5      nUR                  S5      R                  USS5      nUR!                  X R"                  S-   S45      n[        R                  " XÍ/SS9nU R%                  U5      nU R&                   HJ  n[        R(                  " 5       (       a%  U R*                  (       a  U R-                  XñU5      nMB  U" X5      nML     U R/                  U5      nU R1                  U5      nUS S 2S U2S S 24   nU R2                  U R4                  nnUR7                  UUUUU R8                  UUU5      nUR                  SSSSSSSS5      R;                  5       nUR                  UU R8                  UU-  UU-  UU-  5      $ s  sn
f )Nr   r   r   rG   r   r•   rÊ   r¹   g      à?)r¯   Údevicer®   ÚindexingÚijé   é   é   )rH   rI   Úreshaper  r  Úexpandr>   Ú
zeros_liker×   r³   r´   r"  ÚstackÚmeshgridr¼   r¾   Ú	new_zerosr  r  r  rˆ   r„   r‰   r™   r  r  r  rK   r   rJ   )r#   r(   rL   rM   rN   rO   rP   Únum_patchesr  Ú	cls_tokenÚsizeÚgridsr·   Ú
suffix_idsrÈ   Úblockr  r  s                     r%   r3   Ú"MiniMaxH3VideoViTDecoder3d.forward¿  sµ  € Ø>K×>QÑ>QÑ;ˆ
 *°eà%×-Ñ-¨a°°A°q¸!Ó<×DÑDØ VÑ+¨eÑ3°\ó
ˆð Ÿ™ ]Ó3ˆØ#×)Ñ)¨!Ñ,ˆà×.Ñ.×5Ñ5°jÀ"ÀbÓIˆÜ×$Ò$ ]²1°b°q°bº!°8Ñ%<Ó=ˆ	ÜŸ	š	 =À9Ð"MÐSTÑUˆð $¨UÑ3ó
â3�ð ”5—<’<  T´·±À}×G[ÑG[Ñ\Ð_cÑcÑdÐgjÔjÙ3ð 	ð 
ô —{’{¤5§>¢>°5Ð#HÀ4Ñ#HÈbÑQ×YÑYÐZ[Ð]^Ó_ˆØ#×-Ñ-¨aÓ0×7Ñ7¸
ÀBÈÓKˆØ!×+Ñ+¨Z×9QÑ9QÐTUÑ9UÐWXÐ,YÓZˆ
Ü—y’y ,Ð!;ÀÑCˆØ—Y‘Y˜|Ó,ˆ
à×,Ô,ˆEÜ×$Ò$×&Ñ&¨4×+F×+FØ $× AÑ AÀ%ÐXbÓ c’á % mÓ @’ñ	 -ð Ÿ™ mÓ4ˆØŸ™ mÓ4ˆØ%¢a¨¨+¨²qÐ&8Ñ9ˆà#'§?¡?°D×4EÑ4E�Lˆ
Ø%×*Ñ*ØØØØØ×ÑØØØó	
ˆð &×-Ñ-¨a°°A°q¸!¸QÀÀ1ÓE×PÑPÓRˆØ×$Ñ$ØØ×ÑØ˜Ñ%Ø�ZÑØ�JÑó
ð 	
ùòA
s   Â8AJ0)r„   r™   r  r   r  r  r  r  r  r  r  )é   r   é   rG   é$   rj   é@   rG   rG   rÃ   ç      è?rû   )r6   r7   r8   r9   r:   r;   rm   r"   r>   r?   r3   r@   rA   rB   s   @r%   r  r  Ž  sÙ   ø† ñð ØØØØØ#%Ø"$Ø#$ØØ!Ø $Øñ(,àð(,ð ð(,ð ð	(,ð
 ð(,ð ð(,ð !ð(,ð  ð(,ð !ð(,ð ð(,ð ð(,ð ð(,ð ð(,ð 
÷(,ð (,ðT3
 U§\¡\ð 3
°e·l±l÷ 3
ò 3
r'   r  c            0       óT  ^ • \ rS rSrSrSrSS/rS/rS/r/ SQr	\
                      SBS\S	\S
\S\\S4   S\S\\S4   S\\S4   S\S\S\S\S\S\S\S\S\S\S\S\S\S\\S4   S\\S4   SS 4.U 4S! jjj5       r    SCS"\S -  S#\S -  S$\S -  S%\S -  SS 4
S& jjrS'\S(\S)\S\\\   \\   \\   4   4S* jrS+\R(                  S,\R(                  S-\S.\S\R(                  4
S/ jrS0\\\R(                        S1\\   S2\\   S\R(                  4S3 jrS4\R(                  S\R(                  4S5 jrS6\R(                  S\R(                  4S7 jrS4\R(                  S\R(                  4S8 jrS6\R(                  S\R(                  4S9 jr\SDS4\R(                  S:\S\\\R(                     -  4S; jj5       r\SDS6\R(                  S:\S\\\R(                     -  4S< jj5       r    SES=\R(                  S>\S?\RB                  S -  S:\S\\\R(                     -  4
S@ jjr"SAr#U =r$$ )FÚAutoencoderKLMiniMaxH3iõ  a—  
A VAE model with a causal 3D CNN encoder and a non-causal ViT decoder, used in
[MiniMax-H3](https://huggingface.co/MiniMaxAI).

This model inherits from [`ModelMixin`]. Check the superclass documentation for it's generic methods implemented
for all models (such as downloading or saving).

Latents are normalized with per-channel `latents_mean` / `latents_std` rather than a `scaling_factor`; a pipeline
encodes with `(latent - latents_mean) / latents_std` and decodes with `latent * latents_std + latents_mean`.

The pixel convention is ImageNet-normalized RGB over a `[0, 1]` base range, not the usual `[-1, 1]`: `encode`
expects `(pixel - imagenet_mean) / imagenet_std` and `decode` returns values in that same space, so a pipeline has
to apply `sample * imagenet_std + imagenet_mean` (mean `(0.485, 0.456, 0.406)`, std `(0.229, 0.224, 0.225)`) and
clamp to `[0, 1]` before postprocessing.

The temporal geometry is fixed by `clip_length` (17 pixel frames per encoder chunk) and `token_drop` (3 trailing
latent frames dropped per encode): `17 * n + 5` pixel frames map to `5 * n + 2` latent frames.

Unlike most autoencoders in the library, spatial tiling is **on by default**: MiniMax-H3 was released with tiling
enabled for both encoding and decoding, and the released frames are the blended-tile ones, so disabling tiling
changes the output. Use `enable_tiling` to change the tile geometry, `disable_tiling` to turn it off.
TrT   r   Únorm)ÚencoderÚdecoderÚ
quant_convÚpost_quant_convr   r   Úlatent_channelsr�   .r‘   r’   r“   rV   rW   r   Údecoder_num_layersÚdecoder_num_attention_headsÚdecoder_attention_head_dimÚdecoder_num_register_tokensÚdecoder_ffn_multÚdecoder_rope_thetaÚdecoder_rope_dim_ratioÚdecoder_norm_epsÚclip_lengthÚ
token_dropÚlatents_meanÚlatents_stdr   Nc                 óò  >• [         TU ]  5         [        R                  " U5      U l        [        R                  " U5      U l        [        USU-  UUUUUU	U
S9	U l        [        R                  " SU-  SU-  SS9U l
        [        R                  " X3SS9U l        [        UUU R                  U R
                  UUUUUUUUS9U l        U* U R
                  -  U l        [        R                  " UU R
                  -  5      U l        U* U R                   -  U l        [%        U R"                  U R
                  -  U R                  -
  S5      U l        SU l        SU l        S	U l        S	U l        S
U l        S
U l        g )Nr   )	r   r   r�   r‘   r’   r“   rV   rW   r   r   r]   )r   r   r  r  r{   r  r  r  r  r  r  rW   r   FTr£   r8  )r!   r"   rº   ÚprodÚspatial_compression_ratioÚtemporal_compression_ratiorŽ   r=  r   ÚConv3dr?  r@  r  r>  Úframe_pre_paddingÚceilÚtokens_chunk_sizeÚtoken_overlapÚmaxÚframe_overlapÚuse_slicingÚ
use_tilingÚtile_sample_min_heightÚtile_sample_min_widthÚtile_sample_min_overlap_heightÚtile_sample_min_overlap_width)r#   r   r   rA  r�   r‘   r’   r“   rV   rW   r   rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  r$   s                          €r%   r"   ÚAutoencoderKLMiniMaxH3.__init__  s{  ø€ ô4 	‰ÑÔä)-¯ªÐ3MÓ)NˆÔ&Ü*.¯)ª)Ð4OÓ*PˆÔ'ä.Ø#Ø˜_Ñ,Ø1Ø-Ø'AØ(CØ+ØØ!5ñ

ˆŒô Ÿ)š) A¨Ñ$7¸¸_Ñ9LÐZ[Ñ\ˆŒÜ!Ÿyšy¨ÐWXÑYˆÔÜ1Ø'Ø%Ø×5Ñ5Ø×8Ñ8Ø)Ø ;Ø9Ø ;Ø%Ø)Ø1Ø%ñ
ˆŒð$ $/ ,°$×2QÑ2QÑ!QˆÔÜ!%§¢¨;¸×9XÑ9XÑ+XÓ!YˆÔØ)˜k¨T×-CÑ-CÑCˆÔÜ  ×!3Ñ!3°d×6UÑ6UÑ!UÐX\×XnÑXnÑ!nÐpqÓrˆÔð !ˆÔð
 ˆŒð '*ˆÔ#Ø%(ˆÔ"Ø.0ˆÔ+Ø-/ˆÕ*r'   r[  r\  r]  r^  c                 óâ   • SU l         U=(       d    U R                  U l        U=(       d    U R                  U l        U=(       d    U R                  U l        U=(       d    U R                  U l        g)aH  
Enable tiled VAE encoding/decoding. When this option is enabled, the VAE splits the frames into tiles, encodes
or decodes each tile separately and linearly blends the overlaps back together. This lowers the memory
requirement and allows processing larger frames.

Args:
    tile_sample_min_height (`int`, *optional*):
        The tile height in pixel space. Frames taller than this are split along the height dimension.
    tile_sample_min_width (`int`, *optional*):
        The tile width in pixel space. Frames wider than this are split along the width dimension.
    tile_sample_min_overlap_height (`int`, *optional*):
        The minimum overlap, in pixels, between two consecutive vertical tiles.
    tile_sample_min_overlap_width (`int`, *optional*):
        The minimum overlap, in pixels, between two consecutive horizontal tiles.
TN)rZ  r[  r\  r]  r^  )r#   r[  r\  r]  r^  s        r%   Úenable_tilingÚ$AutoencoderKLMiniMaxH3.enable_tilingi  sX   € ð, ˆŒØ&<×&[À×@[Ñ@[ˆÔ#Ø%:×%X¸d×>XÑ>XˆÔ"Ø.L×.sÐPT×PsÑPsˆÔ+Ø-J×-pÈd×NpÑNpˆÕ*r'   ÚlengthÚ	tile_sizeÚmin_overlapc                 óÈ  • X!:¼  a  S/U// 4$ [         R                  " X-  5      nX$-  X4S-
  -  -
  U-
  S:  a  US-  nX$-  X4S-
  -  -
  U-
  S:  a  M  U/US-
  -  nX$-  [        U5      -
  U-
  n[        X`R                  -  5       H  nXWUS-
  -  ==   U R                  -  ss'   M!     S/n[        US-
  5       H  nUR                  US   U-   XW   -
  5        M!     X‚/U-  U4$ )aF  
Lay `tile_size`-wide tiles over `length` pixels. The number of tiles is the smallest one whose union can cover
`length` while keeping every overlap at least `min_overlap`; the slack is then distributed round-robin over the
overlaps in whole `spatial_compression_ratio` steps so that every tile boundary stays latent-aligned.
r   r   r•   )rº   rT  Úsumr�   rP  Úappend)	r#   rc  rd  re  Ú	num_tilesÚoverlapsÚ	remainingr…   Útile_start_indicess	            r%   Ú_split_tilesÚ#AutoencoderKLMiniMaxH3._split_tiles…  s  € ð ÓØ�3˜˜ "Ð$Ð$ä—I’I˜fÑ0Ó1ˆ	ØÑ# kÀ±]Ñ&CÑCÀfÑLÈqÓPØ˜‰NˆIð Ñ# kÀ±]Ñ&CÑCÀfÑLÈqÕPð  �= I°¡MÑ2ˆØÑ)¬C°«MÑ9¸FÑBˆ	Ü�y×$BÑ$BÑBÖCˆAØ˜) a™-Ñ(Ó)¨T×-KÑ-KÑKÕ)ñ Dð  ˜SÐÜ�y 1‘}Ö%ˆAØ×%Ñ%Ð&8¸Ñ&<¸yÑ&HÈ8É;Ñ&VÖWñ &à! ;°Ñ#:¸HÐDÐDr'   ÚaÚbÚblend_extentr©   c                 óº  • [        UR                  U   UR                  U   U5      n[        R                  " X2R                  UR
                  S9nS/UR                  -  nX6U'   SXS-  -
  R                  U5      nXS-  R                  U5      n[        S 5      /UR                  -  n	[        U* S 5      X”'   [        S 5      /UR                  -  n
[        SU5      X¤'   U[        U	5         U-  U[        U
5         U-  -   nX2R                  U   :X  a  U$ [        S 5      /UR                  -  n[        US 5      XÄ'   [        R                  " X²[        U5         /US9$ )N)r"  r¯   r   r   rÊ   )ÚminrH   r>   r³   r"  r¯   ÚndimrK   Úslicer<   r×   )r#   ro  rp  rq  r©   Ú	positionsrH   Úweight_aÚweight_bÚslice_aÚslice_bÚblendedÚ
slice_rests                r%   Ú_blendÚAutoencoderKLMiniMaxH3._blendœ  s8  € Ü˜1Ÿ7™7 3™<¨¯©°©°|ÓDˆÜ—L’L ·h±hÀaÇgÁgÑNˆ	Ø��a—f‘f‘ˆØ!ˆc‰
Ø˜	Ñ0Ñ0×6Ñ6°uÓ=ˆØÑ,×2Ñ2°5Ó9ˆä˜“;�- !§&¡&Ñ(ˆÜ˜l˜]¨DÓ1ˆ‰Ü˜“;�- !§&¡&Ñ(ˆÜ˜Q Ó-ˆ‰Ø”E˜'“NÑ# hÑ.°´5¸³>Ñ1BÀXÑ1MÑMˆàŸ7™7 3™<Ó'ØˆNÜ˜D“k�] Q§V¡VÑ+ˆ
Ü ¨dÓ3ˆ
‰Ü�yŠy˜'¤U¨:Ó%6Ñ#7Ð8¸cÑBÐBr'   ÚtilesÚheight_overlapsÚwidth_overlapsc           	      ó   • / n[        U5       HÙ  u  pV/ n[        U5       HŸ  u  p‰US:”  a  U R                  XS-
     U   X’US-
     SS9n	US:”  a  U R                  XhS-
     X“US-
     SS9n	U[        U5      S-
  :  a  U	SS X%   * 2S S 24   n	U[        U5      S-
  :  a  U	SS S 2S X8   * 24   n	UR                  U	5        M¡     UR                  [        R
                  " USS95        MÛ     [        R
                  " USS9$ )Nr   r   éþÿÿÿrÊ   r•   .)Ú	enumerater}  r—   rh  r>   r×   )
r#   r  r€  r�  Úresult_rowsr…   ÚrowÚ
result_rowÚjr½   s
             r%   Ú_stitch_tilesÚ$AutoencoderKLMiniMaxH3._stitch_tiles°  s   € ð ˆÜ Ö&‰FˆAØˆJÜ$ Sž>‘�Ø�q“5ØŸ;™; u°©U¡|°A¡¸ÈaÐRSÉeÑ>TÐZ\˜;Ð]�DØ�q“5ØŸ;™; s¨q©5¡z°4ÈÈAÉÑ9NÐTV˜;ÐW�DØ”s˜5“z A‘~Ó%Ø Ð%:¨Ñ(:Ð':Ð%:ºAÐ =Ñ>�DØ”s˜3“x !‘|Ó#Ø ¢QÐ(<¨>Ñ+<Ð*<Ð(<Ð <Ñ=�DØ×!Ñ! $Ö'ñ *ð ×ÑœuŸyšy¨¸Ñ<Ö=ñ 'ô �yŠy˜¨"Ñ-Ð-r'   Úxc           	      óð  • U R                   (       d   U R                  U R                  U5      5      $ UR                  S   UR                  S   p2U R	                  X R
                  U R                  5      u  pEnU R	                  X0R                  U R                  5      u  pxn	/ n
[        XE5       Hk  u  p¼/ n[        Xx5       HD  u  pïUSX»U-   2XîU-   24   nUR                  U R                  U R                  U5      5      5        MF     U
R                  U5        Mm     U Vs/ s H  nUU R                  -  PM     nnU	 Vs/ s H  nUU R                  -  PM     nnU R                  U
UU5      $ s  snf s  snf )zAEncode one temporal clip, spatially tiled when tiling is enabled.rƒ  r•   .)rZ  r?  r=  rH   rm  r[  r]  r\  r^  Úziprh  rP  r‰  )r#   r‹  rO   rP   Ú	y_indicesÚ	y_lengthsÚ
y_overlapsÚ	x_indicesÚ	x_lengthsÚ
x_overlapsÚrowsÚi_posÚi_lenr†  Új_posÚj_lenr½   ÚoverlapÚlatent_y_overlapsÚlatent_x_overlapss                       r%   Ú_encode_clipÚ#AutoencoderKLMiniMaxH3._encode_clipÆ  sf  € à��Ø—?‘? 4§<¡<°£?Ó3Ð3àŸ™ ™ Q§W¡W¨R¡[�Ø+/×+<Ñ+<Ø×/Ñ/°×1TÑ1Tó,
Ñ(ˆ	˜jð ,0×+<Ñ+<Ø×-Ñ-¨t×/QÑ/Qó,
Ñ(ˆ	˜jð ˆÜ 	Ö5‰LˆEØˆCÜ # IÖ 9‘�Ø˜˜e¨e¡mÐ3°UÀU¹]Ð5JÐJÑK�Ø—
‘
˜4Ÿ?™?¨4¯<©<¸Ó+=Ó>Ö?ñ !:ð �K‰K˜Öñ 6ñ WaÓaÒV`È7˜W¨×(FÑ(FÔFÑV`ÐÐaÙV`ÓaÒV`È7˜W¨×(FÑ(FÔFÑV`ÐÐaØ×!Ñ! $Ð(9Ð;LÓMÐMùò bùÚas   Ä!E.Å E3Úzc           	      óÌ  • U R                   (       d   U R                  U R                  U5      5      $ UR                  S   U R                  -  nUR                  S   U R                  -  nU R                  X R                  U R                  5      u  pEnU R                  X0R                  U R                  5      u  pxn	U R                  n
/ n[        XE5       H{  u  pÍ/ n[        Xx5       HT  u  nnUSXÊ-  XÊ-  XÚ-  -   2Xú-  Xú-  UU
-  -   24   nUR                  U R                  U R                  U5      5      5        MV     UR                  U5        M}     U R                  X¶U	5      $ )zADecode one temporal clip, spatially tiled when tiling is enabled.rƒ  r•   .)rZ  r>  r@  rH   rP  rm  r[  r]  r\  r^  r�  rh  r‰  )r#   rž  rO   rP   rŽ  r�  r�  r‘  r’  r“  Úratior”  r•  r–  r†  r—  r˜  r½   s                     r%   Ú_decode_clipÚ#AutoencoderKLMiniMaxH3._decode_clipß  s^  € à��Ø—<‘< × 4Ñ 4°QÓ 7Ó8Ð8ð —‘˜‘˜t×=Ñ=Ñ=ˆØ—‘˜‘˜d×<Ñ<Ñ<ˆØ+/×+<Ñ+<Ø×/Ñ/°×1TÑ1Tó,
Ñ(ˆ	˜jð ,0×+<Ñ+<Ø×-Ñ-¨t×/QÑ/Qó,
Ñ(ˆ	˜jð ×.Ñ.ˆØˆÜ 	Ö5‰LˆEØˆCÜ # IÖ 9‘��uØØØ‘N U¡^°e±nÑ%DÐDØ‘N U¡^°e¸u±nÑ%DÐDðFñ�ð
 —
‘
˜4Ÿ<™<¨×(<Ñ(<¸TÓ(BÓCÖDñ !:ð �K‰K˜Öñ 6ð ×!Ñ! $°JÓ?Ð?r'   c                 óL  • U R                   R                  nUR                  S   nUS:X  a  U R                  U5      $ X2-  S:w  a;  USS2SS2SS24   R	                  SSU* U-  SS5      n[
        R                  " X/SS9n[
        R                  " [        UR                  S   U-  5       Vs/ s H(  nU R                  USS2SS2XR-  US-   U-  24   5      PM*     snSS9nU R                   R                  S:”  a#  USS2SS2SU R                   R                  * 24   nU$ s  snf )uÝ  
Encode a video in `clip_length`-frame chunks and drop the `token_drop` trailing latent frames.

A single frame has no temporal extent to chunk, so it goes through the spatial encoder alone. Padding it up to
`clip_length` by repetition instead would run the temporal path over `clip_length` copies of the same image and
return `clip_length // temporal_compression_ratio - token_drop` latent frames rather than one â€” which is not
the conditioning MiniMax-H3 was trained with.
r   r   r   Nr•   rÊ   )	ÚconfigrJ  rH   rœ  Úrepeatr>   r×   r�   rK  )r#   r‹  rJ  rN   Ú
pad_framesr…   Úmomentss          r%   Ú_encodeÚAutoencoderKLMiniMaxH3._encodeý  s-  € ð —k‘k×-Ñ-ˆØ—W‘W˜Q‘Zˆ
Ø˜‹?Ø×$Ñ$ QÓ'Ð'ØÑ# qÓ(Øš1ša ¡˜9™×,Ñ,¨Q°°Z°KÀ;Ñ3NÐPQÐSTÓUˆJÜ—	’	˜1˜/¨qÑ1ˆAä—)’)ô ˜qŸw™w q™z¨[Ñ8Ô9óâ9�Að ×!Ñ! !¢A¢q¨!©/¸QÀ¹UÀkÑ<QÐ*QÐ$QÑ"RÖSÙ9ñð ñ
ˆð �;‰;×!Ñ! AÓ%Øša¢Ð$= t§{¡{×'=Ñ'=Ð&=Ð$=Ð=Ñ>ˆGØˆùòs   Â-/D!c           
      óô  ^^^^• U R                   mU R                  R                  nU R                  mTT-  nUR                  S   U-   nU* T-  nXE-   T-  [        US:„  5      -
  nUS:”  a5  [        R                  " XSS2SS2SS24   R                  SSUSS5      /SS9n/ nSn[        U5       Hº  n	U	T-  n
U R                  USS2SS2XªT-   U R                  -   24   5      n[        [        US:„  5      S-   5       Hh  nXÃ-  nUSS2SS2XÝU-   24   nUSS2SS2U R                  S24   nUS:X  a1  Ub  U R                  XŽU R                  SS9nUR                  U5        Mf  UnMj     M¼     Ub  UR                  U5        [        R                  " USS9nUS:”  a[  U R                  R                   T-  mUR                  S   U-
  m[#        UUUU4S j[        U5       5       5      nUSS2SS2SU* 24   nU$ )	an  
Decode a latent video, mirroring the chunking that `_encode` applied.

`token_drop` removed the tail of every encoded chunk, so consecutive decoded chunks overlap by `frame_overlap`
pixel frames and are linearly cross-faded. Latent frames are repeated at the end when the length is not a whole
number of chunks; the extra pixel frames are cut off again at the end.
r   r   Nr•   r   rÊ   éýÿÿÿc              3   óR   >#   • U  H  nT(       a  TU-   T-  S :X  a  TOTv •  M     g7f)r   NrR   )Ú.0ÚkÚ
intra_tailÚnum_tokens_before_padÚtemporal_ratiorU  s     €€€€r%   Ú	<genexpr>Ú1AutoencoderKLMiniMaxH3._decode.<locals>.<genexpr>E  s4   øé € ð â*�Aö )Ð.CÀaÑ.GÐK\Ñ-\Ð`aÓ-a‘
ÐguÔuÚ*ùs   ƒ$')rU  r¤  rK  rQ  rH   r;   r>   r×   r¥  r�   r¡  rV  rS  r}  rX  rh  rJ  rg  )r#   rž  rK  Úchunk_num_framesÚ
num_tokensÚ
pad_tokensÚ
num_chunksÚdecoded_chunksr™  r…   ÚstartÚcliprˆ  Úframe_startrÖ   Údecr¦  r¯  r°  r±  rU  s                    @@@@r%   Ú_decodeÚAutoencoderKLMiniMaxH3._decode  s%  û€ ð !×2Ñ2ÐØ—[‘[×+Ñ+ˆ
Ø×8Ñ8ˆØ,¨~Ñ=Ðà—W‘W˜Q‘Z *Ñ,ˆ
Ø!�kÐ%6Ñ6ˆ
Ø Ñ-Ð2CÑCÄcÈ*ÐWXÉ.ÓFYÑYˆ
Ø˜‹>Ü—	’	˜1¢¢1 b¡c 	™l×1Ñ1°!°Q¸
ÀAÀqÓIÐJÐPQÑRˆAàˆØˆÜ�zÖ"ˆAØÐ)Ñ)ˆEØ×$Ñ$ Q¢qª!¨UÐ=NÑ5NÐQU×QcÑQcÑ5cÐ-cÐ'cÑ%dÓeˆDÜœ3˜z¨A™~Ó.°Ñ2Ö3�ØÑ2�ØšQ¢ ;Ð?OÑ1OÐ#OÐOÑP�Øša¢ D×$:Ñ$:Ñ$<Ð<Ñ=�Ø˜“6ØÑ*Ø $§¡¨G¸D×<NÑ<NÐTV Ð W˜Ø"×)Ñ)¨%Ö0à#’Gó 4ñ #ð ÑØ×!Ñ! 'Ô*ä�iŠi˜¨AÑ.ˆð ˜‹>ØŸ™×0Ñ0°>ÑAˆJØ$%§G¡G¨A¡J°Ñ$;Ð!Ü÷ ä˜zÔ*óó ˆJð ’aš˜L˜j˜[˜LÐ(Ñ)ˆCØˆ
r'   Úreturn_dictc                 ó„  • UR                  [        U R                  5      5      nU R                  (       aX  UR                  S   S:”  aE  [
        R                  " UR                  S5       Vs/ s H  o0R                  U5      PM     sn5      nOU R                  U5      n[        U5      nU(       d  U4$ [        US9$ s  snf )aý  
Encode a batch of videos into latents.

Args:
    x (`torch.Tensor`):
        Input batch of videos, shape `(batch_size, in_channels, num_frames, height, width)`.
    return_dict (`bool`, *optional*, defaults to `True`):
        Whether to return a [`~models.autoencoders.autoencoder_kl.AutoencoderKLOutput`] instead of a plain
        tuple.

Returns:
    The latent distribution of the encoded videos. Note that MiniMax-H3 normalizes the sampled latents with
    `latents_mean` / `latents_std` afterwards.
r   r   )Úlatent_dist)rÔ   r   r=  rY  rH   r>   r×   Úsplitr¨  r   r   )r#   r‹  r¿  Úx_slicer§  Ú	posteriors         r%   ÚencodeÚAutoencoderKLMiniMaxH3.encodeL  s’   € ð$ �D‰DÔ$ T§\¡\Ó2Ó3ˆØ×× §¡¨¡
¨Q£Ü—i’iÀaÇgÁgÈaÄjÓ QÂj¸7§¡¨gÖ!6ÁjÑ QÓR‰Gà—l‘l 1“oˆGÜ0°Ó9ˆ	ÞØ�<ÐÜ"¨yÑ9Ð9ùò !Rs   Á,B=c                 ón  • UR                  [        U R                  5      5      nU R                  (       aX  UR                  S   S:”  aE  [
        R                  " UR                  S5       Vs/ s H  o0R                  U5      PM     sn5      nOU R                  U5      nU(       d  U4$ [        US9$ s  snf )aë  
Decode a batch of latent videos.

Args:
    z (`torch.Tensor`):
        Input batch of latent videos, shape `(batch_size, latent_channels, num_latent_frames, height, width)`.
    return_dict (`bool`, *optional*, defaults to `True`):
        Whether to return a [`~models.autoencoders.vae.DecoderOutput`] instead of a plain tuple.

Returns:
    [`~models.autoencoders.vae.DecoderOutput`] or `tuple`:
        The decoded videos, shape `(batch_size, out_channels, num_frames, height, width)`.
r   r   )Úsample)
rÔ   r   r>  rY  rH   r>   r×   rÂ  r½  r   )r#   rž  r¿  Úz_sliceÚdecodeds        r%   ÚdecodeÚAutoencoderKLMiniMaxH3.decodeh  sˆ   € ð �D‰DÔ$ T§\¡\Ó2Ó3ˆØ×× §¡¨¡
¨Q£Ü—i’iÀaÇgÁgÈaÄjÓ QÂj¸7§¡¨gÖ!6ÁjÑ QÓR‰Gà—l‘l 1“oˆGÞØ�:ÐÜ GÑ,Ð,ùò !Rs   Á,B2rÈ  Úsample_posteriorÚ	generatorc                 ó¢   • U R                  U5      R                  nU(       a  UR                  US9OUR                  5       nU R	                  XdS9$ )aÑ  
Encode then decode a batch of videos.

Args:
    sample (`torch.Tensor`):
        Input batch of videos, shape `(batch_size, in_channels, num_frames, height, width)`.
    sample_posterior (`bool`, *optional*, defaults to `False`):
        Whether to sample the posterior instead of taking its mode.
    generator (`torch.Generator`, *optional*):
        Generator used when `sample_posterior=True`.
    return_dict (`bool`, *optional*, defaults to `True`):
        Whether to return a [`~models.autoencoders.vae.DecoderOutput`] instead of a plain tuple.

Returns:
    [`~models.autoencoders.vae.DecoderOutput`] or `tuple`:
        The round-tripped videos, shape `(batch_size, out_channels, num_frames, height, width)`.
)rÎ  )r¿  )rÅ  rÁ  rÈ  r+   rË  )r#   rÈ  rÍ  rÎ  r¿  rÄ  rž  s          r%   r3   ÚAutoencoderKLMiniMaxH3.forward€  sG   € ð0 —K‘K Ó'×3Ñ3ˆ	Þ5EˆI×Ñ yÐÑ1È9Ï>É>ÓK[ˆØ�{‰{˜1ˆ{Ð6Ð6r'   )r>  r=  rX  rS  r@  r?  rP  rQ  r[  r]  r^  r\  rV  rU  rY  rZ  )r   r   r5  r¡   r   r¥   r¦   rj   rk   r5   r7  rj   r8  rG   rG   rÃ   r9  rû   é   r   )rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   rð   )r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   r®   )NNNN)T)FNT)%r6   r7   r8   r9   r:   Ú _supports_gradient_checkpointingÚ_no_split_modulesÚ_repeated_blocksÚ _skip_layerwise_casting_patternsÚ_keep_in_fp32_modulesr   r;   r<   rm   r=   r"   ra  Úlistrm  r>   r?   r}  r‰  rœ  r¡  r¨  r½  r   rþ   r   rÅ  r   rË  Ú	Generatorr3   r@   rA   rB   s   @r%   r;  r;  õ  s(  ø† ñð. (,Ð$Ø6Ð8XÐYÐØ8Ð9ÐØ(. xÐ$ò TÐàð ØØ!Ø.MØ !Ø6HØ7IØ!ØØ$-Ø"$Ø+-Ø*,Ø+,Ø !Ø$)Ø(,Ø"&ØØØ*5Ø)4ñ/P0àðP0ð ðP0ð ð	P0ð
 " # s (™OðP0ð ðP0ð %*¨#¨s¨(¡OðP0ð &+¨3°¨8¡_ðP0ð ðP0ð ðP0ð "ðP0ð  ðP0ð &)ðP0ð %(ðP0ð &)ðP0ð  ð!P0ð" "ð#P0ð$ !&ð%P0ð&  ð'P0ð( ð)P0ð* ð+P0ð, ˜E 3˜JÑ'ð-P0ð. ˜5 #˜:Ñ&ð/P0ð0 
÷1P0ó ðP0ðh .2Ø,0Ø59Ø48ñqà # d¡
ðqð  # T™zðqð ),¨d©
ð	qð
 (+¨T¡zðqð 
õqð8E 3ð E°3ð EÀSð EÈUÐSWÐX[ÑS\Ð^bÐcfÑ^gÐimÐnqÑirÐSrÑMsô Eð.C˜Ÿ™ð C¨¯©ð CÀSð CÈsð CÐW\×WcÑWcô Cð(.à�D˜Ÿ™Ñ&Ñ'ð.ð ˜c™ð.ð ˜S™	ð	.ð
 
�‰ô.ð,N˜eŸl™lð N¨u¯|©|ô Nð2@˜eŸl™lð @¨u¯|©|ô @ð<˜Ÿ™ð ¨%¯,©,ô ð81˜Ÿ™ð 1¨%¯,©,ô 1ðf ñ:˜Ÿ™ð :°4ð :ÐCVÐY^Ð_d×_kÑ_kÑYlÑClô :ó ð:ð6 ñ-˜Ÿ™ð -°4ð -À=ÐSXÐY^×YeÑYeÑSfÑCfô -ó ð-ð4 "'Ø,0Ø ñ7à—‘ð7ð ð7ð —?‘? TÑ)ð	7ð
 ð7ð 
˜˜uŸ|™|Ñ,Ñ	,÷7ó 7r'   r;  )/rº   r>   Útorch.nnr   Útorch.nn.functionalÚ
functionalr.   Úconfiguration_utilsr   r   Úutilsr   Úutils.accelerate_utilsr   Ú	attentionr	   r
   r   Úattention_dispatchr   Úmodeling_outputsr   Úmodeling_utilsr   r   Úvaer   r   r   Ú
get_loggerr6   ÚloggerrR  r   Ú	GroupNormrD   ÚModulerT   ro   ry   rŽ   r¨   rÅ   rÇ   r   r  r;  rR   r'   r%   Ú<module>rè     s  ðó ã Ý ß Ð ç BÝ Ý 8ß IÑ IÝ 6Ý 2ß <ß NÑ Nð 
×	Ò	˜HÓ	%€ôv §¡ô vôDA˜bŸl™lô Aô+( "§)¡)ô +(ô\( §¡ô (ôB2 §	¡	ô 2ôj=,˜bŸi™iô =,ô@* 2§9¡9ô *÷()-ñ )-ôX?˜bŸi™iÐ)=ô ?ô4 R§Y¡Yô ô:d
 §¡ô d
ôNe7˜Z¨°nÐFVõ e7r'   