From fad44096a0710018383fafd9a0063b5a75756759 Mon Sep 17 00:00:00 2001
From: sebastien <sebastien@ac1d8469-bf42-47a9-8791-bf33cf982152>
Date: Wed, 29 Oct 2008 15:10:51 +0000
Subject: [PATCH] trunk preprocessor: added option "notmpterms" to dynare
 command, for disabling temporary terms in static and dynamic files

git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@2226 ac1d8469-bf42-47a9-8791-bf33cf982152
---
 ComputingTasks.cc         | 2 +-
 DynareMain.cc             | 7 +++++--
 DynareMain2.cc            | 4 ++--
 ModFile.cc                | 4 ++--
 ModelTree.cc              | 8 +++++---
 include/ComputingTasks.hh | 1 +
 include/ModFile.hh        | 3 ++-
 include/ModelTree.hh      | 5 +++--
 8 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index 60e54307..3c070ec7 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -840,7 +840,7 @@ void
 PlannerObjectiveStatement::computingPass()
 {
   model_tree->computeStaticHessian = true;
-  model_tree->computingPass(eval_context_type());
+  model_tree->computingPass(eval_context_type(), false);
 }
 
 void
diff --git a/DynareMain.cc b/DynareMain.cc
index 61dc9bbb..da860a50 100644
--- a/DynareMain.cc
+++ b/DynareMain.cc
@@ -32,7 +32,7 @@ using namespace std;
    Splitting main() in two parts was necessary because ParsingDriver.h and MacroDriver.h can't be
    included simultaneously (because of Bison limitations).
 */
-void main2(stringstream &in, string &basename, bool debug, bool clear_all);
+void main2(stringstream &in, string &basename, bool debug, bool clear_all, bool no_tmp_terms);
 
 int
 main(int argc, char** argv)
@@ -47,6 +47,7 @@ main(int argc, char** argv)
   bool clear_all = true;
   bool save_macro = false;
   bool debug = false;
+  bool no_tmp_terms = false;
 
   // Parse options
   for (int arg = 2; arg < argc; arg++)
@@ -57,6 +58,8 @@ main(int argc, char** argv)
         clear_all = false;
       else if (string(argv[arg]) == string("savemacro"))
         save_macro = true;
+      else if (string(argv[arg]) == string("notmpterms"))
+        no_tmp_terms = true;
     }
 
   cout << "Starting Dynare ..." << endl
@@ -86,7 +89,7 @@ main(int argc, char** argv)
     }
 
   // Do the rest
-  main2(macro_output, basename, debug, clear_all);
+  main2(macro_output, basename, debug, clear_all, no_tmp_terms);
 
   return 0;
 }
diff --git a/DynareMain2.cc b/DynareMain2.cc
index 53a5584d..e6111e91 100644
--- a/DynareMain2.cc
+++ b/DynareMain2.cc
@@ -25,7 +25,7 @@ using namespace std;
 #include "ModFile.hh"
 
 void
-main2(stringstream &in, string &basename, bool debug, bool clear_all)
+main2(stringstream &in, string &basename, bool debug, bool clear_all, bool no_tmp_terms)
 {
   ParsingDriver p;
 
@@ -36,7 +36,7 @@ main2(stringstream &in, string &basename, bool debug, bool clear_all)
   mod_file->checkPass();
 
   // Do computations
-  mod_file->computingPass();
+  mod_file->computingPass(no_tmp_terms);
 
   // Write outputs
   mod_file->writeOutputFiles(basename, clear_all);
diff --git a/ModFile.cc b/ModFile.cc
index 6b832720..6997ee50 100644
--- a/ModFile.cc
+++ b/ModFile.cc
@@ -91,7 +91,7 @@ ModFile::checkPass()
 }
 
 void
