
    )j:                        d dl 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 ddlmZ ddlmZmZ ddlmZ e G d	 d
e                      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dededefdZ G d de
j                  Z  G d de
j                  Z! G d de
j                  Z"dS )    N)	dataclass)AnyOptional)BaseModelArgscreate_attention_maskcreate_ssm_mask   )swiglu)ArraysCacheKVCache)
ssm_updatec                   2   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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S )"	ModelArgsplamo2
model_typei   hidden_size    num_hidden_layersư>rms_norm_epsTtie_word_embeddingsnum_attention_heads   num_key_value_heads   hidden_size_per_headi   max_position_embeddingsattention_window_sizeNfull_attention_idx@   mamba_d_statemamba_d_convmamba_num_heads   
mamba_step   mamba_chunk_sizemamba_enabledi 4  intermediate_sizei }  
vocab_size)__name__
__module____qualname__r   str__annotations__r   intr   r   floatr   boolr   r   r   r   r   r   r   listr!   r"   r#   r%   r'   r(   r)   r*        ^/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/mlx_lm/models/plamo2.pyr   r      sU        JKsL% $$$$!!!!     ######'S'''!%3%%%.2c+222M3L#OSJcM4"s"""Jr5   r   c            	       Z     e Zd Z	 	 ddedededdf fdZd	ej        dej        fd
Z xZ	S )RMSNormr         ?r   epsoffsetreturnNc                     t                                                       t          j        |          | _        || _        || _        d S N)super__init__mxzerosweightvariance_epsilonr;   )selfr   r:   r;   	__class__s       r6   r@   zRMSNorm.__init__)   s?     	h{++ #r5   hidden_statesc                 h    t           j                            || j        | j        z   | j                  S r>   )rA   fastrms_normrC   r;   rD   )rE   rG   s     r6   __call__zRMSNorm.__call__4   s/    w4;4d6K
 
 	
r5   )r   r9   )
r+   r,   r-   r0   r1   r@   rA   arrayrK   __classcell__rF   s   @r6   r8   r8   (   s         		 		 	 		
 
	 	 	 	 	 	
bh 
28 
 
 
 
 
 
 
 
r5   r8   c                   $    e Zd Zdeddf 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j        deej                 fdZ xZS )Mambaconfigr<   Nc                    t                                                       || _        |j        | _        |j        | _        |j        | _        |j        | _	        |j
        | _        |j        | _        | j        | j        z  | _        t          j        | j        d| j        z  d          | _        t          j        | j        | j        d| j        | j        d          | _        t'          d| j        dz            | _        t          j        | j        | j        d| j        z  z   d          | _        t          j        | j        | j        d          | _        t/          j        | j        f          | _        t/          j        t/          j        d	| j        d	z   t.          j        
                    | _        t/          j        | j                  | _        t/          j        | j                  | _         t/          j        | j                  | _!        t/          j        | j                  | _"        t          j        | j        | j        d          | _#        d S )Nr$   Fbiasr   )in_channelsout_channelsrT   kernel_sizegroupspaddingr       )shaper	   dtype)$r?   r@   rQ   r   r!   d_stater"   conv_kernel_sizer'   
chunk_sizer#   	num_headsr   r)   nnLinearin_projConv1dconv1dmaxdt_dim	bcdt_projdt_projrA   rB   dt_biaslogarangefloat32A_logonesDdt_norm_weightB_norm_weightC_norm_weightout_projrE   rQ   rF   s     r6   r@   zMamba.__init__;   s   !-+ & 3 1/$*$?!!%$2K!Kya$"88u
 
 
 i./-)
 
 
 "d."455"K!dl**
 
 

 ydn5IIIxt~&7888VBIa!);2:NNNOO
(( gdk22WT\22WT\22	$"8$:JQVWWWr5   
conv_inputcachemaskc                    |t          j        |d         |d          }||d         7t          j        |j        d         | j        dz
  | j        f|j                  }n|d         }t          j        ||gd          }| j        dz
  }|j        m|j        d         }t          j	        |j        d||z
            }|d d d f         t          j
        |          z   d         }	t          j        ||	d          |d<   n8|d d | d d d f         |d<   n"t          j        |d| j        dz
  dfdg          }|                     |          }
t          j        |
          S )N).Nr   r	   r\   axis)r   r   )rA   whererB   r[   r_   r)   r]   concatenatelengthscliprm   take_along_axispadrf   rb   silu)rE   rw   rx   ry   
conv_statepadded_inputn_keeptends	positionsconv_outputs              r6   _convzMamba._conve   s    $y/:qAAJQxX"(+-1.
 %*  

 #1X
>:z*BKKKL*Q.F}( &q)wu}aV<<!!!!T']RYv->->>	J	-lIANNNa'F788QQQ7a6Vd&;a&?%CVL L kk,//w{###r5   xBCdtc                    |j         \  }}}	|                    ||| j        | j                  }|                    ||d| j                  }|                    ||d| j                  }|r|d         }
|j        }nd\  }
}t          || j        ||| j        || j	        |
||
  
        \  }}
|r|
|d<   |                    ||| j
                  S )Nr	   NN)ry   r   )r[   reshapera   r   r^   r   r   ro   rq   rk   r)   )rE   r   r   r   r   rx   ry   
batch_sizeseq_len_stater   ys                r6   _ssmz
Mamba._ssm   s     "#
GQIIj'4>4;TUUIIj'1dl;;IIj'1dl;; 	(!HEmGG'NE7JFL
 
 
5  	E!HyyWd.DEEEr5   rG   c                 P   |j         \  }}}|                     |          }|                    ||| j        d          }t	          j        || j        gd          \  }}	|	                    |d| j        | j        z            }	|                     |	||          }	|                     |	          }
t	          j        |
| j	        | j	        dz  gd          \  }}}t	          j
        | j                            t          j                             }t          j                            || j        | j        j                  }t          j                            || j        | j        j                  }t          j                            || j        | j        j                  }|                     |          }|                     |	|||||          }|r |                    |j         d                    t1          |                    d          |          }|                     |          S )Nr{   r$   r	   )r[   rd   r   ra   rA   splitr   r   ri   r^   expro   astypern   rI   rJ   rr   rQ   r   rs   rt   rj   r   advancer
   flattenru   )rE   rG   ry   rx   bsizelengthr   zxzr   BCdtr   r   r   Aouts                   r6   rK   zMamba.__call__   s    ).vq\\-((ZZvt~r:: x) 
 
 
1 IIeR$2K!KLLJJq%&&~~a  8D4<1A"BLLL1bVDJ%%bj11222Wb$"5t{7OPPGQ 2DK4LMMGQ 2DK4LMM \\"ii
 
  	(MM#)A,'''QYYr]]C((}}S!!!r5   r   )r+   r,   r-   r   r@   rA   rL   r   r   r   r   r   rK   rM   rN   s   @r6   rP   rP   :   sT       (Xy (XT (X (X (X (X (X (XT$$H$$ $$$ rx 	$$
 
$$ $$ $$ $$L"F8"F 8"F 8	"F
 H"F }"F rx "F 
"F "F "F "FN $(	-" -"x-" rx -" -" -" -" -" -" -" -"r5   rP   c                   ^     e Zd Zdeddf fdZ	 	 ddej        deej                 fdZ xZ	S )		AttentionrQ   r<   Nc                 d   t                                                       || _        |j        | _        |j        }|j        | _        |dz  | _        |j        | _        |x| _	        | _
        |j        x| _        | _        | j        | j        z  dk    sJ | j        | j        z  | _        | j        | j	        z  | _        | j        | j	        z  | _        | j        | j
        z  | _        t%          j        | j        | j        | j        z   | j        z   d          | _        t%          j        | j        | j
        z  | j        d          | _        t-          j        | j        | j	        f          | _        t-          j        | j        | j	        f          | _        t%          j        | j	                  | _        d S )Ng      r   FrS   )r?   r@   rQ   r   r   r   scaler   q_num_headsqk_dimv_dimr   k_num_headsv_num_headsn_group
q_proj_dim
k_proj_dim
v_proj_dimrb   rc   qkv_projo_projrA   rp   q_weightk_weightRoPErope)rE   rQ   head_dimrF   s      r6   r@   zAttention.__init__   s   !-.'-'E$t^
!5#++dj.4.HH4+$"22a7777'4+;;*T[8*T[8*TZ7	Odo-?
 
 

 itz)4+;%
 
 
 !14; ?@@!14; ?@@GDK((			r5   rG   ry   c                    |j         \  }}}|                     |          }t          j        || j        | j        | j        z   gd          \  }}	}
|                    ||| j        | j                  	                    dddd          }|	                    ||| j
        | j                  	                    dddd          }	|
                    ||| j        | j                  	                    dddd          }
t          j                            |d d          | j        d d d f         z  }t          j                            |	d d          | j        d d d f         z  }	|R|                     ||j        	          }|                     |	|j        	          }	|                    |	|
          \  }	}
n*|                     |          }|                     |	          }	t          j                            ||	|
| j        |
          }|	                    dddd                              ||| j        | j        z            }|                     |          S )Nr   r{   r   r$   r	      r   )rC   r:   )r;   )r   ry   )r[   r   rA   r   r   r   r   r   r   	transposer   r   r   rI   rJ   r   r   r   r;   update_and_fetchscaled_dot_product_attentionr   r   )rE   rG   ry   rx   r   Tr   qkvqkvoutputs               r6   rK   zAttention.__call__   s2     %1ammM**($/4?T_#DEB
 
 
1a IIaD,dk::DDQ1aPPIIaD,dk::DDQ1aPPIIaD,dj99CCAq!QOOGQt66qqq$w9OOGQt66qqq$w9OO		!EL	11A		!EL	11A))!Q//DAqq		!A		!A55* 6 
 
 !!!Q1--55q$"TZ/
 
 {{6"""r5   r   )
