diff --git a/src/DataTree.hh b/src/DataTree.hh index 3a02b7eb121175392358e82ad869030d7d6d42fb..4cdd06fe4d8caef74189945b5e91304ba34a850a 100644 --- a/src/DataTree.hh +++ b/src/DataTree.hh @@ -49,6 +49,8 @@ public: //! A reference to the external functions table ExternalFunctionsTable& external_functions_table; //! Is it possible to use leads/lags on variable nodes? + /* NB: This data member cannot be replaced by a virtual method, because this information is needed + in AddVariable(), which itself can be called from the copy constructor. */ const bool is_dynamic; private: @@ -137,7 +139,7 @@ private: public: DataTree(SymbolTable& symbol_table_arg, NumericalConstants& num_constants_arg, - ExternalFunctionsTable& external_functions_table_arg, bool is_static_args = false); + ExternalFunctionsTable& external_functions_table_arg, bool is_dynamic_arg = false); virtual ~DataTree() = default; @@ -345,14 +347,6 @@ public: //! Adds to the set all the deriv IDs corresponding to parameters virtual void addAllParamDerivId(set<int>& deriv_id_set); - //! Returns bool indicating whether DataTree represents a Dynamic Model (returns true in - //! DynamicModel.hh) - [[nodiscard]] virtual bool - isDynamic() const - { - return false; - }; - struct UnknownLocalVariableException { //! Symbol ID diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 01d04eca798aeb6eeedf7cdceca7811e318100f1..699e3001489aa4daa262e9d4d1ab2a711b46fbed 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -539,13 +539,6 @@ public: void addAllParamDerivId(set<int>& deriv_id_set) override; - //! Returns true indicating that this is a dynamic model - bool - isDynamic() const override - { - return true; - }; - //! Drive test of detrended equations void runTrendTest(const eval_context_t& eval_context); diff --git a/src/ExprNode.cc b/src/ExprNode.cc index 13557d0a5c57b1696d76d6939dfb4f3d85f96296..9e83dbc74da5ac2fbfd0c563d8196d0f43f67f18 100644 --- a/src/ExprNode.cc +++ b/src/ExprNode.cc @@ -899,7 +899,7 @@ VariableNode::prepareForDerivation() case SymbolType::trend: case SymbolType::logTrend: // In static models, exogenous and trends do not have deriv IDs - if (!datatree.isDynamic()) + if (!datatree.is_dynamic) break; [[fallthrough]]; case SymbolType::endogenous: @@ -990,7 +990,7 @@ VariableNode::computeDerivative(int deriv_id) case SymbolType::trend: case SymbolType::logTrend: // In static models, exogenous and trends do not have deriv IDs - if (!datatree.isDynamic()) + if (!datatree.is_dynamic) return datatree.Zero; [[fallthrough]]; case SymbolType::endogenous: @@ -1525,7 +1525,7 @@ VariableNode::computeChainRuleDerivative( case SymbolType::trend: case SymbolType::logTrend: // In static models, exogenous and trends do not have deriv IDs - if (!datatree.isDynamic()) + if (!datatree.is_dynamic) return datatree.Zero; [[fallthrough]]; case SymbolType::endogenous: @@ -2263,7 +2263,7 @@ UnaryOpNode::prepareForDerivation() all the parameters) */ if ((op_code == UnaryOpcode::steadyState || op_code == UnaryOpcode::steadyStateParamDeriv || op_code == UnaryOpcode::steadyStateParam2ndDeriv) - && datatree.isDynamic()) + && datatree.is_dynamic) datatree.addAllParamDerivId(non_null_derivatives); else { @@ -2286,7 +2286,7 @@ UnaryOpNode::prepareForChainRuleDerivation( set<int>& nnd {non_null_chain_rule_derivatives[const_cast<UnaryOpNode*>(this)]}; if ((op_code == UnaryOpcode::steadyState || op_code == UnaryOpcode::steadyStateParamDeriv || op_code == UnaryOpcode::steadyStateParam2ndDeriv) - && datatree.isDynamic()) + && datatree.is_dynamic) datatree.addAllParamDerivId(nnd); else { @@ -2368,7 +2368,7 @@ UnaryOpNode::composeDerivatives(expr_t darg, int deriv_id) case UnaryOpcode::sign: return datatree.Zero; case UnaryOpcode::steadyState: - if (datatree.isDynamic()) + if (datatree.is_dynamic) { if (datatree.getTypeByDerivID(deriv_id) == SymbolType::parameter) { @@ -2393,7 +2393,7 @@ UnaryOpNode::composeDerivatives(expr_t darg, int deriv_id) else return darg; case UnaryOpcode::steadyStateParamDeriv: - assert(datatree.isDynamic()); + assert(datatree.is_dynamic); if (datatree.getTypeByDerivID(deriv_id) == SymbolType::parameter) { auto varg = dynamic_cast<VariableNode*>(arg); @@ -2405,7 +2405,7 @@ UnaryOpNode::composeDerivatives(expr_t darg, int deriv_id) else return datatree.Zero; case UnaryOpcode::steadyStateParam2ndDeriv: - assert(datatree.isDynamic()); + assert(datatree.is_dynamic); if (datatree.getTypeByDerivID(deriv_id) == SymbolType::parameter) { cerr << "3rd derivative of STEADY_STATE node w.r.t. three parameters not implemented"