a
    ==ic/^                     @   s   d dl mZmZ d dlZd dlmZ d dlZd dlZd dl	Z	d dl
mZmZmZ d dlmZ d dlmZ d dlm  m  m  mZ eeZeej eee	j dd ZG d	d
 d
edZ G dd de Z!dd Z"dd Z#edkre#  dS )    )ABCMetaabstractmethodN)	viewitems)corernn_cell	workspace)BeamSearchForwardOnly)Seq2SeqModelHelperc                 C   s0   t ||gt| }dd |D }| j||S )Nc                 S   s   g | ]}|D ]}|qqS  r
   ).0Zv_wxr
   r
   w/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/models/seq2seq/translate.py
<listcomp>       z!_weighted_sum.<locals>.<listcomp>)ziplennetZWeightedSum)modelvaluesweightoutput_nameZvalues_weightsZvalues_weights_flattenedr
   r
   r   _weighted_sum   s    r   c                   @   s4   e Zd Zedd Zedd Zdd Zdd Zd	S )
%Seq2SeqModelCaffe2EnsembleDecoderBasec                 C   s   d S Nr
   selfr   r
   r
   r   get_model_file%   s    z4Seq2SeqModelCaffe2EnsembleDecoderBase.get_model_filec                 C   s   d S r   r
   r   r
   r
   r   get_db_type)   s    z1Seq2SeqModelCaffe2EnsembleDecoderBase.get_db_typec                 C   sD   t j|g|t jd}d|tj< d|tj< d|tj< || |tj< |S )Ndtyper   )npfullfloat32seq2seq_utilZPAD_IDGO_IDEOS_IDZUNK_ID)r   
vocab_sizeword_reward
unk_rewardword_rewardsr
   r
   r   build_word_rewards-   s    


z8Seq2SeqModelCaffe2EnsembleDecoderBase.build_word_rewardsc                    s   d}t | j| jD ]\}  fdd| j D }ttjdg |g| 	|| 
 dslJ d| 	|ttjd|g|d d	 d
dsJ td | 	| qd S )Nreaderc                    s   g | ]}t | r|qS r
   )str
startswith)r   param
scope_namer
   r   r   ;   s   zESeq2SeqModelCaffe2EnsembleDecoderBase.load_models.<locals>.<listcomp>ZCreateDB)dbZdb_typezFailed to create db {}Load   /zgpu_0/)Zload_allZ
add_prefixZstrip_prefixz'Model {} is loaded from a checkpoint {})r   modelsdecoder_scope_namesr   ZGetAllParamsr   ZRunOperatorOncer   ZCreateOperatorr   r   formatloggerinfo)r   Z	db_readerr   Zparams_for_current_modelr
   r0   r   load_models5   s6    


z1Seq2SeqModelCaffe2EnsembleDecoderBase.load_modelsN)__name__
__module____qualname__r   r   r   r+   r;   r
   r
   r
   r   r   #   s   

r   )	metaclassc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )!Seq2SeqModelCaffe2EnsembleDecoderc                 C   s   |d S )N
model_filer
   r   r
   r
   r   r   T   s    z0Seq2SeqModelCaffe2EnsembleDecoder.get_model_filec                 C   s   dS )NZminidbr
   r   r
   r
   r   r   W   s    z-Seq2SeqModelCaffe2EnsembleDecoder.get_db_typec                 C   s   |d ur|d | S |S )Nr5   r
   )r   r1   Z	blob_namer
   r
   r   scopeZ   s    z'Seq2SeqModelCaffe2EnsembleDecoder.scopec           %         s  |d }|dv sJ |dk}	t  * tj|| j|d ddd}
