§
    ‚ŠtjíC  ã                   ó–  — d Z ddlmZ 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mZ dd
lmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZmZmZ ddlm Z  ddl!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0  ej1        e2¦  «        Z3 G d„ de)¦  «        Z4 G d„ de%¦  «        Z5 G d„ de.¦  «        Z6 G d„ dej7        ¦  «        Z8 G d„ d e-¦  «        Z9 G d!„ d"ej7        ¦  «        Z: G d#„ d$e'¦  «        Z; G d%„ d&e¦  «        Z< G d'„ d(e¦  «        Z=e G d)„ d*e=¦  «        ¦   «         Z> G d+„ d,e(e=e¦  «        Z?g d-¢Z@dS ).zPyTorch AFMoE model.é    )ÚCallableN)Únné   )Úinitialization)ÚCacheÚDynamicCache)ÚGenerationMixin)Úcreate_causal_maskÚ!create_sliding_window_causal_mask)ÚGradientCheckpointingLayer)ÚMoeCausalLMOutputWithPastÚMoeModelOutputWithPast)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚlogging)Úmerge_with_config_defaults)ÚOutputRecorderÚcapture_outputsé   )ÚGptOssRMSNorm)ÚLlamaAttentionÚLlamaForCausalLMÚLlamaRotaryEmbeddingÚapply_rotary_pos_embÚeager_attention_forward)ÚQwen2MoeExpertsÚQwen2MoeMLPé   )ÚAfmoeConfigc                   ó   — e Zd ZdS )ÚAfmoeRotaryEmbeddingN©Ú__name__Ú
__module__Ú__qualname__© ó    úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/afmoe/modular_afmoe.pyr%   r%   /   ó   € € € € € Ø€Dr+   r%   c                   ó   — e Zd ZdS )ÚAfmoeRMSNormNr&   r*   r+   r,   r/   r/   3   r-   r+   r/   c                   ó   — e Zd ZdS )ÚAfmoeMLPNr&   r*   r+   r,   r1   r1   7   r-   r+   r1   c                   óF   ‡ — e Zd ZdZˆ fd„Zdej        dej        fd„Zˆ xZS )ÚAfmoeTokenChoiceRouterz©
    Token-choice top-K router for MoE routing.

    This router assigns each token to the top-K experts based on sigmoid scores, matching the released checkpoints.
    c                 óê   •— t          ¦   «                              ¦   «          || _        |j        | _        |j        | _        |j        | _        t          j        |j	        |j        d¬¦  «        | _
        d S ©NF©Úbias)ÚsuperÚ__init__ÚconfigÚnum_experts_per_tokÚtop_kÚnum_expertsÚroute_scaler   ÚLinearÚhidden_sizeÚgate©Úselfr:   Ú	__class__s     €r,   r9   zAfmoeTokenChoiceRouter.__init__B   sb   ø€ Ý‰Œ×ÒÑÔÐØˆŒØÔ/ˆŒ
Ø!Ô-ˆÔØ!Ô-ˆÔÝ”I˜fÔ0°&Ô2DÈ5ÐQÑQÔQˆŒ	ˆ	ˆ	r+   Úhidden_statesÚexpert_biasc                 óž  — |j         \  }}}|                     d|¦  «        }|                      |¦  «                             t          j        ¦  «        }t	          j        |¦  «        }t	          j        ||z   | j        d¬¦  «        \  }}| 	                    d|¬¦  «        }| 
                    dd¬¦  «        dz   }	||	z  }|| j        z  }|||fS )Néÿÿÿÿr"   )ÚkÚdim)rJ   ÚindexT)rJ   Úkeepdimg#B’¡œÇ;)ÚshapeÚviewrA   ÚtoÚtorchÚfloat32ÚsigmoidÚtopkr<   ÚgatherÚsumr>   )
