
    =iH              
       $   d Z ddlZddlZddlZddlZddlZddlZddlZddlZ	dZ
ddddddd	d
d
ddddd	ddddddd	ddddddd	dZd Zd Zd Zd ZddZd dZd Zd!dZd!dZd Zd Zd!dZd Zedk(  r ej4                   e              yy)"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                     t         j                  j                  d      s t        d       t	        j
                  d       t        d      5 } t        j                  |       }d d d        t        d       S # 1 sw Y   xY w)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!   *   sY    77>>/*67	o	!iil 
	*,J 
	s   A66A?c                 H   dd l }t        ||j                        r:|j                         j	                         j                         j                         }t        j                  |j                  t        j                              }|j                  }t        j                  dt        |            }|D ]  }|t        j                  d|      z  } t        | d      5 }|j!                  |       |j!                  |j#                                d d d        y # 1 sw Y   y xY w)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                    t        j                  | t         j                        }t        t	        j
                  dt	        j                  d|d               d         }t        |      D cg c]>  }t        t	        j
                  dt	        j                  d|d|z                  d         @ }}|d|z   d  }||fS c c}w )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B=c                 .   t        t        |       t        |            }|dk(  ry| d | |d | }} t        j                  j	                  |       t        j                  j	                  |      z  }|dkD  r"t        t        j                  | |      |z        S dS )Nr   r   g|=)minr3   r,   linalgnormr)   dot)abnds       r    	_cos_flatrM   G   s~    CFCFAAvRa5!BQ%qA
		qBIINN1--A&'%i51!"8S8    c                    |r|rt        |      dk(  rt        |      dk(  r|d   |d   k(  r|d   |d   k(  r| j                  |      }|j                  |      }t        |j                         |j                               }t        |j                  j                         |j                               }||kD  r|S |S t        | |      S )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h&##OQ?rN   c           	      x   t        t        |       t        |            }| d | |d | }} t        j                  |      }||z
  |z  dz   }t        j                  ||dz  dz   f      }t        j                  ||dz  dz   f      }t        |      D ]  }	|	|z  }
