U
    dG0                     @   sn   d dl mZ G dd dZdd Zdd Zdd	d
Zdd Zdd ZdddZdddZ	dddZ
dd ZdS )    )brewc                   @   s    e Zd Zeed\ZZZZdS )AttentionType   N)	__name__
__module____qualname__tuplerangeZRegularZ	RecurrentZDotZSoftCoverage r
   r
   ;/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/attention.pyr      s   r   c                 C   s   d t| t|S )Nz{}/{})formatstr)scopenamer
   r
   r   s   s    r   c                 C   sB   t | ||gt|d}| jj||t|dgdd|gd\}}|S )N"attention_weighted_encoder_contextZ,attention_weighted_encoder_context_old_shape   )shape)r   Zbatch_mat_mulr   netZReshape)modelencoder_outputs_transposedencoder_output_dimattention_weights_3dr   r   _r
   r
   r   _calc_weighted_context   s    
r   Nc                 C   s>   |d k	r | j j||gdgdd}tj| |t|dddd}|S )NZmasked_attention_logitssequence)moder   ZCUDNNr   )Zengineaxis)r   ZSequenceMaskr   Zsoftmaxr   )r   attention_logits_transposedr   encoder_lengthsr   r
   r
   r   _calc_attention_weights0   s    r!   c              	   C   sN   | j ||}tj| |t|d|dddd}tj| |t|ddddgd}|S )	Nattention_logitsr      T)dim_indim_outr   Zfreeze_biasr   r   )Zaxes)r   ZTanhr   fcr   	transpose)r   "decoder_hidden_encoder_outputs_sumr   r   r"   r   r
   r
   r   %_calc_attention_logits_from_sum_matchI   s(    r)   c                 C   s4   t j| |t||||dd}| jj||dgd}|S )Nr#   r$   r%   r   r   Zdims)r   r&   r   r   Squeeze)r   inputr$   r%   r   r   outputr
   r
   r   _apply_fc_weight_for_sum_matchk   s    r/   c	                 C   s   t | ||||dd}	t | ||||dd}
| j|	|
gt|d}| jj||gt|ddd}t| |||d}t| |||d	}t| ||||d
}|||gfS )Nweighted_prev_attention_contextr   r-   r$   r%   r   r   weighted_decoder_hidden_state&decoder_hidden_encoder_outputs_sum_tmpr(   r   	broadcastr   r(   r   r   r   r   r   r    r   r   r   r   r   r/   r   Addr   r)   r!   r   )r   r   r   weighted_encoder_outputsdecoder_hidden_state_tdecoder_hidden_state_dimZ)attention_weighted_encoder_context_t_prevr   r    r0   r2   r3   r(   r   r   r   r
   r
   r   apply_recurrent_attention   sf    		r>   c                 C   sp   t | ||||dd}| jj||gt|dddd}	t| |	||d}
t| |
||d}t| ||||d}|||	gfS )	Nr2   r1   r(   r   )r5   Zuse_grad_hackr6   r7   r8   r9   )r   r   r   r;   r<   r=   r   r    r2   r(   r   r   r   r
   r
   r   apply_regular_attention   sH    

r?   c                 C   s   ||kr&t j| |t|d||dd}n|}| jj|t|ddgd}| jj||dgd}	| jj||	gt|ddd	}
t| |
||d
}t| ||||d}||g fS )Nr2   r#   r*   &squeezed_weighted_decoder_hidden_stater   r+   r"   r   )Ztrans_ar7   r8   )	r   r&   r   r   r,   Z
ExpandDimsZBatchMatMulr!   r   )r   r   r   r<   r=   r   r    r2   r@   Z1expanddims_squeezed_weighted_decoder_hidden_stater   r   r   r
   r
   r   apply_dot_attention  sR    	
rA   c
                 C   s
  t | ||||dd}
| jj||
gt|ddd}| jj|t|ddgd}t| |t|d	}| jj|	|gt|d
ddd}| j||gt|d}t| |||d}t	| |||d}t
| ||||d}| jj|t|ddgd}| jj||gt|ddd}|||g|fS )Nr2   r1   r3   r   r4   coverage_t_prev_2dr   r+   coverage_t_prev_transposedscaled_coverage_weights)r5   r   r(   r6   r7   r8   attention_weights_2dr#   
coverage_t)r/   r   r:   r   r,   r   r'   ZMulr)   r!   r   )r   r   r   r;   r<   r=   r   r    Zcoverage_t_prevZcoverage_weightsr2   r3   rB   rC   rD   r(   r   r   r   rE   rF   r
   r
   r   apply_soft_coverage_attentionF  s    
	rG   )N)N)N)N)Zcaffe2.pythonr   r   r   r   r!   r)   r/   r>   r?   rA   rG   r
   r
   r
   r   <module>   s    
"" 
Q 
@ 
B