From a741799f906953913706aebcce057cddeb75eaec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Fri, 17 Apr 2020 16:04:19 +0200
Subject: [PATCH] Block decomposition: factorize various helper functions

Should have been done in 76c2e87c3bdb40ac7c46e37b467a37be9d310627.
---
 src/DynamicModel.hh | 102 --------------------------------------------
 src/ModelTree.hh    |  92 ++++++++++++++++++++++++++++++++-------
 src/StaticModel.hh  |  96 -----------------------------------------
 3 files changed, 76 insertions(+), 214 deletions(-)

diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index b16422d5..af64ca2b 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -553,121 +553,21 @@ public:
     return tuple(static_only_equations, static_only_equations_lineno, static_only_equations_equation_tags);
   };
 
-  //! Return the number of blocks
-  int
-  getNbBlocks() const override
-  {
-    return block_type_firstequation_size_mfs.size();
-  };
-  //! Determine the simulation type of each block
-  BlockSimulationType
-  getBlockSimulationType(int block_number) const override
-  {
-    return get<0>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the first equation number of a block
-  int
-  getBlockFirstEquation(int block_number) const override
-  {
-    return get<1>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the size of the block block_number
-  int
-  getBlockSize(int block_number) const override
-  {
-    return get<2>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the number of exogenous variable in the block block_number
   int
   getBlockExoSize(int block_number) const override
   {
     return block_var_exo[block_number].first.size();
   };
-  //! Return the number of colums in the jacobian matrix for exogenous variable in the block block_number
   int
   getBlockExoColSize(int block_number) const override
   {
     return block_var_exo[block_number].second;
   };
-  //! Return the number of feedback variable of the block block_number
-  int
-  getBlockMfs(int block_number) const override
-  {
-    return get<3>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the maximum lag in a block
-  int
-  getBlockMaxLag(int block_number) const override
-  {
-    return block_lag_lead[block_number].first;
-  };
-  //! Return the maximum lead in a block
-  int
-  getBlockMaxLead(int block_number) const override
-  {
-    return block_lag_lead[block_number].second;
-  };
-  //! Return the type of equation (equation_number) belonging to the block block_number
-  EquationType
-  getBlockEquationType(int block_number, int equation_number) const override
-  {
-    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first;
-  };
-  //! Return true if the equation has been normalized
-  bool
-  isBlockEquationRenormalized(int block_number, int equation_number) const override
-  {
-    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s;
-  };
-  //! Return the expr_t of the equation equation_number belonging to the block block_number
-  expr_t
-  getBlockEquationExpr(int block_number, int equation_number) const override
-  {
-    return equations[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]];
-  };
-  //! Return the expr_t of the renormalized equation equation_number belonging to the block block_number
-  expr_t
-  getBlockEquationRenormalizedExpr(int block_number, int equation_number) const override
-  {
-    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].second;
-  };
-  //! Return the original number of equation equation_number belonging to the block block_number
-  int
-  getBlockEquationID(int block_number, int equation_number) const override
-  {
-    return eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number];
-  };
-  //! Return the original number of variable variable_number belonging to the block block_number
-  int
-  getBlockVariableID(int block_number, int variable_number) const override
-  {
-    return endo_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+variable_number];
-  };
-  //! Return the original number of the exogenous variable varexo_number belonging to the block block_number
   int
   getBlockVariableExoID(int block_number, int variable_number) const override
   {
     return exo_block[block_number].find(variable_number)->first;
   };