rC   rE   rF   Ú_Ú
hidden_dimÚrouter_logitsÚscoresÚselected_expertsÚ
top_scoresÚdenominators
             r,   ÚforwardzAfmoeTokenChoiceRouter.forwardJ   sÏ   € Ø(Ô.Ñˆˆ1ˆjØ%×*Ò*¨2¨zÑ:Ô:ˆàŸ	š	 -Ñ0Ô0×3Ò3µE´MÑBÔBˆÝ”˜}Ñ-Ô-ˆå#œj¨°+Ñ)=ÀÄÐQRÐSÑSÔSÑˆÐØ—]’] qÐ0@�]ÑAÔAˆ
Ø —n’n¨°T�nÑ:Ô:¸UÑBˆØ +Ñ-ˆ
Ø $Ô"2Ñ2ˆ
Ø˜jÐ*:Ð:Ð:r+   )	r'   r(   r)   Ú__doc__r9   rP   ÚTensorr]   Ú__classcell__©rD   s   @r,   r3   r3   ;   sm   ø€ € € € € ðð ðRð Rð Rð Rð Rð; U¤\ð ;ÀÄð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r+   r3   c                   ó   — e Zd ZdS )ÚAfmoeExpertsNr&   r*   r+   r,   rc   rc   Y   r-   r+   rc   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚAfmoeSparseMoeBlockzÎ
    Mixture of Experts (MoE) module for AFMoE.

    This module implements a sparse MoE layer with both shared experts (always active) and
    routed experts (activated based on token-choice routing).
    c                 óN  •— t          ¦   «                              ¦   «          || _        t          |¦  «        | _        t          ||j        |j        z  ¦  «        | _        t          |¦  «        | _
        t          j        t          j        |j        ¦  «        d¬¦  «        | _        d S )NF)Úrequires_grad)r8   r9   r:   r3   Úrouterr1   Úmoe_intermediate_sizeÚnum_shared_expertsÚshared_expertsrc   Úexpertsr   Ú	ParameterrP   Úzerosr=   rF   rB   s     €r,   r9   zAfmoeSparseMoeBlock.__init__e   s†   ø€ Ý‰Œ×ÒÑÔÐØˆŒÝ,¨VÑ4Ô4ˆŒÝ& v¨vÔ/KÈfÔNgÑ/gÑhÔhˆÔÝ# FÑ+Ô+ˆŒÝœ<­¬°FÔ4FÑ(GÔ(GÐW\Ð]Ñ]Ô]ˆÔÐÐr+   c                 ó8  — |j         \  }}}|                     d|¦  «        }|                      || j        ¦  «        \  }}}|                      |¦  «                             |||¦  «        }	|                      |||¦  «                             |||¦  «        }
