JSON: simplification of method for writing temporary terms

issue#70
Sébastien Villemot 2019-04-18 14:34:48 +02:00
parent 489b4e840c
commit 43906691d3
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
4 changed files with 48 additions and 77 deletions

View File

@ -6785,24 +6785,18 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
ostringstream third_derivatives_output; // Used for storing third order derivatives equations
deriv_node_temp_terms_t tef_terms;
temporary_terms_t temp_term_empty;
temporary_terms_t temp_term_union = temporary_terms_derivatives[0];
temporary_terms_t temp_term_union_m_1;
temporary_terms_t temp_term_union;
string concat = "";
int hessianColsNbr = dynJacobianColsNbr * dynJacobianColsNbr;
writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union_m_1, model_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union, model_output, tef_terms, "");
model_output << ", ";
writeJsonModelEquations(model_output, true);
// Writing Jacobian
temp_term_union_m_1 = temp_term_union;
temp_term_union.insert(temporary_terms_derivatives[1].begin(), temporary_terms_derivatives[1].end());
concat = "jacobian";
writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, jacobian_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[1], temp_term_union, jacobian_output, tef_terms, "jacobian");
jacobian_output << R"(, "jacobian": {)"
<< R"( "nrows": )" << equations.size()
<< R"(, "ncols": )" << dynJacobianColsNbr
@ -6836,10 +6830,7 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
jacobian_output << "]}";
// Writing Hessian
temp_term_union_m_1 = temp_term_union;
temp_term_union.insert(temporary_terms_derivatives[2].begin(), temporary_terms_derivatives[2].end());
concat = "hessian";
writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, hessian_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[2], temp_term_union, hessian_output, tef_terms, "hessian");
hessian_output << R"(, "hessian": {)"
<< R"( "nrows": )" << equations.size()
<< R"(, "ncols": )" << hessianColsNbr
@ -6881,10 +6872,7 @@ DynamicModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) c
hessian_output << "]}";
// Writing third derivatives
temp_term_union_m_1 = temp_term_union;
temp_term_union.insert(temporary_terms_derivatives[3].begin(), temporary_terms_derivatives[3].end());
concat = "third_derivatives";
writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, third_derivatives_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[3], temp_term_union, third_derivatives_output, tef_terms, "third_derivatives");
third_derivatives_output << R"(, "third_derivative": {)"
<< R"( "nrows": )" << equations.size()
<< R"(, "ncols": )" << hessianColsNbr * dynJacobianColsNbr
@ -6968,9 +6956,8 @@ DynamicModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
temporary_terms_t temp_term_union;
string concat = "all";
for (const auto &it : params_derivs_temporary_terms)
writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, concat);
writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, "all");
jacobian_output << R"("deriv_wrt_params": {)"
<< R"( "neqs": )" << equations.size()

View File

@ -1433,55 +1433,52 @@ ModelTree::writeTemporaryTerms(const temporary_terms_t &tt,
}
void
ModelTree::writeJsonTemporaryTerms(const temporary_terms_t &tt, const temporary_terms_t &ttm1, ostream &output,
deriv_node_temp_terms_t &tef_terms, string &concat) const
ModelTree::writeJsonTemporaryTerms(const temporary_terms_t &tt,
temporary_terms_t &temp_term_union,
ostream &output,
deriv_node_temp_terms_t &tef_terms, const string &concat) const
{
// Local var used to keep track of temp nodes already written
bool wrote_term = false;
temporary_terms_t tt2 = ttm1;
temporary_terms_t tt2 = temp_term_union;
output << R"("external_functions_temporary_terms_)" << concat << R"(": [)";
for (auto it : tt)
if (ttm1.find(it) == ttm1.end())
{
if (dynamic_cast<AbstractExternalFunctionNode *>(it) != nullptr)
{
if (wrote_term)
output << ", ";
vector<string> efout;
it->writeJsonExternalFunctionOutput(efout, tt2, tef_terms);
for (vector<string>::const_iterator it1 = efout.begin(); it1 != efout.end(); it1++)
{
if (it1 != efout.begin())
output << ", ";
output << *it1;
}
wrote_term = true;
}
tt2.insert(it);
}
{
if (dynamic_cast<AbstractExternalFunctionNode *>(it) != nullptr)
{
if (wrote_term)
output << ", ";
vector<string> efout;
it->writeJsonExternalFunctionOutput(efout, tt2, tef_terms);
for (auto it1 = efout.begin(); it1 != efout.end(); ++it1)
{
if (it1 != efout.begin())
output << ", ";
output << *it1;
}
wrote_term = true;
}
tt2.insert(it);
}
tt2 = ttm1;
wrote_term = false;
output << "]"
<< R"(, "temporary_terms_)" << concat << R"(": [)";
for (auto it = tt.begin();
it != tt.end(); it++)
if (ttm1.find(*it) == ttm1.end())
{
if (wrote_term)
output << ", ";
output << R"({"temporary_term": ")";
(*it)->writeJsonOutput(output, tt, tef_terms);
output << R"(")"
<< R"(, "value": ")";
(*it)->writeJsonOutput(output, tt2, tef_terms);
output << R"("})" << endl;
wrote_term = true;
for (const auto &it : tt)
{
if (wrote_term)
output << ", ";
output << R"({"temporary_term": ")";
it->writeJsonOutput(output, tt, tef_terms);
output << R"(")"
<< R"(, "value": ")";
it->writeJsonOutput(output, temp_term_union, tef_terms);
output << R"("})" << endl;
wrote_term = true;
// Insert current node into tt2
tt2.insert(*it);
}
temp_term_union.insert(it);
}
output << "]";
}

