#ifndef MODEL_H_ #define MODEL_H_ #include #include #include class Sampler; class TraceMonitor; class SamplerFactory; /** * @short Graphical model * * The purpose of the model class is to collect together all the * elements necessary to run a MCMC sampler on a graphical model. */ class Model { Graph _graph; long _iteration; std::vector _nodes; std::set _extra_nodes; std::vector _sampled_extra; std::vector _samplers; std::set _monitored_nodes; std::list _monitors; bool _initialized; bool _cansample; public: Model(); virtual ~Model(); Graph &graph(); /** * Checks that the graph is closed and acyclic. A runtime_error * is thrown if it is not */ void checkGraph(); /** * Returns true if the graph has been checked */ bool isGraphChecked(); /** * Initializes the model. Nodes that have not had their values set * are initialized by a call to the Node::initialize function (which * typically will do forward sampling). */ void initialize(); /** Returns true if the model has been initialized */ bool isInitialized(); /** Selects samplers for each stochastic node in the graph * * @param samplers Vector of Sampler factories. Each factory is * tried in turn. If there are any informative stochastic nodes left * without samplers after all factories have been tried, then a * runtime error is thrown */ void chooseSamplers(std::vector const &samplers); /** * Updates the model by niter iterations. A logic_error is thrown if * the model is uninitialized. * * @param niter Number of iterations to run */ void update(long niter); /** * Returns the current iteration number */ long iteration() const; /** * Creates a monitor for the given node, with given thinning interval * If the node is already being monitored, a NodeError is thrown. * A side effect is to turn off burnin mode for all samplers in the model. */ TraceMonitor const * setMonitor(Node *node, int thin); /** * Clears the monitor associated with the given node. If there is * no such monitor, then the function has no effect. */ void clearMonitor(Node const *node); /** * Returns the list of monitors */ std::list const &monitors() const; /** * After the model is initialized, extra uninformative nodes may be * added to the graph (For example, you may wish to add a node that * calculates the deviance of the model). The model takes * responsibility for the extra node. * * The extra node cannot be observed, it must not already be in the * model graph, it may not have any children, and all of its parents * must be in the graph. */ void addExtraNode(Node *node); }; #endif /* MODEL_H_ */