|	|
z   S )NrH   )rM   rN   rh   rF   rk   rl   )rC   rE   Ú
batch_sizeÚseq_lenrW   Úhidden_states_flatrV   r[   rZ   Úshared_outputÚrouted_outputs              r,   r]   zAfmoeSparseMoeBlock.forwardm   s¬   € Ø*7Ô*=Ñ'ˆ
�G˜ZØ*×/Ò/°°JÑ?Ô?Ðð +/¯+ª+°mÀTÔEUÑ*VÔ*VÑ'ˆˆ:Ð'ð ×+Ò+Ð,>Ñ?Ô?×DÒDÀZÐQXÐZdÑeÔeˆØŸšÐ%7Ð9IÈ:ÑVÔV×[Ò[Ø˜ ñ
ô 
ˆð ˜}Ñ,Ð,r+   )r'   r(   r)   r^   r9   r]   r`   ra   s   @r,   re   re   ]   sV   ø€ € € € € ðð ð^ð ^ð ^ð ^ð ^ð-ð -ð -ð -ð -ð -ð -r+   re   c                   óÄ   ‡ — e Zd ZdZdedefˆ fd„Z	 ddej        de	ej        ej        f         dej        dz  d	e
dz  d
ee         de	ej        ej        f         fd„Zˆ xZS )ÚAfmoeAttentionaJ  
    Multi-headed attention module with optional sliding window and gating.

    This attention mechanism supports both full attention and sliding window attention,
    and includes Q/K normalization and gating of the output. It inherits from [`LlamaAttention`] to minimize the amount
    of custom logic we need to maintain.
    r:   Ú	layer_idxc                 ó~  •— t          ¦   «                              ||¦  «         |j        |         dk    | _        | j        r|j        nd | _        t          | j        |j        ¬¦  «        | _        t          | j        |j        ¬¦  «        | _	        t          j        |j        |j        | j        z  d¬¦  «        | _        d S )NÚsliding_attention©ÚepsFr6   )r8   r9   Úlayer_typesÚis_local_attentionÚsliding_windowr/   Úhead_dimÚrms_norm_epsÚq_normÚk_normr   r?   r@   Únum_attention_headsÚ	gate_proj©rC   r:   rw   rD   s      €r,   r9   zAfmoeAttention.__init__…   s¬   ø€ Ý‰Œ×Ò˜ Ñ+Ô+Ð+ð #)Ô"4°YÔ"?ÐCVÒ"VˆÔØ7;Ô7NÐX˜fÔ3Ð3ÐTXˆÔå" 4¤=°fÔ6IÐJÑJÔJˆŒÝ" 4¤=°fÔ6IÐJÑJÔJˆŒÝœ 6Ô#5°vÔ7QÐTXÔTaÑ7aÐhmÐnÑnÔnˆŒˆˆr+   NrE   Úposition_embeddingsÚattention_maskÚpast_key_valueÚkwargsÚreturnc                 óì  — |j         d d…         }g |¢d‘| j        ‘R }|                      |¦  «                             |¦  «        }|                      |¦  «                             |¦  «        }	|                      |¦  «                             |¦  «        }
|                      |¦  «        }|                      |¦  «                             dd¦  «        }|  	                    |	¦  «                             dd¦  «        }	|
                     dd¦  «        }
| j
        r|\  }}t          ||	||¦  «        \  }}	|�|                     |	|
| j        ¦  «        \  }	}
t          j        | j        j        t$          ¦  «        } || ||	|
f|| j        sdn| j        | j        | j        dœ|¤Ž\  }} |j        g |¢d‘R Ž                      ¦   «         }|t1          j        |¦  «        z  }|                      |¦  «        }||fS )NrH   r"   r   ç        )r‡   ÚdropoutÚscalingr~   )rM   r   Úq_projrN   Úk_projÚv_projr„   r�   Ú	transposer‚   r}   r   Úupdaterw   r   Úget_interfacer:   Ú_attn_implementationr   ÚtrainingÚattention_dropoutrŽ   r~   Ú
contiguousrP   rR   Úo_proj)rC   rE   r†   r‡   rˆ   r‰   Úinput_shapeÚhidden_shapeÚquery_statesÚ
key_statesÚvalue_statesÚgate_statesÚcosÚsinÚattention_interfaceÚoutputÚattn_weightsÚattn_outputs                     r,   r]   zAfmoeAttention.forward�   s  € ð $Ô)¨#¨2¨#Ô.ˆØ8˜Ð8 bÐ8¨$¬-Ð8Ð8ˆà—{’{ =Ñ1Ô1×6Ò6°|ÑDÔDˆØ—[’[ Ñ/Ô/×4Ò4°\ÑBÔBˆ
Ø—{’{ =Ñ1Ô1×6Ò6°|ÑDÔDˆØ—n’n ]Ñ3Ô3ˆà—{’{ <Ñ0Ô0×:Ò:¸1¸aÑ@Ô@ˆØ—[’[ Ñ,Ô,×6Ò6°q¸!Ñ<Ô<ˆ
Ø#×-Ò-¨a°Ñ3Ô3ˆàÔ"ð 	`Ø*‰HˆC�Ý';¸LÈ*ÐVYÐ[^Ñ'_Ô'_Ñ$ˆL˜*àÐ%Ø'5×'<Ò'<¸ZÈÐW[ÔWeÑ'fÔ'fÑ$ˆJ˜å(?Ô(MØŒKÔ,Õ.Eñ)
ô )
Ðð  3Ð2ØØØØð	
 
ð
 *Ø#œ}ÐH�C�C°$Ô2HØ”LØÔ.ð
 
ð 
 
ð ð
 
ð 
 
Ñˆ�ð �”Ð.˜kÐ.¨2Ð.Ð.Ð.×9Ò9Ñ;Ô;ˆØ�%œ-¨Ñ4Ô4Ñ4ˆØ—k’k &Ñ)Ô)ˆØ˜LÐ(Ð(r+   )N)r'   r(   r)   r^   r#   Úintr9   rP   r_   Útupler   r   r   r]   r`   ra   s   @r,   rv   rv   |   sä   ø€ € € € € ðð ð	o˜{ð 	o°sð 	oð 	oð 	oð 	oð 	oð 	oð  (,ð.)ð .)à”|ð.)ð # 5¤<°´Ð#=Ô>ð.)ð œ tÑ+ð	.)ð
  ™ð.)ð Ð+Ô,ð.)ð 
