class_docstr: input: n agents' agent_qs (a scalar for each agent)
  output: a scalar (Q)
docstr: Args:
      agent_qs (paddle.Tensor): (batch_size, T, n_agents)
      states (paddle.Tensor):   (batch_size, T, state_shape)
  Returns:
      q_total (paddle.Tensor):  (batch_size, T, 1)
docstr_tok: ["Args",":","agent_qs","(","paddle.Tensor",")",":","(","batch_size",",","T",",","n_agents",")","states","(","paddle.Tensor",")",":","(","batch_size",",","T",",","state_shape",")","Returns",":","q_total","(","paddle.Tensor",")",":","(","batch_size",",","T",",","1",")"]
code: def forward(self, agent_qs, states):
      """
      Args:
          agent_qs (paddle.Tensor): (batch_size, T, n_agents)
          states (paddle.Tensor):   (batch_size, T, state_shape)
      Returns:
          q_total (paddle.Tensor):  (batch_size, T, 1)
      """
      batch_size = agent_qs.shape[0]
      states = states.reshape(shape=(-1, self.state_shape))
      agent_qs = agent_qs.reshape(shape=(-1, 1, self.n_agents))
  
      w1 = paddle.abs(self.hyper_w_1(states))
      w1 = w1.reshape(shape=(-1, self.n_agents, self.embed_dim))
      b1 = self.hyper_b_1(states)
      b1 = b1.reshape(shape=(-1, 1, self.embed_dim))
  
      w2 = paddle.abs(self.hyper_w_2(states))
      w2 = w2.reshape(shape=(-1, self.embed_dim, 1))
      b2 = self.hyper_b_2(states).reshape(shape=(-1, 1, 1))
  
      hidden = F.elu(paddle.bmm(agent_qs, w1) + b1)
      y = paddle.bmm(hidden, w2) + b2
      q_total = y.reshape(shape=(batch_size, -1, 1))
      return q_total
  
file_path: PARL/examples/QMIX/qmixer_model.py
imports: import paddle
  import paddle.nn
  import paddle.nn.functional
  import parl
label_desc: Use image node_id 2 for calling the QMixerModel obj's underlying member method code with example usage: obj.forward(agent_qs, states) and returns: q_total