t        j                  t        j                  j                  | |
|
|z    |z              ||	<   t        j                  t        j                  j                  ||
|
|z    |z              ||	<    t        |j                         |j                               S )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%qAZZ_F#g#!F	63!8a<(	)B	63!8a<(	)B6]Grvv{{1Qqu:#6781rvv{{1Qqu:#6781  RZZ\2::<00rN   c                 V    | sydj                  d | j                  d      D              S )zJConvert '43316,18426,...' to '<|audio_code_43316|><|audio_code_18426|>...' c              3   f   K   | ])  }|j                         sd |j                          d + yw)z<|audio_code_z|>N)strip).0cs     r    	<genexpr>z)codes_to_python_format.<locals>.<genexpr>l   s.     \:NQRSRYRYR[]1779+R0:Ns   11,)joinsplit)	codes_csvs    r    codes_to_python_formatrs   h   s&    77\)//#:N\\\rN   c                    d}t         j                  j                  |      st        d|        yt        j                  | d       t        |      }t        |d<   |d   |d<   |d	   |d
<   |d   |d<   d|d<   t         j                  j                  | d      }t        |d      5 }t        j                  ||d       d d d        |d|ddddd|d| g}	|r|	d|gz  }	t        dt         j                  j                  |       d       t        j                  |	t        j                  d d      }
t        t        j                   |       D cg c]  }|j#                  d      s| c}      }|
j$                  dk7  r`|dkD  rt        d|
j$                   d| d        n>t        d!|
j$                   d"       |
j&                  rt        |
j&                  d#d         yt        d$| d%       y# 1 sw Y   0xY wc c}w )&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	--adapterz[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SEEDrp   r   r   dumpbasename
subprocessrunPIPEr3   listdirendswith
returncoder   )dump_dirr   cfg	gguf_pathadapter_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,G9"G9,G6c                   ()*+,-./012 t         j                  j                  dd       ddlm} t        j                  | d       |d   dkD  +|d   }|j                  d	d
      }|j                  dd      }|d   }|j                  dd      }	t        d|d    d        |       }
|
j                  d|d   d       |rqt
        j                  j                  t
        j                  j                  |            j                  dd      xs d}|
j                  ||      }t        d|        |
j                  ,i )|
j                  2)2fd}||
_        |
j                   0)0fd}||
_        ,j"                  .)+,.fd}|,_        ,j$                  1)1fd}|,_        ,j&                  }dg*|j(                  /)*+/fd}||_        +r_,j*                  j,                  j.                  }dg(|d   -()-fd }||d<   ,j0                  j3                         j5                         )d!<   g }dV)*fd"	}|j7                  |j8                  j;                   |d#                   |j7                  |j<                  j;                   |d$                   |j7                  |j>                  d   j;                   |d%                   |j7                  |j>                  d   j@                  j;                   |d&                   d'd(d)|d*   d+z
  fD ]8  }|j7                  |j>                  |   j;                   |d,|                    : |j7                  |jB                  j;                   |d-                   tE        ,d.      r/)fd/}|j7                  ,jF                  j;                  |             tI        |||tK        |      tM        tN              d0d+|d1   |d2   |d   d3|	tQ        |j                  d4d
            |j                  d5d
      |j                  d6d
      7      }|d    d8|d1    d9}+r|d:|d    z  }t        d;| d<        |
jR                  dWi |}|j                  d=      st        d>|j                  d?d@              y0|D ]  }|jU                           |j                  dAi       }|j                  dB      |dB   d   )dC<   |j                  dDg       }|rdE|d   v r{|d   dE   j3                  d      )dF<   |d   dE   j3                  d      jW                         jY                         }t
        j                  j[                  | dG      } dd l.}!|j^                  d+   }"ta        jb                  dH|"z  t`        jd                  I      }#|d   |#dd dH<   |d+   |#d+d dH<   ta        jf                  |#dJd+      dKz  ji                  t`        jj                        }$|!jm                  | dL      5 }%|%jo                  dH       |%jq                  dH       |%js                  dM       |%ju                  |$jw                                d d d        t        dN|  dO|" dP|"dMz  dQdR       ty        )j{                               D ]2  \  }&}'t}        t
        j                  j[                  | |& dS      |'       4 t        dTt        )       dU       y# 1 sw Y   xY w)XNr   z../../ACE-Step-1.5)AceStepHandlerTru   r   r   captionlyricsri   bpmdurationvocal_languageenz[Python] Initializing r   r   z..cuda)project_rootr   device._default)adapter_namez[Python] LoRA: c                  D     | i |}|d   j                         d<   |S )Nr   text_hiddenclone)rI   kwr   _dumps	orig_texts      r    hooked_textzrun_python.<locals>.hooked_text   s+    qB !!

}rN   c                  D     | i |}|d   j                         d<   |S )Nr   lyric_embedr   )rI   r   r   r   
orig_lyrics      r    hooked_lyricz run_python.<locals>.hooked_lyric   s+     R  !!

}rN   c                       
| i |}|\  }}}|d   j                         d<   |d   j                         d<   r1	j                  j                  |      }|d   j                         d<   |S )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_preparez"run_python.<locals>.hooked_prepare   s~    qB !#%ay0|FLLNy!44>>vFM(5a(8(>(>(@F$%rN   c                  D     | i |}|d   j                         d<   |S )Nr   noiser   )rI   r   rK   r   
orig_noises      r    hooked_noisez run_python.<locals>.hooked_noise   s*     R A$**,wrN   c                     | r| d   n|j                  d      }d   }|dkD  r||d   j                         d|dz
   d<    	| i |}|d   }rG|j                  d   dk(  r5|d   j                         d| d<   |d   j                         d| d<   n|d   j                         d| d<   s|d   j                         d| d	<   dxx   dz  cc<   |S )
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_fwdz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     | i |}|d   j                         dd    d<   dxx   dz  cc<   |S )Nr   r   r   r   r   )r   r   result	_apg_stepr   orig_apgs      r    
hooked_apgzrun_python.<locals>.hooked_apg   sG    t.v.F39!9??3DFXil^3/0aLALMrN   r   c                       fd}|S )Nc                     d   k(  r<t        |t              r|d   n|}|d   j                         j                         <   y y )Nr   )r&   tupler   r)   )moduleinputoutputr   r   r   namestep_filters       r    hookz+run_python.<locals>.make_hook.<locals>.hook   sD    Qx;&#-fe#<fQi&"1v||~335t 'rN    )r   r   r   r   r   s   `` r    	make_hookzrun_python.<locals>.make_hook   s    	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    |d   j                         j                         d<   y )Nr   detok_output)r   r)   )r   r   r   r   s      r    
detok_hookzrun_python.<locals>.detok_hook  s!    %+AY__%6%<%<%>F>"rN   Fr	   r
   odeaudio_codeskeyscaletimesignature)captionsr   r   audio_durationrw   use_random_seed
batch_sizerx   r
   ry   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_servicer   normpathreplace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   rs   generate_musicremover*   r+   rp   waver0   r,   emptyr/   clipr.   int16r   setnchannelssetsampwidthsetframeratewriteframesr5   sorteditemsr9   r3   )3r   r   r   r   r   r   r   r   r   languagehandlerr   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   s3                                           @@@@@@@@@@@r    
run_pythonrC     sS   HHOOA+,.KK4(*o#G9~Gwwx$Fwwua C:Hww'.H	"3}#5"6c
:;G&    ww''(8(8(EFNNsTWXe\ekEt$%MMEF--I %0G!//J &2G"''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
+,#W##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[  [)c                    | d   dkD  }| d   }dddddd	d
dddddddd| d   dz
   g}|r|ddgz  }|dk  rt        t        |            }n1t        t        d|d            }|dz
  |vr|j                  |dz
         |D ]f  }|r/|j                  d| d       |dk  r|j                  d| d       |j                  d| d       ||dz
  k  sR|j                  d| d       h |d d!gz  }|S )"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_stagesrM  Q  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                    t        | j                               }t        t        |            D cg c])  }t        |dz   t        |            D ]  }||   ||   f + }}}t	        d| d       t	        dddd       |D ]  \  }}t	        d	|d
