class_docstr: Coin Game environment.
docstr: We want to be able to use a policy trained as player 1,
  for evaluation as player 2 and vice versa.
docstr_tok: ["We","want","to","be","able","to","use","a","policy","trained","as","player","1",",","for","evaluation","as","player","2","and","vice","versa","."]
code: def _get_obs_invariant_to_the_player_trained(self, observation):
      """
      We want to be able to use a policy trained as player 1,
      for evaluation as player 2 and vice versa.
      """
  
      # player_red_observation contains
      # [Red pos, Blue pos, Red coin pos, Blue coin pos]
      player_red_observation = observation
      # After modification, player_blue_observation will contain
      # [Blue pos, Red pos, Blue coin pos, Red coin pos]
      player_blue_observation = copy.deepcopy(observation)
      player_blue_observation[..., 0] = observation[..., 1]
      player_blue_observation[..., 1] = observation[..., 0]
      player_blue_observation[..., 2] = observation[..., 3]
      player_blue_observation[..., 3] = observation[..., 2]
  
      return [player_red_observation, player_blue_observation]
  
imports: import copy
  import gymnasium
  import logging
  import numpy
  from gymnasium.spaces import Discrete
  from gymnasium.utils import seeding
  from ray.rllib.env.multi_agent_env import MultiAgentEnv
  from ray.rllib.utils import override
  from typing import Dict, Optional
  from ray.rllib.examples.env.utils.interfaces import InfoAccumulationInterface
label_desc: Use image node_id 16 for calling the CoinGame obj's underlying member method code with example usage: obj._get_obs_invariant_to_the_player_trained(observation) and returns: list