
    is^                       d Z ddlmZ ddlZddlZddlmZ ddlm	Z
 ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ dddZ  G d dejB                        Z" G d dejB                        Z# G d dejB                        Z$ G d dejB                        Z% G d deejB                        Z&y)zA
MLX implementation of HDemucs building blocks (inference-only).
    )annotationsN)deepcopy   )DConv)
GLUNCL	Conv1dNCL
Conv2dNCHWConvTranspose1dNCLConvTranspose2dNCHWFusedGroupNormGELUFusedGroupNormGLUGroupNormNCHWGroupNormNCLIdentity)MLXStateDictMixin)CachedSpectralPair)wienerc                R   | j                   d   }|\  }}|dk(  rt        ||      }||k  rf||z
  dz   }t        ||      }	||	z
  }
||
z
  ||	z
  f}|
s|	r?t        j                  | dg| j
                  dz
  z  |
|	fgz   d|      } | j                   d   }|\  }}|r-| dd|dz   f   ddddf   }t        j                  || gd	      } |r.| d| dz
  df   ddddf   }t        j                  | |gd	      } | S t        j                  | dg| j
                  dz
  z  ||fgz   ||      } | S )
zAPad on the last dimension, with reflect support for short inputs.reflectr   r   r   constant)modeconstant_values.Naxis)shapemaxminmxpadndimconcatenate)xpaddingsr   valuelengthpadding_leftpadding_rightmax_pad	extra_padextra_pad_rightextra_pad_leftleftrightleft_ref	right_refs                  k/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/demucs_mlx/mlx_hdemucs.pypad1dr3      s~   WWR[F"*L-ylM2W&(1,I!-;O&8N$~5}7VWHFFH
+/P.QQ#$)	 eaqj)#tt)4H!}26A#vz"},-c4R4i8I9~B7A H FFH
#m'D&EE!	
 H    c                  H     e Zd Z	 d	 	 	 	 	 	 	 d fdZed        Zd Z xZS )ScaledEmbeddingc                   t         |           t        j                  ||      | _        |r~t        j                  | j                  j                  d      }|t        j                  t        j                  d|dz   |j                              d d d f   z  }|| j                  _        | j                  j                  |z  | j                  _        || _        y )Nr   r   r   dtype)super__init__nn	Embedding	embeddingr    cumsumweightsqrtaranger9   scale)selfnum_embeddingsembedding_dimrC   smoothr@   	__class__s         r2   r;   zScaledEmbedding.__init__F   s     	nmDYYt~~441=Fbggbii>A3EV\\&Z[\]_c\cddF$*DNN! $ 5 5 =
r4   c                H    | j                   j                  | j                  z  S N)r>   r@   rC   )rD   s    r2   r@   zScaledEmbedding.weightS   s    ~~$$tzz11r4   c                >    | j                  |      | j                  z  S rJ   )r>   rC   )rD   r$   s     r2   __call__zScaledEmbedding.__call__W   s    ~~a 4::--r4   )g      $@F)rE   intrF   rM   rC   floatrG   bool)__name__
__module____qualname__r;   propertyr@   rL   __classcell__rH   s   @r2   r6   r6   E   sF     -2!25%) 2 2.r4   r6   c                  >     e Zd Zddddddddi ddf fd	Zd	dZ xZS )
	HEncLayer      r   FTr   c                   t         |           d }|	rfd}|r|dz  }nd}| _        || _        || _        || _        |	| _        || _        r!|dg}|dg}|dg}t        |||||      | _	        nt        |||||      | _	        | j
                  ry t        |	      | _        |	rt        |      | _        n ||      | _        d | _        d| _        |rkrt        |d|z  dd|
z  z   d|
      | _        nt        |d|z  dd|