ˆuŒ|˜Uœ\Ð)Ô	*ð.)ð .)ð .)ð .)ð .)ð .)ð .)ð .)r+   rv   c                   óÖ   ‡ — e Zd ZdZdedefˆ fd„Z	 	 	 	 	 ddej        dej        dz  dej	        dz  d	e
dz  d
edz  deej        ej        f         dz  dee         dej        fd„Zˆ xZS )ÚAfmoeDecoderLayerzÌ
    AFMoE decoder layer with dual normalization.

    This layer applies self-attention followed by either a dense MLP or MoE block,
    with dual normalization (pre and post) around each component.
    r:   rw   c                 ó  •— t          ¦   «                              ¦   «          |j        | _        || _        t	          ||¬¦  «        | _        t          |j        |j        ¬¦  «        | _        t          |j        |j        ¬¦  «        | _	        t          |j        |j        ¬¦  «        | _
        t          |j        |j        ¬¦  «        | _        ||j        k    | _        | j        rt          |¦  «        | _        d S t!          |¦  «        | _        d S )N)r:   rw   rz   )r8   r9   r@   rw   rv   Ú	self_attnr/   r€   Úinput_layernormÚpost_attention_layernormÚpre_mlp_layernormÚpost_mlp_layernormÚnum_dense_layersÚmoe_enabledre   Úmlpr1   r…   s      €r,   r9   zAfmoeDecoderLayer.__init__É   sò   ø€ Ý‰Œ×ÒÑÔÐØ!Ô-ˆÔØ"ˆŒå'¨vÀÐKÑKÔKˆŒõ  ,¨FÔ,>ÀFÔDWÐXÑXÔXˆÔÝ(4°VÔ5GÈVÔM`Ð(aÑ(aÔ(aˆÔ%õ ".¨fÔ.@ÀfÔFYÐ!ZÑ!ZÔ!ZˆÔÝ".¨vÔ/AÀvÔGZÐ"[Ñ"[Ô"[ˆÔð %¨Ô(?Ò?ˆÔØÔð 	(Ý*¨6Ñ2Ô2ˆDŒHˆHˆHå Ñ'Ô'ˆDŒHˆHˆHr+   NrE   r‡   Úposition_idsrˆ   Ú	use_cacher†   r‰   rŠ   c           
      ó"  — |}|                       |¦  «        } | j        d||||||dœ|¤Ž\  }}	|                      |¦  «        }||z   }|}|                      |¦  «        }|                      |¦  «        }|                      |¦  «        }||z   }|S )N)rE   r‡   r³   rˆ   r´   r†   r*   )r¬   r«   r­   r®   r²   r¯   )
rC   rE   r‡   r³   rˆ   r´   r†   r‰   ÚresidualrV   s
             r,   r]   zAfmoeDecoderLayer.forwardß   sÉ   € ð !ˆð ×,Ò,¨]Ñ;Ô;ˆØ)˜4œ>ð 
Ø'Ø)Ø%Ø)ØØ 3ð
ð 
ð ð
ð 
Ñˆ�qð ×5Ò5°mÑDÔDˆØ  =Ñ0ˆð !ˆØ×.Ò.¨}Ñ=Ô=ˆØŸš Ñ/Ô/ˆØ×/Ò/°Ñ>Ô>ˆà  =Ñ0ˆØÐr+   )NNNNN)r'   r(   r)   r^   r#   r¦   r9   rP   r_   Ú
LongTensorr   Úboolr§   r   r   ÚFloatTensorr]   r`   ra   s   @r,   r©   r©   Á   s  ø€ € € € € ðð ð(˜{ð (°sð (ð (ð (ð (ð (ð (ð2 /3Ø04Ø'+Ø!%ØHLð!ð !à”|ð!ð œ tÑ+ð!ð Ô&¨Ñ-ð	!ð
  ™ð!ð ˜$‘;ð!ð # 5¤<°´Ð#=Ô>ÀÑEð!ð Ð+Ô,ð!ð 
Ô	ð!ð !ð !ð !ð !ð !ð !ð !r+   r©   c                   ó€   ‡ — e Zd ZU dZeed<   dZdgZdgZ e	e
d¬¦  «        eedœZg d	¢Zd
Zd
Zd
Zd
Zd
Zd
Zˆ fd„Zˆ xZS )ÚAfmoePreTrainedModelz†
    An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained
    models.
    r:   Úmodelr©   Úpast_key_valuesr   )rK   )rX   rE   Ú
attentions)r¬   r­   r®   r¯   r�   r‚   ÚnormrF   Tc                 óÊ  •— t          ¦   «                              |¦  «         | j        j        }t	          |t
          ¦  «        r:t          j        |j        d|¬¦  «         t          j        |j	        d|¬¦  «         dS t	          |t          ¦  «        r t          j        |j        j        ¦  «         dS t	          |t          ¦  «        rt          j        |j        ¦  «         dS dS )zInitialize the weightsrŒ   )ÚmeanÚstdN)r8   Ú_init_weightsr:   Úinitializer_rangeÚ
isinstancerc   ÚinitÚnormal_Úgate_up_projÚ	down_projr3   Úzeros_rA   Úweightre   rF   )rC   ÚmodulerÂ   rD   s      €r,   rÃ   z"AfmoePreTrainedModel._init_weights#  sÕ   ø€ å‰Œ×Ò˜fÑ%Ô%Ð%ØŒkÔ+ˆÝ�f�lÑ+Ô+ð 	,ÝŒL˜Ô,°3¸CÐ@Ñ@Ô@Ð@ÝŒL˜Ô)°¸Ð=Ñ=Ô=Ð=Ð=Ð=Ý˜Õ 6Ñ7Ô7ð 	,ÝŒK˜œÔ*Ñ+Ô+Ð+Ð+Ð+Ý˜Õ 3Ñ4Ô4ð 	,ÝŒK˜Ô*Ñ+Ô+Ð+Ð+Ð+ð	,ð 	,r+   )r'   r(   r)   r^   r#   Ú__annotations__Úbase_model_prefixÚ_no_split_modulesÚ_skip_keys_device_placementr   r3   r©   rv   Ú_can_record_outputsÚ_keep_in_fp32_modulesÚ_supports_sdpaÚ_supports_flash_attnÚ_supports_flex_attnÚ_can_compile_fullgraphÚ_supports_attention_backendÚsupports_gradient_checkpointingrÃ   r`   ra   s   @r,   r»   r»     sÇ   ø€ € € € € € ðð ð
 ÐÐÑØÐØ,Ð-ÐØ#4Ð"5Ðà'˜Ð(>ÀaÐHÑHÔHØ*Ø$ðð Ðð
	ð 	ð 	Ðð €NØÐØÐØ!ÐØ"&ÐØ&*Ð#ð
