diff --git a/parser.src/DataTree.cc b/parser.src/DataTree.cc index 9bb13d04d22c91e4c34781a38d33227642498b6b..67ae18ec88a42268f5fb7898a7b4212223c81ee3 100644 --- a/parser.src/DataTree.cc +++ b/parser.src/DataTree.cc @@ -17,9 +17,9 @@ using namespace std; #include "NumericalConstants.hh" #include "DataTree.hh" -DataTree::DataTree(SymbolTable &symbol_table_arg, VariableTable &variable_table_arg) : +DataTree::DataTree(SymbolTable &symbol_table_arg, ModelParameters &mod_param_arg) : symbol_table(symbol_table_arg), - variable_table(variable_table_arg), + variable_table(symbol_table_arg, mod_param_arg), NoOpCode(-1), NullID(NULL) { offset = 1; diff --git a/parser.src/ModFile.cc b/parser.src/ModFile.cc index 7999f4c30ea7371f7efd380fdc193beb0aecd9c6..a4e647ec86253d249fca9f1064c23b49ed239609 100644 --- a/parser.src/ModFile.cc +++ b/parser.src/ModFile.cc @@ -2,8 +2,7 @@ #include "Interface.hh" ModFile::ModFile() : symbol_table(model_parameters), - variable_table(symbol_table, model_parameters), - model_tree(symbol_table, variable_table, model_parameters, num_constants), + model_tree(symbol_table, model_parameters, num_constants), order(-1), linear(-1) { } diff --git a/parser.src/ModelTree.cc b/parser.src/ModelTree.cc index f172e69d42e8286c068d9772ad3765ca23098c09..e5fef875315b6302b08f5885e6c47bd32af4492e 100644 --- a/parser.src/ModelTree.cc +++ b/parser.src/ModelTree.cc @@ -34,9 +34,10 @@ inline NodeID MetaToken::getDerivativeAddress(int iVarID, const ModelTree &model return iter->second; } -ModelTree::ModelTree(SymbolTable &symbol_table_arg, VariableTable &variable_table_arg, - ModelParameters &mod_param_arg, const NumericalConstants &num_constants_arg) : - DataTree(symbol_table_arg, variable_table_arg), +ModelTree::ModelTree(SymbolTable &symbol_table_arg, + ModelParameters &mod_param_arg, + const NumericalConstants &num_constants_arg) : + DataTree(symbol_table_arg, mod_param_arg), mod_param(mod_param_arg), num_constants(num_constants_arg), computeHessian(false), diff --git a/parser.src/ParsingDriver.cc b/parser.src/ParsingDriver.cc index 5d31156aa3d34f36a3e07c86f68888992d6c705e..5d91290f982ebb9cf5ef7fd50322a223af6754ae 100644 --- a/parser.src/ParsingDriver.cc +++ b/parser.src/ParsingDriver.cc @@ -44,7 +44,6 @@ ParsingDriver::parse(const string &f) mod_file->model_tree.error = error; mod_file->symbol_table.error = error; - mod_file->variable_table.error = error; expression.setNumericalConstants(&mod_file->num_constants); tmp_symbol_table = new TmpSymbolTable(mod_file->symbol_table); @@ -128,13 +127,6 @@ NodeID ParsingDriver::add_model_variable(string *name) { check_symbol_existence(*name); - Type type = mod_file->symbol_table.getType(*name); - - if ((type == eEndogenous) - || (type == eExogenous) - || (type == eExogenousDet)) - mod_file->variable_table.AddVariable(*name, 0); - NodeID id = mod_file->model_tree.AddTerminal(*name); delete name; return id; @@ -153,10 +145,6 @@ ParsingDriver::add_model_variable(string *name, string *olag) << *name << " has lag " << lag << endl; } - - if ((type == eEndogenous) || (type == eExogenous)) - mod_file->variable_table.AddVariable(*name, lag); - NodeID id = mod_file->model_tree.AddTerminal(*name, lag); delete name; delete olag; diff --git a/parser.src/VariableTable.cc b/parser.src/VariableTable.cc index 354cae099eb2b44d7f0484943019aab79fef6fa2..49e00bddb69d247a9782ea2c7fba526436a48fd2 100644 --- a/parser.src/VariableTable.cc +++ b/parser.src/VariableTable.cc @@ -1,14 +1,6 @@ -/*! \file - \version 1.0 - \date 04/09/2004 - \par This file implements the VariableTable class methodes. -*/ -//------------------------------------------------------------------------------ #include <iostream> -#include <vector> #include <algorithm> -using namespace std; -//------------------------------------------------------------------------------ + #include "VariableTable.hh" VariableTable::VariableTable(const SymbolTable &symbol_table_arg, @@ -16,45 +8,30 @@ VariableTable::VariableTable(const SymbolTable &symbol_table_arg, symbol_table(symbol_table_arg), mod_param(mod_param_arg) { - // Empty -} - -//------------------------------------------------------------------------------ -VariableTable::~VariableTable() -{ - // Empty } -//------------------------------------------------------------------------------ -int VariableTable::AddVariable(string iName, int iLag) +int +VariableTable::AddVariable(const string &iName, int iLag) { - int lVariableID; - //Variable lVariable; - varKey key; // Testing if symbol exists if (!symbol_table.Exist(iName)) { - string msg = "unknown symbol: " + iName; - (* error) (msg.c_str()); + cerr << "Unknown symbol: " << iName << endl; exit(-1); } - // Testing if variable exists in VaiableTable - lVariableID = getID(iName,iLag); + // Testing if variable exists in VariableTable + int lVariableID = getID(iName,iLag); if (lVariableID != -1) - { - return lVariableID; - } + return lVariableID; + lVariableID = mVariableIndex.size(); // Making variable struct and key - //lVariable.type = SymbolTable::getType(iName); - //lVariable.symbol_id = SymbolTable::getID(iName); - //lVariable.variable_id = lVariableID; - key = make_pair(iName,iLag); + varKey key = make_pair(iName, iLag); // Pushing variable on VariableTable - //mVariableTable[key] = lVariable; mVariableTable[key] = lVariableID; mVariableIndex.push_back(key); - // Setting variable numbers + + // Setting dynamic variables numbers Type type = getType(lVariableID); if (type == eEndogenous) mod_param.var_endo_nbr++; @@ -62,7 +39,8 @@ int VariableTable::AddVariable(string iName, int iLag) mod_param.var_exo_nbr++; if (type == eExogenousDet) mod_param.var_exo_det_nbr++; - // Setting Maximum and minimum lags + + // Setting maximum and minimum lags if (mod_param.max_lead < iLag) mod_param.max_lead = iLag; else if (-mod_param.max_lag > iLag) @@ -97,123 +75,56 @@ int VariableTable::AddVariable(string iName, int iLag) default: ; } - - return mVariableIndex.size()-1; + return lVariableID; } -//------------------------------------------------------------------------------ -void VariableTable::decSymbolID(string iName, int id, int iLag, Type iType) +void +VariableTable::Sort() { - int lVariableID; - Variable lVariable; - varKey key; - - // Testing if variable exists in VaiableTable - lVariableID = getID(iName,iLag); - if (lVariableID == -1) - { - return; - } - // Making variable struct and key to update - lVariable.type = iType; - lVariable.symbol_id = id-1; - lVariable.variable_id = lVariableID; - // Updating VariableTable with new variable - key = make_pair(iName,iLag); - mVariableTable[key] = lVariableID; - -} - -//------------------------------------------------------------------------------ -void VariableTable::Sort() -{ - varKey key; - int variable; - // To store variable lags - vector<pair<unsigned long long int,int> > VarToSort; - vector<int> IDs; - vector<int> Lags; - vector<Type> Types; - + // Trivial case where no ordering is necessary if (mVariableIndex.size() == 1) { mSortedVariableID.push_back(0); mPrintFormatIndex.push_back(0); return; } - // First putting types into TypesToSort - for (unsigned int id=0; id < mVariableIndex.size(); id++) - { - key = mVariableIndex[id]; - variable = mVariableTable[key]; - //IDs.push_back(variable.symbol_id); - //Types.push_back(variable.type); - IDs.push_back(getSymbolID(variable)); - Types.push_back(getType(variable)); - Lags.push_back(key.second); - unsigned long long int lag = Lags[id]+mod_param.max_lag; - lag = lag << (4*sizeof(int)); - unsigned long long int type = Types[id]; - type = type << 8*sizeof(int); - unsigned long long int sort_pound = IDs[id]+lag+type; - VarToSort.push_back(make_pair(sort_pound,id)); - } - // Uncomment this to debug - /* - cout << "Before sorting\n"; - cout << "S T L ID pound \n"; - for (int id=0; id < VarToSort.size(); id++) + + /* The type of key for lexicographic ordering over variables: + the key is equal to (type, lag, symbol_id) */ + typedef pair<Type, pair<int, int> > lexicographic_key_type; + + // Construct the vector matching keys to their varIDs + vector<pair<lexicographic_key_type, int> > VarToSort; + for (unsigned int varID = 0; varID < mVariableIndex.size(); varID++) { - Type type = Types[VarToSort[id].second]; - int lag = Lags[VarToSort[id].second]; - int ID = IDs[VarToSort[id].second]; - cout << SymbolTable::getNameByID(type, ID) << " " - << type << " " - << lag << " " - << ID << " " - << VarToSort[id].first << "\n"; + Type type = getType(varID); + int symbolID = getSymbolID(varID); + int lag = mVariableIndex[varID].second; + VarToSort.push_back(make_pair(make_pair(type, make_pair(lag, symbolID)), varID)); } - */ - // Sorting variables + + // Sort variables using the lexicographic ordering sort(VarToSort.begin(), VarToSort.end()); - // Puting "sorted Ids" into mSortedVariableID + + // Fill mSortedVariableID and mPrintFormatIndex mSortedVariableID.resize(VarToSort.size()); mPrintFormatIndex.resize(VarToSort.size()); - Type type = Types[VarToSort[0].second]; + Type type = getType(VarToSort[0].second); int index = 0; - for (unsigned int id = 0; id < VarToSort.size(); id++) + for (unsigned int sortedID = 0; sortedID < VarToSort.size(); sortedID++) { - int id2 = VarToSort[id].second; - mSortedVariableID[id2] = id; - if (type == Types[id2]) + int varID = VarToSort[sortedID].second; + mSortedVariableID[varID] = sortedID; + if (type == getType(varID)) { - mPrintFormatIndex[id2] = index; + mPrintFormatIndex[varID] = index; index++; } else { - mPrintFormatIndex[id2] = 0; - type = Types[id2]; + mPrintFormatIndex[varID] = 0; + type = getType(varID); index = 1; } } - // Uncomment this to debug - /* - cout << "After sorting\n"; - cout << "S T L ID SVID PIDX\n"; - for (int id=0; id < VarToSort.size(); id++) - { - Type type = Types[VarToSort[id].second]; - int lag = Lags[VarToSort[id].second]; - int ID = IDs[VarToSort[id].second]; - cout << SymbolTable::getNameByID(Types[id], IDs[id]) << " " - << Types[id] << " " - << Lags[id] << " " - << IDs[id] << " " - << mSortedVariableID[id] << " " - << mPrintFormatIndex[id] << "\n"; - } - */ } - -//------------------------------------------------------------------------------ diff --git a/parser.src/include/DataTree.hh b/parser.src/include/DataTree.hh index f32fd455f533e631bb8769d396a6bed9bc138530..3f152fd22cfba56337187d99f91d66b9a67fe2e0 100644 --- a/parser.src/include/DataTree.hh +++ b/parser.src/include/DataTree.hh @@ -34,8 +34,8 @@ class DataTree protected : //! A reference to the symbol table SymbolTable &symbol_table; - //! A reference to the variable table - VariableTable &variable_table; + //! The variable table + VariableTable variable_table; /*! A list of structures "token" */ TreeList mModelTree; @@ -123,7 +123,7 @@ public : inline NodeID AddAssign(NodeID iArg1, NodeID iArg2); public : /*! Constructor */ - DataTree(SymbolTable &symbol_table_arg, VariableTable &variable_table_arg); + DataTree(SymbolTable &symbol_table_arg, ModelParameters &mod_param_arg); /*! Destructor */ ~DataTree(); }; @@ -232,15 +232,7 @@ inline NodeID DataTree::AddTerminal(std::string iArgName, int iLag) type == eExogenousDet || type == eExogenous || type == eRecursiveVariable) - { - id = variable_table.getID(iArgName,iLag); - if (id == -1) - { - std::string msg = "unknown variable " + iArgName; - (* error) (msg.c_str()); - exit(-1); - } - } + id = variable_table.AddVariable(iArgName,iLag); else id = symbol_table.getID(iArgName); diff --git a/parser.src/include/ModFile.hh b/parser.src/include/ModFile.hh index 20c255a58f81fc43a4a2fde964b3d1020321045f..bacbe630ba8ebf019567d115198194c896fb018b 100644 --- a/parser.src/include/ModFile.hh +++ b/parser.src/include/ModFile.hh @@ -22,8 +22,6 @@ public: ModelParameters model_parameters; //! Symbol table SymbolTable symbol_table; - //! Variable table - VariableTable variable_table; //! Numerical constants table NumericalConstants num_constants; //! Model equations and their derivatives diff --git a/parser.src/include/ModelTree.hh b/parser.src/include/ModelTree.hh index 16645ab9d2e76bb3ce5e2031c02ecce349f857ce..f2ac788e22f48fddcbddc96810a790d7e83638c0 100644 --- a/parser.src/include/ModelTree.hh +++ b/parser.src/include/ModelTree.hh @@ -89,7 +89,7 @@ private : public: //! Constructor - ModelTree(SymbolTable &symbol_table_arg, VariableTable &variable_table_arg, ModelParameters &mod_param_arg, const NumericalConstants &num_constants); + ModelTree(SymbolTable &symbol_table_arg, ModelParameters &mod_param_arg, const NumericalConstants &num_constants); //! Destructor ~ModelTree(); //! When Jacobian (vs endogenous) is written this flag is set to true diff --git a/parser.src/include/VariableTable.hh b/parser.src/include/VariableTable.hh index b2294d49151cbb9387f9816005817e7e3ad7b051..10cba2f2dce49f5a0d3e7a1c4dd172cefa752c47 100644 --- a/parser.src/include/VariableTable.hh +++ b/parser.src/include/VariableTable.hh @@ -1,134 +1,106 @@ #ifndef _VARIABLETABLE_HH #define _VARIABLETABLE_HH -//------------------------------------------------------------------------------ -/** \file - * \version 1.0 - * \date 12/16/2003 - * \par This file defines the VariableTable class . - */ -//------------------------------------------------------------------------------ + +using namespace std; + #include <map> #include <string> #include <vector> -//------------------------------------------------------------------------------ + #include "SymbolTable.hh" -//------------------------------------------------------------------------------ -/*! - \class Variable - \brief Variable struct -*/ -struct Variable -{ - /*! Variable type */ - Type type; - /*! Symbol ID */ - int symbol_id; - /*! Variable ID */ - int variable_id; -}; -/*! Variable key type to acced variable table elements */ -typedef std::pair<std::string, int> varKey; -//------------------------------------------------------------------------------ -/*! - \class VariableTable - \brief This class is used to store variables as they appear - in the model (with their lead or lag) -*/ + +//! This class is used to store variables as they appear in the model (with their lead or lag) +/*! \todo Raise exceptions when requesting ordered IDs before calling to Sort() */ class VariableTable { -private : +private: //! A reference to the symbol table const SymbolTable &symbol_table; //! A reference to model parameters ModelParameters &mod_param; - /*! Variable table data */ - std::map<varKey,int> mVariableTable; - /*! Index (IDs) of variables in variable table */ - std::vector<varKey> mVariableIndex; - /*! Variable IDs of sorted variable table */ - std::vector<int> mSortedVariableID; - /*! Output index for variable table */ - std::vector<int> mPrintFormatIndex; -public : - /*! */ - VariableTable(const SymbolTable &symbol_table_arg, ModelParameters &mod_param_arg); - /*! */ - ~VariableTable(); - /*! Find type and ID in SymbolTable - - Increment variable_id; - - Make variable - - Push variable on variabletable + //! Variable key type to acced variable table elements + typedef pair<string, int> varKey; + //! Maps a pair (symbol, lag) to an ID + map<varKey, int> mVariableTable; + //! Maps an ID to a pair (symbol, lag) + /*! It is the reverse map of mVariableTable */ + vector<varKey> mVariableIndex; + //! Variable IDs of sorted variable table + vector<int> mSortedVariableID; + //! For each variable, gives its index number among variables of the same type + /*! It is the index used in the output file: + - in the lead/lag matrix + - in the right hand side of equations (such as y(index)) */ - int AddVariable(std::string iName, int iLag); - /*! Pointer to error function of parser class */ - void (* error) (const char* m); - /*! Decremente a symbol id of a variable */ - void decSymbolID(std::string iName, int id, int iLag, Type iType); - /*! Return VariableTable[name,lag].variable_id */ - inline int getID(std::string iName, int iLag); - /*! Return lag of variable */ - inline int getLag(int iID); - /*! Return symbol ID of variable */ - inline int getSymbolID(int ivarID); - /*! Gets varibale type */ - inline Type getType(int ivarID); - /*! Gets nomber of variables in mVariableTable */ - inline int size(); - /*! Gets variable ID of sorted variable table */ - inline int getSortID(int); - /*! Return variable index to print in format : y(index) or oo_.y_simul(index) ... */ - inline int getPrintIndex(int iVarID); - /*! Sorts variable table */ + vector<int> mPrintFormatIndex; +public: + VariableTable(const SymbolTable &symbol_table_arg, ModelParameters &mod_param_arg); + //! Adds a variable in the table, and returns its (newly allocated) varID + /*! Also works if the variable already exists */ + int AddVariable(const string &iName, int iLag); + //! Return variable ID + inline int getID(const string &iName, int iLag) const; + //! Return lag of variable + inline int getLag(int ivarID) const; + //! Return symbol ID of variable + inline int getSymbolID(int ivarID) const; + //! Get variable type + inline Type getType(int ivarID) const; + //! Get number of variables in mVariableTable + inline int size() const; + //! Get variable ID of sorted variable table + inline int getSortID(int iVarID) const; + //! Return variable index to print in format : y(index) or oo_.y_simul(index) ... + inline int getPrintIndex(int iVarID) const; + //! Sorts variable table + /*! The order used is a lexicographic order over the tuple (type, lag, symbolID) */ void Sort(); }; -inline int VariableTable::getSortID(int iVarID) + +inline int +VariableTable::getSortID(int iVarID) const { return mSortedVariableID[iVarID]; } -//------------------------------------------------------------------------------ -inline int VariableTable::getPrintIndex(int iVarID) +inline int +VariableTable::getPrintIndex(int iVarID) const { return mPrintFormatIndex[iVarID]; } -//------------------------------------------------------------------------------ -inline int VariableTable::getID(std::string iName, int iLag) +inline int +VariableTable::getID(const string &iName, int iLag) const { - if (mVariableTable.find(make_pair(iName, iLag)) == mVariableTable.end()) - { - return -1; - } + map<varKey, int>::const_iterator it = mVariableTable.find(make_pair(iName, iLag)); + if (it == mVariableTable.end()) + return -1; else - { - return mVariableTable[make_pair(iName, iLag)]; - } + return it->second; } -//------------------------------------------------------------------------------ -inline Type VariableTable::getType(int ivarID) +inline Type +VariableTable::getType(int ivarID) const { varKey key = mVariableIndex[ivarID]; - //return mVariableTable[key].type; return symbol_table.getType(key.first); } -//------------------------------------------------------------------------------ -inline int VariableTable::getSymbolID(int ivarID) +inline int +VariableTable::getSymbolID(int ivarID) const { varKey key = mVariableIndex[ivarID]; - //return mVariableTable[key].symbol_id; return symbol_table.getID(key.first); } -//------------------------------------------------------------------------------ -inline int VariableTable::getLag(int iID) +inline int +VariableTable::getLag(int ivarID) const { - return mVariableIndex[iID].second; + return mVariableIndex[ivarID].second; } -//------------------------------------------------------------------------------ -inline int VariableTable::size() +inline int +VariableTable::size() const { return mVariableTable.size(); }