3
]aC                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dl	Z	d dl
jZd dljjZd dljZd dlZd dlZd dlZd dlmZ d dlmZ G dd deZdS )    N)Counter)util)Agentc               @   sp   e Zd Zdd Zdd ZdddZdd	 ZdddZdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd
S )NavAgentPREVALENTc             C   sZ   || _ |j| _tj| j j| _tjdd| _|j| _|j	j
| _| jd | j_| j| d S )N   )ignore_indexz<PAD>)configdevicerandomRandomseednnCrossEntropyLossloss_fnvocab	nav_agentmodelmodel_configpad_idx
load_model)selfr	    r   \/vulcanscratch/lzhao/repos/Matterport3DGymWithSpeaker/code/tasks/R2R/agents/nav_PREVALENT.py__init__   s    
zNavAgentPREVALENT.__init__c             C   sf   t j|j| j| _tjdt| j  tj	j
| jj | jjd| _	|jjjd k	rb| j|jjj d S )Nznav model: )lr)modelsloadtor
   r   logginginfostrtorchoptimAdam
parametersr   r   r   Z	load_from)r   r	   r   r   r   r   %   s
    zNavAgentPREVALENT.load_modelFc             C   s@   |r| j j  n
| j j  || _t|| _| j  | j| d S )N)r   evaltrainis_evallen
batch_sizeresetencode_goals)r   goal_descriptionsr(   r   r   r   init0   s    

zNavAgentPREVALENT.initc             C   s   g | _ d | _d S )N)action_logit_seqsZprev_actions)r   r   r   r   r+   >   s    zNavAgentPREVALENT.resetNc             C   s^   t |}|d krtt|n|}tj|tjdjdj|dtj|d jdkj	| j
}|S )N)dtyper   r   )r)   intmaxr"   arangeint64	unsqueezerepeat
LongTensorr   r
   )r   lengthsizer*   maskr   r   r   _length2maskB   s
    zNavAgentPREVALENT._length2maskc                s"   j j}xJt|D ]>\}}|d  j j }dg| dg } fdd|D ||< qW tdd |D }x(|D ] }xt||k r|j| qrW qlW tj|}tj	||kdd}|j
d ||dk<  j|d	d
j } j|d	d
}|jdd	\}}|| }	|	|kj }
tj|
}|	|
||j |j fS )Nz<CLS>z<EOS>c                s   g | ]} j | qS r   )r   ).0w)r   r   r   
<listcomp>P   s    z1NavAgentPREVALENT._sort_batch.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r)   )r<   instrr   r   r   r>   Q   s    r   )axisr   T)
from_numpy)r   r   	enumerateZmax_instruction_lengthr2   r)   appendnparrayargmaxshape
_to_tensorlongsortr"   
zeros_liketolist)r   instructionsr   ir?   max_lenZ
seq_tensorseq_lengthsperm_idxZsorted_tensorr:   token_type_idsr   )r   r   _sort_batchI   s&    


zNavAgentPREVALENT._sort_batchc             C   sH   | j |\}| _| _}| _d|| j| j| jd}| jf |\| _| _d S )Nlanguage)modesentenceattention_mask	lang_maskrR   )rS   language_attention_maskrR   rQ   r   h_tlanguage_features)r   r-   rV   rP   Zlanguage_inputsr   r   r   r,   h   s    
zNavAgentPREVALENT.encode_goalsc             C   s   dd |D }t jt|t|| jj| jj ft jd}x<t|D ]0\}}|d j	d }|d ||d |d d f< qBW | j
|dd|fS )Nc             S   s   g | ]}t |d  qS )action_embeddings)r)   )r<   obr   r   r   r>   v   s    z9NavAgentPREVALENT._candidate_variable.<locals>.<listcomp>)r0   r\   r   T)rA   )rD   zerosr)   r2   r   image_feat_sizeangle_feat_sizefloat32rB   rG   rH   )r   obscandidate_lengcandidate_featrN   r]   num_ar   r   r   _candidate_variableu   s    z%NavAgentPREVALENT._candidate_variablec             C   st   t jt|| jjft j}x2t|D ]&\}}tj|d |d | jj||< q$W | j	|dd}| j
|\}}|||fS )Nheading	elevationT)rA   )rD   r^   r)   r   r`   ra   rB   r   build_angle_featuresrH   rf   )r   rb   	input_a_trN   r]   rd   rc   r   r   r   _get_input_feat   s    z!NavAgentPREVALENT._get_input_featc          	   C   sH  t j|}|| j }| j|\}}}tj| jjd| jd d dd d d f fdd| _| j	|dkj
 }tj| j|fdd}t|| jjj_d| j|| j|| j||d}| jf |\| _}	| j	|}
|	j|
td  tj|	}x"t| jD ]\}}|	| ||< qW | jj| | jr0|jddd j }ntj|dj j }|S )	Nr   )dimr   Zvisual)rU   rV   rW   rX   Zvis_maskrR   Zaction_featsZ
cand_featsinf)logitsr   )rD   rE   rQ   rk   r"   catrZ   r5   r[   r;   rI   rY   r2   r   Zvln_bertr	   Z
directionsrR   masked_fill_floatrK   rB   r/   rC   r(   rL   DCategoricalsample)r   rb   Zperm_obsrj   rd   rc   Zvisual_temp_maskZvisual_attention_maskZvisual_inputslogitZcandidate_maskZaction_logitsrN   idxZpred_actionsr   r   r   decide   s4    

4

zNavAgentPREVALENT.decidec             C   sV   t |t | jkstd}x6t|| jD ]&\}}| j|j }|| j||7 }q(W |S )Nr   )r)   r/   AssertionErrorziprH   rI   r   )r   ref_action_seqslossZ
ref_actionru   r   r   r   compute_loss   s    zNavAgentPREVALENT.compute_lossc             C   s6   | j |}| jj  |j  | jj  |j t| S )N)r|   r#   	zero_gradbackwardstepitemr)   )r   rz   r{   r   r   r   learn   s
    


zNavAgentPREVALENT.learn)F)N)__name__
__module____qualname__r   r   r.   r+   r;   rS   r,   rf   rk   rw   r|   r   r   r   r   r   r      s   

-r   )ossysjsonr   r   collectionsr   numpyrD   r"   torch.nnr   Ztorch.nn.functional
functionalFtorch.distributionsdistributionsrr   r   worldsflagsmiscr   Zagents.baser   r   r   r   r   r   <module>   s    