,ð 
,ð 
,ð 
,ð 
,ð 
,ð 
,ð 
,ð 
,r+   r»   c                   óì   ‡ — e Zd ZdZdefˆ fd„Zeee	 	 	 	 	 	 dde	j
        dz  de	j        dz  de	j        dz  de	j
        dz  d	edz  d
edz  dee         deez  fd„¦   «         ¦   «         ¦   «         Zˆ xZS )Ú
AfmoeModelz›
    Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`AfmoeDecoderLayer`]

    Args:
        config: AfmoeConfig
    r:   c                 óÞ  •‡— t          ¦   «                              ‰¦  «         ‰j        | _        ‰j        | _        t          j        ‰j        ‰j        | j        ¦  «        | _        t          j	        ˆfd„t          ‰j        ¦  «        D ¦   «         ¦  «        | _        t          ‰j        ‰j        ¬¦  «        | _        t!          ‰¬¦  «        | _        d| _        |                      ¦   «          d S )Nc                 ó0   •— g | ]}t          ‰|¦  «        ‘ŒS r*   )r©   )Ú.0rw   r:   s     €r,   ú
<listcomp>z'AfmoeModel.__init__.<locals>.<listcomp>@  s$   ø€ ÐcÐcÐc°iÕ˜v yÑ1Ô1ÐcÐcÐcr+   rz   ©r:   F)r8   r9   Úpad_token_idÚpadding_idxÚ
vocab_sizer   Ú	Embeddingr@   Úembed_tokensÚ
ModuleListÚrangeÚnum_hidden_layersÚlayersr/   r€   r¿   r%   Ú
rotary_embÚgradient_checkpointingÚ	post_initrB   s    `€r,   r9   zAfmoeModel.__init__9  sÒ   øø€ Ý‰Œ×Ò˜Ñ Ô Ð Ø!Ô.ˆÔØ Ô+ˆŒåœL¨Ô):¸FÔ<NÐPTÔP`ÑaÔaˆÔÝ”mØcÐcÐcÐcÅ5ÈÔIaÑCbÔCbÐcÑcÔcñ
ô 
ˆŒõ ! Ô!3¸Ô9LÐMÑMÔMˆŒ	Ý.°fÐ=Ñ=Ô=ˆŒØ&+ˆÔ#à�ŠÑÔÐÐÐr+   NÚ	input_idsr‡   Úinputs_embedsr³   r½   r´   r‰   rŠ   c           
      óø  — |d u |d uz  rt          d¦  «        ‚|r|€t          | j        ¬¦  «        }|€|                      |¦  «        }|€V|�|                     ¦   «         nd}t          j        |j        d         |j        ¬¦  «        |z   }| 	                    d¦  «        }t          |x}	t          ¦  «        s%| j        |||dœ}