r+   r,   r-   r   r@   rA   rL   r   rK   rM   rN   s   @r6   r   r      s        )y )T ) ) ) ) ) )D $(	%# %#x%# rx %# %# %# %# %# %# %# %#r5   r   c                   L     e Zd Zdeddf fdZdej        dej        fdZ xZS )MLPrQ   r<   Nc                 $   t                                                       || _        |j        | _        |j        | _        t          j        | j        | j        dz  d          | _        t          j        | j        | j        d          | _        d S )Nr$   FrS   )	r?   r@   rQ   r   r)   rb   rc   gate_up_proj	down_projrv   s     r6   r@   zMLP.__init__(  s    !-!'!9Id4q8u
 
 
 4#94;KRWXXXr5   r   c                     |                      |          }t          j        |dd          }|                     t	          |d         |d                             S )Nr$   r   r{   r   r	   )r   rA   r   r   r
   )rE   r   hhss       r6   rK   zMLP.__call__2  sO    a  Xa$$$~~fRUBqE22333r5   	r+   r,   r-   r   r@   rA   rL   rK   rM   rN   s   @r6   r   r   '  sy        Yy YT Y Y Y Y Y Y4"( 4rx 4 4 4 4 4 4 4 4r5   r   c                   b     e Zd Zdededdf fdZ	 	 d	dej        deej                 fdZ	 xZ
