
    9i                        S SK JrJrJr  S SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  S SKJrJr  S SKJr   " S S5      r " S	 S
5      r\R*                  " \R,                  \R.                  S9 " S S\5      5       rg)    )AnyDictUnionNk_means)Models)MODELS
TorchModel)Tasksc                   T    \ rS rSrSrSS jrSS jrS rS rS r	SS	 jr
S
 rS rSrg)SpectralCluster   zA spectral clustering method using unnormalized Laplacian of affinity matrix.
This implementation is adapted from https://github.com/speechbrain/speechbrain.
c                 (    Xl         X l        X0l        g N)min_num_spksmax_num_spkspval)selfr   r   r   s       j/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/models/audio/sv/cluster_backend.py__init__SpectralCluster.__init__   s    ((	    Nc                     U R                  U5      nU R                  U5      nSXDR                  -   -  nU R                  U5      nU R	                  Xb5      u  pxU R                  Xx5      n	U	$ )Ng      ?)get_sim_mat	p_pruningTget_laplacianget_spec_embscluster_embs)
r   X
oracle_numsim_matprunned_sim_matsym_prund_sim_mat	laplacianemb
num_of_spklabelss
             r   __call__SpectralCluster.__call__   sv    ""1% ..1  ?5F5F#FG &&'89	 ,,YC ""33r   c                 X    [         R                  R                  R                  X5      nU$ r   )sklearnmetricspairwisecosine_similarity)r   r    Ms      r   r   SpectralCluster.get_sim_mat0   s!    OO$$66q<r   c                 L   UR                   S   U R                  -  S:  a  SUR                   S   -  nOU R                  n[        SU-
  UR                   S   -  5      n[        UR                   S   5       H*  n[        R
                  " XS S 24   5      nUSU nSXU4'   M,     U$ )Nr      g      @   )shaper   intrangenpargsort)r   Ar   n_elemsilow_indexess         r   r   SpectralCluster.p_pruning5   s    771:		!A%
?D99Dq4x1771:-. qwwqz"A**Q!tW-K%a0K !"An # r   c                     SU[         R                  " UR                  S   5      '   [         R                  " [         R                  " U5      SS9n[         R
                  " U5      nX!-
  nU$ )Nr   r4   axis)r8   diag_indicesr5   sumabsdiag)r   r0   DLs       r   r   SpectralCluster.get_laplacianF   sN    )*"//!''!*
%&FF266!91%GGAJEr   c                    [         R                  R                  U5      u  p4Ub  UnOPU R                  X0R                  S-
  U R
                  S-    5      n[        R                  " U5      U R                  -   nUS S 2S U24   nXu4$ Nr4   )scipylinalgeighgetEigenGapsr   r   r8   argmax)r   rG   k_oraclelambdaseig_vecsr'   lambda_gap_listr&   s           r   r   SpectralCluster.get_spec_embsM   s    !LL--a0!J"//))A-d.?.?!.CDFO?3d6G6GGJq+:+~&r   c                 "    [        X5      u  p4nU$ r   r   )r   r&   k_r(   s        r   r   SpectralCluster.cluster_embsZ   s    s1r   c                     / n[        [        U5      S-
  5       H2  n[        XS-      5      [        X   5      -
  nUR                  U5        M4     U$ rJ   )r7   lenfloatappend)r   eig_valseig_vals_gap_listr<   gaps        r   rN   SpectralCluster.getEigenGaps^   sR    s8}q()AQ(5+==C$$S) * ! r   )r   r   r   )r4      gI+?r   )__name__
__module____qualname____firstlineno____doc__r   r)   r   r   r   r   r   rN   __static_attributes__ r   r   r   r      s/    
*
"!r   r   c                   2    \ rS rSrSr     SS jrS rSrg)UmapHdbscanf   z
Reference:
- Siqi Zheng, Hongbin Suo. Reformulating Speaker Diarization as Community Detection With
  Emphasis On Topological Structure. ICASSP2022
