
    (HJj<>                        d dl mZmZ d dlmZ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 ddlmZmZmZ ddlmZ dd	lmZ e G d
 de             Z G d de
j6                        Zd Z G d de
j6                        Z G d de
j6                        Z G d de
j6                        Z  G d de
j6                        Z! G d de
j6                        Z" G d de
j6                        Z#y)    )	dataclassfield)ListOptionalN   )swiglu)BaseModelArgscreate_attention_maskcreate_ssm_maskscaled_dot_product_attention)ArraysCache	CacheListKVCache)initialize_rope)
ssm_updatec                   ~   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<   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"<   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-<    e!d. /      Z"e#e   ed0<   d1Z$e%ed2<   d,Z&eed3<   d4Z'eed5<   dZ(eed6<   dZ)eed7<   d8Z*eed9<   dZ+eed:<   d;Z,e-e   ed<<   d=Z.eed><   d?Z/eed@<    e!dA /      Z0e#e   edB<   dCZ1eedD<   dEZ2eedF<   dZ3eedG<   y;)H	ModelArgsFattention_biasg      ?attention_in_multiplierg      ?attention_out_multiplierg;f@embedding_multiplier@   head_dimi   hidden_sizeg{Gz?initializer_rangei   intermediate_sizeg      ?key_multiplierg      ?lm_head_multiplier   mamba_chunk_sizeTmamba_conv_bias   mamba_d_convmamba_d_headi   mamba_d_ssmmamba_d_state   mamba_expandr   mamba_n_groups   mamba_n_headsmamba_norm_before_gatemamba_proj_biasmamba_rms_normmamba_use_mlpi   max_position_embeddingsmlp_bias   mlp_expansion_factorc                  
    ddgS )Ng
 H?g     ? r5       a/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_lm/models/falcon_h1.py<lambda>zModelArgs.<lambda>2   s
    !3Y ?r6   )default_factorymlp_multipliers	falcon_h1
model_typenum_attention_heads$   num_hidden_layersnum_key_value_headsprojectors_biasgh㈵>rms_norm_epsrope_traditionalNrope_scalingg   vH7B
rope_thetag      ?ssm_in_multiplierc                  
    g dS )N);f?g      ?rH   g      ?rH   r5   r5   r6   r7   r8   zModelArgs.<lambda>?   s     !
r6   ssm_multipliersgg}+?ssm_out_multiplieri  
vocab_sizetie_word_embeddings)4__name__
__module____qualname__r   bool__annotations__r   floatr   r   r   intr   r   r   r   r   r    r!   r#   r$   r%   r&   r(   r)   r+   r,   r-   r.   r/   r0   r1   r3   r   r:   r   r<   strr=   r?   r@   rA   rB   rC   rD   r   rE   rF   rI   rJ   rK   rL   r5   r6   r7   r   r      s    ND %(U(&,e,"3%3HcK#u#!s!$NE$ ))c OT L#L#KM3L#NCM3#(D(!OT! ND M4#)S)Hd !#!#(?$OT%[  "J!  s  !OT!L%"d"$(L(5/(&J&#u##(
$OT%[  !43J $$r6   r   c                   (     e Zd Zd fd	ZddZ xZS )FalconH1RMSNormGatedc                     t         |           t        j                  |f      | _        || _        || _        || _        y N)super__init__mxonesweightvariance_epsilonn_groupsnorm_before_gate)selfr   epsr_   r`   	__class__s        r7   rZ   zFalconH1RMSNormGated.__init__M   s7    gg{n- #  0r6   c                     | j                   s|t        ||      }t        j                  j	                  || j
                  | j                        }| j                   r|t        ||      }|S rX   )r`   r   r[   fastrms_normr]   r^   )ra   hidden_statesgates      r7   __call__zFalconH1RMSNormGated.__call__T   sc    $$)9"47M((4;;(=(=
   T%5"47Mr6   )gư>r   TrX   rM   rN   rO   rZ   ri   __classcell__rc   s   @r7   rV   rV   L   s    1
r6   rV   c                 F   | j                   }| j                  | j                  z  }| j                  }|||||g}t	        j
                  t        || j                        D cg c]/  \  }}t	        j                  t	        j                  |      |f      1 c}}      S c c}}w rX   )
