
    ԓ5j7                    8   S SK Jr  S SKJrJrJrJr  S SKr\(       a  S SKJr  SSK	J
r
JrJrJr  \
R                  " S5       " S S	\5      5       r\
R                  " S
SSSSS5       " S S
\5      5       r\
R                  " S5       " S S\5      5       r\
R                  " SS5       " S S\5      5       r\
R                  " S5       " S S\5      5       r\
R                  " S5       " S S\5      5       r\
R                  " S5       " S S\5      5       r\
R                  " S 5       " S! S"\5      5       r " S# S$\5      r " S% S&5      r " S' S(5      r\
R                  " S)S*5       " S+ S,\\\5      5       r\
R                  " S-S.5       " S/ S0\\\5      5       rg)1    )annotations)AnyCallableIterableTYPE_CHECKINGN)Tensor   )	ModelBase	TextModelggufloggerQWenLMHeadModelc                  n    \ rS rSr\R
                  R                  r\S 5       r	\SSS jj5       r
S rSrg)		QwenModel   c           	         SSK Jn  U" 5       nSR                  U R                  S5       Vs/ s H  o2[	        U5         PM     sn5      $ s  snf )Nr   )bytes_to_unicode zlatin-1)*transformers.models.gpt2.tokenization_gpt2r   joindecodeord)br   byte_encoderchars       //mnt/workspace/git/llama.cpp/conversion/qwen.pytoken_bytes_to_stringQwenModel.token_bytes_to_string   s@    O')wwAHHY<OP<ODSY/<OPQQPs   A
Nc                P   U Vs/ s H  n[        U/5      PM     nn S nS n[        [        US S USS  5      5       H2  u  pxU R                  US   US   -   5      n	U	c  M$  Ub  X:  d  M.  UnU	nM4     Ub  Ub  Xb:  a   U$ Uc   eUS U XE   XES-      -   /-   XES-   S  -   nM  s  snf )Nr	   r      )bytes	enumeratezipget)
mergeable_rankstokenmax_rankr   partsmin_idxmin_rankipairranks
             r   bpeQwenModel.bpe   s    %*+UsU+GH$SsU12Y%?@&**47T!W+<=#)9T_G#H	 A
 H$8X=Q  &&&(7Ou~k8J'J&KKe^_T_T`NaaE  ,s   B#c                $    U R                  5         g N)_set_vocab_qwenselfs    r   	set_vocabQwenModel.set_vocab(   s         r2   )r&   zdict[bytes, int]r'   r"   r(   
int | Nonereturnzlist[bytes])__name__
__module____qualname____firstlineno__r   
MODEL_ARCHQWEN
model_archstaticmethodr   r/   r6   __static_attributes__r9   r8   r   r   r      s>    %%JR R
   r8   r   
Qwen2ModelQwen2ForCausalLM"Qwen2AudioForConditionalGenerationKORMoForCausalLM&AudioFlamingo3ForConditionalGenerationDotsOCRForCausalLMc                  j   ^  \ rS rSr\R
                  R                  rS rU 4S jr	SU 4S jjr
SrU =r$ )rE   ,   c                f     U R                  5         g ! [         a    U R                  5          g f = fr2   )_set_vocab_sentencepieceFileNotFoundError_set_vocab_gpt2r4   s    r   r6   Qwen2Model.set_vocab7   s.    	#))+  	#  "	#s    00c                B   > [         TU ]  5         U R                  5         g r2   )superset_gguf_parameters_try_set_pooling_typer5   	__class__s    r   rT   Qwen2Model.set_gguf_parameters=   s    #%""$r8   c              #  l   >#    U R                   S:X  a  SU 3n[        TU ]	  XU5       S h  vN   g  N7f)NrE   model.)hf_archrS   modify_tensorsr5   
data_torchnamebidrW   s       r   r\   Qwen2Model.modify_tensorsA   s2     <<<'D6?D7)*C@@@s   )424r9   r^   r   r_   strr`   r:   r;   zIterable[tuple[str, Tensor]])r<   r=   r>   r?   r   r@   QWEN2rB   r6   rT   r\   rD   __classcell__rW   s   @r   rE   rE   ,   s*     &&J#%A Ar8   Qwen2MoeForCausalLMc                     ^  \ rS rSr% \R
                  R                  rU 4S jrSr	S\
