
    i\S                       U 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mZmZ ddlmZmZmZ i Zded	<   d%d
Zd&dZi Zded<   d'dZd(dZd)dZd)dZd*dZ ed      d+d       Zd,dZ d)dZ!d-d.dZ" G d dejF                        Z$ G d dejF                        Z% G d dejF                        Z& G d d ejF                        Z' G d! d"ejF                        Z( G d# d$eejF                        Z)y)/z
MLX implementation of Demucs (inference-only).
Optimized and Corrected: 
- Fixed GroupNorm reshape bug for 3D tensors.
- Uses optimized matmul/sigmoid.
- Removed Method-level JIT to prevent runtime binding errors.
    )annotationsN)	lru_cache   )	Conv1dNCLConvTranspose1dNCLLambda)MLXStateDictMixincenter_trimunfoldz&dict[tuple[int, float, str], mx.array]_RESAMPLE_FIR_CACHEc           	        | dz  dk(  rt        d      t        |       t        |      t        |      f}t        j                  |      }||S t        j                  | t        j                        }| dz
  dz  }||z
  }dt        |      z  |z  }t        j                  |dk(  t        j                  |      t        j                  t        j                  |z        t        j                  |z  z        }	ddt        j                  dt        j                  z  |z  t        | dz
        z        z  z
  }
dt        |      z  |	z  |
z  }|t        j                  |      z  }|j!                  |      }|t        |<   |S )a'  Design a symmetric low-pass FIR using a Hann-windowed sinc.

    Args:
        numtaps: odd number of taps (e.g., 63)
        cutoff_cycles: cutoff in cycles/sample (Nyquist=0.5)
        dtype: mx.float32 / mx.float16, etc.

    Returns:
        (numtaps,) filter, normalized to DC gain 1.0
       r   z0numtaps must be odd for symmetric 'same' paddingdtyper          @      ?)
ValueErrorintfloatstrr   getmxarangefloat32where	ones_likesinmathpicossumastype)numtapscutoff_cyclesr   keyhnMtxsincws              j/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/demucs_mlx/mlx_demucs.py_lowpass_fir_hannr.   !   sH    {aKLLw<}-s5z
:C$A}
		',A	1A	AA 	eM""Q&A88AFBLLORVVDGGaK-@DGGaK-PQD 	cBFF3=1,uWq[/AABBBA	u]#	#t+a/A	BFF1IA	A H    c                   | j                   d   }|dk  r/t        j                  | dg| j                  dz
  z  ||fgz   d      S g }|dkD  r%| dd|dz   f   ddddf   }|j	                  |       |j	                  |        |dkD  r&| d| dz
  df   ddddf   }|j	                  |       t        j
                  |d	      S )
z;Reflect-pad on the last dimension. Works for any ndim >= 1.r   r   r   edgemoder   .Naxis)shaper   padndimappendconcatenate)r*   pad_left	pad_rightLpartsleftrights          r-   _reflect_pad_lastrC   H   s    	AAvvva&QVVaZ0Xy4I3JJQWXXE!|aAo%&sDbDy1T	LLO1}#	zA~r))*3"95U>>%b))r/   z dict[tuple[int, str], nn.Conv1d]_RESAMPLE_CONV_CACHEc           	     N   | t        |      f}t        j                  |      }||S t        |j                  d         }t        j                  | | |ddd|       }t        j                  |j                  ddd      | |df      }||_
        |j                          |t        |<   |S )zKGet or create a depthwise Conv1d that applies FIR filter h to each channel.r   r   F)in_channelsout_channelskernel_sizestridepaddingbiasgroupsr1   )idrD   r   r   r8   nnConv1dr   broadcast_toreshapeweighteval)num_channelsr&   r%   convkr,   s         r-   _get_depthwise_fir_convrW   \   s    A
