Ë
    îÿæi3  ã                   ó  — 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„ Z
dd„Z G d„ dej                  «      Z G d	„ d
ej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Zy)é    N)Úpartialé   ©Úswigluc                 óÐ   — |j                   �^ }}|j                  «       }t        j                  |«      }t        j                  |«      }| j                  dd«      ||z     ||   |fS )Nr   éýÿÿÿ)ÚshapeÚflattenÚmxÚargsort)ÚxÚindicesÚ_ÚMÚorderÚ	inv_orders         úp/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_lm/models/switch_layers.pyÚ_gather_sortr      s\   € Ø�M‰M�E€QˆØ�o‰oÓ€GÜ�J‰J�wÓ€EÜ—
‘
˜5Ó!€IØ�9‰9�Q˜Ó˜E Q™JÑ'¨°©¸ÐBÐBó    c                 óB   — | |   } |�t        j                  | d|«      } | S ©Nr   )r   Ú	unflatten)r   r   r	   s      r   Ú_scatter_unsortr      s(   € Ø	ˆ)‰€AØÐÜ�L‰L˜˜A˜uÓ%ˆØ€Hr   c                   ó~   ‡ — e Zd Z	 	 	 	 ddededededededefˆ fd„Zed	„ «       Zed
„ «       Z	ed„ «       Z
dd„Zˆ xZS )ÚQuantizedSwitchLinearÚ
input_dimsÚoutput_dimsÚnum_expertsÚbiasÚ
group_sizeÚbitsÚmodec           	      óˆ  •— t         ‰
| �  «        t        j                  d|z  «      }t	        j
                  t        j                  j                  | ||||f¬«      |||¬«      ^| _        | _	        }	|	r|	d   nd | _
        |rt	        j                  ||f«      | _        || _        || _        || _        | j!                  «        y )Nr   ©ÚlowÚhighr	   )r    r!   r"   r   )ÚsuperÚ__init__ÚmathÚsqrtr   ÚquantizeÚrandomÚuniformÚweightÚscalesÚbiasesÚzerosr   r    r!   r"   Úfreeze)Úselfr   r   r   r   r    r!   r"   Úscaler0   Ú	__class__s             €r   r(   zQuantizedSwitchLinear.__init__   s¸   ø€ ô 	‰ÑÔä—	‘	˜!˜j™.Ó)ˆÜ,.¯K©KÜ�I‰I×ÑØ�FØØ" K°Ð<ð ó ð
 "ØØô	-
Ð)ˆŒ�T”[ 6ñ $*�f˜Q’i¨tˆŒáÜŸ™ +¨{Ð!;Ó<ˆDŒIà$ˆŒØˆŒ	ØˆŒ	ð 	�‰�r   c                 óN   — | j                   j                  d   | j                  z  S ©Né   )r/   r	   r    ©r3   s    r   r   z QuantizedSwitchLinear.input_dims?   s    € à�{‰{× Ñ  Ñ# d§o¡oÑ5Ð5r   c                 ó4   — | j                   j                  d   S ©Nr   ©r.   r	   r9   s    r   r   z!QuantizedSwitchLinear.output_dimsC   ó   € à�{‰{× Ñ  Ñ#Ð#r   c                 ó4   — | j                   j                  d   S r   r<   r9   s    r   r   z!QuantizedSwitchLinear.num_expertsG   r=   r   c                 óð   — t        j                  || d   | d   | j                  d«      |d| j                  | j                  | j
                  |¬«
      }d| v r|t        j                  | d   |   d«      z   }|S )Nr.   r/   r0   T)Úrhs_indicesÚ	transposer    r!   r"   Úsorted_indicesr   éþÿÿÿ)r   Ú