S'   S	U 4S jjrU 4S jrSrU =r$ )
Qwen2MoeModelG   c                l  > [         TU ]  5         U R                  R                  S5      =nb4  U R                  R                  U5        [        R                  " SU 35        U R                  R                  S5      =nb5  U R                  R                  U5        [        R                  " SU 35        g g )Nmoe_intermediate_sizez#gguf: expert feed forward length = shared_expert_intermediate_sizez*gguf: expert shared feed forward length = )	rS   rT   hparamsr%   gguf_writeradd_expert_feed_forward_lengthr   info%add_expert_shared_feed_forward_length)r5   rl   rm   rW   s      r   rT   !Qwen2MoeModel.set_gguf_parametersK   s    #%%)\\%5%56M%NN![;;<QRKK=>S=TUV/3||/?/?@a/bb+oBBCbcKKDEdDefg pr8   Nzlist[dict[str, Tensor]] | None_expertsc           	   #    >#    UR                  S5      (       d  UR                  S5      (       a6  UR                  S5      (       d  U S3OUn[        TU ]	  XU5       S h  vN   g UR                  S5      (       d  UR                  S5      (       a  UR                  S:  d  UR                  S   S-  S	:w  a$  [        S
U S[        UR                  5       35      eUR                  S   S-  nUSS U2S S 24   R                  5       nUSUS 2S S 24   R                  5       nUR                  S5      R                  S5      nU S3n	U S3n
[        TU ]	  XiU5       S h  vN   [        TU ]	  XzU5       S h  vN   g UR                  S5      S:w  Ga  U R                  SS/5      nUc   eU R                  c+  [        U R                  5       Vs/ s H  n0 PM     snU l        XR                  U   U'   [        U R                  U   5      US-  :  a  S H  n/ n[        U5       H@  nSU SU SU S3nUR                  U R                  U   U   5        U R                  U   U	 MB     [         R"                  " US	S9nSU SU S3n[        TU ]	  UUU5       S h  vN   M     g g [        TU ]	  XU5       S h  vN   g  GN_ GNc GNNs  snf  N1 N7f)Nzmlp.experts.down_projzmlp.experts.down_proj.weight.weightzmlp.experts.gate_up_projzmlp.experts.gate_up_proj.weight   r!   r   z"Unexpected gate_up_proj shape for z: .z.gate_up_projz.gate_proj.weightz.up_proj.weightexpertsr    num_local_expertsnum_experts)	down_proj	gate_projup_projmodel.layers.z.mlp.experts..dim)endswithrS   r\   ndimshape
ValueErrortuple
contiguousremovesuffixfindfind_hparamrt   rangeblock_countlenappendtorchstack)r5   r^   r_   r`   mappedn_ffgateup	base_namemapped_gate	mapped_up	n_experts_w_namedatasxidenamemerged_namerW   s                     r   r\   Qwen2MoeModel.modify_tensorsV   s     ==011T]]Ca5b5b-1]]9-E-EvW%4Fw-j#FFF==344Fg8h8h"j&6&6r&:Q&>!&C #EdV2eT^TdTdNeMf!ghh##B'1,Dc5D5!m,779DCM*557B)))4AA/RI&K'89K$+_5Iw-dEEEw-bSAAA99Y2%((*=})MNI?"?}}$-243C3C-D E-D-D E'1MM#t$4==%&)a-7CF*,E$Y/"/uM#axw WT]]3%7%>? MM#.u5  0
 "'U!:J$1#mF87"SK$w5j+sSSS D 7)*C@@@] G FA !F$ T
 	Asi   AK J?!C>KK K7K8AKKC KKK9K:KKKKKc                   > [         TU ]  5         U R                  bR  U R                   VVs/ s H  oR                  5         H  o"PM     M     nnn[	        U5      S:  a  [        SU 35      eg g s  snnf )Nr   zUnprocessed experts: )rS   prepare_tensorsrt   keysr   r   )r5   dkry   rW   s       r   r   Qwen2MoeModel.prepare_tensors   sh    !==$"&--B-QAqq-GB7|a #8	!BCC   %Bs   "A0)rt   rb   )r<   r=   r>   r?   r   r@   QWEN2MOErB   rT   rt   __annotations__r\   r   rD   re   rf   s   @r   ri   ri   G   s8    ))Jh 04H,37ArD Dr8   ri   Qwen3ForCausalLM
Qwen3Modelc                     ^  \ rS rSr% \R
                  R                  rSrS\	S'   Sr
S\	S'   SrS\	S'   SrS\	S	'   U 4S
 jrSS jrU 4S jrS rU 4S jrSS jrSU 4S jjrSrU =r$ )r      Fbool	is_rerankis_tied_embeddingsNr:   token_false_idtoken_true_idc                   > [         TU ]  " U0 UD6  [        R                  " U R                  SS9nUR                  SS /5      S   U l        U R                  5       (       a  U R                  5         g g )NF)is_mistral_formatarchitecturesr   )	rS   __init__r
   load_hparams	dir_modelr%   origin_hf_arch_is_qwen3_reranker_find_rerank_configr5   argskwargsrn   rW   s       r   r   Qwen3Model.__init__   sg    $)&) ((5Q%kk/D6B1E""$$$$& %r8   c                   U R                   S-  nSnUR                  5       (       a)  UR                  SSS9 nUR                  5       nS S S 5        [	        U R                   R
                  5      [	        U R                  R                  SS5      5      [	        U R                  R                  SS5      5      [	        U R                  =(       d    S5      /nU Vs/ s H  oU(       d  M  UR                  5       PM     nnSUR                  5       ;   d  S	UR                  5       ;   a  g
[        S U 5       5      (       a  g
SU R                  =(       d    SR                  5       ;   $ ! , (       d  f       GN#= fs  snf )Nz	README.mdr   rutf-8encoding_name_or_path
model_typez# qwen3-rerankerz# qwen3-vl-rerankerTc              3  D   #    U  H  nS U;   =(       d    SU;   v   M     g7f)zqwen3-rerankerzqwen3-vl-rerankerNr9   ).0hints     r   	<genexpr>0Qwen3Model._is_qwen3_reranker.<locals>.<genexpr>   s&     ^S]44'F+>$+FFS]s    sequenceclassification)r   existsopenreadrc   r_   rn   r%   r   lowerany)r5   readme_pathreadme_textf
name_hintsr   s         r   r   Qwen3Model._is_qwen3_reranker   s1   nn{2!!#!8Affh 9 ##$  "56  r23##)r*	

 0:BztTldjjlz
B!2!2!448MQ\QbQbQd8d^S]^^^'D,?,?,E2+L+L+NNN# 98 Cs   E$
E6'E6$
E3c                d   > U R                   S:X  a  U R                  5         g [        TU ]  5         g N InternS1ForConditionalGenerationr   _set_vocab_interns1rS   r6   rV   s    r   r6   Qwen3Model.set_vocab   ,    "DD$$&r8   c                R   SSK Jn  UR                  U R                  5      nSU l        U R
                  R                  SS5      U l        UR                  S5      U l	        UR                  S5      U l
        UR                  S5      U l        U R                  b  U R                  c   eg )	Nr   )AutoTokenizerTtie_word_embeddingsFnoyes|)transformersr   from_pretrainedr   r   rn   r%   r   convert_tokens_to_idsr   r   sep_token_id)r5   r   	tokenizers      r   r   Qwen3Model._find_rerank_config   s    .!11$..A	"&,,"2"23H%"P'==dC&<<UC%;;C@"".43E3E3QQQ3Qr8   c                $  > [         TU ]  5         U R                  (       ap  U R                  R	                  [
        R                  R                  5        U R                  R                  SS/5        U R                  R                  SSS./5        g g )Nr   r   rerankap  <|im_start|>system
Judge whether the Document meets the requirements based on the Query and the Instruct provided. Note that the answer can only be "yes" or "no".<|im_end|>
<|im_start|>user
<Instruct>: Given a web search query, retrieve relevant passages that answer the query
<Query>: {query}
<Document>: {document}<|im_end|>
<|im_start|>assistant
<think>

</think>

)r_   template)
rS   rT   r   ro   add_pooling_typer   PoolingTypeRANKadd_classifier_output_labelsadd_chat_templaterV   s    r   rT   Qwen3Model.set_gguf_parameters   sy    #%>>--d.>.>.C.CD995$-H.. M1 0  r8   c                f    XR                      nXR                     n[        R                  " X2/SS9$ )Nr   r   )r   r   r   r   )r5   r^   	false_rowtrue_rows       r   _get_cls_out_tensorQwen3Model._get_cls_out_tensor   s2    223	001{{H0a88r8   c              #    >#    U R                   (       a  U R                  =(       a    SU;   nU R                  (       + =(       a    SU;   nU(       d  U(       ac  [        R                  [        R                  R
                     S-   U R                  U5      4nUv   U(       a  [        TU ]!  XU5       S h  vN   g [        TU ]!  XU5       S h  vN   g  N N7f)Nembed_tokenslm_headrv   )	r   r   r   TENSOR_NAMESMODEL_TENSORCLS_OUTr   rS   r\   )r5   r^   r_   r`   is_tied_headis_real_headcls_out_headrW   s          r   r\   Qwen3Model.modify_tensors   s     >>22M~7ML#666L9;LL|%%d&7&7&?&?@9L,,Z8  #"$w5jLLL7)*C@@@ M 	As$   B2C5C6CCCC)r   r   r   r   r   r   )r;   r   )r^   r   r;   r   rb   )r<   r=   r>   r?   r   r@   QWEN3rB   r   r   r   r   r   r   r   r6   r   rT   r   r\   rD   re   rf   s   @r   r   r      si    &&J It$$!%NJ% $M:$'O.
R
9A Ar8   DFlashDraftModelc                     ^  \ rS rSr\R
                  R                  rU 4S jrU 4S jr	U 4S jr
SS	U 4S jjjrS
U 4S jjrSrU =r$ )DFlashModel   c                  > [         TU ]  " U0 UD6  U R                  c  [        S5      eSS Kn[        U R                  S-  SSS9 nUR                  U5      U l        S S S 5        [        U R                  S-  SSS9 nUR                  U5      nS S S 5        SW;   a	  0 UEUS   EnXPl	        U R                  R                  S0 5      =(       d    0 U l        g ! , (       d  f       N= f! , (       d  f       N_= f)	NzPDFlash model requires --target-model-dir to read the target config and tokenizerr   zconfig.jsonr   r   r   text_configdflash_config)rS   r   target_model_dirr   jsonr   r   loaddflash_raw_configtarget_configr%   
dflash_cfg)r5   r   r   r
  r   r  rW   s         r   r   DFlashModel.__init__  s    $)&)  (b  	$..=0#HA%)YYq\D" I$''-7wOST IIaLM PM)M}Mm0LMM*0044_bIOR IHOOs   C=C(
C%(
C6c                   > U R                   nU R                  U l          [        TU ]  5         Xl         g ! Xl         f = fr2   )r   r	  rS   r6   )r5   original_dir_modelrW   s     r   r6   DFlashModel.set_vocab  s6    !^^..	0G/N/Ns   5 =c           	       > [         TU ]  5         U R                  R                  nU R                  R                  S5      =(       d    U R                  S   nU R                  R                  S5      nUcR  U R                  S   nU R                  S   n[        U5       Vs/ s H  n[        SUS-   U-  US-   -  S-
  5      PM      nn[        R                  " SU SU 35        U R                  R                  U S	3U Vs/ s H  n[        U5      PM     sn5        U R                  R                  U S
3[        U5      5        U R                  R                  U S3[        U R                  R                  SS5      5      5        U R                  R                  S5      nUb)  U R                  R                  U S3[        U5      5        g g s  snf s  snf )Ntarget_hidden_sizehidden_sizetarget_layer_idsnum_hidden_layersr   r	   zDFlash: target_layers = z, target_hidden_size = z.target_layersz.target_hidden_sizez.block_size
block_size   mask_token_idz.mask_token_id)rS   rT   ro   archr  r%   r  r  rn   r   maxr   rq   	add_arrayint
add_uint32)	r5   r  r  r  n_targetn_draftr,   r  rW   s	           r   rT   DFlashModel.set_gguf_parameters  s   #%$$!33778LMrQUQcQcdqQr??../AB#))*=>H||$78GY^_fYghYgTUAA'9gk'JQ'N OYgh./?.@@WXjWklm""tfN$;ScBdSca3q6ScBde##tf,?$@#FXBYZ##tfK$8#dF\F\F`F`amoqFrBst++O<$''4&(?]AST %  i Ces    %G G
c                   > [         TU ]  U5      n0 nUR                  5        H.  u  pEUR                  S5      (       d  US:X  a	  XSSU-   '   M*  XSU'   M0     U$ )Nzlayers.norm.weightrZ   )rS   index_tensorsitems
startswith)r5   remote_hf_model_idtensorsrenamedr_   genrW   s         r   r%  DFlashModel.index_tensors1  s\     ''(:;35 IDy))T]-B+.4( #	 )
 r8   c              #     >#    US:X  a.  U R                  [        R                  R                  5      U4v   g US:X  a.  U R                  [        R                  R                  5      U4v   g US;   a  g [
        TU ]  XU5       S h  vN   g  N7f)Nz	fc.weightzhidden_norm.weight)d2tt2d)format_tensor_namer   r   FCDFLASH_HIDDEN_NORMrS   r\   r]   s       r   r\   DFlashModel.modify_tensors=  s     ;))$*;*;*>*>?KK''))$*;*;*N*NOQ[[[>!7)*C@@@s   BBBB)r  r  r   r  r2   r(  z
str | Noner;   zdict[str, Callable[[], Tensor]]rb   )r<   r=   r>   r?   r   r@   DFLASHrB   r   r6   rT   r%  r\   rD   re   rf   s   @r   r  r     s;     ''JP$0U*
 

A 
Ar8   r  Qwen3MoeForCausalLMc                  `   ^  \ rS rSr\R
                  R                  rU 4S jrU 4S jr	Sr
U =r$ )Qwen3MoeModeliJ  c                   > [         TU ]  " U0 UD6  [        R                  " U R                  S5      nUR                  SS /5      S   U l        g )NFr   r   )rS   r   r
   r   r   r%   r   r   s       r   r   Qwen3MoeModel.__init__N  sE    $)&)((?%kk/D6B1Er8   c                d   > U R                   S:X  a  U R                  5         g [        TU ]  5         g r   r   rV   s    r   r6   Qwen3MoeModel.set_vocabS  r   r8   )r   )r<   r=   r>   r?   r   r@   QWEN3MOErB   r   r6   rD   re   rf   s   @r   r8  r8  J  s"    ))JF
 r8   r8  Qwen3NextForCausalLMc                  ~   ^  \ rS rSr\R
                  R                  rU 4S jr\	SU 4S jj5       r
SU 4S jjrSrU =r$ )Qwen3NextModeli\  c           	     6  > [         TU ]  5         U R                  R                  U R                  S   5        U R                  R                  U R                  S   5        U R                  R                  U R                  S   5        U R                  R                  U R                  S   5        U R                  R                  U R                  S   U R                  S   -  5        U R                  R                  U R                  R                  SS5      5        U R                  R                  S5      =nc  U R                  S	   U R                  S
   -  nU R                  R                  [        XR                  R                  SS5      -  5      5        g )Nlinear_conv_kernel_dimlinear_key_head_dimlinear_num_key_headslinear_num_value_headslinear_value_head_dimfull_attention_interval   head_dimr  num_attention_headspartial_rotary_factorg      ?)rS   rT   ro   add_ssm_conv_kernelrn   add_ssm_state_sizeadd_ssm_group_countadd_ssm_time_step_rankadd_ssm_inner_sizeadd_full_attention_intervalr%   add_rope_dimension_countr  )r5   rope_dimrW   s     r   rT   "Qwen3NextModel.set_gguf_parameters`  sC   #%,,T\\:R-ST++DLL9N,OP,,T\\:P-QR//=U0VW++DLL9P,QTXT`T`ayTz,z{44T\\5E5EF_ab5cd((44H=||M2dllCX6YYH11#hAQAQRikoAp6p2qrr8   c                X   > Uu  p#UR                  S5      (       a  g [        TU ]	  U5      $ )Nmtp)r'  rS   filter_tensors)clsitemr_   r+  rW   s       r   rW  Qwen3NextModel.filter_tensorsl  s,    	??5!!w%d++r8   c              #  ^  >#    UR                  S5      (       a  [        R                  " U5      * nOvUR                  S5      (       a  UR                  S5      S   S-   nOHSU;   a  UR	                  5       nO1UR                  S5      (       a  UR                  S5      (       d  US-   nS	U;   Ga  U R
                  S
   nU R
                  S   nU R
                  S   nU R
                  S   nU R
                  S   nUUXg-  U-  Xg-  U-  /n	UR                  SS5      R                  5       nUR                  SU[        U	5      5      n[        R                  " XSS9u  ppU
R                  5       R                  US5      n
UR                  5       R                  US5      nUR                  5       R                  US5      nUR                  5       R                  US5      n[        R                  " XU/SS9R                  SS5      R                  5       nUR                  SS5      R                  5       nU R                  [        R                  R                  US5      U4v   U R                  [        R                  R                   US5      U4v   g ["        TU ]I  XU5       S h  vN   g  N7f)N.A_log.dt_biasr   z.dt_proj.biasconv1dr$  zlinear_attn.norm.weightr	   zin_proj_qkvz.weightrC  rF  rE  rD  r  r    r   rv   )r   r   exp
rpartitionsqueezern   permuter   viewsumsplitcatr0  r   r   ATTN_QKV	ATTN_GATErS   r\   )r5   r^   r_   r`   
head_k_dim
head_v_dimnum_v_headsnum_k_headsr  split_arg_list_qkvzqr   vzqkvrW   s                  r   r\   Qwen3NextModel.modify_tensorsv  sP    ==""))J//J]]:&&??:.q1OCD#++-J]]=))$--@Y2Z2Z#aJ D( &;<J&=>J,,'?@K,,'=>K,,}5K+j8+j8	# $++Aq1<<>J#[#>Q:RSJZ"MJA!##K4A##K4A##K4A##K4A))Q1I2.66q!<GGIC		!Q**,A**4+<+<+E+EYWY\]]**4+<+<+F+FYWYZ[[w-jDDDs   J"J-%J+&J-r9   )rY  z tuple[str, Callable[[], Tensor]]r;   z'tuple[str, Callable[[], Tensor]] | Nonerb   )r<   r=   r>   r?   r   r@   	QWEN3NEXTrB   rT   classmethodrW  r\   rD   re   rf   s   @r   r@  r@  \  s8    **J
s , ,(E (Er8   r@  RND1c                  T   ^  \ rS rSr\R
                  R                  rU 4S jrSr	U =r
$ )	RND1Modeli  c                   > [         TU ]  5         U R                  R                  S5        U R                  R                  S5      =nb  U R                  R                  U5        g g )NFr  )rS   rT   ro   add_causal_attentionrn   r%   add_mask_token_id)r5   r  rW   s     r   rT   RND1Model.set_gguf_parameters  sX    #% 	--e4!\\--o>>MK..}= Lr8   r9   )r<   r=   r>   r?   r   r@   ru  rB   rT   rD   re   rf   s   @r   rw  rw    s    %%J> >r8   rw  c                     ^  \ rS rSr\R
                  R                  r \SS j5       r	SS jr
S	U 4S jjrS
U 4S jjrSrU =r$ )_LinearAttentionVReorderBasei  c                J   [        U R                  5      nUS:  a  U[        U5      -  nUSU X#U/-   XQS-   S -   nU R                  " U6 n [        [	        [        U5      5      5      nXqS-      Xq   sXq'   XqS-   '   U R
                  " U6 R                  5       R                  " U6 $ )zRReorder V heads from grouped (by K head) to tiled order along the given dimension.r   Nr	   )listr   r   reshaper   rb  r   )tensorr   rl  num_v_per_krI  r   	new_shapeperms           r   _reorder_v_heads-_LinearAttentionVReorderBase._reorder_v_heads  s     V\\"73u:C$3K;X"FFUVwxX	+E#i.)*#'a=$) 	4a=~~t$//1995AAr8   c                ~  ^ ^^^^^ UR                  S5      (       d  X#4$ T R                  S   mT R                  S   mT R                  S   nT R                  S   nTT-  mSS jmSS jmSUU4S jjnSUUUU 4S	 jjnUR                  S
5      (       ag  UT-  nUT-  n	US U n
X(X-    nX(U	-   S  nUS U nX8X-    nX8U	-   S  nU" XU5      u  p[        R                  " XU/SS9[        R                  " XU/SS94$ UR                  S5      (       a  U" X#U5      u  p#X#4$ UR                  S5      (       a  U" X#S5      u  p#X#4$ UR                  S5      (       ab  T R	                  [        R
                  " TU-  [        R                  S9R                  S5      STTU5      R                  S5      nU" X#U5      u  p#X#4$ )N).linear_attn.in_proj_qkv.weight.linear_attn.in_proj_z.weight.linear_attn.in_proj_a.weight.linear_attn.in_proj_b.weight.linear_attn.out_proj.weightrD  rE  rC  rF  c                    [         R                  " U S5      n[         R                  " U S5      n[         R                  " X4SS9R                  " / U R
                  S S QU R
                  S   S-  P76 $ )N   rH  r    r   r!   )r   bitwise_andbitwise_right_shiftr   r  r   )qslohis      r   unpack_nibblesL_LinearAttentionVReorderBase._transform_nvfp4_weight.<locals>.unpack_nibbles  se    ""2t,B**2q1B;;xR088Z"((3B-ZRTXYIYZZr8   c                B   U R                   " / U R                  S S QU R                  S   S-  PSP76 n [        R                  " U S   S5      n[        R                  " [        R                  " U S   S5      S5      n[        R
                  " X5      R                  5       $ )Nr    r!   ).r   r  ).r	   rH  )r  r   r   r  bitwise_left_shift
bitwise_orr   )codesr  r  s      r   pack_nibblesJ_LinearAttentionVReorderBase._transform_nvfp4_weight.<locals>.pack_nibbles  s    MMM5;;s#3MU[[_5IM1ME""5=$7B))%*;*;E&M4*PRSTB##B+6688r8   c                  > U R                   S:  d   eUR                   S:  d   eU R                  S   S-  nUR                  5       U:X  d   eUS-  S:X  d   eUR                  SS5      nUS S 2S4   nUR	                  S5      [
        R                  " SUR                  S9-   n[
        R                  " XF5      (       d   e[
        R                  " US-  S:H  5      (       d   eUS-  R                  [
        R                  S9n[
        R                  " UR                  S   [
        R                  S9nUR                  5       UR                  S   :X  d   e[
        R                  " [
        R                  " U5      R                  U5      (       d   eT" U 5      n	U	R                  SUR                  U R                  [
        R                  S95      n	T
" U	5      n UR                  SUR                  UR                  S95      nX4$ )	Nr!   r    r  r   r	   dtype)devicer  r  )r   r   numelr  	unsqueezer   aranger  equalalltolongsortvaluesindex_selectr  )r  scalescol_permr   
group_colsgroup_startsexpected
group_permexpected_groupsr  r  r  s             r   apply_col_permL_LinearAttentionVReorderBase._transform_nvfp4_weight.<locals>.apply_col_perm  s   77a<<;;!###q A>>#q(((r6Q;;!))"b1J%ad+L#--a05<<(..3YYH;;z444499\B.!34444&",00uzz0BJ#ll6<<+;5::NO##%b)9999;;uzz*5<<oNNNN"2&E&&r8;;biiuzz;+Z[Ee$B((Z]]&--]-PQF:r8   c                V  > TR                  [        R                  " TU-  [        R                  S9R	                  S5      STTU5      R                  S5      nU R                  SUR                  U R                  S95      UR                  SUR                  UR                  S95      4$ )Nr  r    r   r  )	r  r   r  r  r  ra  r  r  r  )r  r  rI  row_permrl  rk  r  r5   s       r   reorder_rowsJ_LinearAttentionVReorderBase._transform_nvfp4_weight.<locals>.reorder_rows  s    ,,[835::FPPQST;X gbk 
 8;;bii;#@A##Ax{{&--{'HI r8   r  r   r   r  )r  r  r	   r  r  )r  r   r;   r   )r  r   r;   r   )r  r   r  r   r  r   r;   tuple[Tensor, Tensor])r  r   r  r   rI  r  r;   r  )	r   rn   r   rf  r  r  r  r  ra  )r5   r_   weightscaleri  rj  r  r  q_dimk_dimrn  r   ro  q_scalek_scalev_scaler  rl  rk  r  r  r  s   `                @@@@@r   _transform_nvfp4_weight4_LinearAttentionVReorderBase._transform_nvfp4_weight  s   }} 
   = ll#9:ll#;<\\"78
\\"9:
![0	[
	9	 	2	 	 ==:;;,E,EvAU]+Au}~&AFUmG%-0GEMN+G%a*=JA99aAYA.		7W:U[\0]]]==899(
CMF } ]]]^^(:MF } ]]9::,,[:5UZZHRRSTU;Z gaj  +6(CMF}r8   c                P   > U R                  XU5      u  p#[        TU ]	  XX4U5        g r2   )r  rS   _repack_nvfp4)r5   r_   r  r  scale2input_scalerW   s         r   r  *_LinearAttentionVReorderBase._repack_nvfp4   s(    44T5IdE;Gr8   c              #    >#    U R                   R                  SS5      nU R                   R                  SS5      nUS:  Ga  US:  Ga  XE:w  Ga  SU;   Ga  U R                   S   nU R                   S   nXT-  nSU;   aG  Xd-  n	Xd-  n
US U	 nXX-    nXU
-   S  nU R                  USXHU5      n[        R                  " XU/SS9nGOS	U;   a  U R                  USXHU5      nOS
U;   d  SU;   a  U R                  USXHS5      nOSU;   d  SU;   d  SU;   aX  UR
                  S:X  a3  U R                  UR                  S5      SXHS5      R                  S5      nOU R                  USXHS5      nOlSU;   aL  UR                  5       nXd-  S-  nUS U nXS  nU R                  USXHU5      n[        R                  " UU/SS9nOSU;   a  U R                  USXHU5      n[        TU ]%  XU5       S h  vN   g  N7f)NrD  r   rE  zlinear_attn.rC  rF  z.in_proj_qkv.r   z.in_proj_z.z.in_proj_b.z.in_proj_a.r	   r\  r]  z.dt_projr    z.conv1dr!   z
.out_proj.)
rn   r%   r  r   rf  r   r  ra  rS   r\   )r5   r^   r_   r`   rl  rk  ri  rj  r  r  r  rn  r   ro  dataqk_channelsqk_partv_partrW   s                     r   r\   +_LinearAttentionVReorderBase.modify_tensors$  s&    ll&&'=qAll&&'?C?{Q;3MR`dhRh&;<J&=>J%4K$&"0"0v&U]3u}~.))!Q*U"YYaya8
$&!22:q+\fg
$&-4*?!22:q+\]^
T!Z4%7:;M??a'!%!6!6",,R0![q"gbk  "&!6!6z2{ab!cJd"!))+(6:|,l+..vq+T^_"YY'8a@
%!22:q+\fg
7)*C@@@s   G(G3+G1,G3r9   )r  r   r   r  rl  r  r  r  rI  r  r;   r   )r_   rc   r  r   r  r   r;   r  )
r_   rc   r  r   r  r   r  r   r  r   rb   )r<   r=   r>   r?   r   r@   rs  rB   rC   r  r  r  r\   rD   re   rf   s   @r   r}  r}    sF    **J	 	B 	BUnH1A 1Ar8   r}  c                  F   ^  \ rS rSr% / SQrS\S'   S\S'   U 4S jrSrU =r$ )	_Qwen35MRopeMixiniX  )   r  
   r   gguf.GGUFWriterro   dictrope_parametersc                   > [         TU ]  5         SU R                  ;  a&  U R                  R	                  U R
                  5        g g )Nmrope_section)rS   rT   r  ro   add_rope_dimension_sections_QWEN35_DEFAULT_MROPE_SECTIONrV   s    r   rT   %_Qwen35MRopeMixin.set_gguf_parametersb  s;    #%$"6"66889[9[\ 7r8   r9   )	r<   r=   r>   r?   r  r   rT   rD   re   rf   s   @r   r  r  X  s#    
 %4!  ] ]r8   r  c                     ^  \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   S\S'   SrS\S'   U 4S jrSSU 4S jjjr\	S 5       r
