class_docstr: The Env base class, loosely-inspired by the analogous ``env`` class of the OpenAIGym framework. 
  
  A typical workflow is as follows:
  
  >>> my_env = MyCustomEnv(<some_params>)
  >>> initial_observation = my_env.reset(initial_state)
  >>> my_agent.infer_states(initial_observation)
  >>> my_agent.infer_policies()
  >>> next_action = my_agent.sample_action()
  >>> next_observation = my_env.step(next_action)
  
  This would be the first step of an active inference process, where a sub-class of ``Env``, ``MyCustomEnv`` is initialized, 
  an initial observation is produced, and these observations are fed into an instance of ``Agent`` in order to produce an action,
  that can then be fed back into the the ``Env`` instance.
docstr: Steps the environment forward using an action.
  
  Parameters
  ----------
  action
      The action, the type/format of which depends on the implementation.
  
  Returns
  ---------
  observation
      Sensory observations for an agent, the type/format of which depends on the implementation of ``step`` and the observation space of the agent.
code: def step(self, action):
      """
      Steps the environment forward using an action.
  
      Parameters
      ----------
      action
          The action, the type/format of which depends on the implementation.
  
      Returns
      ---------
      observation
          Sensory observations for an agent, the type/format of which depends on the implementation of ``step`` and the observation space of the agent.
      """
      raise NotImplementedError
  
file_path: pymdp/pymdp/envs/env.py
label_desc: Use image node_id 2 for calling the Env obj's underlying member method code with example usage: obj.step(action) without return types