t          di |
¤Žt          di |
¤Ždœ}	|}| j        j        r|| j        j        dz  z  }|                      ||¦  «        }t#          | j        ¦  «        D ]*\  }} ||f|	| j        j        |                  ||||d	œ|¤Ž}Œ+|                      |¦  «        }t+          ||r|nd ¬
¦  «        S )Nz:You must specify exactly one of input_ids or inputs_embedsrß   r   r"   )Údevice)r:   rí   r‡   r½   )Úfull_attentionry   g      à?)r‡   r³   rˆ   r´   r†   )Úlast_hidden_stater½   r*   )Ú
ValueErrorr   r:   rä   Úget_seq_lengthrP   ÚarangerM   rï   Ú	unsqueezerÅ   Údictr
   r   Úmup_enabledr@   ré   Ú	enumeraterè   r|   r¿   r   )rC   rì   r‡   rí   r³   r½   r´   r‰   Úpast_seen_tokensÚcausal_mask_mappingÚmask_kwargsrE   r†   ÚiÚdecoder_layers                  r,   r]   zAfmoeModel.forwardH  s  € ð ˜Ð -°tÐ";Ñ<ð 	[ÝÐYÑZÔZÐZàð 	?˜Ð0Ý*°$´+Ð>Ñ>Ô>ˆOàÐ Ø ×-Ò-¨iÑ8Ô8ˆMàÐØCRÐC^˜×=Ò=Ñ?Ô?Ð?ÐdeÐÝ œ<¨Ô(;¸AÔ(>À}ÔG[Ð\Ñ\Ô\Ð_oÑoˆLØ'×1Ò1°!Ñ4Ô4ˆLõ °Ð?Ð-ÅÑFÔFð 
	àœ+Ø!.Ø"0Ø#2ð	ð ˆKõ #5Ð"CÐ"C°{Ð"CÐ"CÝ%FÐ%UÐ%UÈÐ%UÐ%Uð#ð #Ðð
 &ˆð Œ;Ô"ð 	KØ)¨T¬[Ô-DÀcÑ-IÑJˆMà"Ÿošo¨m¸\ÑJÔJÐå )¨$¬+Ñ 6Ô 6ð 		ð 		ÑˆAˆ}Ø)˜MØðà2°4´;Ô3JÈ1Ô3MÔNØ)Ø.Ø#Ø$7ðð ð ðð ˆMˆMð Ÿ	š	 -Ñ0Ô0ˆÝ%Ø+Ø/8ÐB˜O˜O¸dð