r%   r)   r&   r+   r[   concatenateziprI   broadcast_toarray)argsr   groups_time_state_size	num_headssizessms          r7   compute_mup_vectorrx   a   s    ((!0043E3EE""IE >> E4#7#78	
81 OOBHHQK!.8	
 	
s   !4B
c                   &     e Zd Z fdZddZ xZS )FalconH1Attentionc                    t         |           |j                  | _        |j                  | _        |j
                  | _        |j                  | _        | j                  dz  | _        t        j                  | j                  | j                  | j                  z  |j                        | _        t        j                  | j                  | j                  | j                  z  |j                        | _        t        j                  | j                  | j                  | j                  z  |j                        | _        t        j                  | j                  | j                  z  | j                  |j                        | _        t!        | j                  |j"                  |j$                  |j&                  |j(                        | _        y )Ng      ࿩bias)rY   rZ   r   r=   rt   r@   num_kv_headsr   scalennLinearr   q_projk_projv_projo_projr   rE   rC   rD   r0   ropera   rr   rc   s     r7   rZ   zFalconH1Attention.__init__v   sW   ++11 44]]D(
iidnnt}}<4CVCV
 ii-$$

 ii-$$

 iiNNT]]*D,<,<4CVCV
 $MMOO!!((
	r6   c                 2   |j                   \  }}}| j                  |      }| j                  |      }| j                  |      }	|j	                  ||| j
                  d      j                  dddd      }|j	                  ||| j                  d      j                  dddd      }|	j	                  ||| j                  d      j                  dddd      }	|P| j                  ||j                        }| j                  ||j                        }|j                  ||	      \  }}	n"| j                  |      }| j                  |      }t        |||	|| j                  |      }
|
j                  dddd      j	                  ||d      }
| j                  |
      S )Nr   r'   r      )offset)maskr   cache)shaper   r   r   reshapert   	transposer~   r   r   update_and_fetchr   r   r   )ra   xr   r   BL_querieskeysvaluesoutputs              r7   ri   zFalconH1Attention.__call__   sl   ''1a++a.{{1~Q//!Q;EEaAqQ||Aq$"3"3R8BB1aAN1d&7&7<FFq!QPQRiii=G99T%,,97D 11$?LD&ii(G99T?D-T6DJJe
 !!!Q1-55aB?{{6""r6   NNrj   rl   s   @r7   rz   rz   t   s     
D#r6   rz   c                   N    e Zd Z fdZdej
                  dee   deej
                     dej
                  fdZdej
                  dej
                  d	ej
                  d
ej
                  dee   deej
                     dej
                  fdZ	ddeej
                     fdZ
 xZS )FalconH1Mixerc                    t         |           |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _
        |j                  | _        |j                  | _        |j                  | j                  z  | _        |j                  | _        |j$                  | _        |j(                  | _        dt-        d      f| _        d| _        d| _        | j                  d| j"                  z  | j                  z  z   | _        t7        j8                  | j4                  | j4                  | j                  | j                  | j4                        | _        | j                  | j4                  z   | j                  z   }t7        j<                  | j                  ||j>                        | _         tC        jD                  | j                        | _#        tC        jH                  d| j                  dz         }tC        jJ                  |      | _&        |jN                  | _'        | jN                  r<tQ        | j                  | j                  | j"                  |jR                  	      | _*        tC        jD                  | j                        | _+        t7        j<                  | j                  | j                  |jX                        | _-        y )
Ng        infgMbP?g?r'   )in_channelsout_channelsr}   kernel_sizegroupsr|   r   )rb   r_   r`   ).rY   rZ   r+   rt   r   r&   ssm_state_sizer#   conv_kernel_sizer%   r   r!   use_conv_biasrB   layer_norm_epsilonr)   rs   r_   r$   r   r    
chunk_sizerR   time_step_limittime_step_mintime_step_maxconv_dimr   Conv1dconv1dr   r-   in_projr[   r\   dt_biasarangelogA_logr.   rV   r,   normDrA   out_proj)ra   rr   projection_sizeArc   s       r7   rZ   zFalconH1Mixer.__init__   s3   ++++"00 $ 1 1!%!1!1!11"&"3"3&*&9&9D<O<O&O#++))// #U5\2" ..T]]1BTEXEX1XXii##--==
 004==@4>>Qyy%%
 wwt~~.IIa!+,VVAY
"11,&&++!%!<!<	DI (		""D$4$44;O;O
r6   
conv_inputr   r   returnc                    |t        j                  |d   |d      }||d   It        j                  |j                  d   | j                  dz
  | j
                  f|j                        }n|d   }t        j                  ||gd      }| j                  dz
  }|j                  q|j                  d   }t        j                  |j                  d||z
        }|d d d f   t        j                  |      z   d   }	t        j                  ||	d      |d<   n;|d d | d d d f   |d<   n(t        j                  |d| j                  dz
  dfdg      }| j                  |      }
