code: def run_epoch(self) -> float:
      logger.info("Computing reward")
      rewards = self.individual_pool.compute_all_local_rewards()
      logger.info("Pushing reward")
  
      # Sum the rewards across all machines
      distributed.all_reduce(rewards, self.process_group)
  
      # Divide the rewards by the number of machines.  We do this because
      # there is no "average" all_reduce operator.
      rewards /= self.num_nodes
  
      self.iteration += 1
      self.individual_pool.apply_global_reward(rewards, self.iteration)
      most_recent_avg_rewards = float(torch.mean(rewards))
      new_parent_reward = self.individual_pool.compute_local_reward(
          self.individual_pool.parent_tensors
      )
      logger.info(
          "ITERATION: {0} MEAN REWARD: {1}, NEW PARENT REWARD: {2}".format(
              self.iteration, most_recent_avg_rewards, new_parent_reward
          )
      )
  
      return new_parent_reward
  
file_path: ReAgent/reagent/training/gradient_free/es_worker.py
imports: import logging
  import torch
  import torch.distributed
  import torch.nn
  import torch.optim
  from reagent.core.parameters import EvolutionParameters
  from reagent.training.gradient_free.evolution_pool import EvolutionPool
  from torch.distributed import ProcessGroup
label_desc: Use image node_id 2 for calling the EsWorker obj's underlying member method code with example usage: obj.run_epoch() and returns: new_parent_reward