Ë
    îÿæiL  ã                   ó–  — d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z
 d dlmZ ddlmZmZmZ e G d„ de«      «       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 ee
j2                  d¬«      dd„«       Z G d„ dej(                  «      Zy)é    N)Ú	dataclass)Úpartial)ÚAnyÚOptionalé   )ÚBaseModelArgsÚcreate_attention_maskÚscaled_dot_product_attentionc                   óŒ   — e Zd ZU dZeed<   dZeed<   dZeed<   dZ	eed<   dZ
eed	<   d
Zeed<   dZeed<   dZeed<   dZeed<   y)Ú	ModelArgsÚnanochatÚ
model_typei   Úhidden_sizeé   Únum_hidden_layersé
   Únum_attention_headsÚnum_key_value_headsi   Ú
vocab_sizei   Úmax_position_embeddingsi   Úintermediate_sizeç     ˆÃ@Ú
rope_thetaN)Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚ__annotations__r   Úintr   r   r   r   r   r   r   Úfloat© ó    úk/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_lm/models/nanochat.pyr   r      sa   … à €J�Ó Ø€K�ÓØÐ�sÓØ!Ð˜Ó!Ø!Ð˜Ó!Ø€J�ÓØ#'Ð˜SÓ'Ø!Ð�sÓ!Ø€J�Ôr"   r   c                 óD   — t         j                  j                  | dd«      S )z0Functional RMSNorm with no learnable parameters.Ngñhãˆµøä>)ÚmxÚfastÚrms_norm)Úxs    r#   r'   r'      s   € ä�7‰7×Ñ˜A˜t TÓ*Ð*r"   c           	      ó   — | j                   d   }|€X|dz  }t        j                  t        j                  d|t        j                  ¬«      t        j                  |«      |z  z  «       }t        j                  j                  | |dd|d|¬«      S )	a@  Apply RoPE with blocked layout.


    Args:
        x: Input tensor in (B, H, T, D) format
        offset: Position offset for KV caching
        base: RoPE base frequency (default 10000.0)
        freqs: Precomputed negated frequencies (optional)

    Returns:
        Tensor with RoPE applied, same shape as input
    éÿÿÿÿNé   ç        ©ÚdtypeFg      ð?)ÚdimsÚtraditionalÚbaseÚfreqsÚscaleÚoffset)	Úshaper%   ÚexpÚarangeÚfloat32ÚmathÚlogr&   Úrope)r(   r4   r1   r2   Úhead_dimÚhalf_Ds         r#   Úapply_rotary_embr>       s‰   € ð �w‰w�r‰{€Hà€}à˜Q‘ˆÜ—‘Ü�I‰I�c˜6¬¯©Ô4¼¿¹À»ÈÑ8OÑPó
ð 
ˆô
 �7‰7�<‰<Ø	ØØØØØØð ó ð r"   c            	       óŠ   ‡ — e Zd Zdefˆ fd„Z	 	 ddej                  deej                     dee   dej                  fd„Z	ˆ xZ
S )	Ú	AttentionÚargsc                 óÆ  •— t         ‰| �  «        |j                  | _        |j                  | _        |j
                  | _        | j                  | j                  z  | _        | j                  dz  | _        |j                  | _	        t        j                  | j                  | j                  | j                  z  d¬«      | _        t        j                  | j                  | j                  | j                  z  d¬«      | _        t        j                  | j                  | j                  | j                  z  d¬«      | _        t        j                  | j                  | j                  d¬«      | _        | j                  dz  }t!        j"                  t!        j$                  d|t         j&                  ¬«      t)        j*                  | j                  «      |z  z  «       | _        y )Ng      à¿F©Úbiasr+   r,   r-   )ÚsuperÚ__init__r   r   Ú	num_headsr   Únum_kv_headsr<   r3   r   ÚnnÚLinearÚc_qÚc_kÚc_vÚc_projr%   r6   r7   r8   r9   r:   Ú_rope_freqs)ÚselfrA   r=   Ú	__class__s      €r#   rF   zAttention.__init__C   sd  ø€ Ü‰ÑÔà×+Ñ+ˆÔØ×1Ñ1ˆŒØ ×4Ñ4ˆÔØ×(Ñ(¨D¯N©NÑ:ˆŒØ—]‘] DÑ(ˆŒ
