#ifndef HORUS_BAYESNODE_H
#define HORUS_BAYESNODE_H

#include <vector>

#include "VarNode.h"
#include "Distribution.h"
#include "Horus.h"

using namespace std;


class BayesNode : public VarNode
{
  public:
    BayesNode (const VarNode& v) : VarNode (v) {}
    BayesNode (VarId, unsigned, int, Distribution*);
    BayesNode (VarId, unsigned, int, const BnNodeSet&, Distribution*);

    void                     setParents (const BnNodeSet&);
    void                     addChild (BayesNode*);
    void                     setDistribution (Distribution*);
    Distribution*            getDistribution (void);
    const Params&          getParameters (void);
    Params                 getRow (int) const;
    bool                     isRoot (void);
    bool                     isLeaf (void);
    bool                     hasNeighbors (void) const;
    int                      getCptSize (void);
    int                      getIndexOfParent (const BayesNode*) const;
    string                   cptEntryToString (int, const vector<unsigned>&) const;

    const BnNodeSet& getParents (void) const  { return parents_; }
    const BnNodeSet& getChilds  (void) const  { return childs_;  }

    unsigned getRowSize (void) const
    { 
      return dist_->params.size() / nrStates();
    }

    double getProbability (int row, unsigned col)
    {
      int idx = (row * getRowSize()) + col;
      return dist_->params[idx];
    }

  private:
    DISALLOW_COPY_AND_ASSIGN (BayesNode);

    States                   getDomainHeaders (void) const;
    friend ostream&          operator << (ostream&, const BayesNode&);

    BnNodeSet                parents_;
    BnNodeSet                childs_;
    Distribution*            dist_;
};

ostream& operator << (ostream&, const BayesNode&);

#endif // HORUS_BAYESNODE_H