3
]aN                 @   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               @   s8   e Zd Zdd ZdddZdd Zdd	d
Zdd ZdS )DaggerTrainerc             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   W/vulcanscratch/lzhao/repos/Matterport3DGymWithSpeaker/code/tasks/R2R/trainers/dagger.py__init__   s    zDaggerTrainer.__init__Fc             C   s   t |}|j||d\}}|j||d dd |jD }g }	| j}
xx|j s|j|}|j|\}}x0t|D ]$}|j	| sn|| j
|j| j qnW |	j
| |
d8 }
|
dkrD|j  qDW |s|j|	}|S ||fS )N)is_evalc             S   s   g | ]}|j gqS r   )	viewpoint).0sr   r   r   
<listcomp>#   s    z-DaggerTrainer.run_episode.<locals>.<listcomp>   r   )lenresetinitstatesr	   all_doneZdecidesteprangeis_doneappendr   set_all_doneZlearn)r   batchenvagentr   
batch_sizeobsgoal_descriptionspathsZreference_action_seqsZsteps_remainingactionsZreference_actionsilossr   r   r   run_episode   s(    




zDaggerTrainer.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 ]}	| j|	||	 || qW ||krPP qPW d S )	Nr   trainr   zTrain iter %d (%d%%): d   zloss = %.4f last)r   r   	max_iters	log_everybest_resultsmetricsZ
init_valuer   iterate_batchesr+   logginginfosaveevaluate)r   datasetsr"   r#   eval_splitsr0   r1   Zi_iterZ
total_losssplitr!   r*   Zavg_losslog_strr   r   r   r,   <   s0    






zDaggerTrainer.trainNc                s  i }xt |j D ]\}}tj  | j|||dd\}}	W d Q R X g }
x6t||	D ](\}}|
jtj|j	|d ||d  qTW x:t||	|
D ]*\}}}||d}|j
| |||d < qW qW i }x4tj D ](  fdd|j D }tj|| < qW d	|j }|d
tj| 7 }tj| |d kr<| jd| | n| jd||f | t| dr|| j }| j| }tj| j||rtjd||f  || j|< d| }|j| | j|| d S )NT)r   scanpath)	pred_pathresultinstr_idc                s   g | ]}|d    qS )r@   r   )r   item)metric_namer   r   r   z   s    z*DaggerTrainer.evaluate.<locals>.<listcomp>zEvaluation on %s: z
  * Metrics: zlast_%sz%s_%sr2   z!!! New best %s: %.3fzbest_%s)	enumerater4   torchno_gradr+   zipr   r3   evalworldupdateget_metricsvaluesnpaverager;   Zformat_resultsr5   r6   
save_predshasattrr   r2   	is_betterr7   )r   r;   datasetr"   r#   Zpred_save_name	all_predsr)   r!   Z
pred_pathsresultsrB   r?   r@   Znew_itemZ
avg_resultZall_resultsr<   
new_resultZ
cur_resultZ	save_namer   )rC   r   r8   e   s>    
 $







zDaggerTrainer.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dumpr5   r6   )r   filenamerS   Z	file_pathfr   r   r   rO      s    zDaggerTrainer.save_preds)F)N)__name__
__module____qualname__r   r+   r,   r8   rO   r   r   r   r   r      s
   
!)
-r   )r5   ossys	itertoolsr[   rer
   numpyrM   collectionsr   copyr   dcrE   miscr   Ztrainers.metricsr3   objectr   r   r   r   r   <module>   s   