z   |z   dd        t	                |D ]  }	i }
| j                         D ]V  \  }}t        j                  j                  ||	dz         }t        j                  j                  |      sIt        |      |
|<   X |
sqt	        d|	dd       |D ]N  \  }}||
v r4||
v r0|
|   \  }}|
|   \  }}t        ||||      }t	        d	|dd       >t	        d	ddd       P t	                 i }| j                         D ]S  \  }}t        j                  j                  |d      }t        j                  j                  |      sFt        |      ||<   U t        |      dk\  rht	        dddd       |D ]H  \  }}||v r.||v r*t        ||   d   ||   d         }t	        d	|dd       8t	        d	ddd       J t	                t        |      dkD  rD|d   \  }}| |   | |   }}|D cg c]	  }d|v s| }}|rt	        d| d       t	        dddd	ddd	ddd	ddd	ddd	ddd	ddd	dd       |D ]  }	t        j                  j                  ||	dz         }t        j                  j                  ||	dz         }t        j                  j                  |      rt        j                  j                  |      rt        |      \  }}t        |      \  }}t        |      dk(  rt        |      dk(  r|d   |d   k(  r|d   |d   k(  r|j                  |      }|j                  |      }t        |j                         |j                               }t        |j                   j                         |j                               }||kD  r|j                   }|j                         |j                         }}n||}}t#        t        |      t        |            } |d |  |d |  }}t        ||      }t%        j&                  ||z
        }!t	        d|	dd	|dd	|!j)                         dd	|!j+                         dd	|j+                         dd	|j-                         dd	|j+                         dd	|j-                         d       Wg }"t        j                  j                  |      s|"j/                  |       t        j                  j                  |      s|"j/                  |       t	        d|	ddd j                  |"               y y y c c}}w c c}w )!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  )r1  keysr@   r3   r   r2  r   r   rp   r   rC   rZ   rg   rQ   rM   rR   rS   rE   r,   r^   maxmeanstdr  )#dirsrJ  r:  labelsr#   jpairsrI   rJ   rP  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    comparert  n  sr   DIIK F-23v;-?a-?qQRsTWX^T_I`AfQi#I`#-?Ea	AcU6
78	Bwsm
"%1!F(1*T"#, 	G

HE1Q/Aww~~a 'lU % 5+B'DAqDyQ$YaBaBBB'!Fn"-%&B/  	# & HJJLqGGLLO,77>>!'lHUO ! 8},S12;DAq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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   .W	WWc           
         d|  }d|  }| dk(  r| j                         n| j                         }d|d    d|d    }|d   d	kD  r|d
|d    z  }t        d| d| dt        j                  j                  |              t        j                  j                  |      rt        j                  |       t        |||||      st        d| d       yt        j                  j                  |      rt        j                  |       t        ||||      st        d| d       yt        |      }	t        ||d|	|       y)Nzggml-zpython-r   zsteps=r	   z, shift=r
   r   r   z, CFG=rO  z] z | z] GGML failedFz] Python failed)GGMLPythonT)upper
capitalizer   r   r   r   isdirshutilrmtreer   rC  rM  rt  )
	mode_namer   r   r   r   	dump_ggmldump_pythonr:  cfg_strrJ  s
             r    run_moder    s;   )%II;'K(E1)//
y7K7K7MCs7|nHS\N;G
:VC
O,--	AcU"WIS!1!1)!< =
>?	ww}}Yi IsCK@#m$%	ww}}[!k"k3[9#o&'#FY+6DrN   c                     t        j                  d      } | j                  ddt        t        j                               dgz   d       | j                  dd	d
       | j                  dd d       | j                         }t               }|j                  dk(  rt        t        j                               n|j                  g}d}|D ]m  }t        |   }d|d    d|j                   d}t        j                  j                  |      st        d|        d}Rt        |||||j                        rld}o |rdS dS )Nz+GGML vs Python cosine similarity comparison)descriptionz--moder   allz$which model to test (default: turbo))r   choiceshelpz--quantBF16z=quantization suffix for GGUF (default: BF16, e.g. Q6_K, Q8_0))r   r  r~   z$path to adapter directory (optional)Tz
../models/r   -z.ggufz[Error] GGUF not found: Fr   r   )argparseArgumentParseradd_argumentrI  MODE_CONFIGr[  
parse_argsr!   modequantr   r   r   r   r  adapter)apr   r   modesokmr   r   s           r    mainr    s5   		 	 -Z	[BOOHgtK<L<L<N7OSXRY7Y?  AOOIvX  ZOOK?  A==?D
.C(,		U(:D!!#$E	B!n [!1 2!DJJ<uE	ww~~i(,YK89B3Y=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   rs   r   rC  rM  rt  r  r  __name__r   r   rN   r    <module>r     s    ; : : : 	 )*Scr '(cs ,-Scr *+cs!. 9
1](Xqj:NJd44 zCHHTV rN   