diff --git a/ExprNode.cc b/ExprNode.cc index c4bf7f9c..47d7bc03 100644 --- a/ExprNode.cc +++ b/ExprNode.cc @@ -21,6 +21,8 @@ #include #include +#include + #include #include @@ -75,6 +77,35 @@ ExprNode::cost(const temporary_terms_type &temporary_terms, bool is_matlab) cons return 0; } +void +ExprNode::collectEndogenous(set > &result) const +{ + set > symb_ids; + collectVariables(eEndogenous, symb_ids); + for(set >::const_iterator it = symb_ids.begin(); + it != symb_ids.end(); it++) + result.insert(make_pair(datatree.symbol_table.getTypeSpecificID(it->first), it->second)); +} + +void +ExprNode::collectExogenous(set > &result) const +{ + set > symb_ids; + collectVariables(eExogenous, symb_ids); + for(set >::const_iterator it = symb_ids.begin(); + it != symb_ids.end(); it++) + result.insert(make_pair(datatree.symbol_table.getTypeSpecificID(it->first), it->second)); +} + +void +ExprNode::collectModelLocalVariables(set &result) const +{ + set > symb_ids; + collectVariables(eModelLocalVariable, symb_ids); + transform(symb_ids.begin(), symb_ids.end(), inserter(result, result.begin()), + __gnu_cxx::select1st >()); +} + void ExprNode::computeTemporaryTerms(map &reference_count, temporary_terms_type &temporary_terms, @@ -160,14 +191,9 @@ NumConstNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_ } void -NumConstNode::collectEndogenous(set > &result) const - { - } - -void -NumConstNode::collectExogenous(set > &result) const - { - } +NumConstNode::collectVariables(SymbolType type_arg, set > &result) const +{ +} pair NumConstNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) const @@ -507,22 +533,13 @@ VariableNode::computeTemporaryTerms(map &reference_count, } void -VariableNode::collectEndogenous(set > &result) const - { - if (type == eEndogenous) - result.insert(make_pair(datatree.symbol_table.getTypeSpecificID(symb_id), lag)); - else if (type == eModelLocalVariable) - datatree.local_variables_table[symb_id]->collectEndogenous(result); - } - -void -VariableNode::collectExogenous(set > &result) const - { - if (type == eExogenous) - result.insert(make_pair(datatree.symbol_table.getTypeSpecificID(symb_id), lag)); - else if (type == eModelLocalVariable) - datatree.local_variables_table[symb_id]->collectExogenous(result); - } +VariableNode::collectVariables(SymbolType type_arg, set > &result) const +{ + if (type == type_arg) + result.insert(make_pair(symb_id, lag)); + if (type == eModelLocalVariable) + datatree.local_variables_table[symb_id]->collectVariables(type_arg, result); +} pair VariableNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) const @@ -993,16 +1010,10 @@ UnaryOpNode::compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_t } void -UnaryOpNode::collectEndogenous(set > &result) const - { - arg->collectEndogenous(result); - } - -void -UnaryOpNode::collectExogenous(set > &result) const - { - arg->collectExogenous(result); - } +UnaryOpNode::collectVariables(SymbolType type_arg, set > &result) const +{ + arg->collectVariables(type_arg, result); +} pair UnaryOpNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) const @@ -1615,18 +1626,11 @@ BinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type, } void -BinaryOpNode::collectEndogenous(set > &result) const - { - arg1->collectEndogenous(result); - arg2->collectEndogenous(result); - } - -void -BinaryOpNode::collectExogenous(set > &result) const - { - arg1->collectExogenous(result); - arg2->collectExogenous(result); - } +BinaryOpNode::collectVariables(SymbolType type_arg, set > &result) const +{ + arg1->collectVariables(type_arg, result); + arg2->collectVariables(type_arg, result); +} pair BinaryOpNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) const @@ -2079,20 +2083,12 @@ TrinaryOpNode::writeOutput(ostream &output, ExprNodeOutputType output_type, } void -TrinaryOpNode::collectEndogenous(set > &result) const - { - arg1->collectEndogenous(result); - arg2->collectEndogenous(result); - arg3->collectEndogenous(result); - } - -void -TrinaryOpNode::collectExogenous(set > &result) const - { - arg1->collectExogenous(result); - arg2->collectExogenous(result); - arg3->collectExogenous(result); - } +TrinaryOpNode::collectVariables(SymbolType type_arg, set > &result) const +{ + arg1->collectVariables(type_arg, result); + arg2->collectVariables(type_arg, result); + arg3->collectVariables(type_arg, result); +} pair TrinaryOpNode::normalizeLinearInEndoEquation(int var_endo, NodeID Derivative) const @@ -2199,20 +2195,12 @@ UnknownFunctionNode::computeTemporaryTerms(map &reference_count, } void -UnknownFunctionNode::collectEndogenous(set > &result) const - { - for (vector::const_iterator it = arguments.begin(); - it != arguments.end(); it++) - (*it)->collectEndogenous(result); - } - -void -UnknownFunctionNode::collectExogenous(set > &result) const - { - for (vector::const_iterator it = arguments.begin(); - it != arguments.end(); it++) - (*it)->collectExogenous(result); - } +UnknownFunctionNode::collectVariables(SymbolType type_arg, set > &result) const +{ + for (vector::const_iterator it = arguments.begin(); + it != arguments.end(); it++) + (*it)->collectVariables(type_arg, result); +} void UnknownFunctionNode::collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const diff --git a/ExprNode.hh b/ExprNode.hh index d9d48854..cb2c751a 100644 --- a/ExprNode.hh +++ b/ExprNode.hh @@ -153,19 +153,37 @@ public: //! Writes output of node (with no temporary terms and with "outside model" output type) void writeOutput(ostream &output); + //! Computes the set of all variables of a given symbol type in the expression + /*! + Variables are stored as integer pairs of the form (symb_id, lag). + They are added to the set given in argument. + Note that model local variables are substituted by their expression in the computation + (and added if type_arg = ModelLocalVariable). + */ + virtual void collectVariables(SymbolType type_arg, set > &result) const = 0; + //! Computes the set of endogenous variables in the expression /*! Endogenous are stored as integer pairs of the form (type_specific_id, lag). They are added to the set given in argument. + Note that model local variables are substituted by their expression in the computation. */ - virtual void collectEndogenous(set > &result) const = 0; + virtual void collectEndogenous(set > &result) const; //! Computes the set of exogenous variables in the expression /*! Exogenous are stored as integer pairs of the form (type_specific_id, lag). They are added to the set given in argument. + Note that model local variables are substituted by their expression in the computation. */ - virtual void collectExogenous(set > &result) const = 0; + virtual void collectExogenous(set > &result) const; + + //! Computes the set of model local variables in the expression + /*! + Symbol IDs of these model local variables are added to the set given in argument. + Note that this method is called recursively on the expressions associated to the model local variables detected. + */ + virtual void collectModelLocalVariables(set &result) const; virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const = 0; virtual void computeTemporaryTerms(map &reference_count, @@ -213,8 +231,7 @@ private: public: NumConstNode(DataTree &datatree_arg, int id_arg); virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms) const; - virtual void collectEndogenous(set > &result) const; - virtual void collectExogenous(set > &result) const; + virtual void collectVariables(SymbolType type_arg, set > &result) const; virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const; virtual double eval(const eval_context_type &eval_context) const throw (EvalException); virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const; @@ -237,8 +254,7 @@ private: public: VariableNode(DataTree &datatree_arg, int symb_id_arg, int lag_arg, int deriv_id_arg); virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_type &temporary_terms) const; - virtual void collectEndogenous(set > &result) const; - virtual void collectExogenous(set > &result) const; + virtual void collectVariables(SymbolType type_arg, set > &result) const; virtual void computeTemporaryTerms(map &reference_count, temporary_terms_type &temporary_terms, map > &first_occurence, @@ -276,8 +292,7 @@ public: Model_Block *ModelBlock, int equation, map_idx_type &map_idx) const; - virtual void collectEndogenous(set > &result) const; - virtual void collectExogenous(set > &result) const; + virtual void collectVariables(SymbolType type_arg, set > &result) const; virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const; static double eval_opcode(UnaryOpcode op_code, double v) throw (EvalException); virtual double eval(const eval_context_type &eval_context) const throw (EvalException); @@ -314,8 +329,7 @@ public: Model_Block *ModelBlock, int equation, map_idx_type &map_idx) const; - virtual void collectEndogenous(set > &result) const; - virtual void collectExogenous(set > &result) const; + virtual void collectVariables(SymbolType type_arg, set > &result) const; virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const; static double eval_opcode(double v1, BinaryOpcode op_code, double v2) throw (EvalException); virtual double eval(const eval_context_type &eval_context) const throw (EvalException); @@ -355,8 +369,7 @@ public: Model_Block *ModelBlock, int equation, map_idx_type &map_idx) const; - virtual void collectEndogenous(set > &result) const; - virtual void collectExogenous(set > &result) const; + virtual void collectVariables(SymbolType type_arg, set > &result) const; virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const; static double eval_opcode(double v1, TrinaryOpcode op_code, double v2, double v3) throw (EvalException); virtual double eval(const eval_context_type &eval_context) const throw (EvalException); @@ -385,8 +398,7 @@ public: Model_Block *ModelBlock, int equation, map_idx_type &map_idx) const; - virtual void collectEndogenous(set > &result) const; - virtual void collectExogenous(set > &result) const; + virtual void collectVariables(SymbolType type_arg, set > &result) const; virtual void collectTemporary_terms(const temporary_terms_type &temporary_terms, Model_Block *ModelBlock, int Curr_Block) const; virtual double eval(const eval_context_type &eval_context) const throw (EvalException); virtual void compile(ostream &CompileCode, bool lhs_rhs, const temporary_terms_type &temporary_terms, map_idx_type &map_idx) const; diff --git a/StaticModel.cc b/StaticModel.cc index cd182a86..def06c0b 100644 --- a/StaticModel.cc +++ b/StaticModel.cc @@ -27,7 +27,6 @@ #ifdef DEBUG # include -using namespace __gnu_cxx; #endif #include @@ -321,7 +320,7 @@ StaticModel::computeNormalization() n1++; pair::const_iterator, multimap::const_iterator> x = natural_endo2eqs.equal_range(i); - if (find_if(x.first, x.second, compose1(bind2nd(equal_to(), endo2eq[i]), select2nd::value_type>())) == x.second) + if (find_if(x.first, x.second, compose1(bind2nd(equal_to(), endo2eq[i]), __gnu_cxx::select2nd::value_type>())) == x.second) cout << "Natural normalization of variable " << symbol_table.getName(symbol_table.getID(eEndogenous, i)) << " not used." << endl; else