c                 @    Xl         X l        X0l        X@l        XPl        g r   )n_neighborsn_componentsmin_samplesmin_cluster_sizemetric)r   rm   rn   ro   rp   rq   s         r   r   UmapHdbscan.__init__m   s!     '(& 0r   c           	      4   [         R                  " U R                  S[        U R                  UR
                  S   S-
  5      U R                  S9R                  U5      n[        R                  " U R                  U R                  SS9R                  U5      nU$ )Ng        r      )rm   min_distrn   rq   T)ro   rp   allow_single_cluster)umapUMAPrm   minrn   r5   rq   fit_transformhdbscanHDBSCANro   rp   fit_predict)r   r    umap_Xr(   s       r   r)   UmapHdbscan.__call__y   s    ((T..
Q?;;	

 -
 	 ((!22!%' (3{6': 	 r   )rq   rp   ro   rn   rm   N)   <   
   r   cosine)rb   rc   rd   re   rf   r   r)   rg   rh   r   r   rj   rj   f   s"       "$ 
r   rj   )module_namec                   J   ^  \ rS rSrSrS\\\4   4U 4S jjrS r	S r
SrU =r$ )ClusterBackend   zPerform clustering for input embeddings and output the labels.
Args:
    model_dir: A model dir.
    model_config: The model config.
model_configc                    > [         TU ]  " X/UQ70 UD6  X l        X@l        [	        5       U l        [        5       U l        g r   )superr   r   other_configr   spectral_clusterrj   umap_hdbscan_cluster)r   	model_dirr   argskwargs	__class__s        r   r   ClusterBackend.__init__   s;    B4B6B(" / 1$/M!r   c                    SU;   a  US   OS n[        UR                  5      S:X  d   S5       eUR                  S   S:  a"  [        R                  " UR                  S   SS9$ UR                  S   S:  d  Ub  U R	                  X5      nOU R                  U5      nUc/  S	U R                  ;   a  U R                  XAU R                  S	   5      nU$ )
Nr!   rt   z5modelscope error: the shape of input should be [N, C]r   r   r6   )dtypei   	merge_thr)rZ   r5   r8   zerosr   r   r   merge_by_cos)r   r    paramsrV   r(   s        r   forwardClusterBackend.forward   s    $0F$:F< GG
 	HG	H  771:?88AGGAJe44771:**10F..q1F9(9(99&&v'+'8'8'EGF r   c                    US:  a  US::  d   e UR                  5       S-   nUS:X  a   U$ / n[        U5       H*  nX!U:H     R                  S5      nUR                  U5        M,     [	        U5      S:  d   e[
        R                  " USS9nU[
        R                  R                  USSS9-  n[
        R                  " XR                  5      n	[
        R                  " U	S5      n	[
        R                  " [
        R                  " U	5      U	R                  5      n
X   U:  a   U$ [        [	        U5      5       H0  nX   U
S   :X  a	  U
S   X'   M  X   U
S   :  d  M$  X==   S-  ss'   M2     GMa  )Nr   r4   Tr@   )rA   keepdims)maxr7   meanr\   rZ   r8   stackrL   normmatmulr   triuunravel_indexrO   r5   )r   r(   embscos_thrspk_num
spk_centerr<   spk_embnorm_spk_centeraffinityspkss              r   r   ClusterBackend.merge_by_cos   s_   {w!|++jjlQ&G!|& % J7^{+003!!'* $ z?Q&&&*15J(299>>T ,: ,3 3Oyy2C2CDHwwx+H##BIIh$7HD~'  3v;'9Q' $QFIYa(INI	 (# r   )r   r   r   r   )rb   rc   rd   re   rf   r   strr   r   r   r   rg   __classcell__)r   s   @r   r   r      s+    2S#X 2& r   r   )typingr   r   r   r{   numpyr8   rK   r,   rw   sklearn.cluster._kmeansr   modelscope.metainfor   modelscope.modelsr	   r
   modelscope.utils.constantr   r   rj   register_modulespeaker_diarizationcluster_backendr   rh   r   r   <module>r      sy    $ #      + & 0 +R! R!j B 	6+A+AC<Z <C<r   