#ifndef SYMTAB_H_
#define SYMTAB_H_
 
#include <graph/NodeNameTab.h>
#include <model/NodeArray.h>
#include <sarray/SArray.h>

#include <string>
#include <vector>
#include <map>

/**
 * @short Symbol table
 *
 * The SymTab class stores the names of variables used in the BUGS
 * language representation of the model.
 *
 * @see NodeArray
 */
class SymTab : public NodeNameTab
{
  std::map<std::string, NodeArray*> _varTable;
  std::map<Node const*, std::string> _names;
public:
  /**
   * Constructs an empty symbol table
   */
  SymTab();
  /**
   * Adds an array variable to the symbol table. This creates a
   * NodeArray object of the given dimension and associates it
   * with the name, so it can be retrieved with a call to getVariable.
   * If no dimension is given, the variable is assumed to be scalar.
   */
  void addVariable(std::string const &name, Index const &dim = Index(1));
  /**
   * Returns a pointer to the  NodeArray associated with the given
   * name, or a NULL pointer if there is no such NodeArray.
   */
  NodeArray *getVariable(std::string const &name) const;
  /**
   * Inserts a node into the symbol table with the given name
   * (which must correspond to a previously added variable)
   * and range (which must be a valid sub-range for the variable).
   */
  void insertNode(Node *node, std::string const &name, Range const &range);
  /**
   * Adds all the nodes contained in all the NodeArray objects
   * in the SymTab to the given vector
   */
  void getNodes(std::vector<Node*> &nodes);
  /**
   * Write values of stochastic nodes from the data table to the nodes
   * in SymTab with the same name.  
   *
   * @param data_table Data table from which results will be read
   *
   * @param observed Logical flag. If true, then existing nodes will
   * have their value fixed after being written, and if there is no
   * node corresponding to a value in the data table, a constant node
   * will be created.
   */
  void writeData(std::map<std::string, SArray> const &data_table,
		 bool observed);
  /**
   * Reads the current value of the  stochastic nodes in the
   * symbol table and writes the result to the data table. 
   *
   * @param data_table Data table to which results will be written.
   *
   * @param observed Logical flag. If true, then the values of the
   * fixed nodes are written to the data table. If false, then the
   * values of the non-fixed nodes are written (excluding deterministic
   * nodes).
   */
  void readData(std::map<std::string, SArray> &data_table, bool observed) const;
  /**
   * Reads the current value of all nodes (stochastic and
   * deterministic) in the symbol table and writes the result to the
   * data table
   *
   * @param data_table Data table to which results will be written
   */
  void readData(std::map<std::string, SArray> &data_table) const;
  /**
   * Returns the number of variables in the symbol table
   */
  unsigned int size() const;
  /**
   * Deletes all the variables in the symbol table
   */
  void clear();
  /**
   * Gets the BUGS language name of the node if it has belongs to
   * any of the NodeArrays in the symbol table. Special rules for nested
   * indexing also allow the names of Mixture Nodes to be calculated.
   * If the node name is not found, an empty string is returned
   */
  std::string getName(Node const *node) const;
};

#endif /* SYMTAB_H_ */


syntax highlighted by Code2HTML, v. 0.9.1