From 41a1c5ad1538854a81653166e44a3ff0f293c48a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Fri, 7 Jun 2024 17:30:19 +0200
Subject: [PATCH] Remove DataTree::isDynamic()

Rather use the data member which already exists.
---
 src/DataTree.hh     | 12 +++---------
 src/DynamicModel.hh |  7 -------
 src/ExprNode.cc     | 16 ++++++++--------
 3 files changed, 11 insertions(+), 24 deletions(-)

diff --git a/src/DataTree.hh b/src/DataTree.hh
index 3a02b7eb..4cdd06fe 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 01d04eca..699e3001 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 13557d0a..9e83dbc7 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"
-- 
GitLab