From 3938381e9975aaf187dc186a557cdfd87a12dc9c Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Wed, 28 Jun 2017 12:04:04 +0200 Subject: [PATCH] preprocessor: write JSON output for original model when writing after transform pass --- doc/dynare.texi | 11 ++++++----- preprocessor/ModFile.cc | 42 ++++++++++++++++++++++++++++++++++++++--- preprocessor/ModFile.hh | 2 +- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/doc/dynare.texi b/doc/dynare.texi index 9ed40004a..86479a741 100644 --- a/doc/dynare.texi +++ b/doc/dynare.texi @@ -849,11 +849,12 @@ format. If @code{parse} is passed, then the output will be written after the parsing step in a file called @file{@var{FILENAME}.mod}. If @code{transform} is passed, the JSON output of the transformed model (maximum lead of 1, minimum lag of -1, expectation operators substituted, etc.) will be written after the -transform pass in a file called @file{@var{FILENAME}.mod}. And if -@code{compute} is passed, the output is written after the computing pass. Here, -the transformed model is written to @file{@var{FILENAME}.mod}, the original -model is written to @file{@var{FILENAME}_original.mod}, and the dynamic and -static files are written to @file{@var{FILENAME}_dynamic.mod} and +transform pass in a file called @file{@var{FILENAME}.mod} and the original, +untransformed model will be written in @file{@var{FILENAME}_original.mod}. And +if @code{compute} is passed, the output is written after the computing +pass. Here, the transformed model is written to @file{@var{FILENAME}.mod}, the +original model is written to @file{@var{FILENAME}_original.mod}, and the +dynamic and static files are written to @file{@var{FILENAME}_dynamic.mod} and @file{@var{FILENAME}_static.mod}. @item jsonstdout diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc index 510dffe61..397fee1bb 100644 --- a/preprocessor/ModFile.cc +++ b/preprocessor/ModFile.cc @@ -1270,7 +1270,7 @@ ModFile::writeJsonOutput(const string &basename, JsonOutputPointType json, JsonF if (json == parsing || json == checkpass) symbol_table.freeze(); - writeJsonOutputParsingCheck(basename, json_output_mode); + writeJsonOutputParsingCheck(basename, json_output_mode, json == transformpass); if (json == parsing || json == checkpass) symbol_table.unfreeze(); @@ -1302,7 +1302,7 @@ ModFile::writeJsonOutput(const string &basename, JsonOutputPointType json, JsonF } void -ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode) const +ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode, bool transformpass) const { ostringstream output; output << "{" << endl; @@ -1325,8 +1325,21 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType } output << "}" << endl; + ostringstream original_model_output; + original_model_output << ""; + if (transformpass) + { + original_model_output << "{"; + original_model.writeJsonOriginalModelOutput(original_model_output); + original_model_output << "}" << endl; + } + if (json_output_mode == standardout) - cout << output.str(); + { + cout << output.str(); + if (!original_model_output.str().empty()) + cout << original_model_output.str(); + } else { ofstream jsonOutputFile; @@ -1350,6 +1363,29 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType jsonOutputFile << output.str(); jsonOutputFile.close(); + + if (!original_model_output.str().empty()) + { + if (basename.size()) + { + string fname(basename); + fname += "_original.json"; + jsonOutputFile.open(fname.c_str(), ios::out | ios::binary); + if (!jsonOutputFile.is_open()) + { + cerr << "ERROR: Can't open file " << fname << " for writing" << endl; + exit(EXIT_FAILURE); + } + } + else + { + cerr << "ERROR: Missing file name" << endl; + exit(EXIT_FAILURE); + } + + jsonOutputFile << original_model_output.str(); + jsonOutputFile.close(); + } } } diff --git a/preprocessor/ModFile.hh b/preprocessor/ModFile.hh index d8bb587cb..1b763f636 100644 --- a/preprocessor/ModFile.hh +++ b/preprocessor/ModFile.hh @@ -118,7 +118,7 @@ private: //! Warnings Encountered WarningConsolidation &warnings; //! Functions used in writing of JSON outut. See writeJsonOutput - void writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode) const; + void writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType json_output_mode, bool transformpass) const; void writeJsonComputingPassOutput(const string &basename, JsonFileOutputType json_output_mode, bool jsonprintderivdetail) const; void writeJsonFileHelper(string &fname, ostringstream &output) const; public: