
    ;j1                         S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	r
\R                  " S\S9  Sr/ SQrS rS rS	 rSS
 jrSS jrS rS rS rS rS r\S:X  a  \" 5         gg)a	  GGML vs Python cosine similarity comparison for the MiniMax Music 3 DiT.

Run from tests/ directory. All paths relative to CWD.

The GGML side runs the full mm-synth pipeline with --dump. The Python side
reloads the dumped window-0 condition track and initial noise, then runs the
reference diffusers transformer and vocoder (../../diffusers, CUDA float32)
through the same Euler CFG schedule, with hooks mirroring the GGML probe
names. Sharing the condition and noise isolates the denoising stack from the
stochastic AR stage, whose logits are covered by parity.sh.

Usage:
    cd tests/
    ./debug-dit-cossim.py                   # DiT BF16
    ./debug-dit-cossim.py --quant Q6_K      # DiT Q6_K

Backend follows GGML_BACKEND; the archive loop lives in debug-dit-cossim.sh.
    Nignore)category*   )r            #   c                 d   SS K n[        XR                  5      (       a:  UR                  5       R	                  5       R                  5       R                  5       n[        R                  " UR                  [        R                  5      5      nUR                  n[        R                  " S[        U5      5      nU H  nU[        R                  " SU5      -  nM     [        U S5       nUR!                  U5        UR!                  UR#                  5       5        S S S 5        g ! , (       d  f       g = f)Nr   iwb)torch