ØŸ/™/ˆŒä—9‘9Ø×Ñ˜dŸn™n¨t¯}©}Ñ<À5ô
ˆŒô —9‘9Ø×Ñ˜d×/Ñ/°$·-±-Ñ?Àeô
ˆŒô —9‘9Ø×Ñ˜d×/Ñ/°$·-±-Ñ?Àeô
ˆŒô —i‘i × 0Ñ 0°$×2BÑ2BÈÔOˆŒð —‘ !Ñ#ˆÜŸF™FÜ�I‰I�c˜6¬¯©Ô4Ü�x‰x˜Ÿ™Ó(¨6Ñ1ñ3ó
ð 
ˆÕr"   r(   ÚmaskÚcacheÚreturnc                 ó   — |j                   \  }}}| j                  |«      }| j                  |«      }| j                  |«      }	|j	                  ||| j
                  | j                  «      j                  dddd«      }|j	                  ||| j                  | j                  «      j                  dddd«      }|	j	                  ||| j                  | j                  «      j                  dddd«      }	|�|j                  nd}
t        ||
| j                  | j                  ¬«      }t        ||
| j                  | j                  ¬«      }t        |«      }t        |«      }|�|j                  ||	«      \  }}	t        |||	|| j                   |¬«      }|j                  dddd«      j	                  ||| j"                  «      }| j%                  |«      S )Nr   r+   r   é   )r4   r1   r2   )rS   r3   rR   )r5   rK   rL   rM   ÚreshaperG   r<   Ú	transposerH   r4   r>   r   rO   r'   Úupdate_and_fetchr
   r3   r   rN   )rP   r(   rR   rS   ÚBÚLÚ_ÚqueriesÚkeysÚvaluesr4   Úoutputs               r#   Ú__call__zAttention.__call___   s¬  € ð —'‘'‰ˆˆ1ˆaà—(‘(˜1“+ˆØ�x‰x˜‹{ˆØ—‘˜!“ˆð —/‘/ ! Q¨¯©¸¿¹ÓF×PÑPØˆq�!�Qó
ˆð �|‰|˜A˜q $×"3Ñ"3°T·]±]ÓC×MÑMØˆq�!�Qó
ˆð —‘  1 d×&7Ñ&7¸¿¹ÓG×QÑQØˆq�!�Qó
ˆð
 "'Ð!2�—’¸ˆÜ"Ø˜F¨¯©À×@PÑ@Pô
ˆô  Ø˜ d§o¡o¸T×=MÑ=Mô
ˆô
 ˜7Ó#ˆÜ˜‹~ˆð ÐØ ×1Ñ1°$¸Ó?‰LˆD�&ä-Ø�T˜6¨°d·j±jÀtô
ˆð
 ×!Ñ! ! Q¨¨1Ó-×5Ñ5°a¸¸D×<LÑ<LÓMˆØ�{‰{˜6Ó"Ð"r"   ©NN©r   r   r   r   rF   r%   Úarrayr   r   ra   Ú__classcell__©rQ   s   @r#   r@   r@   B   sW   ø„ ð
˜Yõ 
ð> $(Ø#ñ	.#à�8‰8ð.#ð �r—x‘xÑ ð.#ð ˜‰}ð	.#ð
 
�‰÷.#r"   r@   c                   ó\   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚMLPrA   c                 óæ   •— t         ‰| �  «        t        j                  |j                  |j
                  d¬«      | _        t        j                  |j
                  |j                  d¬«      | _        y ©NFrC   )rE   rF   rI   rJ   r   r   Úc_fcrN   ©rP   rA   rQ   s     €r#   rF   zMLP.__init__‘   sN   ø€ Ü‰ÑÔÜ—I‘I˜d×.Ñ.°×0FÑ0FÈUÔSˆŒ	Ü—i‘i × 6Ñ 6¸×8HÑ8HÈuÔUˆ�r"   r(   rT   c                 óp   — | j                  |«      }t        j                  |«      }| j                  |«      S ©N)rk   rI   Úrelu2rN   )rP   r(   s     r#   ra   zMLP.__call__–   s*   € à�I‰I�a‹LˆÜ�H‰H�Q‹KˆØ�{‰{˜1‹~Ðr"   ©	r   r   r   r   rF   r%   rd   ra   re   rf   s   @r#   rh   rh   �   s,   ø„ ðV˜Yõ Vð
˜"Ÿ(™(ð  r§x¡x÷ r"   rh   c            	       óŠ   ‡ — e Zd Zdefˆ fd„Z	 	 ddej                  deej                     dee   dej                  fd„Z	ˆ xZ
S )	ÚTransformerBlockrA   c                 ób   •— t         ‰| �  «        t        |«      | _        t	        |«      | _        y rn   )rE   rF   r@   Úattnrh   Úmlprl   s     €r#   rF   zTransformerBlock.__init__ž   s$   ø€ Ü‰ÑÔÜ˜d“OˆŒ	Ü�t“9ˆ�r"   r(   rR   rS   rT   c                 ó€   — || j                  t        |«      ||¬«      z   }|| j                  t        |«      «      z   }|S )N©rR   rS   )rt   r'   ru   )rP   r(   rR   rS   ÚhÚouts         r#   ra   zTransformerBlock.__call__£   s=   € ð �—	‘	œ( 1›+¨D¸�	Ó>Ñ>ˆØ�$—(‘(œ8 A›;Ó'Ñ'ˆØˆ
r"   rb   rc   rf   s   @r#   rr   rr   �   sW   ø„ ð˜Yõ ð $(Ø#ñ		à�8‰8ð	ð �r—x‘xÑ ð	ð ˜‰}ð		ð
 