-  //! Return the position of equation_number in the block number belonging to the block block_number
-  int
-  getBlockInitialEquationID(int block_number, int equation_number) const override
-  {
-    return eq_idx_orig2block[equation_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the position of variable_number in the block number belonging to the block block_number
-  int
-  getBlockInitialVariableID(int block_number, int variable_number) const override
-  {
-    return endo_idx_orig2block[variable_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the block number containing the endogenous variable variable_number
-  int
-  getBlockVariableID(int variable_number) const
-  {
-    return get<0>(variable_block_lead_lag[variable_number]);
-  };
-  //! Return the position of the exogenous variable_number in the block number belonging to the block block_number
   int
   getBlockInitialExogenousID(int block_number, int variable_number) const override
   {
@@ -683,7 +583,6 @@ public:
     else
       return -1;
   };
-  //! Return the position of the deterministic exogenous variable_number in the block number belonging to the block block_number
   int
   getBlockInitialDetExogenousID(int block_number, int variable_number) const override
   {
@@ -699,7 +598,6 @@ public:
     else
       return -1;
   };
-  //! Return the position of the other endogenous variable_number in the block number belonging to the block block_number
   int
   getBlockInitialOtherEndogenousID(int block_number, int variable_number) const override
   {
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index 37cdeaa8..99127e3d 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -329,24 +329,52 @@ protected:
                                       vector<BinaryOpNode *> &equations, vector<int> &equations_lineno,
                                       EquationTags &equation_tags, bool static_equations) const;
 
-  //! Determine the simulation type of each block
-  virtual BlockSimulationType getBlockSimulationType(int block_number) const = 0;
   //! Return the number of blocks
-  virtual int getNbBlocks() const = 0;
+  int
+  getNbBlocks() const
+  {
+    return block_type_firstequation_size_mfs.size();
+  };
+  //! Determine the simulation type of each block
+  BlockSimulationType
+  getBlockSimulationType(int block_number) const
+  {
+    return get<0>(block_type_firstequation_size_mfs[block_number]);
+  };
   //! Return the first equation number of a block
-  virtual int getBlockFirstEquation(int block_number) const = 0;
+  int
+  getBlockFirstEquation(int block_number) const
+  {
+    return get<1>(block_type_firstequation_size_mfs[block_number]);
+  };
   //! Return the size of the block block_number
-  virtual int getBlockSize(int block_number) const = 0;
+  int
+  getBlockSize(int block_number) const
+  {
+    return get<2>(block_type_firstequation_size_mfs[block_number]);
+  };
   //! Return the number of exogenous variable in the block block_number
   virtual int getBlockExoSize(int block_number) const = 0;
   //! Return the number of colums in the jacobian matrix for exogenous variable in the block block_number
   virtual int getBlockExoColSize(int block_number) const = 0;
   //! Return the number of feedback variable of the block block_number
-  virtual int getBlockMfs(int block_number) const = 0;
+  int
+  getBlockMfs(int block_number) const
+  {
+    return get<3>(block_type_firstequation_size_mfs[block_number]);
+  };
   //! Return the maximum lag in a block
-  virtual int getBlockMaxLag(int block_number) const = 0;
+  int
+  getBlockMaxLag(int block_number) const
+  {
+    return block_lag_lead[block_number].first;
+  };
   //! Return the maximum lead in a block
-  virtual int getBlockMaxLead(int block_number) const = 0;
+  int
+  getBlockMaxLead(int block_number) const
+  {
+    return block_lag_lead[block_number].second;
+  };
   inline void
   setBlockLeadLag(int block, int max_lag, int max_lead)
   {
@@ -354,23 +382,55 @@ protected:
   };
 
   //! Return the type of equation (equation_number) belonging to the block block_number
-  virtual EquationType getBlockEquationType(int block_number, int equation_number) const = 0;
+  EquationType
+  getBlockEquationType(int block_number, int equation_number) const
+  {
+    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first;
+  };
   //! Return true if the equation has been normalized
-  virtual bool isBlockEquationRenormalized(int block_number, int equation_number) const = 0;
+  bool
+  isBlockEquationRenormalized(int block_number, int equation_number) const
+  {
+    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s;
+  };
   //! Return the expr_t of the equation equation_number belonging to the block block_number
-  virtual expr_t getBlockEquationExpr(int block_number, int equation_number) const = 0;
+  expr_t
+  getBlockEquationExpr(int block_number, int equation_number) const
+  {
+    return equations[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]];
+  };
   //! Return the expr_t of the renormalized equation equation_number belonging to the block block_number
-  virtual expr_t getBlockEquationRenormalizedExpr(int block_number, int equation_number) const = 0;
+  expr_t
+  getBlockEquationRenormalizedExpr(int block_number, int equation_number) const
+  {
+    return equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].second;
+  };
   //! Return the original number of equation equation_number belonging to the block block_number
-  virtual int getBlockEquationID(int block_number, int equation_number) const = 0;
+  int
+  getBlockEquationID(int block_number, int equation_number) const
+  {
+    return eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number];
+  };
   //! Return the original number of variable variable_number belonging to the block block_number
-  virtual int getBlockVariableID(int block_number, int variable_number) const = 0;
+  int
+  getBlockVariableID(int block_number, int variable_number) const
+  {
+    return endo_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+variable_number];
+  };
   //! Return the original number of the exogenous variable varexo_number belonging to the block block_number
   virtual int getBlockVariableExoID(int block_number, int variable_number) const = 0;
   //! Return the position of equation_number in the block number belonging to the block block_number