View File

@ -162,7 +162,7 @@ protected:
void computeParamsDerivativesTemporaryTerms();
//! Writes temporary terms
void writeTemporaryTerms(const temporary_terms_t &tt, temporary_terms_t &temp_term_union, const temporary_terms_idxs_t &tt_idxs, ostream &output, ExprNodeOutputType output_type, deriv_node_temp_terms_t &tef_terms) const;
void writeJsonTemporaryTerms(const temporary_terms_t &tt, const temporary_terms_t &ttm1, ostream &output, deriv_node_temp_terms_t &tef_terms, string &concat) const;
void writeJsonTemporaryTerms(const temporary_terms_t &tt, temporary_terms_t &temp_term_union, ostream &output, deriv_node_temp_terms_t &tef_terms, const string &concat) const;
//! Compiles temporary terms
void compileTemporaryTerms(ostream &code_file, unsigned int &instruction_number, const temporary_terms_t &tt, map_idx_t map_idx, bool dynamic, bool steady_dynamic) const;
//! Adds informations for simulation in a binary file

View File

@ -2815,14 +2815,11 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
ostringstream third_derivatives_output; // Used for storing third order derivatives equations
deriv_node_temp_terms_t tef_terms;
temporary_terms_t temp_term_union = temporary_terms_derivatives[0];
temporary_terms_t temp_term_union_m_1;
string concat = "";
temporary_terms_t temp_term_union;
writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union_m_1, model_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[0], temp_term_union, model_output, tef_terms, "");
model_output << ", ";
writeJsonModelEquations(model_output, true);
@ -2831,10 +2828,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
int hessianColsNbr = JacobianColsNbr*JacobianColsNbr;
// Write Jacobian w.r. to endogenous only
temp_term_union_m_1 = temp_term_union;
temp_term_union.insert(temporary_terms_derivatives[1].begin(), temporary_terms_derivatives[1].end());
concat = "jacobian";
writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, jacobian_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[1], temp_term_union, jacobian_output, tef_terms, "jacobian");
jacobian_output << R"(, "jacobian": {)"
<< R"( "nrows": )" << nrows
<< R"(, "ncols": )" << JacobianColsNbr
@ -2868,10 +2862,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
jacobian_output << "]}";
// Write Hessian w.r. to endogenous only (only if 2nd order derivatives have been computed)
temp_term_union_m_1 = temp_term_union;
temp_term_union.insert(temporary_terms_derivatives[2].begin(), temporary_terms_derivatives[2].end());
concat = "hessian";
writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, hessian_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[2], temp_term_union, hessian_output, tef_terms, "hessian");
hessian_output << R"(, "hessian": {)"
<< R"( "nrows": )" << equations.size()
<< R"(, "ncols": )" << hessianColsNbr
@ -2915,10 +2906,7 @@ StaticModel::writeJsonComputingPassOutput(ostream &output, bool writeDetails) co
hessian_output << "]}";
// Writing third derivatives
temp_term_union_m_1 = temp_term_union;
temp_term_union.insert(temporary_terms_derivatives[3].begin(), temporary_terms_derivatives[3].end());
concat = "third_derivatives";
writeJsonTemporaryTerms(temp_term_union, temp_term_union_m_1, third_derivatives_output, tef_terms, concat);
writeJsonTemporaryTerms(temporary_terms_derivatives[3], temp_term_union, third_derivatives_output, tef_terms, "third_derivatives");
third_derivatives_output << R"(, "third_derivative": {)"
<< R"( "nrows": )" << equations.size()
<< R"(, "ncols": )" << hessianColsNbr * JacobianColsNbr
@ -2999,9 +2987,8 @@ StaticModel::writeJsonParamsDerivativesFile(ostream &output, bool writeDetails)
writeJsonModelLocalVariables(model_local_vars_output, tef_terms);
temporary_terms_t temp_term_union;
string concat = "all";
for (const auto &it : params_derivs_temporary_terms)
writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, concat);
writeJsonTemporaryTerms(it.second, temp_term_union, model_output, tef_terms, "all");
jacobian_output << R"("deriv_wrt_params": {)"
<< R"( "neqs": )" << equations.size()