C##C(DAGGAJA99 !D 			!R+lAq-ABADKIIK $Kr/   c                    t        |j                  d         }|dz  }t        | ||      }|j                  ddd      }| j                  d   }t	        ||      } ||      }|j                  ddd      S )zADepthwise FIR 'same' conv for x in (N, C, L) using native Conv1d.r   r   r   )r   r8   rC   	transposerW   )	r*   r&   rV   r9   xpadxpad_nlcCrU   ys	            r-   _conv1d_same_nclr^   w   sq    AGGAJA
q&CQS)D~~aA&H	
A"1a(DXA;;q!Qr/   c                h   | j                   \  }}}t        j                  | t        j                  |       gd      j	                  ||d|z        }t        ddt        j                        }t        |j                  t        j                        |      dz  }|j                  | j                        S )z1Upsample by 2 with zero-insertion + low-pass FIR.r1   r6   r   ?         ?r#   r$   r   r   )
r8   r   stack
zeros_likerQ   r.   r   r^   r"   r   )r*   Br\   r?   x_upr&   r]   s          r-   _resample_2xrg      s    ggGAq!88Qa()3;;Aq!a%HD 	"D

KARZZ0!4s:A88AGGr/   c                    t        ddt        j                        }t        | j	                  t        j                        |      }|ddddf   }|j	                  | j
                        S )z/Downsample by 2 with low-pass FIR + decimation.r`   ra   rb   .Nr   )r.   r   r   r^   r"   r   )r*   r&   r]   s      r-   _resample_halfri      sQ    "D

KA"**-q1A	#ss(A88AGGr/   c                b    t        t        |       rt        t        |       S t        j                  S N)hasattrr   getattrr   )	dtype_strs    r-   _dtype_from_strro      s#    r9r9%%::r/       )maxsizec                    t        |      }t        j                  | |      }|d d d f   |d d d f   z
  }t        j                  | t        j                        }||fS Nr   )ro   r   r   eyebool_)Trn   r   indexesdeltart   s         r-   _localstate_delta_eye_cachedry      sV    I&Eii'GAtGwtQw//E
&&"((
#C#:r/   c                   t        |       } | dkD  rgt        t        |            }t        j                  | |      }|d d d f   |d d d f   z
  }t        j
                  | t        j                        }||fS t        | t        |            S )Ni'  r   )r   ro   r   r   r   rt   ru   ry   )rv   r   	dtype_objrw   rx   rt   s         r-   _localstate_delta_eyer|      s{    AA5y#CJ/	))AY/4 747#33ffQbhh'cz'3u:66r/   c                ,    t        j                  |       S rk   )rN   gelur*   s    r-   r~   r~      s    771:r/   c                h    t        j                  | d|      \  }}|t        j                  |      z  S )Nr   r6   )r   splitsigmoid)r*   r7   abs       r-   glur      s+    88Aqt$DAqrzz!}r/   c                  *     e Zd Zdd fdZddZ xZS )	GroupNormc                   t         |           t        |      | _        t        |      | _        t        |      | _        t        |      | _        | j                  rWt        j                  |ft        j                        | _        t        j                  |ft        j                        | _        y d | _        d | _        y rs   )super__init__r   
num_groupsrT   r   epsboolaffiner   onesr   rR   zerosrK   )selfr   rT   r   r   	__class__s        r-   r   zGroupNorm.__init__   s    j/-:6l;;''</DDK,

CDIDKDIr/   c                   |j                   d   |j                   d   }}| j                  }||z  dk7  rt        d| d|        |j                  ||||z  g|j                   dd   }t	        t        d|j                              }|j                  |d      }t        j                  ||d      }||z
  t        j                  || j                  z         z  }	|	j                  |j                         }
| j                  rRd|gdg|
j                  dz
  z  z   }|
| j                  j                  |      z  | j                  j                  |      z   }
|
S )Nr   r   znum_channels z not divisible by num_groups r   Tr7   keepdims)r8   r   r   rQ   tupleranger:   meanr   varrsqrtr   r   rR   rK   )r   r*   re   r\   G
x_reshapedaxesr   r   x_normx_outr8   s               r-   __call__zGroupNorm.__call__   s8   wwqz1771:1OOq5A:}QC/LQCPQQ QYYq!Q!V:aggabk:
 U1joo./D48ffZdT: t#rxxdhh'?? qww';;FaSEJJN33EDKK//669J9J59QQEr/   )h㈵>T)r   r   rT   r   r   r   r   r   r*   mx.arrayreturnr   __name__
__module____qualname__r   r   __classcell__r   s   @r-   r   r      s    r/   r   c                  *     e Zd Zdd fdZddZ xZS )
LayerScalec                    t         |           t        |      | _        t	        j
                  |ft        j                        t        |      z   | _        y rs   )	r   r   r   channel_lastr   r   r   r   scale)r   channelsinitr   r   s       r-   r   zLayerScale.__init__   s<     .XXxk<uT{J
r/   c                d    | j                   r|| j                  z  S || j                  d d d f   z  S rk   )r   r   )r   r*   s     r-   r   zLayerScale.__call__   s1    tzz>!4::ag&&&r/   )g        F)r   r   r   r   r   r   r   r   r   s   @r-   r   r      s    K
'r/   r   c                  <     e Zd Z	 	 d	 	 	 	 	 	 	 d fdZddZ xZS )BLSTMc                   t         |           || _        || _        || _        t        |      D cg c]#  }t        j                  |dk(  r|nd|z  |      % c}| _        t        |      D cg c]#  }t        j                  |dk(  r|nd|z  |      % c}| _	        t        j                  d|z  |      | _        y c c}w c c}w )Nr   r   )
input_sizehidden_size)r   r   	max_stepsskiplayersr   rN   LSTMforward_lstmsbackward_lstmsLinearlinear)r   dimr   r   r   ir   s         r-   r   zBLSTM.__init__   s     	"	 6]
" GGa1fs!c'sK"
 6]
" GGa1fs!c'sK"
 iiC-

s   (B>/(Cc           	         |j                   \  }}}|}d}| j                  d|| j                  kD  rU| j                  }|dz  }t        |||      }	|	j                   d   }
d}|	j                  dddd      j	                  d||      }n|j                  ddd      }|}t        | j                  | j                        D ]R  \  }} ||      \  }}|d d d d dd d f   } ||      \  }}|d d d d dd d f   }t        j                  ||gd      }T | j                  |      }|j                  ddd      }|rg }|j	                  |d|      }	dz  }t        
      D ]m  }|dk(  r |j                  |	d d |d d d | f          (||
dz
  k(  r|j                  |	d d |d d |d f          O|j                  |	d d |d d || f          o t        j                  |d      }|d	d |f   }|}| j                  r||z   }|S )
NFr   Tr      r   r1   r6   .)r8   r   r   rY   rQ   zipr   r   r   r<   r   r   r;   r   )r   r*   re   r\   rv   r]   framedwidthrI   framesnframesseqlstm_flstm_bf_out_b_inb_outoutlimitrV   s                        r-   r   zBLSTM.__call__	  s   ''1a>>%!dnn*<NNEaZFAuf-Fll1oGF  Aq!,44RBAAq!$A!$"4"4d6I6IJNFFc{HE1q$B$z?Dd|HE1!TrT1*%E..%b9C K KKKK1a CYYq"a/FaKE7^6JJvaAww&678'A+%JJvaAuvo67JJvaAueV|&;<= $ ..2.Cc2A2g,CA99AAr/   )r   NF)r   r   r   r   r   ztp.Optional[int]r   r   r   r   r   s   @r-   r   r      s3    &'9>.. #.#.26.$+r/   r   c                  *     e Zd Zdd fdZddZ xZS )
LocalStatec                @   t         |           ||z  dk7  rt        d| d|       || _        || _        || _        t        ||d      | _        t        ||d      | _        t        ||d      | _	        |rt        |||z  d      | _
        |rzt        |||z  d      | _        | j                  j                  xj                  dz  c_        | j                  j                  j                  dz
  | j                  j                  _        t        |||z  z   |d      | _        y )Nr   z	channels z not divisible by heads r   g{Gz?r   )r   r   r   headsnfreqsndecayr   contentqueryr%   query_freqsquery_decayrU   rR   rK   proj)r   r   r   r   r   r   s        r-   r   zLocalState.__init__8  s
   eq y
2J5'RSS
 8Q7x15
Xx3(56>1ED(56>1ED!!((D0()-)9)9)>)>)C)Ca)GD!!&h71E	r/   c                x   |j                   \  }}}| j                  }t        ||j                        \  }}| j	                  |      j                  ||d|      }| j                  |      j                  ||d|      }	|	j                  dddd      }
t        j                  |
|      }|dt        j                  |	j                   d         z  z  }| j                  rt        j                  d| j                  dz   |j                        }t        j                  dt        j                  z  |z  |j                  ddd      z        }| j!                  |      j                  ||d|      }dt        j                  | j                        z  }|t        j"                  d|||z        z   }| j$                  rt        j                  d| j$                  dz   |j                        }| j'                  |      j                  ||d|      }t        j(                  |      d	z  }||j                  dddd      z  j+                  d
      }t        j,                  |      }dt        j                  | j$                        z  }||j                  dd||      |j                  ||d|      z  |z  z
  }t        j.                  |t        j0                  d|j                        |      }t        j2                  |d
      }| j5                  |      j                  ||d|      }|j                  dddd      }t        j                  ||      }|j                  dddd      }| j                  r0t        j"                  d|      }t        j6                  ||gd
      }|j                  |d|      }|| j9                  |      z   S )Nr1   r   r   r   r   g      ?r   zfts,bhfs->bhtsr   r6   g      Yzbhts,fts->bhfs)r8   r   r|   r   r   rQ   r%   rY   r   matmulr   sqrtr   r   r    r   r   einsumr   r   r   r!   absr   arraysoftmaxr   r<   r   )r   r*   re   r\   rv   r   rx   rt   querieskeyskeys_tdotsperiodsfreq_kernelfreq_q
freq_scaledecaysdecay_qcoeff	abs_deltadecay_scaleweightsr   	content_tresult_tresulttime_sigs                              r-   r   zLocalState.__call__J  s$   ''1a

*1agg6
s**Q-''5"a8xx{""1eR3 1a+yy)sTYYtzz!}556;;ii4;;?!''BG&&TWWu!4wr1a7P!PQK%%a(00E2qAFtyy55J")) +v
/BD DD ;; YYq$++/AF&&q)11!UBBGjj)C/Gv~~aB::??Q?GEuI		$++ 66K!!!Q1---5!Q/0D xxRXXfDJJ?F**T*,,q/))!UB:%%aAq1	99Wi0##Aq!Q/;;yy!17KHH^^VX$6Q?F2q)499V$$$r/   )   r   r   )r   r   r   r   r   r   r   r   r   r   r   s   @r-   r   r   7  s    F$8%r/   r   c                  n     e Zd Z	 	 	 	 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZ xZS )DConvc                \   t         |           |dz  dk7  rt        d      || _        || _        t        |      | _        |dkD  }dfd}t        ||z        }|
rt        nd }xr |
}g | _	        t        | j                        D ]!  }|rd|z  nd}||dz  z  }|rFddlm}m}  |d|      }t        j                         } |dd|z        }t        j                         }n* ||      }t!        |      } |d|z        }t!        d       }t#        |||||	      ||t#        |d|z  d      ||t%        ||      g}|r|j'                  d
t)        |||             |	r|j'                  d
t+        |ddd             | j                  j-                  t        j.                  |        $ y )Nr   r   zkernel must be oddr   c                H    rt        d|       S t        j                         S )Nr   )r   rN   Identity)dnorms    r-   norm_fnzDConv.__init__.<locals>.norm_fn  s     A&;;= r/   c                .    t        j                  | d      S Nr   r   maximumr   s    r-   <lambda>z DConv.__init__.<locals>.<lambda>  s    rzz!Q/?r/   )FusedGroupNormGELUFusedGroupNormGLUc                    t        | d      S Nr   r6   r   r   s    r-   r  z DConv.__init__.<locals>.<lambda>  s
    3qq>r/   )dilationrJ   r   )r   r      T)r   r   r   )r   r   r   z	nn.Module)r   r   r   r   compressr   depthr   r~   r   r   
mlx_layersr  r  rN   r   r   r   r   insertr   r   r;   
Sequential)r   r   r  r  r   r   attnr   r   lstmgelu_actkerneldilater   hiddenactuse_fused_gn_gelur   r	  rJ   r  r  	norm1_modact_mod	norm2_modglu_modmodsr   s        `                     r-   r   zDConv.__init__  s    	A:?122  Z
	!
 X()d%? !-Xtzz"A!'qAvQH&A+.G M /q&9	++--aX>	++-#FO	 +#AL1	 !9:(FFXwW&!h,28T*(D Az&fMNAuVA4PQKKr}}d34= #r/   c                >    | j                   D ]  }| ||      z   } |S rk   )r   )r   r*   layers      r-   r   zDConv.__call__  s"    [[EE!HA !r/   )r   r   -C6?TFr   r   FTr   T)r   r   r  r   r  r   r   r   r   r   r  r   r   r   r   r   r  r   r  r   r  r   r  r   r   r   r   s   @r-   r   r     s     B5B5 B5 	B5
 B5 B5 B5 B5 B5 B5 B5 B5 B5Hr/   r   c                  ^     e Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd	ZddZddZ xZS )	DemucsMLXc           
     |   t         %|           || _        || _        || _        |