isinstanceTensordetachfloatcpunumpynpascontiguousarrayastypefloat32shapestructpacklenopenwritetobytes)pathdatar   r   headersfs          debug-dit-cossim.py	save_dumpr%   %   s    $%%{{}""$((*002BJJ 78DJJE[[c%j)F&++c1%% 	dD	Q		 
		s   '1D!!
D/c                    [         R                  " U [         R                  S9n[        [        R
                  " S[        R                  " SUS   5      5      S   5      n[        U5       Vs/ s HA  n[        [        R
                  " S[        R                  " SUSU-      5      5      S   5      PMC     nnUSU-   S  nXT4$ s  snf )N)dtyper   r#   r      )r   fromfiler   intr   unpackr   range)r   rawndimr   r   r    s         r$   	load_dumpr/   4   s    
++d"**
-Cv}}S&++c3q6":;A>?DOTUY{[{!SsFKKSQZ$@A!DE{E[q4xy>D; \s   ,ACc                 0   [        [        U 5      [        U5      5      nUS:X  a  gU S U US U p[        R                  R	                  U 5      [        R                  R	                  U5      -  nUS:  a"  [        [        R                  " X5      U-  5      $ S$ )Nr   g        g|=)minr   r   linalgnormr   dot)abnds       r$   	_cos_flatr9   <   sz    CFCFAAvRa5!BQ%q
		qBIINN1--A&'%i5!"8S8    c                    U(       a  U(       a  [        U5      S:X  a  [        U5      S:X  a  US   US   :X  a  US   US   :X  a  U R                  U5      nUR                  U5      n[        UR                  5       UR                  5       5      n[        UR                  R                  5       UR                  5       5      nXv:  a  U$ U$ [        X5      $ )N   r   r(   )r   reshaper9   flattenT)r5   r6   shape_ashape_brarbc_normalc_transposeds           r$   cosrF   E   s    7s7|q0S\Q5F1:#
gaj(@7#B7#B rzz|<H$RTT\\^RZZ\BL&##OQ?r:   c           	      p   [        [        U 5      [        U5      5      nU S U US U p[        R                  " U5      nXB-
  U-  S-   n[        R                  " XbS-  S-   45      n[        R                  " XbS-  S-   45      n[        U5       H  n	X-  n
[        R                  " [        R                  R                  X
X-    U-  5      5      Xy'   [        R                  " [        R                  R                  XX-    U-  5      5      X'   M     [        UR                  5       UR                  5       5      $ )Nr(   r<   )r1   r   r   hanningzerosr,   absfftrfftr9   r>   )r5   r6   winhopr7   windowframessasbr   r"   s              r$   stft_cosrS   R   s    CFCFARa5!BQ%qZZ_Fg#!F	6!8a<(	)B	6!8a<(	)B6]Grvv{{1qw<&#89:rvv{{1qw<&#89:  RZZ\2::<00r:   c                    Sn[         R                  R                  U5      (       d  [        SU 35        g[         R                  " U SS9  [        U5      n[        US'   [        US'   SUS	'   S
U S3US'   SUS'   SUS'   SUS'   SUS'   [         R                  R                  U S5      n[        US5       n[        R                  " XFSS9  S S S 5        USSSUSU SS[         R                  R                  U S5      /
n[        S U S!35        [        R                  " U[        R                  S SS"9n[        [         R                  " U 5       Vs/ s H  ofR!                  S#5      (       d  M  UPM     sn5      n	UR"                  S$:w  a  [        S%UR"                   S&35        g[        S'U	 S(35        g! , (       d  f       N= fs  snf ))Nz../build/mm-synthz[GGML] binary not found: FTexist_okseedlm_seedwav16output_formatzMiniMax-Music3-transformer-.gguf	dit_modelz'MiniMax-Music3-language_model-BF16.gguflm_modelz*MiniMax-Music3-rvq_depth_decoder-BF16.ggufdepth_modelz)MiniMax-Music3-condition_encoder-F32.gguf
cond_modelzMiniMax-Music3-vocoder-F32.gguf	vae_modelrequest0.jsonw   )indentz--modelsz	../modelsz	--requestz--dumpz--no-faz--outz
output.wavz*[GGML] Running MiniMax-Music3-transformer-z.gguf...)stdoutstderrtext.binr   z[GGML] FAILED (exit )z[GGML] Done,  dump files)osr   isfileprintmakedirsdictSEEDjoinr   jsondump
subprocessrunPIPEr   listdirendswith
returncode)
dump_dirreqquantggml_binmergedrequest_jsonr#   cmdrr7   s
             r$   run_ggmlr   b   s   "H77>>(##)(45KK4(#YFF6NF9%F?7weDF;BF:HF=FF<;F;77<</:L	lC	 A		&A& 
! Zk<Xy'277<<,3WYC	6ugX
FGs:??4dKA

8,C,1

60BQ,CDA||q$Q\\N!45	M!K
() 
!	  Ds   6F3G,G3
Gc                 h  ^!^" [         R                  R                  SS5        SS KnSSKJn  SSKJn  SSKJ	n  UR                  5         [        R                  " U SS9  UR                  R                  5       (       a  SOS	n[        [        R                  R!                  US
5      5      u  p[        [        R                  R!                  US5      5      u  pU	S   nUR#                  UR%                  U	5      5      R'                  S5      R)                  U5      nUR#                  U
R%                  U5      5      R*                  R'                  S5      R-                  5       R)                  U5      nUR/                  U5      n[1        UR3                  SS5      5      n[5        UR3                  SS5      5      n[7        SU SU SU SU S3	5        UR9                  SUR:                  S9nUR=                  5       R)                  U5        0 m"S/m!/ nS2U!U"4S jjnUR?                  UR@                  RC                  U" S5      5      5        UR?                  URD                  RC                  U" SSSS95      5        UR?                  URF                  RC                  U" S5      5      5        UR?                  URH                  S   RJ                  RC                  U" S5      5      5        [L         H9  nUR?                  URH                  U   RC                  U" SU 35      5      5        M;     [O        S[P        RR                  " SSU-  U5      -
  5      S/-   n[7        S 5        URU                  5          [W        U5       H  nURY                  UU   /UR:                  US!9nU" UUUSS"9S   nT!S==   S#-  ss'   U" UUUSS"9S   nT!S==   S#-  ss'   UUU-
  U-  -   nUUUS#-      UU   -
  U-  -   nUS   R*                  T"S$U S%3'   US&:  a  US   R*                  T"S$U S'3'   US   R*                  T"S$U S(3'   US   R*                  T"S$U S)3'   M     S S S 5        US   R*                  T"S*'   UR#                  U
R%                  U5      5      T"S+'   U H  nUR[                  5         M     [7        S,5        UR9                  S-UR:                  S9nUR=                  5       R)                  U5        URU                  5          U" U5      nS S S 5        WR]                  S5      R*                  T"S.'   [_        T"Ra                  5       5       H3  u  nn [c        [        R                  R!                  U U S/35      U 5        M5     [7        S0[e        T"5       S135        g! , (       d  f       GNI= f! , (       d  f       N= f)3Nr   z../../diffusers/src)MiniMaxMusic3Vocoder)MiniMaxMusic3Transformer1DModel)loggingTrU   cudar   zwindow0_cond.binz	noise.binsteps   dit_cfg333333?z%[Python] Initializing transformer on z (T=, z steps, CFG=z)...z../checkpoints/transformer)torch_dtypeFc                 "   >^ ^^ UUUU U4S jnU$ )Nc                    > TS   S:w  a  g [        U[        5      (       a  US   OUnT(       a  X1S   -   nUS   R                  5       R                  5       nT	(       a  UR                  nUTT'   g )Nr   )r   tuplecloner   r?   )
moduleinputoutputoutt_call_dumps	add_inputnametranspose_cts
        r$   hook+run_python.<locals>.make_hook.<locals>.hook   sc    Qx1})&%88&)fC!HnA$$&ACCF4Lr:    )r   r   r   r   r   r   s   ``` r$   	make_hookrun_python.<locals>.make_hook   s    		 		 r:   temb_thidden_after_preprocess)r   r   hidden_after_proj_inlayer0_sa_outputhidden_after_layerg      ?z[Python] Denoising...)r'   device)return_dictr(   dit_step_vt_condr<   
_vt_uncond_vt_xtdit_x0noisez[Python] Decoding audio...z../checkpoints/vocoder	vae_audiorh   z[Python] Done, rj   )FF)3sysr   insertr   4diffusers.models.autoencoders.minimax_music3_vocoderr   8diffusers.models.transformers.transformer_minimax_music3r   diffusers.utilsr   disable_progress_barrk   rn   r   is_availabler/   rq   
from_numpyr=   	unsqueezetor?   
contiguous
zeros_liker*   getr   rm   from_pretrainedr   evalappend
time_embedregister_forward_hookpreprocess_convproj_intransformer_blocksattn
KEY_LAYERSlistr   linspaceno_gradr,   tensorremovesqueezesorteditemsr%   r   )#rz   ggml_dirr{   r   r   r   diffusers_loggingr   cond_raw
cond_shape	noise_rawnoise_shaper?   condxt
zeros_condr   cfgmodel_hooksr   lisigr   r   vt_cond	vt_uncondvthvocoderaudior   r   r   r   s#                                    @@r$   
run_pythonr      s   HHOOA,-Yh<**,KK4(zz..00VeF$RWW\\(<N%OPH&rww||Hk'JKI1AH,,Z89CCAFII&QD			)++K8	9	;	;	E	Ea	H	S	S	U	X	XY_	`B!!$'J$%E
	3'
(C	1&aS5'VYUZZ^
_`+;;<Xfkfsfs;tE	JJLOOFFCEF  MM%""8889LMN
MM%''==+$$OQ R
MM%--55i@V6WXY
MM%**1-22HHSeIfghe..r2HHUghjgkSlImno  sR[[cEk599
:cU
BC	
!"	uAc!fXU]]6JAB4U;A>G!HMHb!ZUCAFI!HMHg	1S88Bs1q5zCF*b00B-4QZ\\FXaS)*1u3<Q<>>!J/0(*1FXaS$%(*1FXaS$%  
 !uwwF8&&y'8'8'EFF7O	
  

&'"223KY^YfYf2gGLLNf	 
--*,,F;v||~.f"'',,xD67@ /	OCK=
45= 
. 
s   .C!V9	V#
V #
V1c                    / SQnU[          Vs/ s H  nSU 3PM
     sn-  nU S::  a  [        [        U 5      5      nO3[        [        SU S5      5      nU S-
  U;  a  UR                  U S-
  5        U Hg  nUR                  SU S35        US	:  a  UR                  SU S
35        UR                  SU S35        X@S-
  :  d  MR  UR                  SU S35        Mi     USS/-  nU$ s  snf )N)r   r   r   r   r   r      r      r(   r   r   r<   r   r   r   r   r   )r   r   r,   r   )r   stagesr   step_indicessis        r$   build_stagesr      s    gF
:>:R#B4(:>>FzE%L)E!UA./AIl*	*H-.6MMHRD
34C()	>MMHRD,-  x%%FM ?s   C&c                 >
   [        U R                  5       5      n[        [        U5      5       VVs/ s H+  n[        US-   [        U5      5        H  oSU   X5   4PM     M-     nnn[	        SU S35        U GH  n0 nU R                  5        HZ  u  p[        R                  R                  XS-   5      n[        R                  R                  U5      (       d  MM  [        U5      X'   M\     U(       d  M}  / nU H^  u  pX;   a=  X;   a8  X   u  nnX   u  nn[        UUUU5      nUR                  U SU SUS 35        MG  UR                  U SU S35        M`     [	        U S	3S
R                  U5      -   5        GM     0 nU R                  5        HY  u  p[        R                  R                  U
S5      n[        R                  R                  U5      (       d  MK  [        U5      UU	'   M[     [        U5      S:  a  / nU H  u  pUU;   al  UU;   af  UU   S   R                  SS5      S S 2S4   nUU   S   R                  SS5      S S 2S4   n[        UU5      nUR                  U SU SUS 35        Mw  UR                  U SU S35        M     [	        SS
R                  U5      -   5        [        U5      S:  GaS  US   u  nnU U   U U   nnU Vs/ s H  nSU;   d  M  UPM     nnU(       Ga  [	        SU S35        U GH  n[        R                  R                  UUS-   5      n[        R                  R                  UUS-   5      n[        R                  R                  U5      (       Ga  [        R                  R                  U5      (       a  [        U5      u  nn[        U5      u  nn[        [        U5      [        U5      5      nUS U US U nn[!        UU5      n["        R$                  " UU-
  5      n [	        U SUS SU R'                  5       S SU R)                  5       S SUR)                  5       S SUR+                  5       S SUR)                  5       S SUR+                  5       S 35        GM|  / n![        R                  R                  U5      (       d  U!R                  U5        [        R                  R                  U5      (       d  U!R                  U5        [	        U SS
R                  U!5       35        GM
     g g g s  snnf s  snf )Nr(   [z$] Cosine similarities GGML vs Pythonrh   z vs  z.6fz N/Az: r   zvae_audio.binr<   r   zvae_audio (STFT cosine): r   z] Error growth GGML vs Pythonz: cos z
, max_err z, mean_err z	, mean_A z, std_A z	, mean_B z, std_B z
: missing )r   keysr,   r   rm   r   rk   r   rq   rl   r/   rF   r   r=   rS   r1   r9   r   rJ   maxmeanstd)"dirsr   taglabelsr   jpairsstager    labelr8   r#   partsr5   r6   darQ   dbrR   cvae_dataleft_aleft_ba_labelb_labela_dirb_dirr"   	xt_stagesfafbr7   diffmissings"                                     r$   comparer
     s   DIIK F-23v;-?c-?qSTuVYZ`VaIbAQi#Ib#-?Ec	AcU6
78

HEQ/Aww~~a  'l % DAyQYBBBB's$qc1S'23s$qc./  	rlTYYu--.# & HJJLGGLLO,77>>!'lHUO ! 8}DAH}h!!Q//A6q!t<!!Q//A6q!t<VV,s$qc1S'23s$qc./  	)DIIe,<<=
5zA~ 8G}d7mu &51%1*Q	5AcU789"WW\\%8WW\\%877>>"%%"''..*<*<&r]FB&r]FBCGSW-AVRVB!"b)A66"r'?DUG6!C
488:c:J+VZV_V_VabeUf g%%'WWYsO8BFFHS> J%%'WWYsO8BFFHS>K L !G77>>"--w/77>>"--w/UG:dii.@-ABC' # 	 Q dV 6s   2T
T$Tc            	         [         R                  " 5       n U R                  SSSS9  U R                  5       n[        R
                  R                  S5      (       d!  [        S5        [        R                  " S5        [        S5       n[        R                  " U5      nS S S 5        [        S5        S	nS
n[        WR                  SS5      5      n[        SU SUR                  SS5       SUR                   S35        [        R
                  R!                  U5      (       a  ["        R$                  " U5        ['        XCUR                  5      (       d!  [        S5        [        R                  " S5        [        R
                  R!                  U5      (       a  ["        R$                  " U5        [)        XTU5      (       d!  [        S5        [        R                  " S5        [+        XES.[-        U5      S5        g ! , (       d  f       GNc= f)Nz--quantF32z7DiT GGUF quant suffix (F32, Q8_0, Q6_K, Q5_K_M, Q4_K_M))defaulthelpra   z&[Error] request0.json not found in CWDr(   z[Request] Loaded request0.jsonzggml-ditz
python-ditr   r   z[DiT] steps=z, CFG=r   r   z | mm3-dit-r[   z[DiT] GGML failedz[DiT] Python failed)ggmlpythonDiT)argparseArgumentParseradd_argument
parse_argsrk   r   rl   rm   r   exitr   rr   loadr*   r   r|   isdirshutilrmtreer   r   r
  r   )apargsr#   r{   	dump_ggmldump_pythonr   s          r$   mainr  :  sh   		 	 	"BOOIu3lOm==?D77>>/**67	o	!iil 
	
*+IK$%E	Lvcggi&=%>k$**UZ
[\	ww}}Yi IDJJ//!"	ww}}[!!k"kc22#$Y6U8KUS- 
	s   G::
H	__main__)NN)i   i   )__doc__r  rr   warningsrk   r  r   rt   r   r   r   filterwarningsFutureWarningrp   r   r%   r/   r9   rF   rS   r   r   r   r
  r  __name__r   r:   r$   <module>r&     s   $    	    
    = 9	
 9
1 FTr(CDPTB zF r:   