From f3b80658d37c46cee6a726e3ed97fcb269256adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien.villemot@ens.fr> Date: Tue, 23 Feb 2010 16:45:56 +0100 Subject: [PATCH] Preprocessor: * in DataTree, new functions for testing if some opcode (unary, binary or trinary) is used somewhere in the tree * removed DataTree::containsSteadyState(), rather use a call to the new utility function (cherry picked from commit eba049899e23453d353027b80a2e3b22f2f8be16) --- preprocessor/DataTree.cc | 26 ++++++++++++++++++++++++-- preprocessor/DataTree.hh | 9 ++++++--- preprocessor/DynamicModel.cc | 2 +- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/preprocessor/DataTree.cc b/preprocessor/DataTree.cc index 712d4e90b6..9612fd9035 100644 --- a/preprocessor/DataTree.cc +++ b/preprocessor/DataTree.cc @@ -484,11 +484,33 @@ DataTree::getDynJacobianCol(int deriv_id) const throw (UnknownDerivIDException) } bool -DataTree::containsSteadyStateOperator() const +DataTree::isUnaryOpUsed(UnaryOpcode opcode) const { for (unary_op_node_map_type::const_iterator it = unary_op_node_map.begin(); it != unary_op_node_map.end(); it++) - if (it->first.second == oSteadyState) + if (it->first.second == opcode) + return true; + + return false; +} + +bool +DataTree::isBinaryOpUsed(BinaryOpcode opcode) const +{ + for (binary_op_node_map_type::const_iterator it = binary_op_node_map.begin(); + it != binary_op_node_map.end(); it++) + if (it->first.second == opcode) + return true; + + return false; +} + +bool +DataTree::isTrinaryOpUsed(TrinaryOpcode opcode) const +{ + for (trinary_op_node_map_type::const_iterator it = trinary_op_node_map.begin(); + it != trinary_op_node_map.end(); it++) + if (it->first.second == opcode) return true; return false; diff --git a/preprocessor/DataTree.hh b/preprocessor/DataTree.hh index 039aae26da..fade2b8bbf 100644 --- a/preprocessor/DataTree.hh +++ b/preprocessor/DataTree.hh @@ -67,9 +67,6 @@ protected: //! Internal implementation of AddVariable(), without the check on the lag VariableNode *AddVariableInternal(int symb_id, int lag); - //! Is there a steady state operator in the tree? - bool containsSteadyStateOperator() const; - private: typedef list<NodeID> node_list_type; //! The list of nodes @@ -181,6 +178,12 @@ public: NodeID AddUnknownFunction(const string &function_name, const vector<NodeID> &arguments); //! Checks if a given symbol is used somewhere in the data tree bool isSymbolUsed(int symb_id) const; + //! Checks if a given unary op is used somewhere in the data tree + bool isUnaryOpUsed(UnaryOpcode opcode) const; + //! Checks if a given binary op is used somewhere in the data tree + bool isBinaryOpUsed(BinaryOpcode opcode) const; + //! Checks if a given trinary op is used somewhere in the data tree + bool isTrinaryOpUsed(TrinaryOpcode opcode) const; //! Thrown when trying to access an unknown variable by deriv_id class UnknownDerivIDException { diff --git a/preprocessor/DynamicModel.cc b/preprocessor/DynamicModel.cc index 1bfb09d63a..f510d0fe9f 100644 --- a/preprocessor/DynamicModel.cc +++ b/preprocessor/DynamicModel.cc @@ -990,7 +990,7 @@ DynamicModel::writeDynamicMFile(const string &dynamic_basename) const << "% Warning : this file is generated automatically by Dynare" << endl << "% from model file (.mod)" << endl << endl; - if (containsSteadyStateOperator()) + if (isUnaryOpUsed(oSteadyState)) mDynamicModelFile << "global oo_;" << endl << endl; writeDynamicModel(mDynamicModelFile, false); -- GitLab