| _        |	| _        || _        || _        || _	        || _
        || _        || _        g | _        g | _        g | _        |rd }d}nd }d}|rt         nd }|}d}t#        |      D ]  }d }||k\  rfd}t%        ||||	       ||      t'        |      g} ||k\  }!||k\  }"|dz  r| t)        |||||!|"	      gz  } |r(| t%        |||z  d       |||z        t'        |      gz  } | j                  j+                  t-        j.                  |         g }#|dkD  r|}$nt1        | j                        |z  }$|r0|#t%        |||z  d|
z  dz   |

       |||z        t'        |      gz  }#|dz  r|#t)        |||||!|"	      gz  }#|#t3        ||$||	|
      gz  }#|dkD  r|# ||$      t'        |      gz  }#| j                  j5                  dt-        j.                  |#        |}t7        ||z        } |}|rt9        ||      | _        y d | _        y )Nc                    t        | d      S r  r  r   s    r-   r  zDemucsMLX.__init__.<locals>.act  s    11~%r/   r   c                .    t        j                  | d      S r   r  r   s    r-   r  zDemucsMLX.__init__.<locals>.act  s    zz!Q''r/   r   c                .    t        j                  | d      S r   r  r   s    r-   r  z$DemucsMLX.__init__.<locals>.<lambda>  s    

