class_docstr: The Catalog class used to build models for PPO.
  
  PPOCatalog provides the following models:
      - ActorCriticEncoder: The encoder used to encode the observations.
      - Pi Head: The head used to compute the policy logits.
      - Value Function Head: The head used to compute the value function.
  
  The ActorCriticEncoder is a wrapper around Encoders to produce separate outputs
  for the policy and value function. See implementations of PPORLModule for
  more details.
  
  Any custom ActorCriticEncoder can be built by overriding the
  build_actor_critic_encoder() method. Alternatively, the ActorCriticEncoderConfig
  at PPOCatalog.actor_critic_encoder_config can be overridden to build a custom
  ActorCriticEncoder during RLModule runtime.
  
  Any custom head can be built by overriding the build_pi_head() and build_vf_head()
  methods. Alternatively, the PiHeadConfig and VfHeadConfig can be overridden to
  build custom heads during RLModule runtime.
docstr: Initializes the PPOCatalog.
  
  Args:
      observation_space: The observation space of the Encoder.
      action_space: The action space for the Pi Head.
      model_config_dict: The model config to use.
docstr_tok: ["Initializes","the","PPOCatalog",".","Args",":","observation_space",":","The","observation","space","of","the","Encoder",".","action_space",":","The","action","space","for","the","Pi","Head",".","model_config_dict",":","The","model","config","to","use","."]
code: def __init__(
      self,
      observation_space: gym.Space,
      action_space: gym.Space,
      model_config_dict: dict,
  ):
      """Initializes the PPOCatalog.
  
      Args:
          observation_space: The observation space of the Encoder.
          action_space: The action space for the Pi Head.
          model_config_dict: The model config to use.
      """
      super().__init__(
          observation_space=observation_space,
          action_space=action_space,
          model_config_dict=model_config_dict,
      )
  
      # Replace EncoderConfig by ActorCriticEncoderConfig
      self.actor_critic_encoder_config = ActorCriticEncoderConfig(
          base_encoder_config=self._encoder_config,
          shared=self._model_config_dict["vf_share_layers"],
      )
  
      self.pi_and_vf_head_hiddens = self._model_config_dict[
          "post_fcnet_hiddens"
      ]
      self.pi_and_vf_head_activation = self._model_config_dict[
          "post_fcnet_activation"
      ]
  
      # We don't have the exact (framework specific) action dist class yet and thus
      # cannot determine the exact number of output nodes (action space) required.
      # -> Build pi config only in the `self.build_pi_head` method.
      self.pi_head_config = None
  
      self.vf_head_config = MLPHeadConfig(
          input_dims=self.latent_dims,
          hidden_layer_dims=self.pi_and_vf_head_hiddens,
          hidden_layer_activation=self.pi_and_vf_head_activation,
          output_layer_activation="linear",
          output_layer_dim=1,
      )
  
file_path: ray/python/ray/rllib/algorithms/ppo/ppo_catalog.py
imports: import gymnasium
  from ray.rllib.core.models.catalog import Catalog
  from ray.rllib.core.models.configs import ActorCriticEncoderConfig, MLPHeadConfig, FreeLogStdMLPHeadConfig
  from ray.rllib.core.models.base import Encoder, ActorCriticEncoder, Model
  from ray.rllib.utils import override
  from ray.rllib.utils.annotations import OverrideToImplementCustomLogic
label_desc: Use image node_id 1 to create a new PPOCatalog object from inherited base classes: Catalog with example: obj = PPOCatalog(observation_space, action_space, model_config_dict)