code: def build_program(self):
      self.pred_program = fluid.Program()
      self.learn_program = fluid.Program()
  
      with fluid.program_guard(self.pred_program):
          last_hidden_states = fluid.data(
              name="last_hidden_states",
              shape=[self.n_agents, self.rnn_hidden_dim],
              dtype="float32",
          )
          obs = fluid.data(
              name="obs",
              shape=[self.n_agents, self.obs_shape],
              dtype="float32",
          )
          (
              self.agents_q,
              self.current_hidden_states,
          ) = self.alg.predict_local_q(obs, last_hidden_states)
  
      with fluid.program_guard(self.learn_program):
          init_hidden_states = fluid.data(
              name="init_hidden_states",
              shape=[
                  self.batch_size,
                  self.n_agents,
                  self.rnn_hidden_dim,
              ],
              dtype="float32",
          )
          target_init_hidden_states = fluid.data(
              name="target_init_hidden_states",
              shape=[
                  self.batch_size,
                  self.n_agents,
                  self.rnn_hidden_dim,
              ],
              dtype="float32",
          )
          state_batch = fluid.data(
              name="state_batch",
              shape=[
                  self.batch_size,
                  self.episode_limit,
                  self.state_shape,
              ],
              dtype="float32",
          )
          actions_batch = fluid.data(
              name="actions_batch",
              shape=[
                  self.batch_size,
                  self.episode_limit,
                  self.n_agents,
              ],
              dtype="long",
          )
          reward_batch = fluid.data(
              name="reward_batch",
              shape=[self.batch_size, self.episode_limit, 1],
              dtype="float32",
          )
          terminated_batch = fluid.data(
              name="terminated_batch",
              shape=[self.batch_size, self.episode_limit, 1],
              dtype="float32",
          )
          obs_batch = fluid.data(
              name="obs_batch",
              shape=[
                  self.batch_size,
                  self.episode_limit,
                  self.n_agents,
                  self.obs_shape,
              ],
              dtype="float32",
          )
          available_actions_batch = fluid.data(
              name="available_actions_batch",
              shape=[
                  self.batch_size,
                  self.episode_limit,
                  self.n_agents,
                  self.n_actions,
              ],
              dtype="long",
          )
          filled_batch = fluid.data(
              name="filled_batch",
              shape=[self.batch_size, self.episode_limit, 1],
              dtype="float32",
          )
          (
              self.loss,
              self.mean_td_error,
          ) = self.alg.learn(
              init_hidden_states,
              target_init_hidden_states,
              state_batch,
              actions_batch,
              reward_batch,
              terminated_batch,
              obs_batch,
              available_actions_batch,
              filled_batch,
          )
  
file_path: PARL/benchmark/fluid/QMIX/qmix_agent.py
imports: import parl
  from parl import layers
  import paddle.fluid
  import numpy
  from utils import AvailableActionsSampler
  from parl.utils import machine_info
label_desc: Use image node_id 4 for calling the QMixAgent obj's underlying member method code with example usage: obj.build_program() without return types