docstr: Updates the episodic log file with all the signal values from the most recent episode.
  Additional signals for logging can be set by the creating a new signal using self.register_signal,
  and then updating it with some internal agent values.
  
  :return: None
docstr_tok: ["Updates","the","episodic","log","file","with","all","the","signal","values","from","the","most","recent","episode",".","Additional","signals","for","logging","can","be","set","by","the","creating","a","new","signal","using","self.register_signal",",","and","then","updating","it","with","some","internal","agent","values",".",":","return",":","None"]
code: def update_log(self) -> None:
      """
      Updates the episodic log file with all the signal values from the most recent episode.
      Additional signals for logging can be set by the creating a new signal using self.register_signal,
      and then updating it with some internal agent values.
  
      :return: None
      """
      # log all the signals to file
      current_time = self.get_current_time()
      self.agent_logger.set_current_time(current_time)
      self.agent_logger.create_signal_value(
          "Training Iter", self.training_iteration
      )
      self.agent_logger.create_signal_value(
          "Episode #", self.current_episode
      )
      self.agent_logger.create_signal_value(
          "Epoch", self.training_epoch
      )
      self.agent_logger.create_signal_value(
          "In Heatup", int(self._phase == RunPhase.HEATUP)
      )
      self.agent_logger.create_signal_value(
          "ER #Transitions", self.call_memory("num_transitions")
      )
      self.agent_logger.create_signal_value(
          "ER #Episodes", self.call_memory("length")
      )
      self.agent_logger.create_signal_value(
          "Episode Length", self.current_episode_steps_counter
      )
      self.agent_logger.create_signal_value(
          "Total steps", self.total_steps_counter
      )
      self.agent_logger.create_signal_value(
          "Epsilon",
          np.mean(self.exploration_policy.get_control_param()),
      )
      self.agent_logger.create_signal_value(
          "Shaped Training Reward",
          self.total_shaped_reward_in_current_episode
          if self._phase == RunPhase.TRAIN
          else np.nan,
      )
      self.agent_logger.create_signal_value(
          "Training Reward",
          self.total_reward_in_current_episode
          if self._phase == RunPhase.TRAIN
          else np.nan,
      )
  
      self.agent_logger.create_signal_value(
          "Update Target Network", 0, overwrite=False
      )
      self.agent_logger.update_wall_clock_time(current_time)
  
      # The following signals are created with meaningful values only when an evaluation phase is completed.
      # Creating with default NaNs for any HEATUP/TRAIN/TEST episode which is not the last in an evaluation phase
      self.agent_logger.create_signal_value(
          "Evaluation Reward", np.nan, overwrite=False
      )
      self.agent_logger.create_signal_value(
          "Shaped Evaluation Reward", np.nan, overwrite=False
      )
      self.agent_logger.create_signal_value(
          "Success Rate", np.nan, overwrite=False
      )
      self.agent_logger.create_signal_value(
          "Inverse Propensity Score", np.nan, overwrite=False
      )
      self.agent_logger.create_signal_value(
          "Direct Method Reward", np.nan, overwrite=False
      )
      self.agent_logger.create_signal_value(
          "Doubly Robust", np.nan, overwrite=False
      )
      self.agent_logger.create_signal_value(
          "Weighted Importance Sampling", np.nan, overwrite=False
      )
      self.agent_logger.create_signal_value(
          "Sequential Doubly Robust", np.nan, overwrite=False
      )
  
      for signal in self.episode_signals:
          self.agent_logger.create_signal_value(
              "{}/Mean".format(signal.name), signal.get_mean()
          )
          self.agent_logger.create_signal_value(
              "{}/Stdev".format(signal.name), signal.get_stdev()
          )
          self.agent_logger.create_signal_value(
              "{}/Max".format(signal.name), signal.get_max()
          )
          self.agent_logger.create_signal_value(
              "{}/Min".format(signal.name), signal.get_min()
          )
  
      # dump
      if (
          self.current_episode
          % self.ap.visualization.dump_signals_to_csv_every_x_episodes
          == 0
      ):
          self.agent_logger.dump_output_csv()
  
imports: import copy
  import random
  from collections import OrderedDict
  from typing import Dict, List, Union, Tuple
  import numpy
  from six.moves import range
  from rl_coach.agents.agent_interface import AgentInterface
  from rl_coach.architectures.network_wrapper import NetworkWrapper
  from rl_coach.base_parameters import AgentParameters, Device, DeviceType, DistributedTaskParameters, Frameworks
  from rl_coach.core_types import RunPhase, PredictionType, EnvironmentEpisodes, ActionType, Batch, Episode, StateType
  from rl_coach.core_types import Transition, ActionInfo, TrainingSteps, EnvironmentSteps, EnvResponse
  from rl_coach.logger import screen, Logger, EpisodeLogger
  from rl_coach.memories.episodic.episodic_experience_replay import EpisodicExperienceReplay
  from rl_coach.saver import SaverCollection
  from rl_coach.spaces import SpacesDefinition, VectorObservationSpace, GoalsSpace, AttentionActionSpace
  from rl_coach.utils import Signal, force_list
  from rl_coach.utils import dynamic_import_and_instantiate_module_from_params
  from rl_coach.memories.backend.memory_impl import get_memory_backend
  from rl_coach.core_types import TimeTypes
  from rl_coach.off_policy_evaluators.ope_manager import OpeManager
  from rl_coach.core_types import PickledReplayBuffer, CsvDataset
label_desc: Use image node_id 18 for calling the Agent obj's underlying member method code with example usage: obj.update_log() without return types