class_docstr: | `alias`: ``parl.Agent``
  | `alias`: ``parl.core.fluid.agent.Agent``
  
  | Agent is one of the three basic classes of PARL.
  
  | It is responsible for interacting with the environment and collecting data for training the policy.
  | To implement a customized ``Agent``, users can:
  
    .. code-block:: python
  
      import parl
  
      class MyAgent(parl.Agent):
          def __init__(self, algorithm, act_dim):
              super(MyAgent, self).__init__(algorithm)
              self.act_dim = act_dim
    This class will initialize the neural network parameters automatically, and provides an executor for users to run the programs (self.fluid_executor).
  
  Attributes:
      fluid_executor (fluid.Executor): executor for running programs of the agent.
      alg (parl.algorithm): algorithm of this agent.
  
  Public Functions:
      - ``build_program`` (**abstract function**): build various programs for the agent to interact with outer environment.
      - ``get_weights``: return a Python dictionary containing all the parameters of self.alg.
      - ``set_weights``: copy parameters from ``set_weights()`` to this agent.
      - ``sample``: return a noisy action to perform exploration according to the policy.
      - ``predict``: return an action given current observation.
      - ``learn``: update the parameters of self.alg using the `learn_program` defined in `build_program()`.
      - ``save``: save parameters of the ``agent`` to a given path.
      - ``restore``: restore previous saved parameters from a given path.
  
  Todo:
      - allow users to get parameters of a specified model by specifying the model's name in ``get_weights()``.
class_docstr_tok: ["|","`","alias","`",":","``","parl.Agent","``","|","`","alias","`",":","``","parl.core.fluid.agent.Agent","``","|","Agent","is","one","of","the","three","basic","classes","of","PARL",".","|","It","is","responsible","for","interacting","with","the","environment","and","collecting","data","for","training","the","policy",".","|","To","implement","a","customized","``","Agent","``",",","users","can",":","..","code-block",":",":","python","import","parl","class","MyAgent","(","parl.Agent",")",":","def","__init__","(","self",",","algorithm",",","act_dim",")",":","super","(","MyAgent",",","self",")",".__init__","(","algorithm",")","self.act_dim","=","act_dim","This","class","will","initialize","the","neural","network","parameters","automatically",",","and","provides","an","executor","for","users","to","run","the","programs","(","self.fluid_executor",")",".","Attributes",":","fluid_executor","(","fluid.Executor",")",":","executor","for","running","programs","of","the","agent",".","alg","(","parl.algorithm",")",":","algorithm","of","this","agent",".","Public","Functions",":","-","``","build_program","``","(","*","*","abstract","function","*","*",")",":","build","various","programs","for","the","agent","to","interact","with","outer","environment",".","-","``","get_weights","``",":","return","a","Python","dictionary","containing","all","the","parameters","of","self.alg",".","-","``","set_weights","``",":","copy","parameters","from","``","set_weights","(",")","``","to","this","agent",".","-","``","sample","``",":","return","a","noisy","action","to","perform","exploration","according","to","the","policy",".","-","``","predict","``",":","return","an","action","given","current","observation",".","-","``","learn","``",":","update","the","parameters","of","self.alg","using","the","`","learn_program","`","defined","in","`","build_program","(",")","`",".","-","``","save","``",":","save","parameters","of","the","``","agent","``","to","a","given","path",".","-","``","restore","``",":","restore","previous","saved","parameters","from","a","given","path",".","Todo",":","-","allow","users","to","get","parameters","of","a","specified","model","by","specifying","the","model","'s","name","in","``","get_weights","(",")","``","."]
docstr: Build various programs here with the
  learn, predict, sample functions of the algorithm.
  
  Note:
      | Users **must** implement this function in an ``Agent``.
      | This function will be called automatically in the initialization function.
  
  To build a program, you must do the following:
      a. Create a fluid program with ``fluid.program_guard()``;
      b. Define data layers for feeding the data;
      c. Build various programs(e.g., learn_program, predict_program) with data layers defined in step b.
  
  Example:
  
  .. code-block:: python
  
      self.pred_program = fluid.Program()
  
      with fluid.program_guard(self.pred_program):
          obs = layers.data(
              name='obs', shape=[self.obs_dim], dtype='float32')
          self.act_prob = self.alg.predict(obs)
docstr_tok: ["Build","various","programs","here","with","the","learn",",","predict",",","sample","functions","of","the","algorithm",".","Note",":","|","Users","*","*","must","*","*","implement","this","function","in","an","``","Agent","``",".","|","This","function","will","be","called","automatically","in","the","initialization","function",".","To","build","a","program",",","you","must","do","the","following",":","a",".","Create","a","fluid","program","with","``","fluid.program_guard","(",")","``",";","b",".","Define","data","layers","for","feeding","the","data",";","c.","Build","various","programs","(","e.g.",",","learn_program",",","predict_program",")","with","data","layers","defined","in","step","b",".","Example",":","..","code-block",":",":","python","self.pred_program","=","fluid.Program","(",")","with","fluid.program_guard","(","self.pred_program",")",":","obs","=","layers.data","(","name='obs","'",",","shape=","[","self.obs_dim","]",",","dtype='float32","'",")","self.act_prob","=","self.alg.predict","(","obs",")"]
code: def build_program(self):
      """Build various programs here with the
      learn, predict, sample functions of the algorithm.
  
      Note:
          | Users **must** implement this function in an ``Agent``.
          | This function will be called automatically in the initialization function.
  
      To build a program, you must do the following:
          a. Create a fluid program with ``fluid.program_guard()``;
          b. Define data layers for feeding the data;
          c. Build various programs(e.g., learn_program, predict_program) with data layers defined in step b.
  
      Example:
  
      .. code-block:: python
  
          self.pred_program = fluid.Program()
  
          with fluid.program_guard(self.pred_program):
              obs = layers.data(
                  name='obs', shape=[self.obs_dim], dtype='float32')
              self.act_prob = self.alg.predict(obs)
  
  
      """
      raise NotImplementedError
  
file_path: PARL/parl/core/fluid/agent.py
imports: import warnings
  import os
  import paddle
  import paddle.fluid
  from parl.core.fluid import layers
  from parl.core.agent_base import AgentBase
  from parl.core.fluid.algorithm import Algorithm
  from parl.utils import machine_info
  from parl.utils import logger
label_desc: Use image node_id 2 for calling the Agent obj's underlying member method code with example usage: obj.build_program() without return types