ñ 
ô 
ð 	
r+   )NNNNNN)r'   r(   r)   r^   r#   r9   r   r   r   rP   r·   r_   r¹   r   r¸   r   r   r§   r   r]   r`   ra   s   @r,   rÚ   rÚ   0  s  ø€ € € € € ðð ð˜{ð ð ð ð ð ð ð ØØð .2Ø.2Ø26Ø04Ø(,Ø!%ð<
ð <
àÔ# dÑ*ð<
ð œ tÑ+ð<
ð Ô(¨4Ñ/ð	<
ð
 Ô&¨Ñ-ð<
ð  ™ð<
ð ˜$‘;ð<
ð Ð+Ô,ð<
ð 
Ð'Ñ	'ð<
ð <
ð <
ñ „_ñ  Ôñ „^ð<
ð <
ð <
ð <
ð <
r+   rÚ   c                   ó  — e Zd ZddiZddiZddgdgfiZd„ Zee	 	 	 	 	 	 	 	 	 dd
e	j
        dz  de	j        dz  de	j
        dz  dedz  de	j        dz  de	j
        dz  dedz  dedz  dee	j        z  dee         defd„¦   «         ¦   «         ZdS )ÚAfmoeForCausalLMzlm_head.weightzmodel.embed_tokens.weightÚlm_headÚcolwise_gather_outputrE   Úlogitsc                 óð   — t                                | |¦  «         t          |¦  «        | _        |j        | _        t          j        |j        |j        d¬¦  «        | _        |  	                    ¦   «          d S r5   )
r»   r9   rÚ   r¼   râ   r   r?   r@   r   rë   )rC   r:   s     r,   r9   zAfmoeForCausalLM.__init__�  se   € Ý×%Ò% d¨FÑ3Ô3Ð3Ý Ñ'Ô'ˆŒ
Ø Ô+ˆŒÝ”y Ô!3°VÔ5FÈUÐSÑSÔSˆŒØ�ŠÑÔÐÐÐr+   Nr   rì   r‡   r³   r½   rí   Úlabelsr´   Úoutput_router_logitsÚlogits_to_keepr‰   rŠ   c
                 ór  — |�|n| j         j        } | j        d|||||||dœ|
¤Ž}|j        }t	          |	t
          ¦  «        rt          |	 d ¦  «        n|	}|                      |d d …|d d …f         ¦  «        }d }|� | j        ||| j	        fi |
