3
.a                 @   s   d dl Z d dlZd dlZ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mZ d dlZd dlmZ d dljZG dd deZdS )    N)defaultdict)deepcopy)utilc               @   s@   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
S )SpeakerTrainerc             C   s2   || _ | j jj| _| j jj| _tj| j j| _d S )N)configtrainermain_metric	max_stepsrandomRandomseed)selfr    r   X/vulcanscratch/lzhao/repos/Matterport3DGymWithSpeaker/code/tasks/R2R/trainers/speaker.py__init__   s    zSpeakerTrainer.__init__c       
      C   s   t dd |D }tj||ftj}|d jjd }tj|||ftjd}xFt|D ]:\}}t|j	}	d|||	d f< |j||d |	d d f< qTW ||fS )Nc             s   s   | ]}t |jV  qd S )N)lenadj_loc_list).0stater   r   r   	<genexpr>   s    z6SpeakerTrainer._nav_action_variable.<locals>.<genexpr>r      )dtype)
maxnpzerosuint8action_embeddingsshapefloat32	enumerater   r   )
r   states
batch_sizeZ	max_num_ainvalidZaction_embed_sizeaction_embedsir   Znum_ar   r   r   _nav_action_variable   s    
z#SpeakerTrainer._nav_action_variableFc             C   s8  t |}|j||d}|j||d dd t|D }dd t|D }| j}	x|j sxBt|D ]6}
||
 d }||
 d }||
 j||d d f  qbW |j \}}|j|}x"t|D ]}
||
 j||
  qW |	d8 }	|	dkrP|j	  qPW |s |j
|}|j|||d	}|j|}|S |j||}||fS d S )
N)is_evalc             S   s   g | ]}g qS r   r   )r   r%   r   r   r   
<listcomp>4   s    z.SpeakerTrainer.run_episode.<locals>.<listcomp>c             S   s   g | ]}g qS r   r   )r   r%   r   r   r   r(   5   s    view_featuresview_idr   r   )ref_instructions)r   resetinitranger	   all_doneappendstepZget_action_featset_all_doneget_reference_instructionspredictlearndecode)r   batchenvagentr'   r"   obsZaction_embed_seqsZview_feature_seqssteps_remainingr%   r)   r*   ref_actionsr$   r+   outputslosspred_instructionsr   r   r   run_episode,   s2    



zSpeakerTrainer.run_episodec             C   s  | j jj}| j jj}d}d}i | _x|D ]}	tj| j| j|	< q(W x|d j D ]}
|d7 }| j	|
||}||7 }|| dkr|| }d}d||| d f }|d| 7 }t
jd t
j| |jd x*|D ]"}	td	|	 | j|	||	 || qW ||krPP qPW d S )
Nr   trainr   zTrain iter %d (%d%%): d   zloss = %.4f lastzEvaluate on: )r   r   	max_iters	log_everybest_resultsmetrics
init_valuer   iterate_batchesr@   logginginfosaveprintevaluate)r   datasetsr8   r9   eval_splitsrE   rF   i_iter
total_losssplitr7   r>   avg_losslog_strr   r   r   rA   ^   s2    







zSpeakerTrainer.trainNc       	      C   sT   xNt |j D ]>\}}tj ( | j|||dd\}}td| P W d Q R X qW d S )NT)r'   zDecoded instructions: )r    rJ   torchno_gradr@   rN   )	r   rT   datasetr8   r9   pred_save_namer%   r7   r?   r   r   r   rO      s
    

zSpeakerTrainer.evaluatec             C   sL   d| j j|d f }t|d}tj||dd W d Q R X tjd|  d S )Nz%s/%sz.predw   )indentzSaved eval info to %s)r   experiment_diropenjsondumprK   rL   )r   filename	all_preds	file_pathfr   r   r   
save_preds   s    zSpeakerTrainer.save_preds)F)N)	__name__
__module____qualname__r   r&   r@   rA   rO   rf   r   r   r   r   r      s   
2*
	r   )rK   ossys	itertoolsr`   rer
   numpyr   collectionsr   copyr   dcrW   miscr   trainers.metricsrH   objectr   r   r   r   r   <module>   s   
