
    IuiB2                        d dl Z d dlmZ d dlmZ d dlmZmZ ej                  j                  ej                  j                  ej                  j                  ej                  j                  dZej                  j                  ej                  j                   dZd Zd Zd	 Zd
 Z G d de      Zd Zd ZddZd Zd ZddZd ZddZd Zd Z d Z!d Z"d Z#d Z$e%dk(  r e$        yy)    N)utils)	Converter)common_spectransformer_spec)gelu	fast_gelurelusilu)concatsumc           
         t        | dd      dkD  }t        | dd      dk(  }t        | dd      dk(  }t        | dd      }t        | dd      }t        | d	d
      }t        j                         } || j                  | j                  k(  xr | j                  dv d        ||d
k(  d|z          ||t
        v d|ddj                  t
        j                               d        || j                  |xs |xs |k7  d        ||dk(  xs |t        v d|ddj                  t        j                               d       |j                          y )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	            S/opt/pipecat/venv/lib/python3.12/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                 ,   t        | dd      dkD  }t        | dd      }t        | dd      }t        | dd      dk(  rd}d	}	n| j                  }| j                  }	t        | d
d      }
t        j                  j                  | j                  | j                  f|
|t        |   ||	|t        |   t        | dd      	      }t        | dd      |j                  _        t        ||       |D ]  }|j                  |        |D ]  }|j                  |        |S )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   :   s4    %S*BAFJC!8&AMlH5J sNA&!+----Wa(I!11==	(5)-8''32:>%c<? > 
J -4C9NPU,VJ)Y/ 9	--i89 9	--i89 r,   c                 V   t        | dd      dkD  }t        | dd      dk(  }t        | dd      dk(  }t        | dd      }t        | dd      }	t        | d	d      }
|
|	k(  s|
dk(  rd
}
|rdnd
}t        | dd      }|dk(  }t        | dd      }t        j                  j                  | j                  |	t
        |   |||| j                  dk(  ||t        | dd      |
|      }t        | dd      |j                  _        t        |j                  |d       |D ]  }|j                  |        |S )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   sa   $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($   2	&&y12 r,   c                    t        | t              rd| v rt        | d   t              rB| d   g}| d   g}| j                  d      }||j	                  |j                                ||fS | d   j                  D cg c]  }|d   j                  j                   }}| d   j                  D cg c]  }|d   j                  j                   }}||fS | d   d   j                  g}| d   d   j                  g}||fS c c}w c c}w )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 z!! <A<;N;NO%%(..--OJO;@<;N;NO%%(..--OJO z!! Ahqk&&'
Ahqk&&'
z!! POs   ; C>. Dc                   "    e Zd ZdZdefdZd Zy)OpenNMTPyConverterz(Converts models generated by OpenNMT-py.
model_pathc                     || _         y)zInitializes the OpenNMT-py converter.

        Arguments:
          model_path: Path to the OpenNMT-py PyTorch model (.pt file).
        N)_model_path)selfrn   s     r*   __init__zOpenNMTPyConverter.__init__   s     &r,   c           	         dd l }|j                  | j                  dd      }t        |d         \  }}t	        |d   t        |             |d   }|j                  |d	   j                         D ci c]  \  }}d
|z  | c}}       |d   j                  dk(  rt        |d   |||t        |            S t        |d   |||t        |            S c c}}w )Nr   cpuF)map_locationweights_onlyrh   r#   )r$   model	generatorzgenerator.%sr   )torchloadrp   rk   r+   lenupdateitemsr   r\   rH   )rq   ry   
checkpointrB   rC   rA   keyvalues           r*   _loadzOpenNMTPyConverter._load   s   ZZ5u   

 ",Jw,?!@
J*U#3z?Kw'	 #-["9"?"?"AC $e+	
 e))-==%5!&)*o  +5!&)*o s   3C
N)__name__
__module____qualname____doc__strrr   r    r,   r*   rm   rm      s    2&3 &"r,   rm   c                 \    t        | j                  |       t        | j                  |       y N)set_transformer_encoderencoderrY   rZ   )specrA   s     r*   r>   r>      s    DLL)4DLL)4r,   c                     t        | |d       t        | j                  |d       t        | j                        D ]  \  }}t        ||d|z          y )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      sP    T9i04??I/CDdjj) V5%eY8PST8TUVr,   c                 &   t        | |d       t        | j                  |d       t        | j                        D ]  \  }}t        ||d|z  |        	 t        | j                  |d       y # t        $ r t        | j                  |d       Y y w xY w)NrZ   zdecoder.layer_normzdecoder.transformer_layers.%drT   rx   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    T9i04??I/CDdjj) 
5%+a/#9		

>4??I{; >4??I}=>s   A- - BBc                     t        | d      rt        | j                  |d|z         nd| _        | j                  }t        |t              s|g}t        |      D ]  \  }}t        ||d||fz          y )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                     t        | j                  |d|z         t        | j                  |d|z  d       t	        | j                  j
                  |d|z         y )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                 :   t        | j                  |d|z         t        | j                  |d|z  d       t	        | j                  j
                  |d|z         |r?t        | j                  |d|z         t	        | j                  j
                  |d|z         y y )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                     t        | j                  |d|z         t        | j                  |d|z         t        | j                  |d|z         t        | d      rt        | j                  |d|z         y y )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   !  sh    4??I/FGt}}iE)9:t}}iE)9:t%&4&&	8e3CD 'r,   c                    |rt        d      D cg c]  }t        j                          }}t        |d   |d|z         t        |d   |d|z         t        |d   |d|z         t	        j
                  | j                  d   |       nt        | j                  d   |d|z         t        d      D cg c]  }t        j                          }}t        |d   |d|z         t        |d   |d|z         t	        j
                  | j                  d   |       t        | j                  d   |d	|z         t        | d
      r&t        |d|z        | _	        | j                  | _
        y y c c}w c c}w )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[   :?(CQ..0CC<?I/@5/HI<?I/?%/GH<?I/AE/IJ$++a.,74;;q>9.?%.GH:?(CQ..0C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*4E/c                     	 t        |d|z        | _        	 t        |d|z        | _        y # t        $ r+ t        |d|z        | _        t        |d|z        | _        Y Iw xY w# t        $ r Y y w xY w)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# 1A A #	A/.A/c                 h    t        |d|z        | _        |j                  d|z        }||| _        y y )Nr   r   )r   weightrd   bias)r   rA   r   r   s       r*   r   r   K  s:    	;+>?DK==U*+D	 r,   c                 ,    t        |d|z        | _        y )Nr   )r   r   r   s      r*   r   r   R  s    	;+>?DKr,   c                 H    t        |d|z        j                         | _        y )Nz%s.pe)r   squeeze	encodingsr   s      r*   r   r   V  s    "9go>FFHDNr,   c                     | |   S r   r   )rA   names     r*   r   r   Z  s    T?r,   c                     t        j                  t         j                        } | j                  ddd       t	        j
                  |        | j                         }t        |j                        j                  |       y )N)formatter_classz--model_pathTzModel path.)requiredhelp)
argparseArgumentParserArgumentDefaultsHelpFormatteradd_argumentr   declare_arguments
parse_argsrm   rn   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,   