z  z   d|
      | _        |	rt#        d|z        | _        d| _        n |d|z        | _        d | _        |rt)        |fi || _        y y )	Nc                    t               S rJ   r   ds    r2   norm_fnz#HEncLayer.__init__.<locals>.norm_fnm   
    :r4   c                8    rt        |       S t        |       S rJ   r   r   r^   freqnorm_groupss    r2   r_   z#HEncLayer.__init__.<locals>.norm_fnp       8<}[!4^,{\]B^^r4   rY   r   r   F   T)r:   r;   rd   kernel_sizestrideemptynormr!   r	   convr   rO   _fused_norm1r   norm1rewrite_fused_norm2r   norm2dconvr   )rD   chinchoutrh   ri   re   rj   rd   rr   rk   contextdconv_kwr!   ro   r_   rH   s        ` `       r2   r;   zHEncLayer.__init__\   sw     		_"CC	&
	&*Ka[F(C"4VSIDI!${FCHDI:: J+K?DJ DJ!)%UAGOQPWX(E	1q7{?AwW.{AIF
$(!$QY/

u11DJ r4   c                P   | j                   s3|j                  dk(  r$|j                  \  }}}}|j                  |d|      }| j                   sI|j                  d   }|| j                  z  dk7  r(t        |d| j                  || j                  z  z
  f      }| j                  |      }| j                  r|S |/|j                  dk(  r|j                  dk(  r|d d d d d f   }||z   }| j                  r| j                  |      }n$t        j                  | j                  |            }| j                  r| j                   r6|j                  \  }}}}|j                  dddd      j                  d||      }| j                  |      }| j                   r&|j                        j                  dddd      }| j                  r`| j                  r"| j!                  | j                  |            }	|	S  t#        d      | j!                  | j                  |                  }	|	S |}	|	S )NrY   r   r      rg   r   r   )rd   r"   r   reshaperi   r3   rl   rj   rm   rn   r<   gelurr   	transposero   rp   rq   r   )
rD   r$   injectBCFrTleyzs
             r2   rL   zHEncLayer.__call__   s   yyQVVq[''KAq"a		!R#AyyBDKK1$!aT[[0@!ABCIIaL::H{{aAFFaK1d
+F
A

1A

1&A::yygg1b!KK1a+33B1=

1AyyIIaQ*44Q1a@<<  JJt||A/
  #FN4::dll1o#>?  Ar4   rJ   rP   rQ   rR   r;   rL   rT   rU   s   @r2   rW   rW   [   s1    
 =2~!r4   rW   c                  @     e Zd Zdddddddddi dddf fd	Zd Z xZS )	HDecLayerFrX   rY   r   Tc                   t         |           d }|
rfd}|r|dz  }nd}|| _        || _        | _        || _        || _        || _        || _        |
| _	        || _
        r|dg}|dg}t        ||||      | _        nt        ||||      | _         ||      | _        | j                  ry d | _        d| _        |rrB|rt#        |d|z  dd|z  z   d|      | _        n?t#        |d|z  ddd|z  z   gdd|g      | _        nt%        |d|z  dd|z  z   d|      | _        |
rt'        d|z        | _        d| _        n |d|z        | _        d | _        |	rt-        |fi || _        y y )	Nc                    t               S rJ   r\   r]   s    r2   r_   z#HDecLayer.__init__.<locals>.norm_fn   r`   r4   c                8    rt        |       S t        |       S rJ   rb   rc   s    r2   r_   z#HDecLayer.__init__.<locals>.norm_fn   rf   r4   rY   r   r   Frg   T)r:   r;   r!   lastrd   rs   rj   ri   rh   rk   context_freqr   conv_trr
   rq   ro   rm   r	   r   r   rn   rr   r   )rD   rs   rt   r   rh   ri   re   rj   rd   rr   rk   ru   rv   r!   r   ro   r_   rH   s         ` `        r2   r;   zHDecLayer.__init__   s   $ 		_"CC			