1a0@r/   r   c                *    t        j                         S rk   )rN   r   )r   s    r-   r   z#DemucsMLX.__init__.<locals>.norm_fn	  s    {{}$r/   c                    t        |       S rk   )r   )r   norm_groupss    r-   r   z#DemucsMLX.__init__.<locals>.norm_fn  s    $[!44r/   )r  r   r  r  r  )rJ   )r   r   audio_channelssourcesrH   contextrI   r  resampler   	normalize
sampleratesegmentencoderdecoderskip_scalesr~   r   r   r   r   r;   rN   r  lenr   r  r   r   r  )&r   r*  r)  r   growthr  rewritelstm_layersrH   rI   r+  r  glu_actnorm_startsr(  
dconv_modedconv_depth
dconv_comp
dconv_attn
dconv_lstm
dconv_initr-  r,  r.  r/  r  ch_scaleact2rF   rJ   indexr   encoder  r  decoderG   r   s&                 `                      r-   r   zDemucsMLX.__init__  s   6 	,&
  "$&H(Ht&@$5\E%#5 +xfE!tF
 J&DJ&DA~5:*44dL M Mh8(;Q?Hx/03K 
 LLv 67Fqy*"4<<0>Ah8(;Q[1_V]^Hx/03K 
 A~5:*44dL M M),V! " "F qy7<0&,??LL2==&#9:"K6H,-H] "` h4DIDIr/   c                   | j                   r|dz  }t        | j                        D ]@  }t        j                  || j
                  z
  | j                  z        dz   }t        d|      }B t        | j                        D ]!  }|dz
  | j                  z  | j
                  z   }# | j                   rt        j                  |dz        }t        |      S )Nr   r   )	r,  r   r  r   ceilrH   rI   maxr   )r   lengthr   s      r-   valid_lengthzDemucsMLX.valid_length>  s    ==aKFtzz"AYY)9)9 9T[[HIAMFF^F # tzz"AqjDKK/$2B2BBF #==YYvz*F6{r/   c           	        |}|j                   d   }| j                  rTt        j                  |dd      }t        j                  |dd      }t        j                  |dd      }||z
  d|z   z  }nd}d}| j                  |      |z
  }t        j                  |dd|dz  ||dz  z
  fgd	
      }| j                  rt        |      }g }| j                  D ]  }	 |	|      }|j                  |        | j                  r| j                  |      }| j                  D ]*  }
