
    ieG              
       0   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r
SSSSSSS	.S
S
SSSSS	.SSSSSSS	.SSSSSSS	.S.rS rS rS rS rSS jrS S jrS rS!S jrS!S jrS rS rS!S jrS r\S:X  a  \R4                  " \" 5       5        gg)"a  GGML vs Python cosine similarity comparison for ACE-Step DiT.

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

Usage:
    cd tests/
    ./debug-dit-cossim.py                 # turbo BF16
    ./debug-dit-cossim.py --quant Q6_K    # turbo Q6_K
    ./debug-dit-cossim.py --mode sft      # SFT BF16
    ./debug-dit-cossim.py --mode xl-turbo # XL turbo BF16
    ./debug-dit-cossim.py --mode all      # all 4 models
    N*   zacestep-v15-turbo   g      @           )	gguf_baseconfig_pathstepsshiftguidancen_layerszacestep-v15-sft2         ?zacestep-v15-xl-turbo    zacestep-v15-xl-sft)turbosftzxl-turbozxl-sftc                     [         R                  R                  S5      (       d!  [        S5        [        R
                  " S5        [        S5       n [        R                  " U 5      nS S S 5        [        S5        W$ ! , (       d  f       N= f)Nrequest0.jsonz&[Error] request0.json not found in CWD   z[Request] Loaded request0.json)	ospathisfileprintsysexitopenjsonload)freqs     4/mnt/workspace/acestep.cpp/tests/debug-dit-cossim.pyload_requestr!   *   s\    77>>/**67	o	!iil 
	*,J 
	s   A==
B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lenr   writetobytes)r   datar%   r0   headersr   s          r    	save_dumpr9   3   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   )r,   fromfiler/   intr1   unpackr2   range)r   rawndimr#   r0   r6   s         r    	load_dumprC   @   s    
++d"**
-Cv}}S&++c3q6":;A>?DMRSW[Y[SsFKKS1X$>?BC[EYq4xy>D; Z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   r   g|=)minr3   r,   linalgnormr)   dot)abnds       r    	_cos_flatrM   G   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   )r3   reshaperM   flattenT)rI   rJ   shape_ashape_brarbc_normalc_transposeds           r    cosrZ   O   s    7s7|q0S\Q5F1:#
gaj(@7#B7#B rzz|<H$RTT\\^RZZ\BL&##OQ?rN   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   rP   )rE   r3   r,   hanningzerosr@   absfftrfftrM   rR   )rI   rJ   winhoprK   windowframessasbr#   r8   s              r    stft_cosrg   [   s    CFCFARa5!BQ%qZZ_Fg#!F	6!8a<(	)B	6!8a<(	)B6]Grvv{{1qu:#678rvv{{1qu:#678  RZZ\2::<00rN   c                 `    U (       d  gSR                  S U R                  S5       5       5      $ )zJConvert '43316,18426,...' to '<|audio_code_43316|><|audio_code_18426|>...' c              3   v   #    U  H/  oR                  5       (       d  M  S UR                  5        S3v   M1     g7f)z<|audio_code_z|>N)strip).0cs     r    	<genexpr>)codes_to_python_format.<locals>.<genexpr>l   s-     \:NQRYRYR[0]1779+R0:Ns   99,)joinsplit)	codes_csvs    r    codes_to_python_formatrt   h   s&    77\)//#:N\\\rN   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   US'   US	   US
'   US   US'   SUS'   [         R                  R                  U S5      n[        US5       n[        R                  " XhSS9  S S S 5        USUSSSSSUSU /n	U(       a  U	SU/-  n	[        S[         R                  R                  U5       S35        [        R                  " U	[        R                  S SS9n
[        [         R                   " U 5       Vs/ s H  oR#                  S5      (       d  M  UPM     sn5      nU
R$                  S:w  af  US:  a  [        SU
R$                   SU S 35        OC[        S!U
R$                   S"35        U
R&                  (       a  [        U
R&                  S#S  5        g[        S$U S%35        g! , (       d  f       GNH= fs  snf )&Nz../build/ace-synthz[GGML] binary not found: FTexist_okseedr	   inference_stepsr   guidance_scaler
   thinkingr   w   )indentz--ditz--embeddingz(../models/Qwen3-Embedding-0.6B-BF16.ggufz--vaez../models/vae-BF16.ggufz	--requestz--dump--loraz[GGML] Running ...)stdoutstderrtext.binr   z[GGML] WARNING: exit z but z dump files exist, continuingz[GGML] FAILED (exit )iz[GGML] Done,  dump files)r   r   r   r   makedirsdictSEEDrq   r   r   dumpbasename
subprocessrunPIPEr3   listdirendswith
returncoder   )dump_dirr   cfg	gguf_pathlora_dirggml_binmergedrequest_jsonr   cmdrrK   s               r    run_ggmlr   p   s   #H77>>(##)(45KK4( #YFF6N #GF":F'lF7OF:77<</:L	lC	 A		&A& 
! 	A*\(C (##	OBGG,,Y78
<=s:??4dKA

8,C,1

60BQ,CDA||qq5)!,,uQC?\]^(a89xxahhtuo&	M!K
()3 
!	  Ds   (G?H,H?
Hc                   ^'^(^)^*^+^,^-^.^/^0^1 [         R                  R                  SS5        SSKJn  [
        R                  " U SS9  US   S:  m*US   nUR                  S	S
5      nUR                  SS5      nUS   nUR                  SS5      n	[        SUS    S35        U" 5       n
U
R                  SUS   SS9  U(       a  U
R                  U5      n[        SU 35        U
R                  m+0 m(U
R                  m1U(U14S jnXl        U
R                  m/U(U/4S jnXl        T+R                  m-U(U*U+U-4S jnUT+l        T+R                  m0U(U04S jnUT+l        T+R                   nS/m)UR"                  m.U(U)U*U.4S jnUUl        T*(       a`  T+R$                  R&                  R(                  nS/m'US   m,U'U(U,4S jnUUS'   T+R*                  R-                  5       R/                  5       T(S'   / nSRU(U)4S jjnUR1                  UR2                  R5                  U" S5      5      5        UR1                  UR6                  R5                  U" S 5      5      5        UR1                  UR8                  S   R5                  U" S!5      5      5        UR1                  UR8                  S   R:                  R5                  U" S"5      5      5        S#S$S%US&   S'-
  4 H9  nUR1                  UR8                  U   R5                  U" S(U 35      5      5        M;     UR1                  UR<                  R5                  U" S)5      5      5        [?        T+S*5      (       a0  U(4S+ jnUR1                  T+R@                  R5                  U5      5        [C        XVU[E        U5      [G        [H        5      S,S'US-   US.   US   S/U	[K        UR                  S0S
5      5      UR                  S1S
5      UR                  S2S
5      S39nUS    S4US-    S53nT*(       a  US6US    3-  n[        S7U S835        U
RL                  " SS0 UD6nUR                  S95      (       d  [        S:UR                  S;S<5       35        g,U H  nURO                  5         M     UR                  S=0 5      nUR                  S>5      b  US>   S   T(S?'   UR                  S@/ 5      nU(       Ga  SAUS   ;   Gaz  US   SA   R-                  S5      T(SB'   US   SA   R-                  S5      RQ                  5       RS                  5       n[
        R                  RU                  U SC5      nSS K+n URX                  S'   n![Z        R\                  " SDU!-  [Z        R^                  SE9n"US   U"SS SD2'   US'   U"S'S SD2'   [Z        R`                  " U"SFS'5      SG-  Rc                  [Z        Rd                  5      n#U Rg                  USH5       n$U$Ri                  SD5        U$Rk                  SD5        U$Rm                  SI5        U$Ro                  U#Rq                  5       5        S S S 5        [        SJU SKU! SLU!SI-  SM SN35        [s        T(Ru                  5       5       H3  u  n%n&[w        [
        R                  RU                  U U% SO35      U&5        M5     [        SP[y        T(5       SQ35        g! , (       d  f       N= f)TNr   z../../ACE-Step-1.5)AceStepHandlerTrv   r   r   captionlyricsri   bpmdurationvocal_languageenz[Python] Initializing r   r   z..cuda)project_rootr   devicez[Python] LoRA: c                  D   > T" U 0 UD6nUS   R                  5       TS'   U$ )Nr   text_hiddenclone)rI   kwr   _dumps	orig_texts      r    hooked_textrun_python.<locals>.hooked_text   s+    qB !!

}rN   c                  D   > T" U 0 UD6nUS   R                  5       TS'   U$ )Nr   lyric_embedr   )rI   r   r   r   
orig_lyrics      r    hooked_lyric run_python.<locals>.hooked_lyric   s+     R  !!

}rN   c                     > T
" U 0 UD6nUu  p4nUS   R                  5       TS'   US   R                  5       TS'   T(       a1  T	R                  R                  U5      nUS   R                  5       TS'   U$ )Nr   
enc_hiddencontextnull_enc_hidden)r   null_condition_emb	expand_as)rI   r   r   enc_hsenc_maskctxnull_expandedr   has_cfgmodel	orig_conds          r    hooked_prepare"run_python.<locals>.hooked_prepare   s|    qB !#%ay0|FLLNy!44>>vFM(5a(8(>(>(@F$%rN   c                  D   > T" U 0 UD6nUS   R                  5       TS'   U$ )Nr   noiser   )rI   r   rK   r   
orig_noises      r    hooked_noise run_python.<locals>.hooked_noise   s*     R A$**,wrN   c                    > U (       a  U S   OUR                  S5      nTS   nUS:  a   Ub  US   R                  5       TSUS-
   S3'   T	" U 0 UD6nUS   nT(       aH  UR                  S   S:X  a5  US   R                  5       TSU S3'   US   R                  5       TSU S3'   OUS   R                  5       TSU S3'   T(       d  US   R                  5       TSU S	3'   TS==   S-  ss'   U$ )
Nr   hidden_statesdit_stepr   _xtrP   _vt_cond
_vt_uncond_vt)getr   r0   )
argskwargsxt_instepoutvtr   _stepr   orig_fwds
         r    
hooked_fwdrun_python.<locals>.hooked_fwd   s   QVZZ%@Qx!8)/4Qx~~/?FXdQhZs+,''Vrxx{a'021FXdV8,-24Q%++-FXdV:./021FXdV8,-+-a5;;=FXdV3'(aA
rN   apg_forwardc                  l   > T" U 0 UD6nUS   R                  5       TSTS    S3'   TS==   S-  ss'   U$ )Nr   r   r   r   r   )r   r   result	_apg_stepr   orig_apgs      r    
hooked_apgrun_python.<locals>.hooked_apg   sG    t.v.F39!9??3DFXil^3/0aLALMrN   r   c                    >^ ^ UUU U4S jnU$ )Nc                    > TS   T:X  aA  [        U[        5      (       a  US   OUnUS   R                  5       R                  5       TT'   g g )Nr   )r&   tupler   r)   )moduleinputoutputr   r   r   namestep_filters       r    hook+run_python.<locals>.make_hook.<locals>.hook   sG    Qx;&#-fe#<#<fQi&"1v||~335t 'rN    )r   r   r   r   r   s   `` r    	make_hookrun_python.<locals>.make_hook   s    	6 	6 rN   hidden_after_proj_inenc_after_cond_embhidden_after_layer0layer0_sa_output         r   r   hidden_after_layertemb_tdetokenizerc                 N   > US   R                  5       R                  5       TS'   g )Nr   detok_output)r   r)   )r   r   r   r   s      r    
detok_hookrun_python.<locals>.detok_hook  s!    %+AY__%6%<%<%>F>"rN   Fr	   r
   odeaudio_codeskeyscaletimesignature)captionsr   r   audio_durationrx   use_random_seed
batch_sizery   r
   rz   infer_methodr   audio_code_string	key_scaletime_signature, z stepsz, CFG z[Python] Generating (z)...successz[Python] Generation failed: errorunknownextra_outputspred_latentsdit_x0audiostensor	vae_audioz
output.wavrP   r;   i  r|   i  z[Python] Wrote z: z
 samples (z.2fzs @ 48kHz stereo)r   z[Python] Done, r   )r   r   )=r   r   insertacestep.handlerr   r   r   r   r   initialize_serviceadd_lorar   infer_text_embeddingsinfer_lyric_embeddingsprepare_conditionprepare_noisedecoderforwardgenerate_audio__func____globals__r   squeezer   appendproj_inregister_forward_hookcondition_embedderlayers	self_attn
time_embedhasattrr   r   r)   strr   rt   generate_musicremover*   r+   rq   waver0   r,   emptyr/   clipr.   int16r   setnchannelssetsampwidthsetframeratewriteframesr5   sorteditemsr9   r3   )2r   r   r   r   r   r   r   r   r   languagehandlerlrr   r   r   r   r  r   gen_globalsr   _hooksr   lir   
gen_kwargstagr   hextrar  audio_npwav_pathr-  	n_samplesinterleavedpcmwfr   r  r   r   r   r   r   r   r   r   r   r   r   s2                                          @@@@@@@@@@@r    
run_pythonrG     s"   HHOOA+,.KK4(*o#G9~Gwwx$Fwwua C:Hww'.H	"3}#5"6c
:;G&   h't$%MMEF--I %0!//J &2"''I  -E$$J 'EmmGCEH   !GO**33??C	}-	
 &0M"','?'?'G'G'I'O'O'Q#$F  MM'//77	BX8YZ[
MM',,BB9MaCbcd
MM'..#99)DY:Z[\
MM'..#--CCIN`Dabc"b#j/A-.gnnR(>>yK]^`]aIb?cde / MM'$$::9X;NOP um$$	?e''==jIJSXSY!GCL:801KL''*b)ww3
J"  3w<.
7CJ())	!#d
+,##1j1F::i  ,VZZ-K,LMN	
  JJ+Eyy , 03xZZ"%F(fQi'$Qi199!<{!9X&..q1557==?77<<,7NN1%	hhq9}BJJ?$QKADqD$QKADqDww{B*U2::288DYYx%OOAOOAOOE"NN3;;=)	 &
 	zI;j5QT@UUfghv||~.f"'',,xD67@ / 
OCK=
45 &%s   AZ22
[ c                    U S   S:  nU S   nSSSSSS	S
SSSSSSSSU S   S-
   3/nU(       a  USS/-  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 Hn  nU(       a0  UR                  SU S35        US:  a  UR                  SU S35        UR                  SU S35        XRS-
  :  d  MY  UR                  SU S35        Mp     US S!/-  nU$ )"Nr   r   r	   r   r   r   r   r   r   r   r   r   r   r   hidden_after_layer6hidden_after_layer12hidden_after_layer18r   r   r   r   r   r   r      r   r   rP   r   r   r   r  r  )listr@   r"  )r   r   r	   stagesstep_indicessis         r    build_stagesrQ  M  s<   *o#GLE}lNIw(*>157M
S_q012F '):;;zE%L)E!UA./AIl*	*MMHRD12AvJ78C()	>MMHRD,-  x%%FMrN   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        [	        SSS 3SS9  U H  u  px[	        S	US
-   U-   S 3SS9  M     [	        5         U 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|  [	        SU	S 3SS9  U HH  u  pxXz;   a0  X;   a+  X   u  pX   u  nn[        UUUU5      n[	        S	US 3SS9  M:  [	        S	SS 3SS9  MJ     [	        5         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:  ae  [	        SSS 3SS9  U HG  u  pxUU;   a.  UU;   a(  [        UU   S   UU   S   5      n[	        S	US 3SS9  M9  [	        S	SS 3SS9  MI     [	        5         [        U5      S:  Gal  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a7  [	        SU S35        [	        SSS S	SS S	SS S	SS S	SS S	SS S	SS S	S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      (       Ga  [        U5      u  nn[        U5      u  nn[        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UU:  a  UR                   nUR                  5       UR                  5       nnOU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![	        SU	S 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Mh  / n"[        R                  R                  U5      (       d  U"R/                  U5        [        R                  R                  U5      (       d  U"R/                  U5        [	        SU	S 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 Pythonz  stage30sri   )end z vs z>14sr   z>14.6fzN/Azvae_audio.binrP   zvae_audio (STFT cosine)r   r   z] Error growth GGML vs Python22srZ   z>10smax_errmean_errmean_Astd_Amean_Bstd_Bz10.6fz
 missing: r	  )r5  keysr@   r3   r   r6  r   r   rq   r   rC   rZ   rg   rQ   rM   rR   rS   rE   r,   r^   maxmeanstdr"  )#dirsrN  r>  labelsr#   jpairsrI   rJ   rT  r6   labelrL   r   dare   dbrf   rm   vae_dataa_labelb_labela_dirb_dirr8   	xt_stagesfafbda_rawdb_rawc_flatc_transrK   diffmissings#                                      r    comparerx  j  sj   DIIK F-23v;-?a-?qQRsTWX^T_I`AQi#I`#-?Ea	AcU6
78	Bwsm
"%!F(1*T"#, 	G

HEQ/Aww~~a  'l % 5+B'DAyQYBBB'!Fn"-%&B/  	# & HJJLGGLLO,77>>!'lHUO ! 8},S12;DAH}hXa[^Xa[^<!Fn"-%&B/  	
5zA~ 8G}d7mu &51%1*Q	5AcU789Bwsm1U4L)D1A:dBSht_Agd^1XdO1WTNT U"WW\\%8WW\\%877>>"%%"''..*<*<!*2JFB!*2JFB2w!|B1A"Q%BqEUWXYUZN#^^B/#^^B/!*2::<!F"+BDDLLNBJJL"I"V+!#B!#rzz|BB!'BCGSW-AVRVB!"b)A66"r'?DBuSk1U)1TXXZ4Fa		TYGZbggi.a/?q5@QQRSUSYSYS[\aRbd e !G77>>"--w~~g/F77>>"--w~~g/FBuSkDIIg4F3GHI5 #	 	 U bZ 6s   2W4
W:+W:c           
         SU  3nSU  3nU S:X  a  U R                  5       OU R                  5       nSUS    SUS    3nUS   S	:  a  US
US    3-  n[        SU SU S[        R                  R                  U5       35        [        R                  R                  U5      (       a  [        R                  " U5        [        XRXU5      (       d  [        SU S35        g[        R                  R                  U5      (       a  [        R                  " U5        [        XbX5      (       d  [        SU S35        g[        U5      n	[        XVS.X5        g)Nzggml-zpython-r   zsteps=r	   z, shift=r
   r   r   z, CFG=rS  z] z | z] GGML failedFz] Python failed)GGMLPythonT)upper
capitalizer   r   r   r   isdirshutilrmtreer   rG  rQ  rx  )
	mode_namer   r   r   r   	dump_ggmldump_pythonr>  cfg_strrN  s
             r    run_moder    s;   )%II;'K(E1)//
y7K7K7MCs7|nHS\N;G
:VC
O,--	AcU"WIS!1!1)!< =
>?	ww}}Yi ICH==#m$%	ww}}[!!k"k66#o&'#FY6DrN   c                     [         R                  " SS9n U R                  SS[        [        R                  5       5      S/-   SS9  U R                  SS	S
S9  U R                  SS SS9  U R                  5       n[        5       nUR                  S:X  a  [        [        R                  5       5      OUR                  /nSnU Hx  n[        U   nSUS    SUR                   S3n[        R                  R                  U5      (       d  [        SU 35        SnMX  [        XVX'UR                  5      (       a  Mv  SnMz     U(       a  S$ S$ )Nz+GGML vs Python cosine similarity comparison)descriptionz--moder   allz$which model to test (default: turbo))defaultchoiceshelpz--quantBF16z=quantization suffix for GGUF (default: BF16, e.g. Q6_K, Q8_0))r  r  r   z)path to LoRA adapter directory (optional)Tz
../models/r   -z.ggufz[Error] GGUF not found: Fr   r   )argparseArgumentParseradd_argumentrM  MODE_CONFIGr_  
parse_argsr!   modequantr   r   r   r   r  lora)apr   r   modesokmr   r   s           r    mainr    s7   		 	 -Z	[BOOHgtK<L<L<N7OSXRY7Y?  AOOIvX  ZOOHdD  F==?D
.C(,		U(:D!!#$E	B!n [!1 2!DJJ<uE	ww~~i((,YK89B		::B  1rN   __main__)NN)i   i   )N)__doc__r   r   r   r1   r  r  r   r+   r,   r   r  r!   r9   rC   rM   rZ   rg   rt   r   rG  rQ  rx  r  r  __name__r   r   rN   r    <module>r     s    ; : : : 	 )*Scr '(cs ,-Scr *+cs!. 9
1](Xmb:NJd44 zHHTV rN   