class_docstr: AdditiveNoise is an exploration policy intended for continuous action spaces. It takes the action from the agent
  and adds a Gaussian distributed noise to it. The amount of noise added to the action follows the noise amount that
  can be given in two different ways:
  1. Specified by the user as a noise schedule which is taken in percentiles out of the action space size
  2. Specified by the agents action. In case the agents action is a list with 2 values, the 1st one is assumed to
  be the mean of the action, and 2nd is assumed to be its standard deviation.
class_docstr_tok: ["AdditiveNoise","is","an","exploration","policy","intended","for","continuous","action","spaces",".","It","takes","the","action","from","the","agent","and","adds","a","Gaussian","distributed","noise","to","it",".","The","amount","of","noise","added","to","the","action","follows","the","noise","amount","that","can","be","given","in","two","different","ways",":","1",".","Specified","by","the","user","as","a","noise","schedule","which","is","taken","in","percentiles","out","of","the","action","space","size","2",".","Specified","by","the","agents","action",".","In","case","the","agents","action","is","a","list","with","2","values",",","the","1st","one","is","assumed","to","be","the","mean","of","the","action",",","and","2nd","is","assumed","to","be","its","standard","deviation","."]
code: def get_action(self, action_values: List[ActionType]) -> ActionType:
      # TODO-potential-bug consider separating internally defined stdev and externally defined stdev into 2 policies
  
      # set the current noise
      if self.phase == RunPhase.TEST:
          current_noise = self.evaluation_noise
      else:
          current_noise = self.noise_schedule.current_value
  
      # scale the noise to the action space range
      if self.noise_as_percentage_from_action_space:
          action_values_std = current_noise * (
              self.action_space.high - self.action_space.low
          )
      else:
          action_values_std = current_noise
  
      # extract the mean values
      if isinstance(action_values, list):
          # the action values are expected to be a list with the action mean and optionally the action stdev
          action_values_mean = action_values[0].squeeze()
      else:
          # the action values are expected to be a numpy array representing the action mean
          action_values_mean = action_values.squeeze()
  
      # step the noise schedule
      if self.phase is not RunPhase.TEST:
          self.noise_schedule.step()
          # the second element of the list is assumed to be the standard deviation
          if isinstance(action_values, list) and len(action_values) > 1:
              action_values_std = action_values[1].squeeze()
  
      # add noise to the action means
      if self.phase is not RunPhase.TEST:
          action = np.random.normal(
              action_values_mean, action_values_std
          )
      else:
          action = action_values_mean
  
      return np.atleast_1d(action)
  
file_path: coach/rl_coach/exploration_policies/additive_noise.py
imports: from typing import List
  import numpy
  from rl_coach.core_types import RunPhase, ActionType
  from rl_coach.exploration_policies.exploration_policy import ContinuousActionExplorationPolicy, ExplorationParameters
  from rl_coach.schedules import Schedule, LinearSchedule
  from rl_coach.spaces import ActionSpace, BoxActionSpace
label_desc: Use image node_id 2 for calling the AdditiveNoise obj's underlying member method code with example usage: obj.get_action(action_values) and returns: np