-  virtual int getBlockInitialEquationID(int block_number, int equation_number) const = 0;
+  int
+  getBlockInitialEquationID(int block_number, int equation_number) const
+  {
+    return eq_idx_orig2block[equation_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
+  };
   //! Return the position of variable_number in the block number belonging to the block block_number
-  virtual int getBlockInitialVariableID(int block_number, int variable_number) const = 0;
+  int
+  getBlockInitialVariableID(int block_number, int variable_number) const
+  {
+    return endo_idx_orig2block[variable_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
+  };
   //! Return the position of variable_number in the block number belonging to the block block_number
   virtual int getBlockInitialExogenousID(int block_number, int variable_number) const = 0;
   //! Return the position of the deterministic exogenous variable_number in the block number belonging to the block block_number
diff --git a/src/StaticModel.hh b/src/StaticModel.hh
index 9c2f0c5a..8414e68d 100644
--- a/src/StaticModel.hh
+++ b/src/StaticModel.hh
@@ -190,127 +190,31 @@ public:
   int getDerivID(int symb_id, int lag) const noexcept(false) override;
   void addAllParamDerivId(set<int> &deriv_id_set) override;
 
-  //! Return the number of blocks
-  int
-  getNbBlocks() const override
-  {
-    return (block_type_firstequation_size_mfs.size());
-  };
-  //! Determine the simulation type of each block
-  BlockSimulationType
-  getBlockSimulationType(int block_number) const override
-  {
-    return (get<0>(block_type_firstequation_size_mfs[block_number]));
-  };
-  //! Return the first equation number of a block
-  int
-  getBlockFirstEquation(int block_number) const override
-  {
-    return (get<1>(block_type_firstequation_size_mfs[block_number]));
-  };
-  //! Return the size of the block block_number
-  int
-  getBlockSize(int block_number) const override
-  {
-    return (get<2>(block_type_firstequation_size_mfs[block_number]));
-  };
-  //! Return the number of exogenous variable in the block block_number
   int
   getBlockExoSize(int block_number) const override
   {
     return 0;
   };
-  //! Return the number of colums in the jacobian matrix for exogenous variable in the block block_number
   int
   getBlockExoColSize(int block_number) const override
   {
     return 0;
   }
-  //! Return the number of feedback variable of the block block_number
-  int
-  getBlockMfs(int block_number) const override
-  {
-    return (get<3>(block_type_firstequation_size_mfs[block_number]));
-  };
-  //! Return the maximum lag in a block
-  int
-  getBlockMaxLag(int block_number) const override
-  {
-    return (block_lag_lead[block_number].first);
-  };
-  //! Return the maximum lead in a block
-  int
-  getBlockMaxLead(int block_number) const override
-  {
-    return (block_lag_lead[block_number].second);
-  };
-  //! Return the type of equation (equation_number) belonging to the block block_number
-  EquationType
-  getBlockEquationType(int block_number, int equation_number) const override
-  {
-    return (equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first);
-  };
-  //! Return true if the equation has been normalized
-  bool
-  isBlockEquationRenormalized(int block_number, int equation_number) const override
-  {
-    return (equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].first == EquationType::evaluate_s);
-  };
-  //! Return the expr_t of the equation equation_number belonging to the block block_number
-  expr_t
-  getBlockEquationExpr(int block_number, int equation_number) const override
-  {
-    return (equations[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]]);
-  };
-  //! Return the expr_t of the renormalized equation equation_number belonging to the block block_number
-  expr_t
-  getBlockEquationRenormalizedExpr(int block_number, int equation_number) const override
-  {
-    return (equation_type_and_normalized_equation[eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]].second);
-  };
-  //! Return the original number of equation equation_number belonging to the block block_number
-  int
-  getBlockEquationID(int block_number, int equation_number) const override
-  {
-    return (eq_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+equation_number]);
-  };
-  //! Return the original number of variable variable_number belonging to the block block_number
-  int
-  getBlockVariableID(int block_number, int variable_number) const override
-  {
-    return (endo_idx_block2orig[get<1>(block_type_firstequation_size_mfs[block_number])+variable_number]);
-  };
-  //! Return the original number of the exogenous variable varexo_number belonging to the block block_number
   int
   getBlockVariableExoID(int block_number, int variable_number) const override
   {
     return 0;
   };
-  //! Return the position of equation_number in the block number belonging to the block block_number
-  int
-  getBlockInitialEquationID(int block_number, int equation_number) const override
-  {
-    return eq_idx_orig2block[equation_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the position of variable_number in the block number belonging to the block block_number
-  int
-  getBlockInitialVariableID(int block_number, int variable_number) const override
-  {
-    return endo_idx_orig2block[variable_number] - get<1>(block_type_firstequation_size_mfs[block_number]);
-  };
-  //! Return the position of variable_number in the block number belonging to the block block_number
   int
   getBlockInitialExogenousID(int block_number, int variable_number) const override
   {
     return -1;
   };
-  //! Return the position of the deterministic exogenous variable_number in the block number belonging to the block block_number
   int
   getBlockInitialDetExogenousID(int block_number, int variable_number) const override
   {
     return -1;
   };
-  //! Return the position of the other endogenous variable_number in the block number belonging to the block block_number
   int
   getBlockInitialOtherEndogenousID(int block_number, int variable_number) const override
   {
-- 
GitLab