W d    n1 sV0    Y  tj||d t|d	 | j| j| j|
|d |	d
d d\}}}}}t  t |	r|j	j
|d| jdd}|d ur|j	j
|d| jdd}tj|| j|d ddd}|j	||gd}W d    n1 s(0    Y  g }g }t|d	 D ]b\}}|d }|| |d
krt|d }n|d	 |d  d }tjd||ddd}|| qFt   |d urtt|D ]8}|| d ur|j	j
|| d|| jdd||< q|d urVtt|D ]8}|| d ur|j	j
|| d|| jdd||< qtj||||||	d}W d    n1 s0    Y  tj||d d | j||d |d || d
}|j	j fdd| D  }|j|||||d\}}dd t|||D }t   |j	j|gd d!gd| gd"\}} tj||| | j|d# d$}!|j	|!d%}"|j	|"d&}#|	r~| }$n:|j	j | jgd'dd(}$|j	!|$d)}$|j	j
|$d*| jd
d}$W d    n1 s0    Y  ||#|$fS )+N	attention)noneregularrD   encoder_embedding_sizeencoder_embeddingsF)r   r'   embedding_sizenameZfreeze_embeddingsencoder_typedecoder_layer_configsr   T)r   Zencoder_paramsZnum_decoder_layersinputsZinput_lengthsr'   Z
embeddingsrH   use_attentionZnum_gpusforward_onlyrB   Zencoder_outputs_tiledr4   )ZtilesZaxisZweighted_encoder_outputs_tileddecoder_embedding_sizedecoder_embeddingsembedded_tokens_t_prev	num_units        )rN   
input_sizeZhidden_sizeZforget_biasZmemory_optimizationzfinal_encoder_hidden_tiled_{}zfinal_encoder_cell_tiled_{})r   encoder_units_per_layerdecoder_units_per_layerfinal_encoder_hidden_statesfinal_encoder_cell_statesrM   )
encoder_outputsZencoder_output_dimencoder_lengthsr'   attention_typerH   Zdecoder_num_unitsdecoder_cellsweighted_encoder_outputsrI   c                    s   g | ]}d   |qS )z
{}/{}_prevr8   )r   srB   r
   r   r      s   zDSeq2SeqModelCaffe2EnsembleDecoder._build_decoder.<locals>.<listcomp>)r   Zinput_tZseq_lengthsstatestimestepc              
   S   s:   g | ]2\}}}t j|t j|d ddt j|ddddqS )r   r4   )ZbloboffsetZwindow)initial_valueZstate_prev_linkZ
state_link)r   ZStateConfigZ
LinkConfig)r   Zinitial_stateZ
state_prevstater
   r
   r   r      s   decoder_outputs_flattenedZ2decoder_outputs_and_contexts_combination_old_shape)shapedecoder_softmax_size)r   decoder_outputsZdecoder_output_sizetarget_vocab_sizeri   output_probsoutput_log_probsZzero_attention_weights_tmp_1)valueZzero_attention_weights_tmp_2Zzero_attention_weights_tmp)"r   Z	NameScoper$   Zbuild_embeddingssource_vocab_sizeZbuild_embedding_encoderr   encoder_inputsr[   r   ZTile	beam_sizerk   ZGather	enumerateappendr   ZLSTMCellranger8   Z build_initial_rnn_decoder_statesZLSTMWithAttentionDecoderZAddExternalInputsZget_state_namesapplyr   ZReshapeZget_output_dimZoutput_projectionZSoftmaxLogZget_attention_weightsConstantFillZ	Transpose)%r   r   
step_modelmodel_paramsrB   previous_tokensrc   fake_seq_lengthsr\   rM   rG   rZ   r^   rW   rX   rU   rP   rQ   r]   rV   iZlayer_configrR   rT   cellZinitial_statesZattention_decoderZstates_prevrj   rb   state_configsrg   _Zoutput_logitsrl   rm   attention_weightsr
   ra   r   _build_decodera   s^   
$
$




"




&z0Seq2SeqModelCaffe2EnsembleDecoder._build_decoderc              
   C   s  |d | _ |d }|d | _t| j dks.J | j d d }| j d d }| j D ]$}|d |ksdJ |d |ksPJ qPt|| _t|| _dd tt| j D | _td	d