-ModFile::computingPass()
+ModFile::computingPass(bool no_tmp_terms)
 {
   // Mod file may have no equation (for example in a standalone BVAR estimation)
   if (model_tree.equation_number() > 0)
@@ -113,7 +113,7 @@ ModFile::computingPass()
             model_tree.computeThirdDerivatives = true;
         }
 
-      model_tree.computingPass(global_eval_context);
+      model_tree.computingPass(global_eval_context, no_tmp_terms);
     }
 
   for(vector<Statement *>::iterator it = statements.begin();
diff --git a/ModelTree.cc b/ModelTree.cc
index c6bef42d..513a2e4f 100644
--- a/ModelTree.cc
+++ b/ModelTree.cc
@@ -3140,7 +3140,7 @@ ModelTree::BlockLinear(Model_Block *ModelBlock)
 }
 
 void
-ModelTree::computingPass(const eval_context_type &eval_context)
+ModelTree::computingPass(const eval_context_type &eval_context, bool no_tmp_terms)
 {
   cout << equations.size() << " equation(s) found" << endl;
 
@@ -3171,10 +3171,12 @@ ModelTree::computingPass(const eval_context_type &eval_context)
       block_triangular.Normalize_and_BlockDecompose_Static_0_Model(j_m);
       BlockLinear(block_triangular.ModelBlock);
 
-      computeTemporaryTermsOrdered(order, block_triangular.ModelBlock);
+      if (!no_tmp_terms)
+        computeTemporaryTermsOrdered(order, block_triangular.ModelBlock);
     }
   else
-    computeTemporaryTerms(order);
+    if (!no_tmp_terms)
+      computeTemporaryTerms(order);
 }
 
 void
diff --git a/include/ComputingTasks.hh b/include/ComputingTasks.hh
index 96e547e2..c9ba68e4 100644
--- a/include/ComputingTasks.hh
+++ b/include/ComputingTasks.hh
@@ -434,6 +434,7 @@ public:
   /*! \todo check there are only endogenous variables at the current period in the objective
     (no exogenous, no lead/lag) */
   virtual void checkPass(ModFileStructure &mod_file_struct);
+  /*! \todo allow for the possibility of disabling temporary terms */
   virtual void computingPass();
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
diff --git a/include/ModFile.hh b/include/ModFile.hh
index 6dde1452..1a3f3a3b 100644
--- a/include/ModFile.hh
+++ b/include/ModFile.hh
@@ -63,7 +63,8 @@ public:
   /*! \todo add check for number of equations and endogenous if ramsey_policy is present */
   void checkPass();
   //! Execute computations
-  void computingPass();
+  /*! \param no_tmp_terms if true, no temporary terms will be computed in the static and dynamic files */
+  void computingPass(bool no_tmp_terms);
   //! Writes Matlab/Scilab output files
   /*!
     \param basename The base name used for writing output files. Should be the name of the mod file without its extension
diff --git a/include/ModelTree.hh b/include/ModelTree.hh
index 7cb392e6..34645599 100644
--- a/include/ModelTree.hh
+++ b/include/ModelTree.hh
@@ -157,8 +157,9 @@ public:
   //! Whether dynamic third order derivatives (w.r. to endogenous and exogenous) should be written
   bool computeThirdDerivatives;
   //! Execute computations (variable sorting + derivation)
-  /*! You must set computeJacobian, computeJacobianExo, computeHessian, computeStaticHessian and computeThirdDerivatives to correct values before calling this function */
-  void computingPass(const eval_context_type &eval_context);
+  /*! You must set computeJacobian, computeJacobianExo, computeHessian, computeStaticHessian and computeThirdDerivatives to correct values before calling this function
+      \param no_tmp_terms if true, no temporary terms will be computed in the static and dynamic files */
+  void computingPass(const eval_context_type &eval_context, bool no_tmp_terms);
   //! Writes model initialization and lead/lag incidence matrix to output
   void writeOutput(ostream &output) const;
   //! Writes static model file
-- 
GitLab