@@ -428,7 +428,7 @@ def evaluate(self, env_fn, nets, itr, num_batches=5):
428428
429429 # calculate average evaluation reward
430430 eval_ep_rewards = [float (i ) for batch in eval_batches for i in batch .ep_rewards ]
431- avg_eval_ep_rewards = np .mean (eval_ep_rewards )
431+ avg_eval_ep_rewards = np .mean (eval_ep_rewards ) if eval_ep_rewards else float ( "nan" )
432432
433433 # save checkpoint - saves with suffix and as best if improved
434434 self .checkpointer .save_if_best (nets , avg_eval_ep_rewards , itr )
@@ -441,6 +441,10 @@ def train(self, env_fn, n_itr):
441441
442442 train_start_time = time .time ()
443443
444+ # Track last known episode stats for iterations where no episodes complete
445+ last_mean_ep_reward = float ("nan" )
446+ last_mean_ep_len = float ("nan" )
447+
444448 obs_mirr , act_mirr = None , None
445449 if hasattr (env_fn (), "mirror_observation" ):
446450 obs_mirr = env_fn ().mirror_clock_observation
@@ -580,9 +584,19 @@ def train(self, env_fn, n_itr):
580584
581585 action_noise = self .policy .stds .data .tolist ()
582586
587+ # Handle empty episode stats (no episodes completed this iteration)
588+ if len (batch .ep_rewards ) > 0 :
589+ mean_ep_reward = float (torch .mean (batch .ep_rewards ))
590+ mean_ep_len = float (torch .mean (batch .ep_lens .float ()))
591+ last_mean_ep_reward = mean_ep_reward
592+ last_mean_ep_len = mean_ep_len
593+ else :
594+ mean_ep_reward = last_mean_ep_reward
595+ mean_ep_len = last_mean_ep_len
596+
583597 sys .stdout .write ("-" * 37 + "\n " )
584- sys .stdout .write (f"| { 'Mean Eprew' :>15} | { torch . mean ( batch . ep_rewards ) :>15.5g} |\n " )
585- sys .stdout .write (f"| { 'Mean Eplen' :>15} | { torch . mean ( batch . ep_lens . float ()) :>15.5g} |\n " )
598+ sys .stdout .write (f"| { 'Mean Eprew' :>15} | { mean_ep_reward :>15.5g} |\n " )
599+ sys .stdout .write (f"| { 'Mean Eplen' :>15} | { mean_ep_len :>15.5g} |\n " )
586600 sys .stdout .write (f"| { 'Actor loss' :>15} | { np .mean (actor_losses ):>15.3g} |\n " )
587601 sys .stdout .write (f"| { 'Critic loss' :>15} | { np .mean (critic_losses ):>15.3g} |\n " )
588602 sys .stdout .write (f"| { 'Mirror loss' :>15} | { np .mean (mirror_losses ):>15.3g} |\n " )
@@ -614,8 +628,8 @@ def train(self, env_fn, n_itr):
614628
615629 eval_ep_lens = [float (i ) for b in eval_batches for i in b .ep_lens ]
616630 eval_ep_rewards = [float (i ) for b in eval_batches for i in b .ep_rewards ]
617- avg_eval_ep_lens = np .mean (eval_ep_lens )
618- avg_eval_ep_rewards = np .mean (eval_ep_rewards )
631+ avg_eval_ep_lens = np .mean (eval_ep_lens ) if eval_ep_lens else float ( "nan" )
632+ avg_eval_ep_rewards = np .mean (eval_ep_rewards ) if eval_ep_rewards else float ( "nan" )
619633 print ("====EVALUATE EPISODE====" )
620634 print (
621635 f"(Episode length:{ avg_eval_ep_lens :.3f} . Reward:{ avg_eval_ep_rewards :.3f} . "
@@ -631,8 +645,8 @@ def train(self, env_fn, n_itr):
631645 critic_loss = np .mean (critic_losses ),
632646 mirror_loss = np .mean (mirror_losses ),
633647 imitation_loss = np .mean (imitation_losses ),
634- mean_reward = float ( torch . mean ( batch . ep_rewards )) ,
635- mean_ep_len = float ( torch . mean ( batch . ep_lens . float ())) ,
648+ mean_reward = mean_ep_reward ,
649+ mean_ep_len = mean_ep_len ,
636650 mean_noise_std = np .mean (action_noise ),
637651 step = itr ,
638652 )
0 commit comments