// Pure abstract class (interface) defining RL player implementation 
// interface .
//
// Specific implementation is created by code auto-generation process
// for player specification
template <class Observation, class Action>
class PlayerImp {

 public:

  // Observation -> State transform 
  // (to be manually added in generated code)
  virtual void set_state (Observation* currObserv) = 0;
    
  // return action to be taken according to the player policy
  virtual Action choose_action() = 0;

  virtual void get_step_reward (double lastReward) = 0;

  // start new run
  virtual void start_run () = 0;

  // finish current run 
  virtual void finish_run () = 0;

  // provides with statistics received in learning process. 
  virtual void print_stats () = 0;

};

// Pure abstract class defining interface for RL player 
// implementation creation.
// 
// Specific implementation is created by code auto-generation process
// for player specification
//
// THIS INTERFACE COULD BE EXTENDED IN NEW VERSIONS!
template <class Observation, class Action>
class PlayerImpBuilder {

 public:

  // player will use algoritm specified  by <algKind> for learning,
  // but it will make actions according some predefined policy 
  // (not depended on learning process).
  virtual void create_algorithm (AlgorithmKind algKind, double lambdaVal)
    = 0;

  // player will use predefined policy specified by <policyKind>
  virtual void create_policy (char* policyKind) = 0;

  // player will use algoritm specified  by <algKind> for learning and
  // eps-greedy policy
  virtual void create_online_algorithm (AlgorithmKind algKind, 
					double lambdaVal,
					double eps) = 0;
  
  // return created player
  virtual PlayerImp<Observation,Action>* get_player_imp() = 0;
};

