#ifndef STOCHASTIC_NODE_H_
#define STOCHASTIC_NODE_H_

#include <graph/Node.h>
#include <sarray/SArray.h>

#include <vector>

class Distribution;

class StochasticNode : public Node {
    Distribution const * const _dist;
    std::vector<SArray const *> _parameters;

    /* Forbid copying of Stochastic Nodes */
    StochasticNode(StochasticNode const &orig);
    StochasticNode &operator=(StochasticNode const &rhs);
 public:

    StochasticNode(Distribution const *dist, Index const &dim = Index(1));
    ~StochasticNode();

    bool isBounded() const;
    SArray const *lowerBound();
    SArray const *upperBound();
    void setBounds(Node *lBound, Node *uBound);
    Distribution const *distribution() const;
    void setParameters(std::vector<Node*> const &parameters);
    std::vector<SArray const *> const &parameters() const;
    double logDensity() const;

    void forwardSample();
    bool isStochastic() const;
};

StochasticNode const *asStochastic(Node const *node);

#endif /* STOCHASTIC_NODE_H_ */


syntax highlighted by Code2HTML, v. 0.9.1