t        j                  |
      S )N).Nr   r   )dtypeaxis)r   r   )r[   wherezerosr   r   r   r   rn   lengthsclipr   take_along_axispadr   r   silu)ra   r   r   r   
conv_statepadded_inputn_keeptends	positionsconv_outputs              r7   _convzFalconH1Mixer._conv   sh    $y/:qAJQxXX%%a($*?*?!*CT]]S$**

 #1X
>>:z*BKL**Q.F}}( &&q)wwu}}aV<!!T']RYYv->>	J	--lIANa'F78Q7a66Vd&;&;a&?%CVLL kk,/ww{##r6   rg   r   Cdtc                    |j                   \  }}}	|j                  ||| j                  | j                        }|j                  ||| j                  | j
                        }|j                  ||| j                  | j
                        }|r|d   }
|j                  }nd\  }
}t        || j                  ||| j                  || j                  |
| j                  ||      \  }}
|r|
|d<   |j                  ||| j                        S )Nr   r   )r   r   rt   r   r_   r   r   r   r   r   r   r   r   )ra   rg   r   r   r   r   r   
batch_sizeseq_lenr   stater   ys                r7   _ssmzFalconH1Mixer._ssm  s     "/!4!4
GQ%--
 IIj'4==$:M:MNIIj'4==$:M:MN!HEmmG'NE7JJFFLL  
5 E!HyyWd.D.DEEr6   c                 F   | j                  |      }t        j                  || j                  | j                  | j                  z   gd      \  }}}| j                  |||      }t        j                  || j                  | j                  | j                  | j                  z  z   gd      \  }	}
}| j                  |	|
||||      }|r|j                  |j                  d          | j                  r| j                  ||      }nt        ||      }| j                  |      S )Nr   r   )r   r   )r   r[   splitr   r   r   r_   r   r   advancer   r.   r   r   r   )ra   input_statesr   r   projected_statesrh   r   r   r   rg   r   r   r   s                r7   ri   zFalconH1Mixer.__call__3  s   <<5!xx##T%;%;dmm%KL 
j" jjUD9 hh&&&&9L9L)LL 
q! IImQ2u4I@MM!''!*%		!T"AtQA}}Qr6   r   )rM   rN   rO   rZ   r[   rq   r   r   r   r   ri   rk   rl   s   @r7   r   r      s    6
p $HH $ $ $ rxx 	 $
 
 $D#Fxx#F 88#F 88	#F
 HH#F $#F rxx #F 
#FJ x7I  r6   r   c                   $     e Zd Z fdZd Z xZS )FalconH1MLPc                 <   t         |           |j                  }|j                  }t	        j
                  |||j                        | _        t	        j
                  |||j                        | _        t	        j
                  |||j                        | _	        y )Nr|   )
rY   rZ   r   r   r   r   r1   	gate_projup_proj	down_proj)ra   rr   r   r   rc   s       r7   rZ   zFalconH1MLP.__init__U  sp    && 22;0AVyy.?dmmT#4kVr6   c                 |    t        | j                  |      | j                  |            }| j                  |      }|S rX   )r   r   r   r   )ra   r   r   s      r7   ri   zFalconH1MLP.__call___  s2    4>>!$dll1o6NN1r6   rj   rl   s   @r7   r   r   S  s    Wr6   r   c                        e Zd Z fdZdej
                  deej
                     deej
                     dej
                  fdZ xZS )FalconH1DecoderLayerc                    t         |           t        |      | _        |j                  }|j
                  |z  d|j                  z  |z  z   | _        t        |      | _	        t        |      | _        t        j                  |j                  |j                        | _        t        j                  |j                  |j                        | _        y )Nr'   rr   rb   )rY   rZ   r   feed_forwardr   r=   r@   channels_attnr   mambarz   	self_attnr   RMSNormr   rB   input_layernormpre_ff_layernorm)ra   rr   r   rc   s      r7   rZ   zFalconH1DecoderLayer.__init__f  s    '-==$$x/$***X56 	
 #-
*40!zz$*:*:@Q@QR "

4+;+;ARAR Sr6   h	attn_mask
mamba_maskr   c                     |}| j                  |      }| j                  ||d   |      }| j                  |||d         }||z   |z   }|}| j                  |      }| j	                  |      }||z   S )Nr   )r   r   r   r   )r   r   )r   r   r   r   r   )ra   r   r   r   r   residualmamba_hattn_hs           r7   ri   zFalconH1DecoderLayer.__call__w  s       #**!58**M(   
 w'!!!$a !|r6   )	rM   rN   rO   rZ   r[   rq   r   ri   rk   rl   s   @r7   r   r   e  sN    T"88 BHH%	
 RXX& 