S )
PlamoDecoderLayerrQ   is_mambar<   Nc                    t                                                       || _        |j        | _        || _        |  |rt          |          | _        nt          |          | _        t          |          | _	        t          |j        |j        d          | _        t          |j        |j        d          | _        t          |j        |j        d          | _        t          |j        |j        d          | _        d S )Nr9   )r:   r;   g?gWfѷ?)r?   r@   rQ   r   r   rP   mixerr   r   mlpr8   r   pre_mixer_normpost_mixer_normpre_mlp_normpost_mlp_norm)rE   rQ   r   rF   s      r6   r@   zPlamoDecoderLayer.__init__9  s   !-  	+vDJJ"6**DJv;;%F$7
 
 
  'F$7 
  
  
 $F$7
 
 
 %F$7
 
 
r5   rG   ry   c                     |}|                      |          }|                     |||          }|                     |          }||z   }|}|                     |          }|                     |          }|                     |          }||z   S )N)rG   ry   rx   )r   r   r   r   r   r   )rE   rG   ry   rx   residualhidden_states_sahidden_states_mlps          r6   rK   zPlamoDecoderLayer.__call__Q  s     !++M::::' & 
 
  //0@AA #33 ))-88 !HH]33 !../@AA+++r5   r   )r+   r,   r-   r   r2   r@   rA   rL   r   rK   rM   rN   s   @r6   r   r   8  s        
y 
D 
T 
 
 
 
 
 