| _| jj	
d| _| jj	
d| _| jj	
d| _| jjjg d| jgdtjjd}t| j| jtjtjd}| }g }	g }
g }t| j | jD ]^\}}| j| j||d || | |d\}}}|	| |
| |d ur:|| q:t|dksJ | jjjg ddtt| dgd}t|||dd}| jjjg ddtt|
 dgd}t||
|dd}| jjjg d| jgdtjj d}|j!| j| j|||	g |d\| _"| _#| _$| _%t&'| jj t&(d| j)| j|d d |d d d  t&j*| jj	t+| jt+| jt+| jgd! t,-d" | jj.D ]}t,-| qd S )#Nensemble_modelsdecoding_paramsrq   r   source_vocabtarget_vocabc                 S   s   g | ]}d  |qS )zmodel{}r_   )r   r|   r
   r
   r   r   M  s   z>Seq2SeqModelCaffe2EnsembleDecoder.__init__.<locals>.<listcomp>T)Zinit_paramsrp   r[   max_output_seq_lenr{   i )rh   rn   r    )rq   r   Zgo_token_idZeos_token_idry   )r   rx   ry   rB   rz   rc   r{    num_decoders_with_attention_blobr4   )rn   rh   attention_weights_average)r   r   r   r   num_decoders_bloboutput_log_probs_averager*   rS   )rL   lengthZ	log_probsZ
attentionsr~   Zdata_dependenciesr*   r(   r)   )r'   r(   r)   )Zinput_blobszParams created: )/r6   rq   r   ro   rk   rt   r7   r	   r   r   ZAddExternalInputrp   r[   r   Zparam_init_netrw   r   ZDataTypeZINT32r   r$   r%   r&   Zget_step_modelr   r   Zget_previous_tokensZget_timestepextendrs   floatr   FLOATru   output_token_beam_listoutput_prev_index_beam_listoutput_score_beam_list"output_attention_weights_beam_listr   Z
RunNetOnceFeedBlobr+   Z	CreateNetr-   r9   r:   params)r   translate_paramsr   r   r   r   r{   Zbeam_decoderrx   r~   rm   r   r1   Zstate_configs_per_decoderZoutput_log_probs_per_decoderZattention_weights_per_decoderr   r   r   r   r*   r/   r
   r
   r   __init__;  s    








	

		
z*Seq2SeqModelCaffe2EnsembleDecoder.__init__c                    s  t | jtdd t D jtjd t | jtt	 gjtjd t | j
t|gjtjd t | jj |}t | j}t | j}t | j}t | j}|df}t|d D ]b}	t| jD ]R}
||	 |
 d tjks|	|kr||	 |
 d ||d  |d  d kr|	|
f}qq|\}	}
g }g }||	 |
 d  }|	dkr|||	 |
 d  |||	 |
  ||	 |
 d }
|	d8 }	qLt|} fdd|D }tt|}|||fS )Nc                 S   s   g | ]
}|gqS r
   r
   )r   Ztoken_idr
   r
   r   r     s   z<Seq2SeqModelCaffe2EnsembleDecoder.decode.<locals>.<listcomp>r   r   r4   c                    s$   g | ]}t t|d t  qS r   )listreversedr   )r   r   numberized_inputr
   r   r     s   )r   r   rp   r!   arrayr   Zastypeint32r[   r   r   int64ZRunNetr   r   Z	FetchBlobr   r   r   r   rt   rq   r$   r&   rs   r   )r   r   r   Z	num_stepsZscore_beam_listZtoken_beam_listZprev_index_beam_listZattention_weights_beam_listZbest_indicesr|   Z	hyp_indexoutputZattention_weights_per_tokenZ
best_scorer
   r   r   decode  sp    