r6   r   c                   &     e Zd Z fdZddZ xZS )FalconH1Modelc                    t         |           || _        |j                  | _        |j                  | _        t        j                  | j                  | j                        | _        t        |      | _	        t        |j                        D cg c]  }t        |       c}| _        t        j                  | j                  |j                        | _        y c c}w )Nr   )rY   rZ   rr   rK   r   r   	Embeddingembed_tokensrx   _mup_vectorranger?   r   layersr   rB   final_layernorm)ra   rr   r   rc   s      r7   rZ   zFalconH1Model.__init__  s    	//++LL$:J:JK-d305d6L6L0M
0M1 &0M
  "zz$*:*:@Q@QR
s   Cc                    | j                  |      }|}|dt        | j                        z  g}t        ||d   d         }t	        ||d   d         }t        | j                  |      D ]  \  }} |||||      } | j                  |      S )Nr   r   r   )r   r   r   )r   lenr   r   r
   ro   r   )ra   inputsr   r   r   r   layercs           r7   ri   zFalconH1Model.__call__  s    f%=!C$445E$Qa4
)!U1Xa[9	DKK/HE1#%	A 0 ##A&&r6   rX   rj   rl   s   @r7   r   r     s    S'r6   r   c                   B     e Zd Z fdZddZd Zd Zed        Z xZ	S )Modelc                     t         |           || _        |j                  | _        t	        |      | _        |j                  s2t        j                  |j                  |j                  d      | _        y y )Nr   Fr|   )rY   rZ   rr   r<   r   modelrL   r   r   r   rK   lm_headr   s     r7   rZ   zModel.__init__  sX    	//"-
''99T%5%5tUSDL (r6   c                     | j                  ||      }| j                  j                  rU| j                   j                  j	                  |      }|| j                  j
                  | j                  j                  z  z  S | j                  |      S )N)r   )r  rr   rL   r   	as_linearr   r   r  )ra   r   r   rg   outs        r7   ri   zModel.__call__  sn    

6
799((**))33MBC$))669W9WWXX<<..r6   c                    |d   }|j                   d   |j                   d   k  r|S i }| j                  }|j                         D ]  \  }}|j                  d      r||j                  z  }n||j                  d      r||j
                  z  }nZ|j                  d      s|j                  d      r||j                  z  }n'|j                  d      r||j                  |j                  z  z  }n|j                  d	      r||j                  z  }n|j                  d
      r||j                  z  }n|j                  d      r||j                  d   z  }n|j                  d      r||j                  d   z  }no|j                  d      rG||j                  | j                  j                  j                  |j                        d d d f   z  z  }nd|v r|j!                  ddd      }|||<    |S )Nz"model.layers.0.mamba.conv1d.weightr   r   zembed_tokens.weightzlm_head.weightzq_proj.weightzk_proj.weightzkey_proj.weightzo_proj.weightzout_proj.weightzgate_proj.weightr   zdown_proj.weightzin_proj.weightzconv1d.weightr'   )r   rr   itemsendswithr   r   r   r   r   rJ   r:   rF   r  r   astyper   r   )ra   weightsc1dsanitized_weightsrr   nameparams          r7   sanitizezModel.sanitize  s   :;99R=CIIaL(Nyy"==?KD%}}23222/0000/4==3Q55501558K8KKK/6660100012--a0012--a00/0**jj,,33EKK@DIJ !D(1a0&+d#3 +4 ! r6   c                     t        | j                  j                        D cg c]   }t        t	        d      t                     " c}S c c}w )Nr'   )size)r   rr   r?   r   r   r   )ra   r   s     r7   
make_cachezModel.make_cache  sF     499667
7 kq)7957
 	
 
s   %A
c                 .    | j                   j                  S rX   )r  r   )ra   s    r7   r   zModel.layers  s    zz   r6   rX   )
rM   rN   rO   rZ   ri   r  r  propertyr   rk   rl   s   @r7   r  r    s-    T/#!J
 ! !r6   r  )$dataclassesr   r   typingr   r   mlx.corecorer[   mlx.nnr   activationsr   baser	   r
   r   r   r   r   r   r   
rope_utilsr   ssmr   r   ModulerV   rx   rz   r   r   r   r   r  r5   r6   r7   <module>r#     s    ) !     3 2 '  3% 3% 3%l299 *&<#		 <#~] BII ] @")) $*299 *Z$'BII $'N?!BII ?!r6   