#ifndef HORUS_HORUS_H
#define HORUS_HORUS_H

#include <limits>

#include <vector>

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
  TypeName(const TypeName&);               \
  void operator=(const TypeName&)

using namespace std;

class Var;
class Factor;
class VarNode;
class FacNode;

typedef vector<double>      Params;
typedef unsigned            VarId;
typedef vector<VarId>       VarIds;
typedef vector<Var*>        Vars;
typedef vector<VarNode*>    VarNodes;
typedef vector<FacNode*>    FacNodes;
typedef vector<Factor*>     Factors;
typedef vector<string>      States;
typedef vector<unsigned>    Ranges;
typedef unsigned long long  ullong;


enum LiftedSolvers
{
  FOVE, // first order variable elimination
  LBP,  // lifted belief propagation
};


enum GroundSolvers
{
  VE,   // variable elimination
  BP,   // belief propagation
  CBP   // counting belief propagation
};


namespace Globals {

extern bool logDomain;

// level of debug information
extern unsigned verbosity;

extern LiftedSolvers liftedSolver;
extern GroundSolvers groundSolver;

};


namespace Constants {

// show message calculation for belief propagation
const bool SHOW_BP_CALCS = false;

const int NO_EVIDENCE = -1;

// number of digits to show when printing a parameter
const unsigned PRECISION = 6;

};


namespace BpOptions
{
  enum Schedule {
    SEQ_FIXED,
    SEQ_RANDOM,
    PARALLEL,
    MAX_RESIDUAL
  };
  extern Schedule  schedule;
  extern double    accuracy;
  extern unsigned  maxIter;
}

#endif // HORUS_HORUS_H