class_docstr: input: n_agents' agent_qs (a scalar for each agent)
  output: a scalar (Q)
code: def __init__(
      self,
      n_agents,
      state_shape,
      mixing_embed_dim=32,
      hypernet_layers=2,
      hypernet_embed_dim=64,
  ):
      super(QMixerModel, self).__init__()
  
      self.n_agents = n_agents
      self.state_shape = state_shape
      self.embed_dim = mixing_embed_dim
      if hypernet_layers == 1:
          self.hyper_w_1 = nn.Linear(
              self.state_shape, self.embed_dim * self.n_agents
          )
          self.hyper_w_2 = nn.Linear(self.state_shape, self.embed_dim)
      elif hypernet_layers == 2:
          self.hyper_w_1 = nn.Sequential(
              nn.Linear(self.state_shape, hypernet_embed_dim),
              nn.ReLU(),
              nn.Linear(
                  hypernet_embed_dim, self.embed_dim * self.n_agents
              ),
          )
          self.hyper_w_2 = nn.Sequential(
              nn.Linear(self.state_shape, hypernet_embed_dim),
              nn.ReLU(),
              nn.Linear(hypernet_embed_dim, self.embed_dim),
          )
      else:
          raise ValueError('hypernet_layers should be "1" or "2"!')
  
      self.hyper_b_1 = nn.Linear(self.state_shape, self.embed_dim)
      self.hyper_b_2 = nn.Sequential(
          nn.Linear(self.state_shape, self.embed_dim),
          nn.ReLU(),
          nn.Linear(self.embed_dim, 1),
      )
  
file_path: PARL/benchmark/torch/qmix/qmixer_model.py
imports: import torch
  import torch.nn
  import torch.nn.functional
  import parl
label_desc: Use image node_id 1 to create a new QMixerModel object from inherited base classes: parl with example: obj = QMixerModel(n_agents, state_shape, mixing_embed_dim, hypernet_layers, hypernet_embed_dim)