�‰÷	r"   rr   c                   ó`   ‡ — e Zd Zdefˆ fd„Z	 ddej                  dej                  fd„Zˆ xZS )ÚNanoChatModelrA   c                 óú   •— t         ‰| �  «        || _        t        j                  |j
                  |j                  «      | _        t        |j                  «      D �cg c]  }t        |«      ‘Œ c}| _        y c c}w rn   )rE   rF   rA   rI   Ú	Embeddingr   r   ÚwteÚranger   rr   rx   )rP   rA   r\   rQ   s      €r#   rF   zNanoChatModel.__init__°   s]   ø€ Ü‰ÑÔØˆŒ	Ü—<‘< §¡°×1AÑ1AÓBˆŒÜ27¸×8NÑ8NÔ2OÓPÑ2O¨QÔ" 4Õ(Ð2OÑPˆ�ùÒPs   ÁA8ÚinputsrT   c                 óú   — | j                  |«      }t        |«      }|€d gt        | j                  «      z  }t	        ||d   «      }t        | j                  |«      D ]  \  }} ||||¬«      }Œ t        |«      }|S )Nr   rw   )r~   r'   Úlenrx   r	   Úzip)rP   r€   rS   rx   rR   ÚlayerÚcs          r#   ra   zNanoChatModel.__call__¶   s{   € ð
 �H‰H�VÓˆä�Q‹Kˆàˆ=Ø�FœS §¡›[Ñ(ˆEä$ Q¨¨a©Ó1ˆä˜DŸF™F EÖ*‰HˆE�1Ù�a˜d¨!Ô,‰Að +ô �Q‹Kˆàˆr"   rn   rp   rf   s   @r#   r{   r{   ¯   s5   ø„ ðQ˜Yõ Qð ñà—‘ðð 
�‰÷	r"   r{   T)Ú	shapelessc                 ó8   — |t        j                  | |z  «      z  S rn   )r%   Útanh)ÚlogitsÚcaps     r#   Úsoftcapr‹   Í   s   € à”—‘˜ #™Ó&Ñ&Ð&r"   c                   óp   ‡ — e Zd Zdefˆ fd„Z	 ddej                  dej                  fd„Zed„ «       Z	ˆ xZ
S )ÚModelrA   c                 óÔ   •— t         ‰| �  «        || _        |j                  | _        t	        |«      | _        t        j                  |j                  |j                  d¬«      | _
        y rj   )rE   rF   rA   r   r{   ÚtransformerrI   rJ   r   r   Úlm_headrl   s     €r#   rF   zModel.__init__Ó   sK   ø€ Ü‰ÑÔØˆŒ	ØŸ/™/ˆŒÜ(¨Ó.ˆÔÜ—y‘y ×!1Ñ!1°4·?±?ÈÔOˆ�r"   r€   rT   c                 ód   — | j                  ||¬«      }| j                  |«      }t        |«      }|S )N)rS   )r�   r�   r‹   )rP   r€   rS   ry   r‰   s        r#   ra   zModel.__call__Ú   s7   € ð
 ×Ñ˜v¨UÐÓ3ˆØ—‘˜cÓ"ˆô ˜“ˆàˆr"   c                 ó.   — | j                   j                  S rn   )r�   rx   )rP   s    r#   ÚlayerszModel.layersç   s   € à×Ñ×!Ñ!Ð!r"   rn   )r   r   r   r   rF   r%   rd   ra   Úpropertyr“   re   rf   s   @r#   r�   r�   Ò   sI   ø„ ðP˜Yõ Pð ñà—‘ðð 
�‰ó	ð ñ"ó ô"r"   r�   )r   N)g      .@)r9   Údataclassesr   Ú	functoolsr   Útypingr   r   Úmlx.coreÚcorer%   Úmlx.nnrI   r1   r   r	   r
   r   r'   r>   ÚModuler@   rh   rr   r{   Úcompiler‹   r�   r!   r"   r#   Ú<module>r�      s·   ðó Ý !Ý ß  å Ý ç TÑ Tð ô	 �ó 	 ó ð	 ò+ó
ôDK#�—	‘	ô K#ô\
ˆ"�)‰)ô 
ô�r—y‘yô ô$�B—I‘Iô ñ< 	ˆ�‰˜tÔ$ò'ó %ð'ô"ˆB�I‰Iõ "r"   