gather_qmmÚgetr    r!   r"   Úexpand_dims©r3   r   r   rB   s       r   Ú__call__zQuantizedSwitchLinear.__call__K   sw   € Ü�M‰MØØ�‰NØ�‰NØ�H‰H�XÓØØØ—‘Ø—‘Ø—‘Ø)ô
ˆð �T‰>Ø”B—N‘N 4¨¡<°Ñ#8¸"Ó=Ñ=ˆAØˆr   )Té@   é   Úaffine©F)Ú__name__Ú
__module__Ú__qualname__ÚintÚboolÚstrr(   Úpropertyr   r   r   rH   Ú__classcell__©r5   s   @r   r   r      sœ   ø„ ð ØØØñ!àð!ð ð!ð ð	!ð
 ð!ð ð!ð ð!ð õ!ðF ñ6ó ð6ð ñ$ó ð$ð ñ$ó ð$÷r   r   c            	       ó‚   ‡ — e Zd Z	 ddedededefˆ fd„Zed„ «       Zed„ «       Zed„ «       Z	dd	„Z
dd
ededefd„Zˆ xZS )ÚSwitchLinearr   r   r   r   c                 óæ   •— t         ‰| �  «        t        j                  d|z  «      }t        j
                  j                  | ||||f¬«      | _        |rt	        j                  ||f«      | _	        y y )Nr   r$   )
r'   r(   r)   r*   r   r,   r-   r.   r1   r   )r3   r   r   r   r   r4   r5   s         €r   r(   zSwitchLinear.__init__^   sn   ø€ ô 	‰ÑÔÜ—	‘	˜!˜j™.Ó)ˆÜ—i‘i×'Ñ'Ø�ØØ ¨ZÐ8ð (ó 
ˆŒñ ÜŸ™ +¨{Ð!;Ó<ˆD�Ið r   c                 ó4   — | j                   j                  d   S r7   r<   r9   s    r   r   zSwitchLinear.input_dimsl   r=   r   c                 ó4   — | j                   j                  d   S r;   r<   r9   s    r   r   zSwitchLinear.output_dimsp   r=   r   c                 ó4   — | j                   j                  d   S r   r<   r9   s    r   r   zSwitchLinear.num_expertst   r=   r   c                 ó¤   — t        j                  || d   j                  dd«      ||¬«      }d| v r|t        j                  | d   |   d«      z   }|S )Nr.   éÿÿÿÿrC   )r@   rB   r   )r   Ú	gather_mmÚswapaxesrF   rG   s       r   rH   zSwitchLinear.__call__x   sY   € Ü�L‰LØØ�‰N×#Ñ# B¨Ó+ØØ)ô	
ˆð �T‰>Ø”B—N‘N 4¨¡<°Ñ#8¸"Ó=Ñ=ˆAØˆr   r    r!   r"   c           	      ó  — | j                   j                  \  }}}t        |||d|||¬«      }t        j                  | j                   |||¬«      ^|_         |_        }|r|d   nd |_        d| v r| j                  |_        |S )NF)r"   r   r   )r.   r	   r   r   r+   r/   r0   r   )	r3   r    r!   r"   r   r   r   Úqlr0   s	            r   Úto_quantizedzSwitchLinear.to_quantizedƒ   s‡   € Ø/3¯{©{×/@Ñ/@Ñ,ˆ�[ *Ü"ØØØØØØØô
ˆô )+¯©Ø�K‰K˜ T°ô)
Ð%ˆŒ	�2”9˜vñ "(�F˜1’I¨TˆŒ	à�T‰>Ø—i‘iˆBŒGØˆ	r   )TrL   )rI   rJ   rK   )rM   rN   rO   rP   rQ   r(   rS   r   r   r   rH   rR   rb   rT   rU   s   @r   rW   rW   ]   s†   ø„ àPTñ=Øð=Ø,/ð=Ø>Að=ØIMõ=ð ñ$ó ð$ð ñ$ó ð$ð ñ$ó ð$ó	ñ sð °sð Àc÷ r   rW   c                   ó$   ‡ — e Zd Zˆ fd„Zd„ Zˆ xZS )ÚSwiGLUc                 ó"   •— t         ‰| �  «        y ©N)r'   r(   )r3   r5   s    €r   r(   zSwiGLU.__init__™   s   ø€ Ü‰ÑÕr   c                 ó   — t        ||«      S rf   r   )r3   r   Úgates      r   rH   zSwiGLU.__call__œ   s   € Ü�d˜A‹Ðr   )rM   rN   rO   r(   rH   rT   rU   s   @r   rd   rd   ˜   s   ø„ ôör   rd   c            	       ó`   ‡ — e Zd Z e«       dfdedededefˆ fd„Zdej                  fd„Z	ˆ xZ
S )	Ú	SwitchGLUFr   Úhidden_dimsr   r   c                 ó¨   •— t         ‰| �  «        t        ||||¬«      | _        t        ||||¬«      | _        t        ||||¬«      | _        || _        y ©N)r   )r'   r(   rW   Ú	gate_projÚup_projÚ	down_projÚ
activation©r3   r   rk   r   rq   r   r5   s         €r   r(   zSwitchGLU.__init__¡   sO   ø€ ô 	‰ÑÔä% j°+¸{ÐQUÔVˆŒÜ# J°¸[ÈtÔTˆŒÜ% k°:¸{ÐQUÔVˆŒØ$ˆ�r   Úreturnc                 ó¦  — t        j                  |d«      }|j                  dk\  }|}d }|rt        ||«      \  }}}| j                  rt        j
                  |«      }| j                  |||¬«      }| j                  |||¬«      }| j                  | j                  ||«      ||¬«      }|rt        |||j                  «      }|j                  d«      S ©N)rC   r   rI   )rB   rC   )r   rF   Úsizer   ÚtrainingÚstop_gradientro   rn   rp   rq   r   r	   Úsqueeze)r3   r   r   Údo_sortÚidxr   Úx_upÚx_gates           r   rH   zSwitchGLU.__call__°   sÍ   € Ü�N‰N˜1˜hÓ'ˆð —,‘, "Ñ$ˆØˆØˆ	ÙÜ ,¨Q°Ó 8ÑˆAˆs�IØ�=Š=Ü×"Ñ" 3Ó'ˆCØ�|‰|˜A˜s°7ˆ|Ó;ˆØ—‘  3°w�Ó?ˆØ�N‰NØ�O‰O˜D &Ó)ØØ"ð ó 