&	(&*Ka[F.tUKPDL-dE;ODLU^
::!#-dAHa!g+oqRY#ZDL#-dAHq!a'k/>RTUXY[bWc#dDL(q4xQ[!WU.{AHE
$(!$QX.

t0x0DJ r4   c                   | j                   r=|j                  dk(  r.|j                  \  }}}|j                  || j                  d|      }| j
                  s||z   }| j                  r^| j                  r!| j                  | j                  |            }n3 t        d      | j                  | j                  |                  }n|}| j                  r| j                   r6|j                  \  }}}}|j                  dddd      j                  d||      }| j                  |      }| j                   r)|j                        j                  dddd      }n|}| j                  | j                  |            }	| j                   r.| j                  rB|	d| j                  | j                   d d f   }	n |	d| j                  | j                  |z   f   }	| j                  st!        j"                  |	      }	|	|fS )Nrx   r   r   r   r   rg   .)rd   r"   r   ry   rs   rj   ro   rm   rn   r   rr   r{   rq   r   r!   r   r<   rz   )
rD   r$   skipr'   r}   r~   r   r   r   r   s
             r2   rL   zHDecLayer.__call__  s   991ggGAq!		!TYYA.AzzDA||$$

4<<?3A&Atzz$,,q/'BCAzz99"#''KAq"aAq!Q/77AqAAJJqM99		!RA.88Aq!DAAJJt||A'99xxc488TXXI-q01#txx6 1112Ayy
A!tr4   r   rU   s   @r2   r   r      s7    
 !?1Br4   r   c                  &     e Zd Z fdZddZ xZS )	MultiWrapc                    t         |           || _        g | _        t	        |t
              | _        t        t        |      dz         D cg c]  }t        |       c}| _        y c c}w )Nr   )
r:   r;   split_ratioslayers
isinstancerW   rl   rangelenr   )rD   layerr   _rH   s       r2   r;   zMultiWrap.__init__#  sY    (ui0	05c,6G!6K0LM0L1x0LMMs   A'c           	     l   |j                   \  }}}}t        | j                        dgz   }d}	g }
t        || j                        D ]!  \  }}| j
                  r|j                  dz  }|dk(  r|}d}nzt        t        ||z              }||	z
  }|	dk(  r||z  }t        ||j                  z
  |j                  z  dz         }|	|dz
  |j                  z  z   |j                  z   }|	dk(  r||z  }|d d d d |	|d d f   }|	dk(  rt        ||df      }|dk(  rt        |d|f      }|
j                   ||             ||j                  z
  |j                  z   }	|dk(  r|}nt        t        ||z              }|j                  }d|_        |d d d d |	|f   }|d d d d |	|f   } |||d       \  }}|
rR|
d   d d d d |j                   d fxx   |d d d d d |j                  f   z  cc<   |d d d d |j                  d f   }|dk(  r|d d d d d |j                   dz  d d f   }|	dk(  r|d d d d |j                  dz  d d d f   }|
j                  |       ||_        |}	$ t        j                  |
d      }| j
                  sst        j                   |      }| j
                  r|S |d fS )Nr   r   rY   r   Trg   r   )r   listr   zipr   rl   rh   rM   roundri   r3   appendr   r    r#   r<   rz   )rD   r$   r   r'   r}   r~   r   r   ratiosstartoutsratior   r!   limitframesr   r   r   soutr   s                         r2   rL   zMultiWrap.__call__*  s   gg1b!d''(A3.4LE5yy''1,A:EFb5j 12EBzc	"B):):$:ell#JQ#NOF!VaZ5<<$??%BSBSSEzaE%K*+A:a#q*AA:a!S*AE!H% 1 11ELL@A:Eb5j 12Ezz!