U 4S jrSU 4S jjrSrU =r$ )_Qwen35MtpMixinih  a+  Shared MTP wiring for Qwen3.5/3.6 text variants. The HF config carries
the MTP block under `mtp_num_hidden_layers` and the tensors under
`mtp.*`; we extend block_count, emit the nextn metadata key, and remap
`mtp.*` to the standard layer-indexed nextn naming so the existing
tensor_map handles them.zdict[str, Any]rn   zgguf.MODEL_ARCHrB   r  ro   r  r   zgguf.TensorNameMap
tensor_mapr   no_mtpmtp_onlyNr:   _original_block_countc                .  > [         TU ]  " U0 UD6  U R                  S   U l        U R                  (       d/  U =R                  U R                  R                  SS5      -  sl        [        R                  " U R                  U R                  5      U l	        g )Nr  mtp_num_hidden_layersr   )
rS   r   rn   r   r  r%   r   get_tensor_name_maprB   r  )r5   r   r   rW   s      r   r   _Qwen35MtpMixin.__init__x  so    $)&)<<(;<{{ 0 01H! LL224??DDTDTUr8   c                   >^ 0 U R                   EU R                   R                  S0 5      Em[        U4S jS 5       S 5      nTR                  U5      [        U 5      l        [
        TU ]  US9$ )Nr  c              3  6   >#    U  H  oT;   d  M
  Uv   M     g 7fr2   r9   )r   r   rn   s     r   r   0_Qwen35MtpMixin.index_tensors.<locals>.<genexpr>  s     jY!bi]iAAYs   		)n_layersr  n_layer
num_layers)r(  )rn   r%   nexttyper  rS   r%  )r5   r(  keyrn   rW   s      @r   r%  _Qwen35MtpMixin.index_tensors  sd    IT\\IT\\%5%5mR%HIjYjlpq+2;;s+;T
(w$8J$KKr8   c                   U R                   c   e[        R                  " U5      =nc  g Uu  p4UR                  S5      (       a  UR	                  SSS5      nUR                  S5      (       a  U R
                  (       a  g SSSS	S
.nUR                  SS5      n[        U5      S:X  aJ  US   S:X  aA  US   R                  5       (       a)  [        US   5      nSU R                   U-    SUS    3nX44$ [        U5      S:X  a&  US   U;   a  SU R                    SXVS       SUS    3nX44$ U R                  (       a  US;   nU(       d  g X44$ )Nz
model.mtp.rZ   r   r	   zmtp.eh_projenormhnormzshared_head.norm)fcpre_fc_norm_embeddingpre_fc_norm_hiddennormr   rw   rH  layersr!   r   )zmodel.embed_tokens.weightzmodel.norm.weightzlm_head.weightzembed_tokens.weightr$  )r  r   rW  r'  replacer  re  r   	isdecimalr  r  )	rX  rY  titemr_   r+  remapperr)   mtp_idxkeeps	            r   rW  _Qwen35MtpMixin.filter_tensors  sp   ((444--d33E<	??<((<<"a0D??6""zz)2)0)0);	H JJsA&E5zQ58x#7E!H<N<N<P<PeAh-&s'@'@7'J&K1USTXJW y UqU1X%9&s'@'@&A8RSHCUBVVWX]^_X`Wab y \\  D yr8   c                   > [         TU ]  5         U R                  (       a  g U R                  R	                  SS5      =nS:  a  U R
                  R                  U5        g g )Nr  r   )rS   rT   r  rn   r%   ro   add_nextn_predict_layers)r5   nrW   s     r   rT   #_Qwen35MtpMixin.set_gguf_parameters  sQ    #%;;!!"91==AB55a8 Cr8   c           
       > U R                   R                  5       n[        TU ]  US9  U R                  (       a  U(       d  g U R
                  R                  R                  S5      S   n[        R                  " U R                  R                  U R                  R                  U R                  R                  U R                  R                  S US S9nU R                   R                  SU S3-  U l         g )N)
vocab_onlyr   r!   )
size_labeloutput_typer   zmtp-z.gguf)	fname_outis_dirrS   prepare_metadatar  ftyper_   	partitionr   naming_conventionmetadatabasenamefinetuneversionparent)r5   r  from_dirr  fname_defaultrW   s        r   r   _Qwen35MtpMixin.prepare_metadata  s    >>((* J 7}}H::??44S9!<!33MM 6 68N8NMM!!dX\^ ..4e1LLr8   )r   r  r  r2   r4  )r  r   )r<   r=   r>   r?   __doc__r   r  r   r%  rt  rW  rT   r  rD   re   rf   s   @r   r  r  h  su        ""LN(,:,VL L  @9M Mr8   r  Qwen3_5ForConditionalGenerationQwen3_5ForCausalLMc                  @    \ rS rSr\R
                  R                  rSrg)Qwen3_5TextModeli  r9   N)	r<   r=   r>   r?   r   r@   QWEN35rB   rD   r9   r8   r   r  r    s    ''Jr8   r  "Qwen3_5MoeForConditionalGenerationQwen3_5MoeForCausalLMc                  @    \ rS rSr\R
                  R                  rSrg)Qwen3_5MoeTextModeli  r9   N)	r<   r=   r>   r?   r   r@   	QWEN35MOErB   rD   r9   r8   r   r  r    s    **Jr8   r  )
__future__r   typingr   r   r   r   r   r   baser
   r   r   r   registerr   rE   ri   r   r  r8  r@  rw  r}  r  r  r  r  r9   r8   r   <module>r"     s   " 9 9  4 4 %&	  '< (,A AA& )*NDI ND +NDb &5^A ^A 6^AB &'KA* KA (KA\ )*M  +" *+AE] AE ,AEH F> > >eA> eAP] ] PM PMf 57KL((9;W ( M( 8:QR+/+<>Z + S+r8   