ˆñ Ü  9¨g¯m©mÓ<ˆAà�y‰y˜‹}Ðr   )rM   rN   rO   rd   rP   rQ   r(   r   ÚarrayrH   rT   rU   s   @r   rj   rj       sH   ø„ ñ “8Øñ%àð%ð ð%ð ð	%ð õ%ð b§h¡h÷ r   rj   c            	       óx   ‡ — e Zd Z ej                  d¬«      dfdedededefˆ fd„Zd	ej                  fd
„Z
ˆ xZS )Ú	SwitchMLPÚprecise)ÚapproxFr   rk   r   r   c                 ó€   •— t         ‰| �  «        t        ||||¬«      | _        t        ||||¬«      | _        || _        y rm   )r'   r(   rW   Úfc1Úfc2rq   rr   s         €r   r(   zSwitchMLP.__init__Ë   s;   ø€ ô 	‰ÑÔä 
¨K¸È4ÔPˆŒÜ ¨Z¸È4ÔPˆŒØ$ˆ�r   rs   c                 ó€  — t        j                  |d«      }|j                  dk\  }|}d }|rt        ||«      \  }}}| j                  rt        j
                  |«      }| j                  |||¬«      }| j                  |«      }| j                  |||¬«      }|rt        |||j                  «      }|j                  d«      S ru   )r   rF   rv   r   rw   rx   r„   rq   r…   r   r	   ry   )r3   r   r   rz   r{   r   s         r   rH   zSwitchMLP.__call__Ù   s²   € Ü�N‰N˜1˜hÓ'ˆð —,‘, "Ñ$ˆØˆØˆ	ÙÜ ,¨Q°Ó 8ÑˆAˆs�IØ�=Š=Ü×"Ñ" 3Ó'ˆCØ�H‰H�Q˜¨GˆHÓ4ˆØ�O‰O˜AÓˆØ�H‰H�Q˜¨GˆHÓ4ˆáÜ  9¨g¯m©mÓ<ˆAà�y‰y˜‹}Ðr   )rM   rN   rO   ÚnnÚGELUrP   rQ   r(   r   r~   rH   rT   rU   s   @r   r€   r€   Ê   sQ   ø„ ð �2—7‘7 )Ô,Øñ%àð%ð ð%ð ð	%ð õ%ð b§h¡h÷ r   r€   rf   )r)   Ú	functoolsr   Úmlx.coreÚcorer   Úmlx.nnr‡   Úactivationsr   r   r   ÚModuler   rW   rd   rj   r€   © r   r   Ú<module>r�      st   ðó Ý å Ý å òCóô?˜BŸI™Iô ?ôD8�2—9‘9ô 8ôvˆR�Y‰Yô ô'�—	‘	ô 'ôT"�—	‘	õ "r   