#ifndef YAP_PACKAGES_CLPBN_HORUS_GROUNDSOLVER_H_
#define YAP_PACKAGES_CLPBN_HORUS_GROUNDSOLVER_H_

#include "FactorGraph.h"
#include "Horus.h"


namespace Horus {

class GroundSolver {
  public:
    GroundSolver (const FactorGraph& factorGraph) : fg(factorGraph) { }

    virtual ~GroundSolver() { } // ensure that subclass destructor is called

    virtual Params solveQuery (VarIds queryVids) = 0;

    virtual void printSolverFlags() const = 0;

    void printAnswer (const VarIds& vids);

    void printAllPosterioris();

    static Params getJointByConditioning (GroundSolverType,
        FactorGraph, const VarIds& jointVarIds);

  protected:
    const FactorGraph& fg;

  private:
    DISALLOW_COPY_AND_ASSIGN (GroundSolver);
};

}  // namespace Horus

#endif  // YAP_PACKAGES_CLPBN_HORUS_GROUNDSOLVER_H_