3
YaC                 @   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 d dlmZmZmZmZ G dd deZdS )    N)Counter)util)Agent)GPT2LMHeadModelGPT2TokenizerAdamWget_linear_schedule_with_warmupc               @   sz   e Zd Zdd Zdd Zd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dZdd Zdd ZdS ) SpeakerAgentGPTc             C   s   || _ |j| _tj| j j| _tjdd| _|j| _|j	j
| _| jd | j_| j| | jjd| jj  }tj|| j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image_feat_sizeangle_feat_sizeLinearemb_sizetolinear_transform)selfr   feature_size r$   Z/vulcanscratch/lzhao/repos/Matterport3DGymWithSpeaker/code/tasks/R2R/agents/speaker_GPT.py__init__   s    

zSpeakerAgentGPT.__init__c             C   sx   t jddddd| _tjdddj| j| _| jjt| j d| _	d	| _
t| jj | jjd
| _t| jddd| _d S )Ngpt2z<|startoftext|>z<|endoftext|>z<|pad|>)	bos_token	eos_token	pad_tokenF)output_hidden_statesi   i   )lr   r
   )Znum_warmup_stepsZnum_training_stepsr   )r   from_pretrained	tokenizerr   r    r   r   resize_token_embeddingslenr   max_seq_lengthr   
parametersr   r,   optimr   	scheduler)r"   r   r$   r$   r%   r   +   s    zSpeakerAgentGPT.load_modelFc             C   s*   |r| j j  n
| j j  || _|| _d S )N)r   evaltrainis_eval
batch_size)r"   r9   r8   r$   r$   r%   init9   s
    
zSpeakerAgentGPT.initNc             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
   )r1   intmaxtorcharangeint64	unsqueezerepeat
LongTensorr    r   )r"   lengthsizer9   maskr$   r$   r%   _length2maskC   s
    zSpeakerAgentGPT._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>Q   s    z/SpeakerAgentGPT._sort_batch.<locals>.<listcomp>c             S   s   g | ]}t |qS r$   )r1   )rH   instrr$   r$   r%   rJ   R   s    r
   )axisr   T)
from_numpy)r   r   	enumeratemax_instruction_lengthr=   r1   appendnparrayargmaxshape
_to_tensorlongsortr>   
zeros_liketolist)r"   instructionsr   irK   max_len
seq_tensorseq_lengthsperm_idxsorted_tensorrF   token_type_idsr$   )r"   r%   _sort_batchJ   s&    


zSpeakerAgentGPT._sort_batchc             C   sH   | j |\}| _| _}| _d|| j| j| jd}| jf |\| _| _d S )Nlanguage)modesentenceattention_mask	lang_maskra   )rb   language_attention_maskra   r_   r   h_tlanguage_features)r"   goal_descriptionsre   r^   language_inputsr$   r$   r%   encode_goalsi   s    
zSpeakerAgentGPT.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)r1   )rH   obr$   r$   r%   rJ   w   s    z7SpeakerAgentGPT._candidate_variable.<locals>.<listcomp>)r;   rn   r   T)rM   )rQ   zerosr1   r=   r   r   r   float32rN   rT   rU   )r"   obscandidate_lengcandidate_featr[   ro   num_ar$   r$   r%   _candidate_variablev   s    z#SpeakerAgentGPT._candidate_variablec       	      C   s   t jtj|j| jj }t jtj|j| jj }t j||gdd}t|j	 \}}}t j
|| j| |gj| jj }t j||gdd}||fS )Nr   )dimr
   )r>   rM   rQ   stackr    r   floatcatlistrE   rp   r2   )	r"   view_feature_seqsaction_embed_seqsZ
input_featr9   seq_lenr#   paddedZpadded_input_featr$   r$   r%   _get_input_feat   s    "zSpeakerAgentGPT._get_input_featc             C   sR   t jt|| jjft j}x2t|D ]&\}}tj|d |d | jj||< q$W |S )Nheading	elevation)	rQ   rp   r1   r   r   rq   rN   r   build_angle_features)r"   rr   	input_a_tr[   ro   r$   r$   r%   get_action_feat   s
    zSpeakerAgentGPT.get_action_featc             C   sX   g }x6|D ].}| j d| d d| jdd}|j|d  q
W tj|}| j|dd}|S )Nz<|startoftext|>z<|endoftext|>T
max_length)
truncationr   padding	input_ids)rM   )r/   r2   rP   rQ   rR   rU   )r"   rZ   r   instructionZencodings_dictr]   r$   r$   r%   get_instruction_tensor   s    

z&SpeakerAgentGPT.get_instruction_tensorc             C   s:   | j ||\}}| j|}|r(| j|}| j||d}|S )N)inputs_embedslabels)r   r!   r   r   )r"   r|   r}   ref_instructionsinputsr#   transformed_inputsoutputsr$   r$   r%   predict   s    

zSpeakerAgentGPT.predictc             C   sH   | j ||\}}| j|}| jj|ddddd}| jj|d dd}|S )N2      r   T)r   r   	num_beamsno_repeat_ngram_sizeearly_stoppingr   )skip_special_tokens)r   r!   r   generater/   decode)r"   r|   r}   r   r#   r   r   Ztext_outputsr$   r$   r%   r      s
    
zSpeakerAgentGPT.decodec             C   sF   |d }|j   | jj  | jj  | jj  | jj  |j | j S )Nr   )backwardr4   stepr5   	zero_gradr   itemr9   )r"   r   lossr$   r$   r%   learn   s    



zSpeakerAgentGPT.learn)F)N)N)__name__
__module____qualname__r&   r   r:   rG   rb   rm   rv   r   r   r   r   r   r   r$   r$   r$   r%   r	      s   


	
r	   )ossysjsonloggingr   collectionsr   numpyrQ   r>   torch.nnr   Ztorch.nn.functional
functionalFtorch.distributionsdistributionsDmodelsworldsflagsmiscr   agents.baser   Ztransformersr   r   r   r   r	   r$   r$   r$   r%   <module>   s"   

