
    C1iB2                        S SK r S SKJr  S SKJr  S SKJrJr  \R                  R                  \R                  R                  \R                  R                  \R                  R                  S.r\R                  R                  \R                  R                   S.rS rS rS	 rS
 r " S S\5      rS rS rSS jrS rS rSS jrS rSS jrS rS r S r!S r"S r#S r$\%S:X  a  \$" 5         gg)    N)utils)	Converter)common_spectransformer_spec)gelu	fast_gelurelusilu)concatsumc           
         [        U SS5      S:  n[        U SS5      S:H  n[        U SS5      S:H  n[        U SS5      n[        U SS5      n[        U S	S
5      n[        R                  " 5       nU" U R                  U R                  :H  =(       a    U R                  S;   S5        U" US
:H  SU-  5        U" U[
        ;   SU< SSR                  [
        R                  5       5      < S35        U" U R                  U=(       d    U=(       d    U:g  S5        U" US:H  =(       d	    U[        ;   SU< SSR                  [        R                  5       5      < S35        UR                  5         g )Nmax_relative_positionsr   pos_ffn_activation_fnr	   
feat_merger   self_attn_typez
scaled-dot>   transformertransformer_lmzROptions --encoder_type and --decoder_type must be 'transformer' or 'transformer_lmzNOption --self_attn_type %s is not supported (supported values are: scaled-dot)zOption --pos_ffn_activation_fn z. is not supported (supported activations are: z, )z`Options --position_encoding and --max_relative_positions cannot be both enabled or both disabled   zOption --feat_merge z. is not supported (supported merge modes are:  )getattrr   ConfigurationCheckerencoder_typedecoder_type_SUPPORTED_ACTIVATIONSjoinkeysposition_encoding_SUPPORTED_FEATURES_MERGEvalidate)	optnum_source_embeddingswith_relative_positionwith_rotary
with_alibiactivation_fnr   r   checks	            [/home/james-whalen/.local/lib/python3.13/site-packages/ctranslate2/converters/opennmt_py.py	check_optr+      sm   $S*BAFJ#7;rAK6:b@JC!8&AMlH5JS"2LAN&&(E	C,,, 	B AA	, 
,&X
	
 
//$))$:$?$?$AB	D
 
"8"UK"U:V	
 
"Mj4M&Msxx 9 > > @A	C
 
NN    c                 .   [        U SS5      S:  n[        U SS5      n[        U SS5      n[        U SS5      S:X  a  SnS	n	OU R                  nU R                  n	[        U S
S5      n
[        R                  R                  U R                  U R                  4U
U[        U   UU	U[        U   [        U SS5      S9	n[        U SS5      UR                  l        [        X5        U H  nUR                  U5        M     U H  nUR                  U5        M     U$ )5Creates a model specification from the model options.r   r   r   r	   r   r   lambda_alignr   r   heads   
multiqueryF)r%   
activationalignment_layeralignment_headsr$   embeddings_mergemulti_query_attentiondecoder_start_tokenz<s>)r   r4   r5   r   TransformerSpecfrom_config
enc_layers
dec_layersr   r!   configr8   set_transformer_specregister_source_vocabularyregister_target_vocabulary)r#   	variables
src_vocabs
tgt_vocabsr$   r%   r(   r   r4   r5   	num_heads
model_spec	src_vocab	tgt_vocabs                 r*   _get_model_spec_seq2seqrH   :   s(    %S*BAFJC!8&AMlH5J sNA&!+----Wa(I!11==	(5)-8''32:>%c<? > 
J -4C9NPU,VJ)/	--i8  	--i8   r,   c                 Z   [        U SS5      S:  n[        U SS5      S:H  n[        U SS5      S:H  n[        U SS5      n[        U SS5      n	[        U S	S5      n
X:X  d  U
S:X  a  S
n
U(       a  SOS
n[        U SS5      nUS:H  n[        U SS5      n[        R                  R                  U R                  U	[
        U   UUUU R                  S:H  UU[        U SS5      U
US9n[        U SS5      UR                  l        [        UR                  USS9  U H  nUR                  U5        M     U$ )r.   r   r   r   r   r   r	   r0   r1   num_kvNrotary_interleaveTr
   sliding_windowrmsr2   F)
r3   ffn_glur%   alibirms_norm
rotary_dimrK   r7   num_heads_kvrL   norm_epsgư>with_encoder_attention)r   r   TransformerDecoderModelSpecr:   r<   r   
layer_normr=   layer_norm_epsilonset_transformer_decoderdecoderregister_vocabulary)r#   rA   rB   rC   r$   r%   r&   r'   r(   rD   rJ   rQ   rK   rN   rL   rE   rG   s                    r*   _get_model_spec_lmr\   c   sZ   $S*BAFJ#7;rAK6:b@JC!8&AMWa(IS(A&Ffk!tJ%8$?v%GS"2A6N!==II)-855(+%c<?% J J ,33
D+IJ($  	&&y1   r,   c                 .   [        U [        5      (       a  SU ;   a  [        U S   [        5      (       aB  U S   /nU S   /nU R                  S5      nUb  UR	                  UR                  5       5        X4$ U S   R                   Vs/ s H  oDS   R                  R                  PM     nnU S   R                   Vs/ s H  oDS   R                  R                  PM     nn X4$ U S   S   R                  /nU S   S   R                  /nX4$ s  snf s  snf )Nsrctgt	src_featsr   r   )	
isinstancedictlistgetextendvaluesfieldsvocabitos)rh   rB   rC   r`   fields        r*   
get_vocabsrk      s   %5E>eElD)),J,J		+.I$!!)"2"2"45 !! <A<;N;NO;N%(..--;NJO;@<;N;NO;N%(..--;NJOJ !! Ahqk&&'
Ahqk&&'
!! POs   "D<"Dc                   ,    \ rS rSrSrS\4S jrS rSrg)OpenNMTPyConverter   z(Converts models generated by OpenNMT-py.
model_pathc                     Xl         g)zqInitializes the OpenNMT-py converter.

Arguments:
  model_path: Path to the OpenNMT-py PyTorch model (.pt file).
N_model_path)selfro   s     r*   __init__OpenNMTPyConverter.__init__   s
     &r,   c           	         SS K nUR                  U R                  SSS9n[        US   5      u  p4[	        US   [        U5      S9  US   nUR                  US	   R                  5        VVs0 s H  u  pgS
U-  U_M     snn5        US   R                  S:X  a  [        US   UUU[        U5      S9$ [        US   UUU[        U5      S9$ s  snnf )Nr   cpuF)map_locationweights_onlyrh   r#   )r$   model	generatorzgenerator.%sr   )torchloadrr   rk   r+   lenupdateitemsr   r\   rH   )rs   r|   
checkpointrB   rC   rA   keyvalues           r*   _loadOpenNMTPyConverter._load   s   ZZ5u   

 ",Jw,?!@
*U#3z?Kw'	 #-["9"?"?"A"AJC $e+"A	
 e))-==%5!&)*o  +5!&)*o s   ,C
rq   N)	__name__
__module____qualname____firstlineno____doc__strrt   r   __static_attributes__ r,   r*   rm   rm      s    2&3 &"r,   rm   c                 \    [        U R                  U5        [        U R                  U5        g N)set_transformer_encoderencoderrY   rZ   )specrA   s     r*   r>   r>      s    DLL)4DLL)4r,   c                     [        XS5        [        U R                  US5        [        U R                  5       H  u  p#[        X1SU-  5        M     g )Nr   zencoder.layer_normzencoder.transformer.%d)set_input_layersset_layer_normrW   	enumeratelayerset_transformer_encoder_layer)r   rA   ir   s       r*   r   r      sC    Ti04??I/CDdjj)%e8PST8TU *r,   c                 "   [        XS5        [        U R                  US5        [        U R                  5       H  u  p4[        UUSU-  US9  M      [        U R                  US5        g ! [         a    [        U R                  US5         g f = f)NrZ   zdecoder.layer_normzdecoder.transformer_layers.%drT   r{   zgenerator.0)	r   r   rW   r   r   set_transformer_decoder_layer
set_linear
projectionKeyError)r   rA   rU   r   r   s        r*   rY   rY      s    Ti04??I/CDdjj)%+a/#9		
 *>4??I{; >4??I}=>s   A* *!BBc                     [        U S5      (       a  [        U R                  USU-  5        OSU l        U R                  n[        U[        5      (       d  U/n[        U5       H  u  pE[        UUSX$4-  5        M     g )Nposition_encodingsz%s.embeddings.make_embedding.peFz(%s.embeddings.make_embedding.emb_luts.%d)	hasattrset_position_encodingsr   scale_embeddings
embeddingsra   rc   r   set_embeddings)r   rA   scopeembeddings_specsr   embeddings_specs         r*   r   r      s    t)**##-5	
 !&&--,-'(896%C	
 :r,   c                     [        U R                  USU-  5        [        U R                  USU-  SS9  [	        U R                  R
                  USU-  5        g )N%s.feed_forward%s.self_attnTself_attention%s.layer_norm)set_ffnffnset_multi_head_attentionr   r   rW   r   rA   r   s      r*   r   r     sW    DHHi!2U!:;	 4&&119oPU>UVr,   c                 >   [        U R                  USU-  5        [        U R                  USU-  SS9  [	        U R                  R
                  USU-  5        U(       a?  [        U R                  USU-  5        [	        U R                  R
                  USU-  5        g g )Nr   r   Tr   z%s.layer_norm_1z%s.context_attnz%s.layer_norm_2)r   r   r   r   r   rW   	attention)r   rA   r   rU   s       r*   r   r     s    DHHi!2U!:;	 4&&119>ORW>WX <MPU<UVt~~00)=NQV=VW r,   c                     [        U R                  USU-  5        [        U R                  USU-  5        [        U R                  USU-  5        [        U S5      (       a  [        U R                  USU-  5        g g )Nr   z%s.w_1z%s.w_2linear_0_noactz%s.w_3)r   rW   r   linear_0linear_1r   r   r   s      r*   r   r   !  sk    4??I/FGt}}iE)9:t}}iE)9:t%&&4&&	8e3CD 'r,   c                    U(       a  [        S5       Vs/ s H  n[        R                  " 5       PM     nn[        US   USU-  5        [        US   USU-  5        [        US   USU-  5        [        R
                  " U R                  S   U5        O[        U R                  S   USU-  5        [        S5       Vs/ s H  n[        R                  " 5       PM     nn[        US   USU-  5        [        US   USU-  5        [        R
                  " U R                  S   U5        [        U R                  S   US	U-  5        [        U S
5      (       a&  [        USU-  5      U l	        U R                  U l
        g g s  snf s  snf )N   r   z%s.linear_queryr   z%s.linear_keys   z%s.linear_valuesr   z%s.final_linearrelative_position_keysz'%s.relative_positions_embeddings.weight)ranger   
LinearSpecr   r   fuse_linearlinearr   _get_variabler   relative_position_values)r   rA   r   r   _split_layerss         r*   r   r   )  s`   :?(C(Q..0(C<?I/@5/HI<?I/?%/GH<?I/AE/IJ$++a.,74;;q>9.?%.GH:?(C(Q..0(C<?I/?%/GH<?I/AE/IJ$++a.,7t{{2	+<u+DEt-..&3@5H'
# )-(C(C%	 / D Ds   E>>Fc                      [        USU-  5      U l         [        USU-  5      U l        g ! [         a+    [        USU-  5      U l        [        USU-  5      U l         NJf = f! [         a     g f = f)N	%s.weightz%s.a_2z%s.b_2%s.bias)r   gammar   betar   s      r*   r   r   >  s|    ?"9kE.AB

!)Y->?	  ?"9h.>?
!)X-=>	?  s    , A$ 2A! A!$
A10A1c                 h    [        USU-  5      U l        UR                  SU-  5      nUb  X0l        g g )Nr   r   )r   weightrd   bias)r   rA   r   r   s       r*   r   r   K  s8    	;+>?DK==U*+D	 r,   c                 ,    [        USU-  5      U l        g )Nr   )r   r   r   s      r*   r   r   R  s    	;+>?DKr,   c                 H    [        USU-  5      R                  5       U l        g )Nz%s.pe)r   squeeze	encodingsr   s      r*   r   r   V  s    "9go>FFHDNr,   c                 
    X   $ r   r   )rA   names     r*   r   r   Z  s
    ?r,   c                      [         R                  " [         R                  S9n U R                  SSSS9  [        R
                  " U 5        U R                  5       n[        UR                  5      R                  U5        g )N)formatter_classz--model_pathTzModel path.)requiredhelp)
argparseArgumentParserArgumentDefaultsHelpFormatteradd_argumentr   declare_arguments
parse_argsrm   ro   convert_from_args)parserargss     r*   mainr   ^  se    $$ >>F MJ'Dt'99$?r,   __main__)T)F)&r   ctranslate2.convertersr    ctranslate2.converters.converterr   ctranslate2.specsr   r   
ActivationGELUGELUTanhRELUSWISHr   EmbeddingsMergeCONCATADDr!   r+   rH   r\   rk   rm   r>   r   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r*   <module>r      s    ( 6 ; ""''''00""''""((	  ))00&&** #L&R)X"(- -`5
V>$
.WXED*
@I@ zF r,   