class_docstr: Epsilon-greedy Exploration class that produces exploration actions.
  
  When given a Model's output and a current epsilon value (based on some
  Schedule), it produces a random action (if rand(1) < eps) or
  uses the model-computed one (if rand(1) >= eps).
code: def get_exploration_action(
      self,
      *,
      action_distribution: ActionDistribution,
      timestep: Union[int, TensorType],
      explore: Optional[Union[bool, TensorType]] = True,
  ):
      if self.framework in ["tf2", "tf"]:
          return self._get_tf_exploration_action_op(
              action_distribution, explore, timestep
          )
      else:
          return self._get_torch_exploration_action(
              action_distribution, explore, timestep
          )
  
imports: import gymnasium
  import numpy
  import tree
  import random
  from typing import Union, Optional
  from ray.rllib.models.torch.torch_action_dist import TorchMultiActionDistribution
  from ray.rllib.models.action_dist import ActionDistribution
  from ray.rllib.utils.annotations import override, PublicAPI
  from ray.rllib.utils.exploration.exploration import Exploration, TensorType
  from ray.rllib.utils.framework import try_import_tf, try_import_torch, get_variable
  from ray.rllib.utils.from_config import from_config
  from ray.rllib.utils.numpy import convert_to_numpy
  from ray.rllib.utils.schedules import Schedule, PiecewiseSchedule
  from ray.rllib.utils.torch_utils import FLOAT_MIN
label_desc: Use image node_id 2 for calling the EpsilonGreedy obj's underlying member method code with example usage: obj.get_exploration_action() and returns: self, self