aE%K'(AuU{*+q!T*QHQELL=>12c!Q:M6NN2aELLM12CA:a$7ell]a%7$7:;CA:aELLA$5$69:CC !
S 5T nnT*yy''#,C99JDyr4   )NNr   rU   s   @r2   r   r   "  s    N4r4   r   c                       e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	Zd	dZd
ddZddZddZddZddZ	 xZ
S )
HDemucsMLXc$                *   t         :|           g t        d6i 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|d|d|d | d!|"d"|#f| _        |
| _        |	| _        || _        || _        || _        || _	        || _
        || _        || _        |"| _        |#| _        || _        |d#z  | _        t#        ||d#z  $      | _        || _        || _        d | _        || _        || _        |r|st1        d%      |r||k7  rt1        d&      g | _        g | _        |rg | _        g | _        |}$|$}%| j                  r|%d'z  }%|xs |}&|}'|d'z  }(t;        |      D ]  })|)|k\  }*|)|k\  }+|)|k\  },|(d(kD  }-|}.|}/|-s|d'z  }/|}.d)}0d*}1|-r|(|k  r|(}/d*}0d)}1|/|.|-|0|,|||*|+||| d)d+d,}2t        |2      }3d*|3d-<   ||3d<   ||3d<   d)|3d.<   t        |2      }4d*}5|r|)|k  rd)}5d*|4d/<   |1rt=        |&|'      }'|'}&t?        |%|'f|d(z  |d0|2}6|r1|-r/t?        |$|&f|d(z  ||1d1|3}7| j6                  jA                  |7       |5rtC        |6|      }6| j2                  jA                  |6       |)d2k(  r5| j                  tE        | j                        z  }$|$| j                  rd'nd(z  }%tG        |'|%f|d'z  |)d2k(  |d3|4}8|5rtC        |8|      }8|r6|-r4tG        |&|$f|d'z  |1|)d2k(  |d4|3}9| j8                  jI                  d2|9       | j4                  jI                  d2|8       |&}$|'}%tK        ||&z        }&tK        ||'z        }'|-r|(|k  rd(}(n|(|z  }(|)d2k(  s|stM        |(|%||5      | _        || _'         y )7Nsourcesaudio_channelschannelschannels_timegrowthnfftwiener_iters	end_iterswiener_residualcacdepthro   hybrid
hybrid_oldmulti_freqsmulti_freqs_depthfreq_emb	emb_scale
emb_smoothrh   time_strideri   ru   context_encnorm_startsre   
dconv_modedconv_depth
dconv_comp
dconv_attn
dconv_lstm
dconv_init
sampleratesegmentrY   )n_fft
hop_lengthz%hybrid_old must come with hybrid=Truez)Hybrid requires wiener_iters == end_itersrg   r   TF)lstmattnr   compressinitgelu_act)rh   ri   rd   r!   rk   ro   re   rv   rd   r!   r   )rr   ru   )rr   ru   rj   r   )rr   r   ru   )rr   rj   r   ru   )rG   rC    )(r:   r;   dict_init_args_kwargsr   r   r   r   rh   ru   ri   r   r   r   r   r   r   r   	_spectralr   r   r   r   r   
ValueErrorencoderdecodertencodertdecoderr   r   rW   r   r   r   r   insertrM   r6   freq_emb_scale);rD   r   r   r   r   r   r   r   r   r   r   r   ro   r   r   r   r   r   r   r   rh   r   ri   ru   r   r   re   r   r   r   r   r   r   rescaler   r   rs   chin_zrt   chout_zfreqsindexr   r   rk   rd   strikerr!   	last_freqkwkwtkw_decmultienctencdectdecrH   s;                                                             r2   r;   zHDemucsMLX.__init__b  s]   L 	"$d #'
#'
)#'
 #'
 (	#'

 #'
 #'
 &#'
  #'
 ,#'
 #'
 #'
 #'
 #'
 "#'
 $#'
  0!#'
" ##'
$  %#'
& "'#'
( $)#'
* $+#'
, -#'
. /#'
0 $1#'
2 $3#'
4 $5#'
6 "7#'
8 $9#'
: ";#'
< "=#'
> "?#'
@ "A#'
B "C#'
D E#'
 #"H .,&
 $	!)+$419M("$fDEEli/HIIDMDM88aKF)	5\EJ&DJ&DK'D19DDC!Ao"CI, 	  #"*  ( *& $B" r(CCK!,C"CMCJ"XFEu'88).~&eW-FG]:>;]Z\]C$ %A'1A~'yA<?A $$T*[1LL$z**S->>dhhA6<'1A~aZ<4:<C [1$  %q.#!#  $$Q-LL3'DF'E&7*+GK'Ef$Ezh /vjXa b&.#{ "r4   c                   | j                   }| j                  rt        t        j                  |j
                  d   |z              }|dz  dz  }| j                  s't        |||||z  z   |j
                  d   z
  fd      }n$t        |||||z  z   |j
                  d   z
  f      }| j                  j                  |      dd dd d f   }| j                  r|dddz   f   }|S )Nr   rg   rx   r   )r   .)