6 $(	, ,x, rx , , , , , , , ,r5   r   rQ   ir<   c                     | j         sdS | j        dk    sJ || j        k     sJ | j        | j        dz  k    r|| j        dz
  k    S || j        z  | j        dz  k    S )NFr	   r$   )r(   r%   r   )rQ   r   s     r6   r   r   n  s~     uq    v'''''F$5$:;;F,q000!!v'8A'=>>r5   c                   >     e Zd Zdeddf fdZdej        fdZ xZS )PlamoDecoderrQ   r<   Nc                     t                                                       fdt          j                  D             | _        j        rdnd | _        j        dz  | _        d S )Nc           	      N    g | ]!}t          t          |                     "S ))r   )r   r   ).0r   rQ   s     r6   
<listcomp>z)PlamoDecoder.__init__.<locals>.<listcomp>~  s@     
 
 
 fx/B/BCCC
 
 
r5   r   r$   )	r?   r@   ranger   layersr(   ssm_idxr%   fa_idxrv   s    `r6   r@   zPlamoDecoder.__init__{  sw    
 
 
 
6344
 
 
 #0:qqd'1,r5   r   c                    |d gt          | j                  z  }t          ||| j                           }| j        t          ||| j                           }nd }t          | j        |          D ]\  }} |||j        r|n||          }|S )N)ry   rx   )lenr   r   r   r   r   zipr   )rE   r   rx   	attn_mask
mamba_masklcs          r6   rK   zPlamoDecoder.__call__  s    =FS---E)!U4;-?@@	<#(E$,,?@@JJJ
 e$$	 	 
#$:<ZZ9  AA
 r5   r   rN   s   @r6   r   r   z  sh        -y -T - - - - - -"(        r5   r   c                   >     e Zd Zdef fdZ	 ddej        fdZ xZS )
PlamoModelrQ   c                    t                                                       || _        |j        | _        t	          j        |j        |j                  | _        t          |          | _	        t          |j        |j                  | _        d S )N)r:   )r?   r@   rQ   r*   rb   	Embeddingr   embed_tokensr   r   r8   r   normrv   s     r6   r@   zPlamoModel.__init__  sq     +L):F<NOO"6**F.F4GHHH			r5   Ninputsc                     |j         \  }}|                     |          }|                     ||          }|                     |          S r>   )r[   r   r   r   )rE   r   rx   r   
seq_lengthr   r   s          r6   rK   zPlamoModel.__call__  sN    
 "(
Jf%%kk
 

 yy~~r5   r>   r   rN   s   @r6   r   r     ss        Iy I I I I I I         r5   r   c                        e Zd Zdeddf fdZdeeef         deeef         fdZd Zdde	j
        de	j
        fd	Zed
             Z xZS )ModelrQ   r<   Nc                    t                                                       || _        |j        | _        t	          |          | _        |j        | _        |j        s(t          j	        |j
        | j        d          | _        d S d S )NFrS   )r?   r@   rQ   r   r   modelr*   r   rb   rc   r   lm_headrv   s     r6   r@   zModel.__init__  s     +''
 +) 	&(i"DO%' ' 'DLLL	 	r5   weightsc                     |                                 D ]3\  }}d|v r*|j        d         dk    r|                    dd          ||<   4|S )Nzconv1d.weightr   r	   r$   )itemsr[   moveaxis)rE   r   r   r   s       r6   sanitizezModel.sanitize  sU    MMOO 	. 	.DAq!##q(8(8ZZ1--
r5   c                 $    d | j         D             S )Nc                 X    g | ]'}|j         rt          d           nt                      (S )r$   )size)r   r   r   )r   r   s     r6   r   z$Model.make_cache.<locals>.<listcomp>  s3    VVVQqz@####wyyVVVr5   )r   rE   s    r6   
make_cachezModel.make_cache  s     WV$+VVVVr5   r   c                     |                      ||          }| j        j        r | j         j                            |          }n|                     |          }|S )N)r   rx   )r   rQ   r   r   	as_linearr   )rE   r   rx   outputslogitss        r6   rK   zModel.__call__  s_    **  
 
 ;* 	+Z,66w??FF\\'**Fr5   c                 $    | j         j        j        S r>   )r   r   r  s    r6   r   zModel.layers  s    z ''r5   r>   )r+   r,   r-   r   r@   dictr   r  r  rA   rL   rK   propertyr   rM   rN   s   @r6   r   r     s        y T      S#X 4S>    W W W

 
rx 
 
 
 
 
 ( ( X( ( ( ( (r5   r   )#mathdataclassesr   typingr   r   mlx.corecorerA   mlx.nnrb   mlx_lm.models.baser   r   r   activationsr
   rx   r   r   ssmr   r   Moduler8   rP   r   r   r   r0   r2   r   r   r   r   r4   r5   r6   <module>r     s    ! ! ! ! ! !                             T T T T T T T T T T       ' ' ' ' ' ' ' '              ,
 
 
 
 
bi 
 
 
$b" b" b" b" b"BI b" b" b"JE# E# E# E# E#	 E# E# E#P4 4 4 4 4") 4 4 4"3, 3, 3, 3, 3,	 3, 3, 3,l	?Y 	?3 	?4 	? 	? 	? 	?    29   B       8'( '( '( '( '(BI '( '( '( '( '(r5   