z(Seq2SeqModelCaffe2EnsembleDecoder.decodeN)	r<   r=   r>   r   r   rB   r   r   r   r
   r
   r
   r   r@   R   s    [ r@   c                    s   t | j| j}tdt| t | j| j}dd t	|D  tdt| t
tt|||| jdg|dd}|  tjD ]J}t ||}||dt| d	 \}}	}
td
 fdd|D  qd S )NzSource vocab size {}c                 S   s   i | ]\}}||qS r
   r
   )r   kvr
   r
   r   
<dictcomp>  r   z,run_seq2seq_beam_decoder.<locals>.<dictcomp>zTarget vocab size {})r   r   ry   rA   )r   r   )r          c                    s   g | ]} | qS r
   r
   )r   tidZinversed_target_vocabr
   r   r   6  r   z,run_seq2seq_beam_decoder.<locals>.<listcomp>)r$   Z	gen_vocabZsource_corpusZunk_thresholdr9   r:   r8   r   Ztarget_corpusr   r@   dict
checkpointr;   sysstdinZget_numberized_sentencer   printjoin)argsry   r   r   r   decoderlineZnumerized_source_sentencetranslation	alignmentr   r
   r   r   run_seq2seq_beam_decoder  sB    

r   c               
   C   s  t jdd} | jdtd ddd | jdtd ddd | jd	td
dd | jdddd | jdddd | jdtddd | jdtddd | jdtddd | jdtddd | jdtddd | jd tdd!d | jd"td d#d | jd$td%d&d | jd'td(d)d | jd*td(d+d | jd,td d-dd |  }t|jd.g|j	 }|j
rz|jd d/ksfJ |d/ d0  d  < t|jd.g|j }t|t|jrd1nd2|t||j
d3|j|j|jd4t|j|j|jd5d6 d S )7NzCaffe2: Seq2Seq Translation)descriptionz--source-corpuszcPath to source corpus in a text file format. Each line in the file should contain a single sentenceT)typedefaulthelprequiredz--target-corpusz+Path to target corpus in a text file formatz--unk-threshold2   zCThreshold frequency under which token becomes labeled unknown token)r   r   r   z--use-bidirectional-encoder
store_truez:Set flag to use bidirectional recurrent network in encoder)actionr   z--use-attentionz,Set flag to use seq2seq with attention modelz--encoder-cell-num-unitsi   z&Number of cell units per encoder layerz--encoder-num-layersr   zNumber encoder layersz--decoder-cell-num-unitsz)Number of cell units in the decoder layerz--decoder-num-layerszNumber decoder layersz--encoder-embedding-size   z&Size of embedding in the encoder layerz--decoder-embedding-sizez&Size of embedding in the decoder layerz--decoder-softmax-sizez$Size of softmax layer in the decoderz--beam-size   zSize of beam for the decoderz--word-rewardrS   zReward per each word generated.z--unk-rewardzBReward per each UNK token generated. Typically should be negative.z--checkpointzPath to checkpoint)rR   r   rR   rE   rD   )encoder_layer_configsuse_bidirectional_encoder)rC   rK   rJ   rF   rO   ri   )rq   r(   r)   )ry   r   )argparseArgumentParseradd_argumentr-   intr   
parse_argsr   Zencoder_cell_num_unitsZencoder_num_layersr   Zdecoder_cell_num_unitsZdecoder_num_layersr   rM   rF   rO   ri   rq   r(   r)   )parserr   r   rK   r
   r
   r   main9  s    













r   __main__)$abcr   r   r   Zfuture.utilsr   loggingnumpyr!   r   Zcaffe2.pythonr   r   r   Z(caffe2.python.models.seq2seq.beam_searchr   Z1caffe2.python.models.seq2seq.seq2seq_model_helperr	   Z)caffe2.python.models.seq2seq.seq2seq_utilpythonr6   Zseq2seqr$   	getLoggerr<   r9   setLevelINFO
addHandlerStreamHandlerstderrr   r   r@   r   r   r
   r
   r
   r   <module>   s,   
	/   D&U