class_docstr: A simple, q-value-from-cont-action model (for e.g. SAC type algos).
code: def __init__(
      self, obs_space, action_space, num_outputs, model_config, name
  ):
      # Pass num_outputs=None into super constructor (so that no action/
      # logits output layer is built).
      # Alternatively, you can pass in num_outputs=[last layer size of
      # config[model][fcnet_hiddens]] AND set no_last_linear=True, but
      # this seems more tedious as you will have to explain users of this
      # class that num_outputs is NOT the size of your Q-output layer.
      super(ContActionQModel, self).__init__(
          obs_space, action_space, None, model_config, name
      )
  
      # Now: self.num_outputs contains the last layer's size, which
      # we can use to construct the single q-value computing head.
  
      # Nest an RLlib FullyConnectedNetwork (torch or tf) into this one here
      # to be used for Q-value calculation.
      # Use the current value of self.num_outputs, which is the wrapped
      # model's output layer size.
      combined_space = Box(
          -1.0, 1.0, (self.num_outputs + action_space.shape[0],)
      )
      self.q_head = FullyConnectedNetwork(
          combined_space, action_space, 1, model_config, "q_head"
      )
  
imports: from gymnasium.spaces import Box
  from ray.rllib.models.tf.fcnet import FullyConnectedNetwork
  from ray.rllib.models.tf.tf_modelv2 import TFModelV2
  from ray.rllib.models.torch.fcnet import FullyConnectedNetwork
  from ray.rllib.models.torch.misc import SlimFC
  from ray.rllib.models.torch.torch_modelv2 import TorchModelV2
  from ray.rllib.utils.framework import try_import_tf, try_import_torch
label_desc: Use image node_id 1 to create a new ContActionQModel object from inherited base classes: TFModelV2 with example: obj = ContActionQModel(obs_space, action_space, num_outputs, model_config, name)