|j                  d      }t        ||      } |
||z         }, | j                  rt        |      }||z  |z   }t        ||      }|j!                  |j                   d   t#        | j$                        | j&                  |j                   d         }|S )Nr1   r   Tr   r   r   r2   r   constantr4   )r8   r-  r   r   stdrH  r9   r,  rg   r0  r;   r  r1  popr
   ri   rQ   r3  r*  r)  )r   mixr*   rG  monor   rK  rx   savedrB  rC  r   s               r-   r   zDemucsMLX.__call__J  s   >>773Q6D774b48D&&B6CTdSj)ADC!!&)F2FF1vv
EEQJ4F'GHzZ==QAllFq	ALLO # 99		!AllF99R=DtQ'Dq4x A #
 ==q!AGdN6"IIaggaj#dll"3T5H5H!''RT+Vr/   )r   @   r      Tr      r   r   TTr   r   r   r   r   r   r   r  TTiD  (   )rG  r   r   r   )rM  r   r   r   )r   r   r   r   rH  r   r   r   s   @r-   r!  r!    s[     3kZ
&r/   r!  )r#   r   r$   r   r   mx.Dtyper   r   )r*   r   r=   r   r>   r   r   r   )rT   r   r&   r   r   z	nn.Conv1d)r*   r   r&   r   r   r   r   )rn   r   r   rT  )rv   r   rn   r   r   tp.Tuple[mx.array, mx.array])rv   r   r   rT  r   rU  )r   )r*   r   r7   r   r   r   )*__doc__
__future__r   r   typingtp	functoolsr   mlx.corecorer   mlx.nnrN   r  r   r   r   	mlx_utilsr	   r
   r   r   __annotations__r.   rC   rD   rW   r^   rg   ri   ro   ry   r|   r~   r   Moduler   r   r   r   r   r!   r/   r-   <module>rb     s    #      = = = = ?A ; @$N*" :< 6 ;6 
 2 7
(		 (V	' 	'>BII >BK% K%\HBII HV`!299 `r/   