B
    #=6\0                 @   s   d dl mZ d dl mZ d dl mZ d dl mZ 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 )    )absolute_import)division)print_function)unicode_literals)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-install-l3r2oljg/torch/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   )dims)r   r*   r   r   Squeeze)r   inputr(   r)   r   r   outputr   r   r   _apply_fc_weight_for_sum_matchk   s    
r2   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   r0   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   )r2   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$   r3   r4   r5   r,   r#   r   r   r   r   r   apply_recurrent_attention   sR    r;   c             C   sp   t | ||||dd}| jj||gt|dddd}	t| |	||d}
t| |
||d}t| ||||d}|||	gfS )	Nr4   )r   r0   r(   r)   r   r   r,   r   )r6   Zuse_grad_hack)r   r,   r   r   )r   r#   r   r$   )r   r   r   r   r   )r2   r   r7   r   r-   r%   r   )r   r   r   r8   r9   r:   r   r$   r4   r,   r#   r   r   r   r   r   apply_regular_attention   s<    
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 )Nr4   r'   )r(   r)   r"   &squeezed_weighted_decoder_hidden_stater   )r.   r&   r   )Ztrans_a)r   r#   r   r$   )r   r   r   r   r   )	r   r*   r   r   r/   Z
ExpandDimsZBatchMatMulr%   r   )r   r   r   r9   r:   r   r$   r4   r=   Z1expanddims_squeezed_weighted_decoder_hidden_stater#   r   r   r   r   r   apply_dot_attention  sD    


r>   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 )Nr4   )r   r0   r(   r)   r   r   r5   r   )r6   coverage_t_prev_2dr   )r.   coverage_t_prev_transposedscaled_coverage_weights)r6   r"   r,   )r   r,   r   r   )r   r#   r   r$   )r   r   r   r   r   attention_weights_2dr'   
coverage_t)r2   r   r7   r   r/   r   r+   ZMulr-   r%   r   )r   r   r   r8   r9   r:   r   r$   Zcoverage_t_prevZcoverage_weightsr4   r5   r?   r@   rA   r,   r#   r   r   rB   rC   r   r   r   apply_soft_coverage_attentionF  sn    

rD   )N)N)N)N)
__future__r   r   r   r   Zcaffe2.pythonr   r   r   r   r%   r-   r2   r;   r<   r>   rD   r   r   r   r   <module>   s   
""
H
8
9