From 7a08b73ddf500a18dffff2cd1e24d977fe54ca06 Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Mon, 16 Oct 2017 17:52:47 +0200 Subject: [PATCH 1/9] preprocessor: json: change model keyword to modfile --- preprocessor/ModFile.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc index c03a8696a..625c1c845 100644 --- a/preprocessor/ModFile.cc +++ b/preprocessor/ModFile.cc @@ -1385,9 +1385,9 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType if (json_output_mode == standardout) { if (transformpass || computingpass) - cout << "\"transformed_model\": "; + cout << "\"transformed_modfile\": "; else - cout << "\"model\": "; + cout << "\"modfile\": "; cout << output.str(); if (!original_model_output.str().empty()) cout << ", \"original_model\": " << original_model_output.str(); From d4e3dbe37031f0b004ae8761cd8f54e0d9a4dc01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Mon, 16 Oct 2017 23:22:41 +0200 Subject: [PATCH 2/9] Fixes #1541. --- matlab/missing/isfile/isfile.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/missing/isfile/isfile.m b/matlab/missing/isfile/isfile.m index ece12f43f..5676e7633 100644 --- a/matlab/missing/isfile/isfile.m +++ b/matlab/missing/isfile/isfile.m @@ -49,7 +49,7 @@ cellofstringflag = false; n = 1; a = false; -if isstring(b) && length(b)>1 && isvector(b) +if ~isoctave() && isstring(b) && length(b)>1 && isvector(b) n = length(b); stringarrayflag = true; a = false(size(b)); From fa26ab10e052ac9c0709181e6a462885afc26401 Mon Sep 17 00:00:00 2001 From: Johannes Pfeifer Date: Tue, 17 Oct 2017 09:13:53 +0200 Subject: [PATCH 3/9] Make isfile.m command work with Matlab versions before 9.1 --- matlab/missing/isfile/isfile.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/missing/isfile/isfile.m b/matlab/missing/isfile/isfile.m index 5676e7633..85347fa8e 100644 --- a/matlab/missing/isfile/isfile.m +++ b/matlab/missing/isfile/isfile.m @@ -49,7 +49,7 @@ cellofstringflag = false; n = 1; a = false; -if ~isoctave() && isstring(b) && length(b)>1 && isvector(b) +if ~isoctave() && ~matlab_ver_less_than('9.1') && isstring(b) && length(b)>1 && isvector(b) n = length(b); stringarrayflag = true; a = false(size(b)); From 6e1d5bdf46a82798316591edfeeed71f8e80907b Mon Sep 17 00:00:00 2001 From: Houtan Bastani Date: Mon, 16 Oct 2017 17:24:55 +0200 Subject: [PATCH 4/9] preprocessor: json: print steady_state_model file --- preprocessor/ExprNode.cc | 100 ++++++++++++++++++------------- preprocessor/ExprNode.hh | 46 ++++++++------ preprocessor/ModFile.cc | 30 ++++++++++ preprocessor/StaticModel.cc | 32 ++++++++++ preprocessor/StaticModel.hh | 1 + preprocessor/SteadyStateModel.cc | 44 ++++++++++++++ preprocessor/SteadyStateModel.hh | 2 + 7 files changed, 194 insertions(+), 61 deletions(-) diff --git a/preprocessor/ExprNode.cc b/preprocessor/ExprNode.cc index e701170d1..ba04540cc 100644 --- a/preprocessor/ExprNode.cc +++ b/preprocessor/ExprNode.cc @@ -195,7 +195,8 @@ ExprNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output void ExprNode::writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { // Nothing to do } @@ -340,7 +341,8 @@ NumConstNode::writeOutput(ostream &output, ExprNodeOutputType output_type, void NumConstNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { output << datatree.num_constants.get(id); } @@ -640,7 +642,8 @@ VariableNode::containsExternalFunction() const void VariableNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { temporary_terms_t::const_iterator it = temporary_terms.find(const_cast(this)); if (it != temporary_terms.end()) @@ -650,7 +653,7 @@ VariableNode::writeJsonOutput(ostream &output, } output << datatree.symbol_table.getName(symb_id); - if (lag != 0) + if (isdynamic && lag != 0) output << "(" << lag << ")"; } @@ -1892,7 +1895,8 @@ UnaryOpNode::containsExternalFunction() const void UnaryOpNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { temporary_terms_t::const_iterator it = temporary_terms.find(const_cast(this)); if (it != temporary_terms.end()) @@ -1966,7 +1970,7 @@ UnaryOpNode::writeJsonOutput(ostream &output, break; case oSteadyState: output << "("; - arg->writeJsonOutput(output, temporary_terms, tef_terms); + arg->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << ")"; return; case oSteadyStateParamDeriv: @@ -2017,7 +2021,7 @@ UnaryOpNode::writeJsonOutput(ostream &output, } // Write argument - arg->writeJsonOutput(output, temporary_terms, tef_terms); + arg->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); if (close_parenthesis) output << ")"; @@ -2227,9 +2231,10 @@ UnaryOpNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutputType out void UnaryOpNode::writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { - arg->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); + arg->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); } void @@ -3300,7 +3305,8 @@ BinaryOpNode::containsExternalFunction() const void BinaryOpNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { // If current node is a temporary term temporary_terms_t::const_iterator it = temporary_terms.find(const_cast(this)); @@ -3323,9 +3329,9 @@ BinaryOpNode::writeJsonOutput(ostream &output, default: ; } - arg1->writeJsonOutput(output, temporary_terms, tef_terms); + arg1->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << ","; - arg2->writeJsonOutput(output, temporary_terms, tef_terms); + arg2->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << ")"; return; } @@ -3333,9 +3339,9 @@ BinaryOpNode::writeJsonOutput(ostream &output, if (op_code == oPowerDeriv) { output << "get_power_deriv("; - arg1->writeJsonOutput(output, temporary_terms, tef_terms); + arg1->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << ","; - arg2->writeJsonOutput(output, temporary_terms, tef_terms); + arg2->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << "," << powerDerivOrder << ")"; return; } @@ -3355,7 +3361,7 @@ BinaryOpNode::writeJsonOutput(ostream &output, } // Write left argument - arg1->writeJsonOutput(output, temporary_terms, tef_terms); + arg1->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); if (close_parenthesis) output << ")"; @@ -3422,7 +3428,7 @@ BinaryOpNode::writeJsonOutput(ostream &output, } // Write right argument - arg2->writeJsonOutput(output, temporary_terms, tef_terms); + arg2->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); if (close_parenthesis) output << ")"; @@ -3620,10 +3626,11 @@ BinaryOpNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutputType ou void BinaryOpNode::writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { - arg1->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); - arg2->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); + arg1->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); + arg2->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); } void @@ -4578,7 +4585,8 @@ TrinaryOpNode::containsExternalFunction() const void TrinaryOpNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { // If current node is a temporary term temporary_terms_t::const_iterator it = temporary_terms.find(const_cast(this)); @@ -4598,11 +4606,11 @@ TrinaryOpNode::writeJsonOutput(ostream &output, break; } - arg1->writeJsonOutput(output, temporary_terms, tef_terms); + arg1->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << ","; - arg2->writeJsonOutput(output, temporary_terms, tef_terms); + arg2->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << ","; - arg3->writeJsonOutput(output, temporary_terms, tef_terms); + arg3->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); output << ")"; } @@ -4685,11 +4693,12 @@ TrinaryOpNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutputType o void TrinaryOpNode::writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { - arg1->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); - arg2->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); - arg3->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); + arg1->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); + arg2->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); + arg3->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); } void @@ -5298,7 +5307,8 @@ AbstractExternalFunctionNode::writeExternalFunctionArguments(ostream &output, Ex void AbstractExternalFunctionNode::writeJsonExternalFunctionArguments(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { for (vector::const_iterator it = arguments.begin(); it != arguments.end(); it++) @@ -5306,7 +5316,7 @@ AbstractExternalFunctionNode::writeJsonExternalFunctionArguments(ostream &output if (it != arguments.begin()) output << ","; - (*it)->writeJsonOutput(output, temporary_terms, tef_terms); + (*it)->writeJsonOutput(output, temporary_terms, tef_terms, isdynamic); } } @@ -5476,7 +5486,8 @@ ExternalFunctionNode::compileExternalFunctionOutput(ostream &CompileCode, unsign void ExternalFunctionNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { temporary_terms_t::const_iterator it = temporary_terms.find(const_cast(this)); if (it != temporary_terms.end()) @@ -5486,7 +5497,7 @@ ExternalFunctionNode::writeJsonOutput(ostream &output, } output << datatree.symbol_table.getName(symb_id) << "("; - writeJsonExternalFunctionArguments(output, temporary_terms, tef_terms); + writeJsonExternalFunctionArguments(output, temporary_terms, tef_terms, isdynamic); output << ")"; } @@ -5602,14 +5613,15 @@ ExternalFunctionNode::writeExternalFunctionOutput(ostream &output, ExprNodeOutpu void ExternalFunctionNode::writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { int first_deriv_symb_id = datatree.external_functions_table.getFirstDerivSymbID(symb_id); assert(first_deriv_symb_id != eExtFunSetButNoNameProvided); for (vector::const_iterator it = arguments.begin(); it != arguments.end(); it++) - (*it)->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); + (*it)->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); if (!alreadyWrittenAsTefTerm(symb_id, tef_terms)) { @@ -5629,7 +5641,7 @@ ExternalFunctionNode::writeJsonExternalFunctionOutput(vector &efout, ef << ", \"external_function_term_dd\": \"TEFDD_" << indx << "\""; ef << ", \"value\": \"" << datatree.symbol_table.getName(symb_id) << "("; - writeJsonExternalFunctionArguments(ef, temporary_terms, tef_terms); + writeJsonExternalFunctionArguments(ef, temporary_terms, tef_terms, isdynamic); ef << ")\"}}"; efout.push_back(ef.str()); } @@ -5719,7 +5731,8 @@ FirstDerivExternalFunctionNode::composeDerivatives(const vector &dargs) void FirstDerivExternalFunctionNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { // If current node is a temporary term temporary_terms_t::const_iterator it = temporary_terms.find(const_cast(this)); @@ -5934,7 +5947,8 @@ FirstDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Exp void FirstDerivExternalFunctionNode::writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { int first_deriv_symb_id = datatree.external_functions_table.getFirstDerivSymbID(symb_id); assert(first_deriv_symb_id != eExtFunSetButNoNameProvided); @@ -5944,7 +5958,7 @@ FirstDerivExternalFunctionNode::writeJsonExternalFunctionOutput(vector & if (first_deriv_symb_id == symb_id) { expr_t parent = datatree.AddExternalFunction(symb_id, arguments); - parent->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); + parent->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); return; } @@ -5967,7 +5981,7 @@ FirstDerivExternalFunctionNode::writeJsonExternalFunctionOutput(vector & << ", \"value\": \"" << datatree.symbol_table.getName(first_deriv_symb_id) << "("; } - writeJsonExternalFunctionArguments(ef, temporary_terms, tef_terms); + writeJsonExternalFunctionArguments(ef, temporary_terms, tef_terms, isdynamic); ef << ")\"}}"; efout.push_back(ef.str()); } @@ -6100,7 +6114,8 @@ SecondDerivExternalFunctionNode::composeDerivatives(const vector &dargs) void SecondDerivExternalFunctionNode::writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { // If current node is a temporary term temporary_terms_t::const_iterator it = temporary_terms.find(const_cast(this)); @@ -6293,7 +6308,8 @@ SecondDerivExternalFunctionNode::writeExternalFunctionOutput(ostream &output, Ex void SecondDerivExternalFunctionNode::writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const { int second_deriv_symb_id = datatree.external_functions_table.getSecondDerivSymbID(symb_id); assert(second_deriv_symb_id != eExtFunSetButNoNameProvided); @@ -6303,7 +6319,7 @@ SecondDerivExternalFunctionNode::writeJsonExternalFunctionOutput(vector if (second_deriv_symb_id == symb_id) { expr_t parent = datatree.AddExternalFunction(symb_id, arguments); - parent->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms); + parent->writeJsonExternalFunctionOutput(efout, temporary_terms, tef_terms, isdynamic); return; } @@ -6327,7 +6343,7 @@ SecondDerivExternalFunctionNode::writeJsonExternalFunctionOutput(vector << ", \"value\": \"" << datatree.symbol_table.getName(second_deriv_symb_id) << "("; } - writeJsonExternalFunctionArguments(ef, temporary_terms, tef_terms); + writeJsonExternalFunctionArguments(ef, temporary_terms, tef_terms, isdynamic); ef << ")\"}}" << endl; efout.push_back(ef.str()); } diff --git a/preprocessor/ExprNode.hh b/preprocessor/ExprNode.hh index 33cfc7305..7bdd9a675 100644 --- a/preprocessor/ExprNode.hh +++ b/preprocessor/ExprNode.hh @@ -223,7 +223,7 @@ enum ExprNodeOutputType void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms) const; //! Writes output of node in JSON syntax - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const = 0; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic = true) const = 0; virtual int precedenceJson(const temporary_terms_t &temporary_terms) const; @@ -236,7 +236,8 @@ enum ExprNodeOutputType //! Allows the insertion of commas if necessary virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic = true) const; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, @@ -490,7 +491,7 @@ public: }; virtual void prepareForDerivation(); virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual bool containsExternalFunction() const; virtual void collectDynamicVariables(SymbolType type_arg, set > &result) const; virtual void collectTemporary_terms(const temporary_terms_t &temporary_terms, temporary_terms_inuse_t &temporary_terms_inuse, int Curr_Block) const; @@ -540,7 +541,7 @@ public: VariableNode(DataTree &datatree_arg, int symb_id_arg, int lag_arg); virtual void prepareForDerivation(); virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual bool containsExternalFunction() const; virtual void collectDynamicVariables(SymbolType type_arg, set > &result) const; virtual void computeTemporaryTerms(map &reference_count, @@ -620,14 +621,15 @@ public: map &temp_terms_map, bool is_matlab, NodeTreeReference tr) const; virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual bool containsExternalFunction() const; virtual void writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -712,14 +714,15 @@ public: map &temp_terms_map, bool is_matlab, NodeTreeReference tr) const; virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual bool containsExternalFunction() const; virtual void writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -821,14 +824,15 @@ public: map &temp_terms_map, bool is_matlab, NodeTreeReference tr) const; virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual bool containsExternalFunction() const; virtual void writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -895,7 +899,7 @@ protected: int getIndxInTefTerms(int the_symb_id, deriv_node_temp_terms_t &tef_terms) const throw (UnknownFunctionNameAndArgs); //! Helper function to write output arguments of any given external function void writeExternalFunctionArguments(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - void writeJsonExternalFunctionArguments(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + void writeJsonExternalFunctionArguments(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; public: AbstractExternalFunctionNode(DataTree &datatree_arg, int symb_id_arg, const vector &arguments_arg); @@ -904,14 +908,15 @@ public: map &temp_terms_map, bool is_matlab, NodeTreeReference tr) const = 0; virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const = 0; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const = 0; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic = true) const = 0; virtual bool containsExternalFunction() const; virtual void writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const = 0; virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const = 0; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic = true) const = 0; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -974,13 +979,14 @@ public: map &temp_terms_map, bool is_matlab, NodeTreeReference tr) const; virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual void writeExternalFunctionOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -1018,7 +1024,7 @@ public: vector< vector > &v_temporary_terms, int equation) const; virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -1028,7 +1034,8 @@ public: deriv_node_temp_terms_t &tef_terms) const; virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -1061,7 +1068,7 @@ public: vector< vector > &v_temporary_terms, int equation) const; virtual void writeOutput(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; - virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms) const; + virtual void writeJsonOutput(ostream &output, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const bool isdynamic) const; virtual void compile(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, @@ -1071,7 +1078,8 @@ public: deriv_node_temp_terms_t &tef_terms) const; virtual void writeJsonExternalFunctionOutput(vector &efout, const temporary_terms_t &temporary_terms, - deriv_node_temp_terms_t &tef_terms) const; + deriv_node_temp_terms_t &tef_terms, + const bool isdynamic) const; virtual void compileExternalFunctionOutput(ostream &CompileCode, unsigned int &instruction_number, bool lhs_rhs, const temporary_terms_t &temporary_terms, const map_idx_t &map_idx, bool dynamic, bool steady_dynamic, diff --git a/preprocessor/ModFile.cc b/preprocessor/ModFile.cc index 625c1c845..de52a4da7 100644 --- a/preprocessor/ModFile.cc +++ b/preprocessor/ModFile.cc @@ -1382,6 +1382,12 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType original_model_output << "}" << endl; } + ostringstream steady_state_model_output; + steady_state_model_output << ""; + if (dynamic_model.equation_number() > 0) + steady_state_model.writeJsonSteadyStateFile(steady_state_model_output, + transformpass || computingpass); + if (json_output_mode == standardout) { if (transformpass || computingpass) @@ -1391,6 +1397,8 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType cout << output.str(); if (!original_model_output.str().empty()) cout << ", \"original_model\": " << original_model_output.str(); + if (!steady_state_model_output.str().empty()) + cout << ", \"steady_state_model\": " << steady_state_model_output.str(); } else { @@ -1438,6 +1446,28 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType jsonOutputFile << original_model_output.str(); jsonOutputFile.close(); } + if (!steady_state_model_output.str().empty()) + { + if (basename.size()) + { + string fname(basename); + fname += "_steady_state_model.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 << steady_state_model_output.str(); + jsonOutputFile.close(); + } } } diff --git a/preprocessor/StaticModel.cc b/preprocessor/StaticModel.cc index ea6ed05e1..11a033a86 100644 --- a/preprocessor/StaticModel.cc +++ b/preprocessor/StaticModel.cc @@ -2197,6 +2197,38 @@ StaticModel::writeLatexAuxVarRecursiveDefinitions(ostream &output) const } } +void +StaticModel::writeJsonAuxVarRecursiveDefinitions(ostream &output) const +{ + deriv_node_temp_terms_t tef_terms; + temporary_terms_t temporary_terms; + + for (int i = 0; i < (int) aux_equations.size(); i++) + if (dynamic_cast(aux_equations[i])->containsExternalFunction()) + { + vector efout; + dynamic_cast(aux_equations[i])->writeJsonExternalFunctionOutput(efout, + temporary_terms, + tef_terms, + false); + for (vector::const_iterator it = efout.begin(); it != efout.end(); it++) + { + if (it != efout.begin()) + output << ", "; + output << *it; + } + } + + for (int i = 0; i < (int) aux_equations.size(); i++) + { + output << ", {\"lhs\": \""; + aux_equations[i]->get_arg1()->writeJsonOutput(output, temporary_terms, tef_terms, false); + output << "\", \"rhs\": \""; + dynamic_cast(aux_equations[i]->substituteStaticAuxiliaryDefinition())->get_arg2()->writeJsonOutput(output, temporary_terms, tef_terms, false); + output << "\"}"; + } +} + void StaticModel::writeParamsDerivativesFile(const string &basename, bool julia) const { diff --git a/preprocessor/StaticModel.hh b/preprocessor/StaticModel.hh index 68b6db3d8..ad55f89d9 100644 --- a/preprocessor/StaticModel.hh +++ b/preprocessor/StaticModel.hh @@ -192,6 +192,7 @@ public: void writeSetAuxiliaryVariables(const string &basename, const bool julia) const; void writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const; void writeLatexAuxVarRecursiveDefinitions(ostream &output) const; + void writeJsonAuxVarRecursiveDefinitions(ostream &output) const; //! To ensure that no exogenous is present in the planner objective //! See #1264 diff --git a/preprocessor/SteadyStateModel.cc b/preprocessor/SteadyStateModel.cc index a68b2b1c3..b1385ad8f 100644 --- a/preprocessor/SteadyStateModel.cc +++ b/preprocessor/SteadyStateModel.cc @@ -270,3 +270,47 @@ SteadyStateModel::writeSteadyStateFileC(const string &basename, bool ramsey_mode static_model.writeAuxVarInitval(output, oCSteadyStateFile); output << "}" << endl; } + +void +SteadyStateModel::writeJsonSteadyStateFile(ostream &output, bool transformComputingPass) const +{ + if (def_table.size() == 0) + return; + + deriv_node_temp_terms_t tef_terms; + vector > eqtags; + temporary_terms_t tt_empty; + + output << "{\"steady_state_model\": ["; + + for (size_t i = 0; i < def_table.size(); i++) + { + const vector &symb_ids = def_table[i].first; + if (i != 0) + output << ","; + output << "{\"lhs\": "; + if (symb_ids.size() > 1) + output << "["; + for (size_t j = 0; j < symb_ids.size(); j++) + { + if (j != 0) + output << ","; + variable_node_map_t::const_iterator it = + variable_node_map.find(make_pair(symb_ids[j], 0)); + assert(it != variable_node_map.end()); + output << "\""; + dynamic_cast(it->second)->writeJsonOutput(output, tt_empty, tef_terms, false); + output << "\""; + } + if (symb_ids.size() > 1) + output << "]"; + output << ", \"rhs\":\""; + def_table[i].second->writeJsonOutput(output, tt_empty, tef_terms, false); + output << "\"}" << endl; + } + + if (transformComputingPass) + static_model.writeJsonAuxVarRecursiveDefinitions(output); + + output << "]}"; +} diff --git a/preprocessor/SteadyStateModel.hh b/preprocessor/SteadyStateModel.hh index a4b879dc0..2c3a23c5f 100644 --- a/preprocessor/SteadyStateModel.hh +++ b/preprocessor/SteadyStateModel.hh @@ -53,6 +53,8 @@ public: void writeSteadyStateFileC(const string &basename, bool ramsey_model) const; //! Writes LaTeX file with the equations of the dynamic model (for the steady state model) void writeLatexSteadyStateFile(const string &basename) const; + //! Writes JSON output + void writeJsonSteadyStateFile(ostream &output, bool transformComputingPass) const; }; #endif From 798c22fb6e92dd6b11398563369a86bb08e04461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Tue, 17 Oct 2017 17:55:09 +0200 Subject: [PATCH 5/9] Account for matlab R2017b. --- m4/ax_matlab_version.m4 | 3 +++ matlab/add_path_to_mex_files.m | 2 +- windows/dynare.nsi | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/m4/ax_matlab_version.m4 b/m4/ax_matlab_version.m4 index 6f01df9f2..603b29945 100644 --- a/m4/ax_matlab_version.m4 +++ b/m4/ax_matlab_version.m4 @@ -22,6 +22,9 @@ AC_REQUIRE([AX_MATLAB]) AC_MSG_CHECKING([for MATLAB version]) if test "x$MATLAB_VERSION" != "x"; then case $MATLAB_VERSION in + *2017b | *2017B) + MATLAB_VERSION="9.3" + ;; *2017a | *2017A) MATLAB_VERSION="9.2" ;; diff --git a/matlab/add_path_to_mex_files.m b/matlab/add_path_to_mex_files.m index 13140bba5..0e5ddc5ed 100644 --- a/matlab/add_path_to_mex_files.m +++ b/matlab/add_path_to_mex_files.m @@ -52,7 +52,7 @@ else end end else - tmp = [dynareroot '../mex/matlab/win64-7.8-9.2/']; + tmp = [dynareroot '../mex/matlab/win64-7.8-9.3/']; if exist(tmp, 'dir') mexpath = tmp; if modifypath diff --git a/windows/dynare.nsi b/windows/dynare.nsi index b9b106042..1b42f1e52 100644 --- a/windows/dynare.nsi +++ b/windows/dynare.nsi @@ -98,9 +98,9 @@ Section "MEX files for MATLAB 64-bit, version 7.5 to 7.7 (R2007b to R2008b)" File ..\mex\matlab\win64-7.5-7.7\*.mexw64 SectionEnd -Section "MEX files for MATLAB 64-bit, version 7.8 to 9.2 (R2009a to R2017a)" - SetOutPath $INSTDIR\mex\matlab\win64-7.8-9.2 - File ..\mex\matlab\win64-7.8-9.2\*.mexw64 +Section "MEX files for MATLAB 64-bit, version 7.8 to 9.3 (R2009a to R2017b)" + SetOutPath $INSTDIR\mex\matlab\win64-7.8-9.3 + File ..\mex\matlab\win64-7.8-9.3\*.mexw64 SectionEnd SectionGroupEnd From 1f5fc8a8bd8eca223829dee76e1223e4f5f076a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Wed, 18 Oct 2017 11:16:57 +0200 Subject: [PATCH 6/9] Updated NEWS for 4.5.2 release. --- NEWS | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/NEWS b/NEWS index e38acc20b..6495aa3c5 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,82 @@ +Announcement for Dynare 4.5.2 (on 2017-10-19) +============================================= + +We are pleased to announce the release of Dynare 4.5.2. + +This is a bugfix release. + +The Windows packages are already available for download at: + + http://www.dynare.org/download/dynare-stable + +The Mac and GNU/Linux packages (for Debian and Ubuntu LTS) should follow soon. + +This release is compatible with MATLAB versions 7.3 (R2006b) to 9.3 (R2017b) +and with GNU Octave versions 4.2. + +Here is a list of the problems identified in version 4.5.1 and that have been +fixed in version 4.5.2: + + + - Fixed bug in perfect foresight solver: + + + If expected shocks were declared after the terminal period, as specified + by the `periods` option, Dynare was crashing. + + + Models declared with the `linear` option were crashing if exogenous + variables were present with a lead or lag. + + - After ML or Bayesian estimation when the smoother option or `mh_replic=0` + were not specified, not all smoothed measurement errors were displayed. + + - Fixed error in reference manual about the `conditional_forecasts` command. + + - Fixed smoother behaviour, provide informative error instead of crashing when + model cannot be solved. + + - The `nopathchange` preprocessor option was always triggered, regardless of + whether it was passed or not. + + - When `ramsey_policy` is used, allow state variables to be set in `histval` + block. + + - `histval` erroneously accepted leads, leading to cryptic crashes. + + - The prior MC draws from previous runs were not deleted, potentially + resulting in loading stale files. + + - `estim_params_` was being declared `global` more than once. + + - Fixed crashes happening when simulating linear models with order>1. + + - Make empirical moments independent of `simul_replic`, as stated in the + reference manual, by outputting moments computed with the first simulated + sample. + + - The `prior_function` required a preceding `estimation`-command to properly + set up the prior. + + - If the mode for a parameter was at exactly 0, `mode_check` was crashing. + + - Fixed `get_posterior_parameters`-routine which should not do more than + getting parameters. As a consequecence, the `shock_decomposition`-command + did not correctly set the `parameter_set` for use in subsequent function + calls if shocks are correlated or measurement error is present. + + - Fixed bug in Ramsey problem with constraints both on a policy instrument and + another variable. Note that the constraint on a variable that is not an + instrument of the Ramsey problem must be written with an equation tag in the + model block. + + - Fixed bug in Ramsey problem with constraints on policy instrument. + + - Fixed crash with optimizer 5 when not used with DSGE model at order 1. + + - Fixed mex file used for third order approximation (was crashing on + Matlab/Windows 7). + + + Announcement for Dynare 4.5.1 (on 2017-08-24) ============================================= From 5cfcadf946a158c673572b6798ba780d5cee0b47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=28Charybdis=29?= Date: Thu, 19 Oct 2017 10:32:36 +0200 Subject: [PATCH 7/9] Fixed typo. --- NEWS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 6495aa3c5..24e746096 100644 --- a/NEWS +++ b/NEWS @@ -59,7 +59,7 @@ fixed in version 4.5.2: - If the mode for a parameter was at exactly 0, `mode_check` was crashing. - Fixed `get_posterior_parameters`-routine which should not do more than - getting parameters. As a consequecence, the `shock_decomposition`-command + getting parameters. As a consequense, the `shock_decomposition`-command did not correctly set the `parameter_set` for use in subsequent function calls if shocks are correlated or measurement error is present. From 43d910a6fea78d0c3e9092e0d79cd532e62f7955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Thu, 19 Oct 2017 22:54:59 +0200 Subject: [PATCH 8/9] Updated NEWS file for 4.5.3. --- NEWS | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/NEWS b/NEWS index 24e746096..15fdcd090 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,29 @@ +Announcement for Dynare 4.5.3 (on 2017-10-19) +============================================= + +We are pleased to announce the release of Dynare 4.5.3. + +This is a bugfix release. It comes less than 24 hours after the previous release, +because version 4.5.2 was affected by a critical bug for MATLAB older than R2016b. + +The Windows packages are already available for download at: + + http://www.dynare.org/download/dynare-stable + +The Mac and GNU/Linux packages (for Debian and Ubuntu LTS) should follow soon. + +This release is compatible with MATLAB versions 7.3 (R2006b) to 9.3 (R2017b) +and with GNU Octave versions 4.2. + +Here is a list of the problems identified in version 4.5.1 and that have been +fixed in version 4.5.2: + + + - `isfile` routine was failing with matlab older than R2016b. This bug did not + affect Octave. + + + Announcement for Dynare 4.5.2 (on 2017-10-19) ============================================= From d57b072390c2696a1a37b56c705910e0c6efa226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemian=20=28Charybdis=29?= Date: Thu, 19 Oct 2017 23:48:48 +0200 Subject: [PATCH 9/9] Fixed typos. --- NEWS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 15fdcd090..8cec1a2f2 100644 --- a/NEWS +++ b/NEWS @@ -15,8 +15,8 @@ The Mac and GNU/Linux packages (for Debian and Ubuntu LTS) should follow soon. This release is compatible with MATLAB versions 7.3 (R2006b) to 9.3 (R2017b) and with GNU Octave versions 4.2. -Here is a list of the problems identified in version 4.5.1 and that have been -fixed in version 4.5.2: +Here is a list of the problems identified in version 4.5.2 and that have been +fixed in version 4.5.3: - `isfile` routine was failing with matlab older than R2016b. This bug did not