r   r   rM   mathceilr   r   r3   r   stft)rD   r$   hlr   r!   r   s         r2   _speczHDemucsMLX._spec3  s    __;;TYYqwwr{R/01B'A+C??!c3b=1772;#>?iP!c3b=1772;#>?@NN"3Q;/;;#qRx- Ar4   c                   | j                   d|z  z  }d	d} ||g d      }| j                  r ||g d      }|dz  dz  }| j                  s+|t        t	        j
                  ||z              z  d|z  z   }n$|t        t	        j
                  ||z              z  }| j                  j                  ||      }| j                  s|d|||z   f   }|S |dd |f   }|S | j                  j                  ||      }|S )
NrY   c                    | j                   t        |      z
  }|dk  rt        d      dg|z  |z   }t        j                  | |      S )Nr   z!pad spec has more dims than arrayr   )r"   r   r   r    r!   )arrpadslead	full_padss       r2   _pad_last_dimsz)HDemucsMLX._ispec.<locals>._pad_last_dimsE  sH    88c$i'Dax !DEE4$.I66#y))r4   )r   )r   r   r   )r   r   )rg   rg   rg   rx   )r'   .)r   mx.arrayr   ztp.List[tp.Tuple[int, int]])r   r   r   rM   r   r   r   istft)	rD   r   r'   rC   r   r   r!   r   r$   s	            r2   _ispeczHDemucsMLX._ispecC  s
   __e,	* 167;;q":;A'A+C??#dii455C?#dii455$$Qr$2A??c3sV|++,
  c7F7lO  $$Qv$6Ar4   c                   | j                   rg|j                  \  }}}}t        j                  t        j                  |      t        j
                  |      gd      j                  ||dz  ||      }|S t        j                  |      }|S )Nrg   r   )r   r   r    stackrealimagry   abs)rD   r   r}   r~   r   r   ms          r2   
_magnitudezHDemucsMLX._magnitude_  sp    88''KAq"a"''!*bggaj1:BB1a!eRQRSA  q	Ar4   c                L   | j                   }| j                  rN|j                  \  }}}}}|j                  ||dd||      j	                  dddddd      }	|	d   }
|	d	   }|
d
|z  z   S |dk  r'|d d d f   }|dt        j                  |      z   z  |z  S | j                  |||      S )Nr   rg   r   r   rY      rx   .r   .r                 ?g:0yE>)r   r   r   ry   r{   r    r   _wiener)rD   r   r   nitersr}   Sr~   r   r   r   r   r   s               r2   _maskzHDemucsMLX._maskg  s    ""88WWNAq!R))Aq"aQ/99!Q1aKCv;Dv;D"t)##A:!T'
Arvvay()A--||Aq&))r4   c                   |j                   }d| j                  |j                  \  }}}}|j                  ddddd      }	t	        j
                  t	        j                  |      t	        j                  |      gd      }
|
j                  ddddd      }fd	} t	        j                  |      |	|      }r|d
d dd d f   }|j                  dddddd      }|d   d|d   z  z   }|j                  |      S )Ni,  r   rY   rx   rg   r   r   r   c           
         g }t        d	      D ]J  }t        ||	z         }t        | |   ||         }|j                  |j	                  ddddd             L t        j                  |d      S )Nr   )residualr   rg   rY   rx   r   )r   slicer   r   r{   r    r#   )

mag_sample
mix_sample
out_chunksposframez_outr   r  r
  wiener_win_lens
         r2   _process_one_samplez/HDemucsMLX._wiener.<locals>._process_one_sample  s    JQ>2c3#78u%u%%	 !!%//!Q1a"@A 3 >>*155r4   .r   r  r  r  )
r9   r   r   r{   r    r   r   r   vmapastype)rD   mag_outmix_stftr  r   r}   r  r~   Fq
mag_out_mxmix_stft_rimix_stft_mxr  r   r   r
  r  s      `          @@@r2   r  zHDemucsMLX._wienert  s    ~~'' 1aQ&&q!Q15
hh 127783DEBO!++Aq!Q:	6 +bgg)*:{Cc3B3k"CmmAq!Q1-&kBV,,zz$r4   c                H   |}|j                   d   }| j                  |      }| j                  |      }|}|j                   \  }}}}	t        j                  |dd      }
t        j
                  |dd      }||
z
  d|z   z  }| j                  r=|}t        j                  |dd      }t        j
                  |dd      }||z
  d|z   z  }g }g }g }g }t        | j                        D ]:  \  }}|j                  |j                   d          d }| j                  rm|t        | j                        k  rU|j                  j                   d          | j                  |   } ||      }|j                  s|j                  |       n|} |||      }|dk(  r|| j                  pt        j                  |j                   d   t        j                  	      }| j                  |      j!                  d
d      d d d d d d f   }|| j"                  |z  z   }|j                  |       = t        j$                  |      }| j                  rt        j$                  |      }t        | j&                        D ]  \  }}|j)                  d      } ||||j)                  d            \  }}| j                  r"| j*                  t        | j,                        z
  }| j                  sn|k\  st| j,                  ||z
     }|j)                  d      }|j                  r|d d d d df   } ||d |      \  }}|j)                  d      }  || |      \  }} t        |      dk7  st        |      dk7  st        |      dk7  rt/        d      t        | j0                        }!|j3                  ||!d||	      }||d d d f   z  |
d d d f   z   }| j5                  ||      }"| j7                  |"|      }| j                  r/j3                  ||!d|      }|d d d f   z  d d d f   z   }||z   }|S )Nr   )r   rg   rx   T)r   keepdimsgh㈵>)r   rg   r   r8   r   z#Skip connections not fully consumed)r   r   r   r    meanstdr   	enumerater   r   r   r   rj   r   rB   int32r{   r   
zeros_liker   popr   r   RuntimeErrorr   ry   r  r   )#rD   mixr$   r'   r   magr}   r~   r  r   r  r   xtmeantstdtsavedsaved_tlengths	lengths_tidxencoder|   r   frsembdecoder   preoffsetr   length_tr   skip_tr  zouts#                                      r2   rL   zHDemucsMLX.__call__  s   JJsOooa gg1b!wwqy48ffQY6X$*%;;BGGBVd;E66"6D9Du*-B	$T\\2KCNN1772;'F{{sS%77  ".}}S)"XzzNN2&Fq&!AaxDMM5ii288<mmC(221a8q!T9IJ++c11LLO! 3$ MM!;;q!B$T\\2KC99R=DAtW[[_5FAs{{c$--&88{{sf}}}S6\2$==,::aAg,C dH5EB$[[_F VX6EB 3 u:?c)n1S\Q5FDEEIIaBA&AtGtAtG},zz!QKKf%;;Aq"f-Bd1d7m#eAtGn4BQAr4   )"rg   0   Nrg   i   r   r   FT   TTFNrg   g?
   TrX   rg   rY   r   r   rY   rY   r   rg   rY   rY   rY   g-C6?g?iD  (   )r$   r   returnr   )Nr   )r   r   r'   ztp.Optional[int]rC   rM   r=  r   )r   r   r=  r   )r   r   r   r   r=  r   )r  r   r  r   r  rM   r=  r   )r&  r   r=  r   )rP   rQ   rR   r;   r   r   r   r  r  rL   rT   rU   s   @r2   r   r   a  s     IO/b 8* BJr4   r   )r   g        )r$   r   r%   ztp.Tuple[int, int]r   strr&   rN   )'__doc__
__future__r   r   typingtpcopyr   mlx.corecorer    mlx.nnr<   
mlx_demucsr   
mlx_layersr   r   r	   r
   r   r   r   r   r   r   	mlx_utilsr   spec_mlxr   
wiener_mlxr   r3   Moduler6   rW   r   r   r   r   r4   r2   <module>rM     s    #         ) ( #L.bii .,a		 aH`		 `F<		 <~~"BII ~r4   