¤Ž}t          |||j        |j        |j        |j        ¬¦  «        S )N)rì   r‡   r³   r½   rí   r´   r  )Úlossr  r½   rE   r¾   rX   r*   )r:   r  r¼   rñ   rÅ   r¦   Úslicer   Úloss_functionrâ   r   r½   rE   r¾   rX   )rC   rì   r‡   r³   r½   rí   r  r´   r  r  r‰   ÚoutputsrE   Úslice_indicesr  r  s                   r,   r]   zAfmoeForCausalLM.forward–  s  € ð  %9Ð$DÐ Ð È$Ì+ÔJjð 	ð +5¨$¬*ð 	+
ØØ)Ø%Ø+Ø'ØØ!5ð	+
ð 	+
ð ð	+
ð 	+
ˆð  Ô1ˆÝ8BÀ>ÕSVÑ8WÔ8WÐk�˜~˜o¨tÑ4Ô4Ð4Ð]kˆØ—’˜m¨A¨A¨A¨}¸a¸a¸aÐ,?Ô@ÑAÔAˆàˆØÐØ%�4Ô% f¨f°d´oÐPÐPÈÐPÐPˆDå(ØØØ#Ô3Ø!Ô/ØÔ)Ø!Ô/ð
ñ 
ô 
ð 	
r+   )	NNNNNNNNr   )r'   r(   r)   Ú_tied_weights_keysÚ_tp_planÚ_pp_planr9   r   r   rP   r·   r_   r   r¹   r¸   r¦   r   r   r   r]   r*   r+   r,   rÿ   rÿ   Š  sG  € € € € € Ø*Ð,GÐHÐØÐ2Ð3€HØ˜_Ð-°¨zÐ:Ð;€Hðð ð ð Øð .2Ø.2Ø04Ø(,Ø26Ø*.Ø!%Ø,0Ø-.ð+
ð +
àÔ# dÑ*ð+
ð œ tÑ+ð+
ð Ô&¨Ñ-ð	+
ð
  ™ð+
ð Ô(¨4Ñ/ð+
ð Ô  4Ñ'ð+
ð ˜$‘;ð+
ð # T™kð+
ð ˜eœlÑ*ð+
ð Ð+Ô,ð+
ð 
#ð+
ð +
ð +
ñ „^ñ Ôð+
ð +
ð +
r+   rÿ   )rÿ   rÚ   r»   )Ar^   Úcollections.abcr   rP   r   Ú r   rÆ   Úcache_utilsr   r   Ú
generationr	   Úmasking_utilsr
   r   Úmodeling_layersr   Úmodeling_outputsr   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.genericr   Úutils.output_capturingr   r   Úgpt_oss.modeling_gpt_ossr   Úllama.modeling_llamar   r   r   r   r   Úqwen2_moe.modeling_qwen2_moer    r!   Úconfiguration_afmoer#   Ú
get_loggerr'   Úloggerr%   r/   r1   ÚModuler3   rc   re   rv   r©   r»   rÚ   rÿ   Ú__all__r*   r+   r,   ú<module>r$     sÚ  ðð Ð à $Ð $Ð $Ð $Ð $Ð $à €€€Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø )Ð )Ð )Ð )Ð )Ð )Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ &Ð &Ð &Ð &Ð &Ð &Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ 4Ð 4Ð 4Ð 4Ð 4Ð 4ðð ð ð ð ð ð ð ð ð ð ð ð ð ð HÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ ,Ð ,Ð ,Ð ,Ð ,Ð ,ð 
ˆÔ	˜HÑ	%Ô	%€ð	ð 	ð 	ð 	ð 	Ð/ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	�=ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	ˆ{ñ 	ô 	ð 	ð;ð ;ð ;ð ;ð ;˜RœYñ ;ô ;ð ;ð<	ð 	ð 	ð 	ð 	�?ñ 	ô 	ð 	ð-ð -ð -ð -ð -˜"œ)ñ -ô -ð -ð>B)ð B)ð B)ð B)ð B)�^ñ B)ô B)ð B)ðJ?ð ?ð ?ð ?ð ?Ð2ñ ?ô ?ð ?ðD*,ð *,ð *,ð *,ð *,˜?ñ *,ô *,ð *,ðZ ðV
ð V
ð V
ð V
ð V
Ð%ñ V
ô V
ñ „ðV
ðr9
ð 9
ð 9
ð 9
ð 9
Ð'Ð)=¸ñ 9
ô 9
ð 9
ðxð ð €€€r+   