Julia: remove driver file

The Julia code now uses the JSON output for retrieving the information that
previously was in the driver file.
issue#70
Sébastien Villemot 2021-04-19 14:51:34 +02:00
parent 7b3df21f11
commit c2d47fb48e
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
11 changed files with 171 additions and 485 deletions

View File

@ -2527,67 +2527,67 @@ DynamicModel::includeExcludeEquations(const string &eqs, bool exclude_eqs)
} }
void void
DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename, const string &modstruct, DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename,
const vector<int> &state_var, bool estimation_present) const const vector<int> &state_var, bool estimation_present) const
{ {
for (int blk = 0; blk < static_cast<int>(blocks.size()); blk++) for (int blk = 0; blk < static_cast<int>(blocks.size()); blk++)
{ {
int block_size = blocks[blk].size; int block_size = blocks[blk].size;
output << modstruct << "block_structure.block(" << blk+1 << ").Simulation_Type = " << static_cast<int>(blocks[blk].simulation_type) << ";" << endl output << "M_.block_structure.block(" << blk+1 << ").Simulation_Type = " << static_cast<int>(blocks[blk].simulation_type) << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_lag = " << blocks[blk].max_lag << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_lag = " << blocks[blk].max_lag << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_lead = " << blocks[blk].max_lead << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_lead = " << blocks[blk].max_lead << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_endo_lag = " << blocks[blk].max_endo_lag << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_endo_lag = " << blocks[blk].max_endo_lag << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_endo_lead = " << blocks[blk].max_endo_lead << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_endo_lead = " << blocks[blk].max_endo_lead << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_exo_lag = " << blocks[blk].max_exo_lag << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_exo_lag = " << blocks[blk].max_exo_lag << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_exo_lead = " << blocks[blk].max_exo_lead << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_exo_lead = " << blocks[blk].max_exo_lead << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_exo_det_lag = " << blocks[blk].max_exo_det_lag << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_exo_det_lag = " << blocks[blk].max_exo_det_lag << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").maximum_exo_det_lead = " << blocks[blk].max_exo_det_lead << ";" << endl << "M_.block_structure.block(" << blk+1 << ").maximum_exo_det_lead = " << blocks[blk].max_exo_det_lead << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").endo_nbr = " << block_size << ";" << endl << "M_.block_structure.block(" << blk+1 << ").endo_nbr = " << block_size << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").mfs = " << blocks[blk].mfs_size << ";" << endl << "M_.block_structure.block(" << blk+1 << ").mfs = " << blocks[blk].mfs_size << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").equation = ["; << "M_.block_structure.block(" << blk+1 << ").equation = [";
for (int eq = 0; eq < block_size; eq++) for (int eq = 0; eq < block_size; eq++)
output << " " << getBlockEquationID(blk, eq)+1; output << " " << getBlockEquationID(blk, eq)+1;
output << "];" << endl output << "];" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").variable = ["; << "M_.block_structure.block(" << blk+1 << ").variable = [";
for (int var = 0; var < block_size; var++) for (int var = 0; var < block_size; var++)
output << " " << getBlockVariableID(blk, var)+1; output << " " << getBlockVariableID(blk, var)+1;
output << "];" << endl output << "];" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").exogenous = ["; << "M_.block_structure.block(" << blk+1 << ").exogenous = [";
for (int exo : blocks_exo[blk]) for (int exo : blocks_exo[blk])
output << " " << exo+1; output << " " << exo+1;
output << "];" << endl output << "];" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").exo_nbr = " << blocks_exo[blk].size() << ";" << endl << "M_.block_structure.block(" << blk+1 << ").exo_nbr = " << blocks_exo[blk].size() << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").exogenous_det = ["; << "M_.block_structure.block(" << blk+1 << ").exogenous_det = [";
for (int exo_det : blocks_exo_det[blk]) for (int exo_det : blocks_exo_det[blk])
output << " " << exo_det+1; output << " " << exo_det+1;
output << "];" << endl output << "];" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").exo_det_nbr = " << blocks_exo_det[blk].size() << ";" << endl << "M_.block_structure.block(" << blk+1 << ").exo_det_nbr = " << blocks_exo_det[blk].size() << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").other_endogenous = ["; << "M_.block_structure.block(" << blk+1 << ").other_endogenous = [";
for (int other_endo : blocks_other_endo[blk]) for (int other_endo : blocks_other_endo[blk])
output << " " << other_endo+1; output << " " << other_endo+1;
output << "];" << endl output << "];" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").other_endogenous_block = ["; << "M_.block_structure.block(" << blk+1 << ").other_endogenous_block = [";
for (int other_endo : blocks_other_endo[blk]) for (int other_endo : blocks_other_endo[blk])
output << " " << endo2block[other_endo]+1; output << " " << endo2block[other_endo]+1;
output << "];" << endl; output << "];" << endl;
output << modstruct << "block_structure.block(" << blk+1 << ").tm1 = zeros(" << blocks_other_endo[blk].size() << ", " << state_var.size() << ");" << endl; output << "M_.block_structure.block(" << blk+1 << ").tm1 = zeros(" << blocks_other_endo[blk].size() << ", " << state_var.size() << ");" << endl;
int line = 1; int line = 1;
for (auto other_endo : blocks_other_endo[blk]) for (auto other_endo : blocks_other_endo[blk])
{ {
if (auto it = find(state_var.begin(), state_var.end(), other_endo); if (auto it = find(state_var.begin(), state_var.end(), other_endo);
it != state_var.end()) it != state_var.end())
output << modstruct << "block_structure.block(" << blk+1 << ").tm1(" output << "M_.block_structure.block(" << blk+1 << ").tm1("
<< line << ", " << line << ", "
<< distance(state_var.begin(), it)+1 << ") = 1;" << endl; << distance(state_var.begin(), it)+1 << ") = 1;" << endl;
line++; line++;
} }
output << modstruct << "block_structure.block(" << blk+1 << ").other_endo_nbr = " << blocks_other_endo[blk].size() << ";" << endl; output << "M_.block_structure.block(" << blk+1 << ").other_endo_nbr = " << blocks_other_endo[blk].size() << ";" << endl;
int count_lead_lag_incidence = 0; int count_lead_lag_incidence = 0;
vector<int> local_state_var; vector<int> local_state_var;
output << modstruct << "block_structure.block(" << blk+1 << ").lead_lag_incidence = [" << endl; output << "M_.block_structure.block(" << blk+1 << ").lead_lag_incidence = [" << endl;
for (int lag = -1; lag <= 1; lag++) for (int lag = -1; lag <= 1; lag++)
{ {
for (int var = 0; var < block_size; var++) for (int var = 0; var < block_size; var++)
@ -2609,13 +2609,13 @@ DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename, co
} }
output << "];" << endl; output << "];" << endl;
output << modstruct << "block_structure.block(" << blk+1 << ").sorted_col_dr_ghx = ["; output << "M_.block_structure.block(" << blk+1 << ").sorted_col_dr_ghx = [";
for (int lsv : local_state_var) for (int lsv : local_state_var)
output << distance(state_var.begin(), find(state_var.begin(), state_var.end(), lsv))+1 << " "; output << distance(state_var.begin(), find(state_var.begin(), state_var.end(), lsv))+1 << " ";
output << "];" << endl; output << "];" << endl;
count_lead_lag_incidence = 0; count_lead_lag_incidence = 0;
output << modstruct << "block_structure.block(" << blk+1 << ").lead_lag_incidence_other = [" << endl; output << "M_.block_structure.block(" << blk+1 << ").lead_lag_incidence_other = [" << endl;
for (int lag = -1; lag <= 1; lag++) for (int lag = -1; lag <= 1; lag++)
{ {
for (int other_endo : blocks_other_endo[blk]) for (int other_endo : blocks_other_endo[blk])
@ -2635,19 +2635,19 @@ DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename, co
} }
output << "];" << endl; output << "];" << endl;
output << modstruct << "block_structure.block(" << blk+1 << ").n_static = " << blocks[blk].n_static << ";" << endl output << "M_.block_structure.block(" << blk+1 << ").n_static = " << blocks[blk].n_static << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").n_forward = " << blocks[blk].n_forward << ";" << endl << "M_.block_structure.block(" << blk+1 << ").n_forward = " << blocks[blk].n_forward << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").n_backward = " << blocks[blk].n_backward << ";" << endl << "M_.block_structure.block(" << blk+1 << ").n_backward = " << blocks[blk].n_backward << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").n_mixed = " << blocks[blk].n_mixed << ";" << endl << "M_.block_structure.block(" << blk+1 << ").n_mixed = " << blocks[blk].n_mixed << ";" << endl
<< modstruct << "block_structure.block(" << blk+1 << ").is_linear = " << (blocks[blk].linear ? "true" : "false" ) << ';' << endl << "M_.block_structure.block(" << blk+1 << ").is_linear = " << (blocks[blk].linear ? "true" : "false" ) << ';' << endl
<< modstruct << "block_structure.block(" << blk+1 << ").NNZDerivatives = " << blocks_derivatives[blk].size() << ';' << endl; << "M_.block_structure.block(" << blk+1 << ").NNZDerivatives = " << blocks_derivatives[blk].size() << ';' << endl;
} }
output << modstruct << "block_structure.variable_reordered = ["; output << "M_.block_structure.variable_reordered = [";
for (int i = 0; i < symbol_table.endo_nbr(); i++) for (int i = 0; i < symbol_table.endo_nbr(); i++)
output << " " << endo_idx_block2orig[i]+1; output << " " << endo_idx_block2orig[i]+1;
output << "];" << endl output << "];" << endl
<< modstruct << "block_structure.equation_reordered = ["; << "M_.block_structure.equation_reordered = [";
for (int i = 0; i < symbol_table.endo_nbr(); i++) for (int i = 0; i < symbol_table.endo_nbr(); i++)
output << " " << eq_idx_block2orig[i]+1; output << " " << eq_idx_block2orig[i]+1;
output << "];" << endl; output << "];" << endl;
@ -2664,13 +2664,13 @@ DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename, co
} }
for (auto [lag, eq_var_set] : lag_row_incidence) for (auto [lag, eq_var_set] : lag_row_incidence)
{ {
output << modstruct << "block_structure.incidence(" << max_endo_lag+lag+1 << ").lead_lag = " << lag << ";" << endl output << "M_.block_structure.incidence(" << max_endo_lag+lag+1 << ").lead_lag = " << lag << ";" << endl
<< modstruct << "block_structure.incidence(" << max_endo_lag+lag+1 << ").sparse_IM = [" << endl; << "M_.block_structure.incidence(" << max_endo_lag+lag+1 << ").sparse_IM = [" << endl;
for (auto [eq, var] : eq_var_set) for (auto [eq, var] : eq_var_set)
output << " " << eq+1 << " " << var+1 << ";" << endl; output << " " << eq+1 << " " << var+1 << ";" << endl;
output << "];" << endl; output << "];" << endl;
} }
output << modstruct << "block_structure.dyn_tmp_nbr = " << blocks_temporary_terms_idxs.size() << ';' << endl; output << "M_.block_structure.dyn_tmp_nbr = " << blocks_temporary_terms_idxs.size() << ';' << endl;
if (estimation_present) if (estimation_present)
{ {
@ -2685,7 +2685,7 @@ DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename, co
n_obs--; n_obs--;
int n = n_obs + n_state; int n = n_obs + n_state;
output << modstruct << "nobs_non_statevar = " << n_obs << ";" << endl; output << "M_.nobs_non_statevar = " << n_obs << ";" << endl;
int nb_diag = 0; int nb_diag = 0;
vector<int> i_nz_state_var(n); vector<int> i_nz_state_var(n);
@ -2754,11 +2754,11 @@ DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename, co
i_nz_state_var[lp + i] = lp + nze; i_nz_state_var[lp + i] = lp + nze;
lp += nze; lp += nze;
} }
output << modstruct << "nz_state_var = ["; output << "M_.nz_state_var = [";
for (int i = 0; i < lp; i++) for (int i = 0; i < lp; i++)
output << i_nz_state_var[i] << " "; output << i_nz_state_var[i] << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "n_diag = " << nb_diag << ";" << endl; << "M_.n_diag = " << nb_diag << ";" << endl;
KF_index_file.write(reinterpret_cast<char *>(&nb_diag), sizeof(nb_diag)); KF_index_file.write(reinterpret_cast<char *>(&nb_diag), sizeof(nb_diag));
using index_KF = pair<int, pair<int, int >>; using index_KF = pair<int, pair<int, int >>;
@ -2798,7 +2798,7 @@ DynamicModel::writeBlockDriverOutput(ostream &output, const string &basename, co
} }
void void
DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool block_decomposition, bool use_dll, bool estimation_present, bool compute_xrefs, bool julia) const DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool block_decomposition, bool use_dll, bool estimation_present, bool compute_xrefs) const
{ {
/* Writing initialisation for M_.lead_lag_incidence matrix /* Writing initialisation for M_.lead_lag_incidence matrix
M_.lead_lag_incidence is a matrix with as many columns as there are M_.lead_lag_incidence is a matrix with as many columns as there are
@ -2809,28 +2809,16 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
model at a given period. model at a given period.
*/ */
string modstruct, outstruct; output << "M_.orig_maximum_endo_lag = " << max_endo_lag_orig << ";" << endl
if (julia) << "M_.orig_maximum_endo_lead = " << max_endo_lead_orig << ";" << endl
{ << "M_.orig_maximum_exo_lag = " << max_exo_lag_orig << ";" << endl
modstruct = "model_."; << "M_.orig_maximum_exo_lead = " << max_exo_lead_orig << ";" << endl
outstruct = "oo_."; << "M_.orig_maximum_exo_det_lag = " << max_exo_det_lag_orig << ";" << endl
} << "M_.orig_maximum_exo_det_lead = " << max_exo_det_lead_orig << ";" << endl
else << "M_.orig_maximum_lag = " << max_lag_orig << ";" << endl
{ << "M_.orig_maximum_lead = " << max_lead_orig << ";" << endl
modstruct = "M_."; << "M_.orig_maximum_lag_with_diffs_expanded = " << max_lag_with_diffs_expanded_orig << ";" << endl
outstruct = "oo_."; << "M_.lead_lag_incidence = [";
}
output << modstruct << "orig_maximum_endo_lag = " << max_endo_lag_orig << ";" << endl
<< modstruct << "orig_maximum_endo_lead = " << max_endo_lead_orig << ";" << endl
<< modstruct << "orig_maximum_exo_lag = " << max_exo_lag_orig << ";" << endl
<< modstruct << "orig_maximum_exo_lead = " << max_exo_lead_orig << ";" << endl
<< modstruct << "orig_maximum_exo_det_lag = " << max_exo_det_lag_orig << ";" << endl
<< modstruct << "orig_maximum_exo_det_lead = " << max_exo_det_lead_orig << ";" << endl
<< modstruct << "orig_maximum_lag = " << max_lag_orig << ";" << endl
<< modstruct << "orig_maximum_lead = " << max_lead_orig << ";" << endl
<< modstruct << "orig_maximum_lag_with_diffs_expanded = " << max_lag_with_diffs_expanded_orig << ";" << endl
<< modstruct << "lead_lag_incidence = [";
// Loop on endogenous variables // Loop on endogenous variables
int nstatic = 0, int nstatic = 0,
nfwrd = 0, nfwrd = 0,
@ -2882,63 +2870,45 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
output << ";"; output << ";";
} }
output << "]';" << endl; output << "]';" << endl;
output << modstruct << "nstatic = " << nstatic << ";" << endl output << "M_.nstatic = " << nstatic << ";" << endl
<< modstruct << "nfwrd = " << nfwrd << ";" << endl << "M_.nfwrd = " << nfwrd << ";" << endl
<< modstruct << "npred = " << npred << ";" << endl << "M_.npred = " << npred << ";" << endl
<< modstruct << "nboth = " << nboth << ";" << endl << "M_.nboth = " << nboth << ";" << endl
<< modstruct << "nsfwrd = " << nfwrd+nboth << ";" << endl << "M_.nsfwrd = " << nfwrd+nboth << ";" << endl
<< modstruct << "nspred = " << npred+nboth << ";" << endl << "M_.nspred = " << npred+nboth << ";" << endl
<< modstruct << "ndynamic = " << npred+nboth+nfwrd << ";" << endl; << "M_.ndynamic = " << npred+nboth+nfwrd << ";" << endl;
if (!julia)
{ output << "M_.dynamic_tmp_nbr = [";
output << modstruct << "dynamic_tmp_nbr = [";
for (size_t i = 0; i < temporary_terms_derivatives.size(); i++) for (size_t i = 0; i < temporary_terms_derivatives.size(); i++)
output << temporary_terms_derivatives[i].size() + (i == 0 ? temporary_terms_mlv.size() : 0) << "; "; output << temporary_terms_derivatives[i].size() + (i == 0 ? temporary_terms_mlv.size() : 0) << "; ";
output << "];" << endl; output << "];" << endl;
/* Write mapping between model local variables and indices in the temporary /* Write mapping between model local variables and indices in the temporary
terms vector (dynare#1722) */ terms vector (dynare#1722) */
output << modstruct << "model_local_variables_dynamic_tt_idxs = {" << endl; output << "M_.model_local_variables_dynamic_tt_idxs = {" << endl;
for (auto [mlv, value] : temporary_terms_mlv) for (auto [mlv, value] : temporary_terms_mlv)
output << " '" << symbol_table.getName(mlv->symb_id) << "', " output << " '" << symbol_table.getName(mlv->symb_id) << "', "
<< temporary_terms_idxs.at(mlv)+1 << ';' << endl; << temporary_terms_idxs.at(mlv)+1 << ';' << endl;
output << "};" << endl; output << "};" << endl;
}
// Write equation tags // Write equation tags
equation_tags.writeOutput(output, modstruct, julia); equation_tags.writeOutput(output);
// Write Occbin tags // Write Occbin tags
equation_tags.writeOccbinOutput(output, modstruct, julia); equation_tags.writeOccbinOutput(output);
// Write mapping for variables and equations they are present in // Write mapping for variables and equations they are present in
if (!julia)
for (const auto &variable : variableMapping) for (const auto &variable : variableMapping)
{ {
output << modstruct << "mapping." << symbol_table.getName(variable.first) << ".eqidx = ["; output << "M_.mapping." << symbol_table.getName(variable.first) << ".eqidx = [";
for (auto equation : variable.second) for (auto equation : variable.second)
output << equation + 1 << " "; output << equation + 1 << " ";
output << "];" << endl; output << "];" << endl;
} }
else
{
output << modstruct << "mapping = Dict(\n";
for (const auto &variable : variableMapping)
{
output << " \""
<< symbol_table.getName(variable.first)
<< "\" => [";
for (auto equation : variable.second)
output << equation + 1 << ", ";
output << "]," << endl;
}
output << ")" << endl;
}
/* Say if static and dynamic models differ (because of [static] and [dynamic] /* Say if static and dynamic models differ (because of [static] and [dynamic]
equation tags) */ equation tags) */
output << modstruct << "static_and_dynamic_models_differ = " output << "M_.static_and_dynamic_models_differ = "
<< (static_only_equations.size() > 0 ? "true" : "false") << (static_only_equations.size() > 0 ? "true" : "false")
<< ";" << endl; << ";" << endl;
@ -2950,7 +2920,7 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
has_external_function = true; has_external_function = true;
break; break;
} }
output << modstruct << "has_external_function = " output << "M_.has_external_function = "
<< (has_external_function ? "true" : "false") << (has_external_function ? "true" : "false")
<< ';' << endl; << ';' << endl;
@ -2971,45 +2941,38 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
// Write the block structure of the model // Write the block structure of the model
if (block_decomposition) if (block_decomposition)
writeBlockDriverOutput(output, basename, modstruct, state_var, estimation_present); writeBlockDriverOutput(output, basename, state_var, estimation_present);
output << modstruct << "state_var = ["; output << "M_.state_var = [";
for (int it : state_var) for (int it : state_var)
output << it+1 << (julia ? "," : " "); output << it+1 << " ";
output << "];" << endl; output << "];" << endl;
// Writing initialization for some other variables // Writing initialization for some other variables
if (!julia) output << "M_.exo_names_orig_ord = [1:" << symbol_table.exo_nbr() << "];" << endl;
output << modstruct << "exo_names_orig_ord = [1:" << symbol_table.exo_nbr() << "];" << endl;
else
output << modstruct << "exo_names_orig_ord = collect(1:" << symbol_table.exo_nbr() << ");" << endl;
output << modstruct << "maximum_lag = " << max_lag << ";" << endl output << "M_.maximum_lag = " << max_lag << ";" << endl
<< modstruct << "maximum_lead = " << max_lead << ";" << endl; << "M_.maximum_lead = " << max_lead << ";" << endl;
output << modstruct << "maximum_endo_lag = " << max_endo_lag << ";" << endl output << "M_.maximum_endo_lag = " << max_endo_lag << ";" << endl
<< modstruct << "maximum_endo_lead = " << max_endo_lead << ";" << endl << "M_.maximum_endo_lead = " << max_endo_lead << ";" << endl
<< outstruct << "steady_state = zeros(" << symbol_table.endo_nbr() << (julia ? ")" : ", 1);") << endl; << "oo_.steady_state = zeros(" << symbol_table.endo_nbr() << ", 1);" << endl;
output << modstruct << "maximum_exo_lag = " << max_exo_lag << ";" << endl output << "M_.maximum_exo_lag = " << max_exo_lag << ";" << endl
<< modstruct << "maximum_exo_lead = " << max_exo_lead << ";" << endl << "M_.maximum_exo_lead = " << max_exo_lead << ";" << endl
<< outstruct << "exo_steady_state = zeros(" << symbol_table.exo_nbr() << (julia ? ")" : ", 1);") << endl; << "oo_.exo_steady_state = zeros(" << symbol_table.exo_nbr() << ", 1);" << endl;
if (symbol_table.exo_det_nbr()) if (symbol_table.exo_det_nbr())
{ {
output << modstruct << "maximum_exo_det_lag = " << max_exo_det_lag << ";" << endl output << "M_.maximum_exo_det_lag = " << max_exo_det_lag << ";" << endl
<< modstruct << "maximum_exo_det_lead = " << max_exo_det_lead << ";" << endl << "M_.maximum_exo_det_lead = " << max_exo_det_lead << ";" << endl
<< outstruct << "exo_det_steady_state = zeros(" << symbol_table.exo_det_nbr() << (julia ? ")" : ", 1);") << endl; << "oo_.exo_det_steady_state = zeros(" << symbol_table.exo_det_nbr() << ", 1);" << endl;
} }
output << modstruct << "params = " << (julia ? "fill(NaN, " : "NaN(") output << "M_.params = " << "NaN(" << symbol_table.param_nbr() << ", 1);" << endl;
<< symbol_table.param_nbr() << (julia ? ")" : ", 1);") << endl;
// FIXME: implement this for Julia
if (!julia)
{
string empty_cell = "cell(" + to_string(symbol_table.endo_nbr()) + ", 1)"; string empty_cell = "cell(" + to_string(symbol_table.endo_nbr()) + ", 1)";
output << modstruct << "endo_trends = struct('deflator', " << empty_cell output << "M_.endo_trends = struct('deflator', " << empty_cell
<< ", 'log_deflator', " << empty_cell << ", 'growth_factor', " << empty_cell << ", 'log_deflator', " << empty_cell << ", 'growth_factor', " << empty_cell
<< ", 'log_growth_factor', " << empty_cell << ");" << endl; << ", 'log_growth_factor', " << empty_cell << ");" << endl;
for (int i = 0; i < symbol_table.endo_nbr(); i++) for (int i = 0; i < symbol_table.endo_nbr(); i++)
@ -3018,26 +2981,25 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
if (auto it = nonstationary_symbols_map.find(symb_id); it != nonstationary_symbols_map.end()) if (auto it = nonstationary_symbols_map.find(symb_id); it != nonstationary_symbols_map.end())
{ {
auto [is_log, deflator] = it->second; auto [is_log, deflator] = it->second;
output << modstruct << "endo_trends(" << i << ")." output << "M_.endo_trends(" << i << ")."
<< (is_log ? "log_deflator" : "deflator") << " = '"; << (is_log ? "log_deflator" : "deflator") << " = '";
deflator->writeJsonOutput(output, {}, {}); deflator->writeJsonOutput(output, {}, {});
output << "';" << endl; output << "';" << endl;
auto growth_factor = const_cast<DynamicModel *>(this)->AddDivide(deflator, deflator->decreaseLeadsLags(1))->removeTrendLeadLag(trend_symbols_map)->replaceTrendVar(); auto growth_factor = const_cast<DynamicModel *>(this)->AddDivide(deflator, deflator->decreaseLeadsLags(1))->removeTrendLeadLag(trend_symbols_map)->replaceTrendVar();
output << modstruct << "endo_trends(" << i << ")." output << "M_.endo_trends(" << i << ")."
<< (is_log ? "log_growth_factor" : "growth_factor") << " = '"; << (is_log ? "log_growth_factor" : "growth_factor") << " = '";
growth_factor->writeJsonOutput(output, {}, {}); growth_factor->writeJsonOutput(output, {}, {});
output << "';" << endl; output << "';" << endl;
} }
} }
}
if (compute_xrefs) if (compute_xrefs)
writeXrefs(output); writeXrefs(output);
// Write number of non-zero derivatives // Write number of non-zero derivatives
// Use -1 if the derivatives have not been computed // Use -1 if the derivatives have not been computed
output << modstruct << (julia ? "nnzderivatives" : "NNZDerivatives") << " = ["; output << "M_.NNZDerivatives = [";
for (int i = 1; i < static_cast<int>(NNZDerivatives.size()); i++) for (int i = 1; i < static_cast<int>(NNZDerivatives.size()); i++)
output << (i > computed_derivs_order ? -1 : NNZDerivatives[i]) << "; "; output << (i > computed_derivs_order ? -1 : NNZDerivatives[i]) << "; ";
output << "];" << endl; output << "];" << endl;
@ -3045,7 +3007,7 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
// Write Pac Model Consistent Expectation parameter info // Write Pac Model Consistent Expectation parameter info
for (auto &it : pac_mce_alpha_symb_ids) for (auto &it : pac_mce_alpha_symb_ids)
{ {
output << modstruct << "pac." << it.first.first << ".equations." << it.first.second << ".mce.alpha = ["; output << "M_.pac." << it.first.first << ".equations." << it.first.second << ".mce.alpha = [";
for (auto it : it.second) for (auto it : it.second)
output << symbol_table.getTypeSpecificID(it) + 1 << " "; output << symbol_table.getTypeSpecificID(it) + 1 << " ";
output << "];" << endl; output << "];" << endl;
@ -3053,12 +3015,12 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
// Write Pac Model Consistent Expectation Z1 info // Write Pac Model Consistent Expectation Z1 info
for (auto &it : pac_mce_z1_symb_ids) for (auto &it : pac_mce_z1_symb_ids)
output << modstruct << "pac." << it.first.first << ".equations." << it.first.second << ".mce.z1 = " output << "M_.pac." << it.first.first << ".equations." << it.first.second << ".mce.z1 = "
<< symbol_table.getTypeSpecificID(it.second) + 1 << ";" << endl; << symbol_table.getTypeSpecificID(it.second) + 1 << ";" << endl;
// Write Pac lag info // Write Pac lag info
for (auto &it : pac_eqtag_and_lag) for (auto &it : pac_eqtag_and_lag)
output << modstruct << "pac." << it.first.first << ".equations." << it.second.first << ".max_lag = " << it.second.second << ";" << endl; output << "M_.pac." << it.first.first << ".equations." << it.second.first << ".max_lag = " << it.second.second << ";" << endl;
// Write Pac equation tag info // Write Pac equation tag info
map<string, vector<pair<string, string>>> for_writing; map<string, vector<pair<string, string>>> for_writing;
@ -3067,7 +3029,7 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
for (auto &it : for_writing) for (auto &it : for_writing)
{ {
output << modstruct << "pac." << it.first << ".tag_map = ["; output << "M_.pac." << it.first << ".tag_map = [";
for (auto &it1 : it.second) for (auto &it1 : it.second)
output << "{'" << it1.first << "', '" << it1.second << "'};"; output << "{'" << it1.first << "', '" << it1.second << "'};";
output << "];" << endl; output << "];" << endl;
@ -3076,17 +3038,17 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
for (auto &it : pac_model_info) for (auto &it : pac_model_info)
{ {
vector<int> lhs = get<0>(it.second); vector<int> lhs = get<0>(it.second);
output << modstruct << "pac." << it.first << ".lhs = ["; output << "M_.pac." << it.first << ".lhs = [";
for (auto it : lhs) for (auto it : lhs)
output << it + 1 << " "; output << it + 1 << " ";
output << "];" << endl; output << "];" << endl;
if (int growth_param_index = get<1>(it.second); if (int growth_param_index = get<1>(it.second);
growth_param_index >= 0) growth_param_index >= 0)
output << modstruct << "pac." << it.first << ".growth_neutrality_param_index = " output << "M_.pac." << it.first << ".growth_neutrality_param_index = "
<< symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl; << symbol_table.getTypeSpecificID(growth_param_index) + 1 << ";" << endl;
output << modstruct << "pac." << it.first << ".auxiliary_model_type = '" << get<2>(it.second) << "';" << endl; output << "M_.pac." << it.first << ".auxiliary_model_type = '" << get<2>(it.second) << "';" << endl;
} }
for (auto &pit : pac_equation_info) for (auto &pit : pac_equation_info)
@ -3094,28 +3056,28 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
auto [lhs_pac_var, optim_share_index, ar_params_and_vars, ec_params_and_vars, non_optim_vars_params_and_constants, additive_vars_params_and_constants, optim_additive_vars_params_and_constants] = pit.second; auto [lhs_pac_var, optim_share_index, ar_params_and_vars, ec_params_and_vars, non_optim_vars_params_and_constants, additive_vars_params_and_constants, optim_additive_vars_params_and_constants] = pit.second;
string substruct = pit.first.first + ".equations." + pit.first.second + "."; string substruct = pit.first.first + ".equations." + pit.first.second + ".";
output << modstruct << "pac." << substruct << "lhs_var = " output << "M_.pac." << substruct << "lhs_var = "
<< symbol_table.getTypeSpecificID(lhs_pac_var.first) + 1 << ";" << endl; << symbol_table.getTypeSpecificID(lhs_pac_var.first) + 1 << ";" << endl;
if (optim_share_index >= 0) if (optim_share_index >= 0)
output << modstruct << "pac." << substruct << "share_of_optimizing_agents_index = " output << "M_.pac." << substruct << "share_of_optimizing_agents_index = "
<< symbol_table.getTypeSpecificID(optim_share_index) + 1 << ";" << endl; << symbol_table.getTypeSpecificID(optim_share_index) + 1 << ";" << endl;
output << modstruct << "pac." << substruct << "ec.params = " output << "M_.pac." << substruct << "ec.params = "
<< symbol_table.getTypeSpecificID(ec_params_and_vars.first) + 1 << ";" << endl << symbol_table.getTypeSpecificID(ec_params_and_vars.first) + 1 << ";" << endl
<< modstruct << "pac." << substruct << "ec.vars = ["; << "M_.pac." << substruct << "ec.vars = [";
for (auto it : ec_params_and_vars.second) for (auto it : ec_params_and_vars.second)
output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " "; output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "ec.istarget = ["; << "M_.pac." << substruct << "ec.istarget = [";
for (auto it : ec_params_and_vars.second) for (auto it : ec_params_and_vars.second)
output << (get<1>(it) ? "true " : "false "); output << (get<1>(it) ? "true " : "false ");
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "ec.scale = ["; << "M_.pac." << substruct << "ec.scale = [";
for (auto it : ec_params_and_vars.second) for (auto it : ec_params_and_vars.second)
output << get<2>(it) << " "; output << get<2>(it) << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "ec.isendo = ["; << "M_.pac." << substruct << "ec.isendo = [";
for (auto it : ec_params_and_vars.second) for (auto it : ec_params_and_vars.second)
switch (symbol_table.getType(get<0>(it))) switch (symbol_table.getType(get<0>(it)))
{ {
@ -3130,32 +3092,32 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "ar.params = ["; << "M_.pac." << substruct << "ar.params = [";
for (auto &[pid, vid, vlag] : ar_params_and_vars) for (auto &[pid, vid, vlag] : ar_params_and_vars)
output << (pid != -1 ? symbol_table.getTypeSpecificID(pid) + 1 : -1) << " "; output << (pid != -1 ? symbol_table.getTypeSpecificID(pid) + 1 : -1) << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "ar.vars = ["; << "M_.pac." << substruct << "ar.vars = [";
for (auto &[pid, vid, vlag] : ar_params_and_vars) for (auto &[pid, vid, vlag] : ar_params_and_vars)
output << (vid != -1 ? symbol_table.getTypeSpecificID(vid) + 1 : -1) << " "; output << (vid != -1 ? symbol_table.getTypeSpecificID(vid) + 1 : -1) << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "ar.lags = ["; << "M_.pac." << substruct << "ar.lags = [";
for (auto &[pid, vid, vlag] : ar_params_and_vars) for (auto &[pid, vid, vlag] : ar_params_and_vars)
output << vlag << " "; output << vlag << " ";
output << "];" << endl; output << "];" << endl;
if (!non_optim_vars_params_and_constants.empty()) if (!non_optim_vars_params_and_constants.empty())
{ {
output << modstruct << "pac." << substruct << "non_optimizing_behaviour.params = ["; output << "M_.pac." << substruct << "non_optimizing_behaviour.params = [";
for (auto &it : non_optim_vars_params_and_constants) for (auto &it : non_optim_vars_params_and_constants)
if (get<2>(it) >= 0) if (get<2>(it) >= 0)
output << symbol_table.getTypeSpecificID(get<2>(it)) + 1 << " "; output << symbol_table.getTypeSpecificID(get<2>(it)) + 1 << " ";
else else
output << "NaN "; output << "NaN ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "non_optimizing_behaviour.vars = ["; << "M_.pac." << substruct << "non_optimizing_behaviour.vars = [";
for (auto &it : non_optim_vars_params_and_constants) for (auto &it : non_optim_vars_params_and_constants)
output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " "; output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "non_optimizing_behaviour.isendo = ["; << "M_.pac." << substruct << "non_optimizing_behaviour.isendo = [";
for (auto &it : non_optim_vars_params_and_constants) for (auto &it : non_optim_vars_params_and_constants)
switch (symbol_table.getType(get<0>(it))) switch (symbol_table.getType(get<0>(it)))
{ {
@ -3170,29 +3132,29 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "non_optimizing_behaviour.lags = ["; << "M_.pac." << substruct << "non_optimizing_behaviour.lags = [";
for (auto &it : non_optim_vars_params_and_constants) for (auto &it : non_optim_vars_params_and_constants)
output << get<1>(it) << " "; output << get<1>(it) << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "non_optimizing_behaviour.scaling_factor = ["; << "M_.pac." << substruct << "non_optimizing_behaviour.scaling_factor = [";
for (auto &it : non_optim_vars_params_and_constants) for (auto &it : non_optim_vars_params_and_constants)
output << get<3>(it) << " "; output << get<3>(it) << " ";
output << "];" << endl; output << "];" << endl;
} }
if (!additive_vars_params_and_constants.empty()) if (!additive_vars_params_and_constants.empty())
{ {
output << modstruct << "pac." << substruct << "additive.params = ["; output << "M_.pac." << substruct << "additive.params = [";
for (auto &it : additive_vars_params_and_constants) for (auto &it : additive_vars_params_and_constants)
if (get<2>(it) >= 0) if (get<2>(it) >= 0)
output << symbol_table.getTypeSpecificID(get<2>(it)) + 1 << " "; output << symbol_table.getTypeSpecificID(get<2>(it)) + 1 << " ";
else else
output << "NaN "; output << "NaN ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "additive.vars = ["; << "M_.pac." << substruct << "additive.vars = [";
for (auto &it : additive_vars_params_and_constants) for (auto &it : additive_vars_params_and_constants)
output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " "; output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "additive.isendo = ["; << "M_.pac." << substruct << "additive.isendo = [";
for (auto &it : additive_vars_params_and_constants) for (auto &it : additive_vars_params_and_constants)
switch (symbol_table.getType(get<0>(it))) switch (symbol_table.getType(get<0>(it)))
{ {
@ -3207,29 +3169,29 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "additive.lags = ["; << "M_.pac." << substruct << "additive.lags = [";
for (auto &it : additive_vars_params_and_constants) for (auto &it : additive_vars_params_and_constants)
output << get<1>(it) << " "; output << get<1>(it) << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "additive.scaling_factor = ["; << "M_.pac." << substruct << "additive.scaling_factor = [";
for (auto &it : additive_vars_params_and_constants) for (auto &it : additive_vars_params_and_constants)
output << get<3>(it) << " "; output << get<3>(it) << " ";
output << "];" << endl; output << "];" << endl;
} }
if (!optim_additive_vars_params_and_constants.empty()) if (!optim_additive_vars_params_and_constants.empty())
{ {
output << modstruct << "pac." << substruct << "optim_additive.params = ["; output << "M_.pac." << substruct << "optim_additive.params = [";
for (auto &it : optim_additive_vars_params_and_constants) for (auto &it : optim_additive_vars_params_and_constants)
if (get<2>(it) >= 0) if (get<2>(it) >= 0)
output << symbol_table.getTypeSpecificID(get<2>(it)) + 1 << " "; output << symbol_table.getTypeSpecificID(get<2>(it)) + 1 << " ";
else else
output << "NaN "; output << "NaN ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "optim_additive.vars = ["; << "M_.pac." << substruct << "optim_additive.vars = [";
for (auto &it : optim_additive_vars_params_and_constants) for (auto &it : optim_additive_vars_params_and_constants)
output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " "; output << symbol_table.getTypeSpecificID(get<0>(it)) + 1 << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "optim_additive.isendo = ["; << "M_.pac." << substruct << "optim_additive.isendo = [";
for (auto &it : optim_additive_vars_params_and_constants) for (auto &it : optim_additive_vars_params_and_constants)
switch (symbol_table.getType(get<0>(it))) switch (symbol_table.getType(get<0>(it)))
{ {
@ -3244,23 +3206,23 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "optim_additive.lags = ["; << "M_.pac." << substruct << "optim_additive.lags = [";
for (auto &it : optim_additive_vars_params_and_constants) for (auto &it : optim_additive_vars_params_and_constants)
output << get<1>(it) << " "; output << get<1>(it) << " ";
output << "];" << endl output << "];" << endl
<< modstruct << "pac." << substruct << "optim_additive.scaling_factor = ["; << "M_.pac." << substruct << "optim_additive.scaling_factor = [";
for (auto &it : optim_additive_vars_params_and_constants) for (auto &it : optim_additive_vars_params_and_constants)
output << get<3>(it) << " "; output << get<3>(it) << " ";
output << "];" << endl; output << "];" << endl;
} }
// Create empty h0 and h1 substructures that will be overwritten later if not empty // Create empty h0 and h1 substructures that will be overwritten later if not empty
output << modstruct << "pac." << substruct << "h0_param_indices = [];" << endl output << "M_.pac." << substruct << "h0_param_indices = [];" << endl
<< modstruct << "pac." << substruct << "h1_param_indices = [];" << endl; << "M_.pac." << substruct << "h1_param_indices = [];" << endl;
} }
for (auto &it : pac_h0_indices) for (auto &it : pac_h0_indices)
{ {
output << modstruct << "pac." << it.first.first << ".equations." << it.first.second << ".h0_param_indices = ["; output << "M_.pac." << it.first.first << ".equations." << it.first.second << ".h0_param_indices = [";
for (auto it1 : it.second) for (auto it1 : it.second)
output << symbol_table.getTypeSpecificID(it1) + 1 << " "; output << symbol_table.getTypeSpecificID(it1) + 1 << " ";
output << "];" << endl; output << "];" << endl;
@ -3268,7 +3230,7 @@ DynamicModel::writeDriverOutput(ostream &output, const string &basename, bool bl
for (auto &it : pac_h1_indices) for (auto &it : pac_h1_indices)
{ {
output << modstruct << "pac." << it.first.first << ".equations." << it.first.second << ".h1_param_indices = ["; output << "M_.pac." << it.first.first << ".equations." << it.first.second << ".h1_param_indices = [";
for (auto it1 : it.second) for (auto it1 : it.second)
output << symbol_table.getTypeSpecificID(it1) + 1 << " "; output << symbol_table.getTypeSpecificID(it1) + 1 << " ";
output << "];" << endl; output << "];" << endl;

View File

@ -156,7 +156,7 @@ private:
void writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const; void writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const;
// Write the block structure of the model in the driver file // Write the block structure of the model in the driver file
void writeBlockDriverOutput(ostream &output, const string &basename, const string &modstruct, void writeBlockDriverOutput(ostream &output, const string &basename,
const vector<int> &state_var, bool estimation_present) const; const vector<int> &state_var, bool estimation_present) const;
// Used by determineBlockDerivativesType() // Used by determineBlockDerivativesType()
@ -300,7 +300,7 @@ public:
void computingPass(bool jacobianExo, int derivsOrder, int paramsDerivsOrder, void computingPass(bool jacobianExo, int derivsOrder, int paramsDerivsOrder,
const eval_context_t &eval_context, bool no_tmp_terms, bool block, bool use_dll, bool bytecode); const eval_context_t &eval_context, bool no_tmp_terms, bool block, bool use_dll, bool bytecode);
//! Writes information about the dynamic model to the driver file //! Writes information about the dynamic model to the driver file
void writeDriverOutput(ostream &output, const string &basename, bool block, bool use_dll, bool estimation_present, bool compute_xrefs, bool julia) const; void writeDriverOutput(ostream &output, const string &basename, bool block, bool use_dll, bool estimation_present, bool compute_xrefs) const;
//! Write JSON AST //! Write JSON AST
void writeJsonAST(ostream &output) const; void writeJsonAST(ostream &output) const;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020 Dynare Team * Copyright © 2020-2021 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -76,37 +76,19 @@ EquationTags::writeCheckSumInfo(ostream &output) const
} }
void void
EquationTags::writeOutput(ostream &output, const string &modstruct, bool julia) const EquationTags::writeOutput(ostream &output) const
{ {
if (julia) output << "M_.equations_tags = {" << endl;
{
output << modstruct << "equation_tags = [" << endl;
for (const auto & [eqn, tags] : eqn_tags) for (const auto & [eqn, tags] : eqn_tags)
for (const auto & [key, value] : tags)
output << " EquationTag("
<< eqn + 1 << R"( , ")"
<< key << R"(" , ")" << value << R"("))" << endl;
output << " ]" << endl;
}
else
{
output << modstruct << "equations_tags = {" << endl;
for (const auto & [eqn, tags] : eqn_tags)
{
for (const auto & [key, value] : tags) for (const auto & [key, value] : tags)
output << " " << eqn + 1 << " , '" output << " " << eqn + 1 << " , '"
<< key << "' , '" << value << "' ;" << endl; << key << "' , '" << value << "' ;" << endl;
}
output << "};" << endl; output << "};" << endl;
} }
}
void void
EquationTags::writeOccbinOutput(ostream &output, const string &modstruct, bool julia) const EquationTags::writeOccbinOutput(ostream &output) const
{ {
if (julia)
return;
map<int, map<string, string>> occbin_options; map<int, map<string, string>> occbin_options;
for (const auto & [eqn, tags] : eqn_tags) for (const auto & [eqn, tags] : eqn_tags)
for (const auto & [key, value] : tags) for (const auto & [key, value] : tags)
@ -121,9 +103,9 @@ EquationTags::writeOccbinOutput(ostream &output, const string &modstruct, bool j
{ {
idx++; idx++;
for (const auto & [key, value] : tags) for (const auto & [key, value] : tags)
output << modstruct << "occbin.constraint(" << idx << ")." output << "M_.occbin.constraint(" << idx << ")."
<< key << " = '" << value << "';" << endl; << key << " = '" << value << "';" << endl;
output << modstruct << "occbin.constraint(" << idx << ").equation = " output << "M_.occbin.constraint(" << idx << ").equation = "
<< eqn+1 << ";" << endl; << eqn+1 << ";" << endl;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2020 Dynare Team * Copyright © 2020-2021 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -111,8 +111,8 @@ public:
//! Various functions to write equation tags //! Various functions to write equation tags
void writeCheckSumInfo(ostream &output) const; void writeCheckSumInfo(ostream &output) const;
void writeOutput(ostream &output, const string &modstruct, bool julia) const; void writeOutput(ostream &output) const;
void writeOccbinOutput(ostream &output, const string &modstruct, bool julia) const; void writeOccbinOutput(ostream &output) const;
void writeLatexOutput(ostream &output, int eqn) const; void writeLatexOutput(ostream &output, int eqn) const;
void writeJsonAST(ostream &output, const int eq) const; void writeJsonAST(ostream &output, const int eq) const;
}; };

View File

@ -1011,7 +1011,7 @@ ModFile::writeMOutput(const string &basename, bool clear_all, bool clear_global,
if (dynamic_model.equation_number() > 0) if (dynamic_model.equation_number() > 0)
{ {
dynamic_model.writeDriverOutput(mOutputFile, basename, block, use_dll, mod_file_struct.estimation_present, compute_xrefs, false); dynamic_model.writeDriverOutput(mOutputFile, basename, block, use_dll, mod_file_struct.estimation_present, compute_xrefs);
if (!no_static) if (!no_static)
static_model.writeDriverOutput(mOutputFile, block); static_model.writeDriverOutput(mOutputFile, block);
} }
@ -1139,88 +1139,8 @@ ModFile::writeMOutput(const string &basename, bool clear_all, bool clear_global,
void void
ModFile::writeJuliaOutput(const string &basename) const ModFile::writeJuliaOutput(const string &basename) const
{ {
ofstream jlOutputFile;
if (basename.size())
{
string fname(basename);
fname += ".jl";
jlOutputFile.open(fname, ios::out | ios::binary);
if (!jlOutputFile.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);
}
jlOutputFile << "module " << basename << endl
<< "#" << endl
<< "# NB: this file was automatically generated by Dynare" << endl
<< "# from " << basename << ".mod" << endl
<< "#" << endl << endl
<< "using DynareModel" << endl
<< "using DynareOptions" << endl
<< "using DynareOutput" << endl << endl
<< "using Utils" << endl
<< "using SteadyState" << endl << endl
<< "using " << basename << "Static" << endl
<< "using " << basename << "Dynamic" << endl
<< R"(if isfile(")" << basename << R"(SteadyState.jl"))" << endl
<< " using " << basename << "SteadyState" << endl
<< "end" << endl
<< R"(if isfile(")" << basename << R"(SteadyState2.jl"))" << endl
<< " using " << basename << "SteadyState2" << endl
<< "end" << endl << endl
<< "export model_, options_, oo_" << endl;
// Write Output
jlOutputFile << endl
<< "oo_ = dynare_output()" << endl
<< R"(oo_.dynare_version = ")" << PACKAGE_VERSION << R"(")" << endl;
// Write Options
jlOutputFile << endl
<< "options_ = dynare_options()" << endl
<< R"(options_.dynare_version = ")" << PACKAGE_VERSION << R"(")" << endl;
if (linear)
jlOutputFile << "options_.linear = true" << endl;
// Write Model
jlOutputFile << endl
<< "model_ = dynare_model()" << endl
<< R"(model_.fname = ")" << basename << R"(")" << endl
<< R"(model_.dynare_version = ")" << PACKAGE_VERSION << R"(")" << endl
<< "model_.sigma_e = zeros(Float64, " << symbol_table.exo_nbr() << ", "
<< symbol_table.exo_nbr() << ")" << endl
<< "model_.correlation_matrix = ones(Float64, " << symbol_table.exo_nbr() << ", "
<< symbol_table.exo_nbr() << ")" << endl
<< "model_.orig_eq_nbr = " << mod_file_struct.orig_eq_nbr << endl
<< "model_.eq_nbr = " << dynamic_model.equation_number() << endl
<< "model_.ramsey_eq_nbr = " << mod_file_struct.ramsey_eq_nbr << endl;
if (mod_file_struct.calibrated_measurement_errors)
jlOutputFile << "model_.h = zeros(Float64,"
<< symbol_table.observedVariablesNbr() << ", "
<< symbol_table.observedVariablesNbr() << ");" << endl
<< "model_.correlation_matrix_me = ones(Float64, "
<< symbol_table.observedVariablesNbr() << ", "
<< symbol_table.observedVariablesNbr() << ");" << endl;
else
jlOutputFile << "model_.h = zeros(Float64, 1, 1)" << endl
<< "model_.correlation_matrix_me = ones(Float64, 1, 1)" << endl;
cout << "Processing outputs ..." << endl;
symbol_table.writeJuliaOutput(jlOutputFile);
if (dynamic_model.equation_number() > 0) if (dynamic_model.equation_number() > 0)
{ {
dynamic_model.writeDriverOutput(jlOutputFile, basename, false, false,
mod_file_struct.estimation_present, false, true);
if (!no_static) if (!no_static)
{ {
static_model.writeStaticFile(basename, false, false, false, "", {}, {}, true); static_model.writeStaticFile(basename, false, false, false, "", {}, {}, true);
@ -1230,34 +1150,6 @@ ModFile::writeJuliaOutput(const string &basename) const
dynamic_model.writeParamsDerivativesFile(basename, true); dynamic_model.writeParamsDerivativesFile(basename, true);
} }
steady_state_model.writeSteadyStateFile(basename, mod_file_struct.ramsey_model_present, true); steady_state_model.writeSteadyStateFile(basename, mod_file_struct.ramsey_model_present, true);
// Print statements (includes parameter values)
for (const auto &statement : statements)
statement->writeJuliaOutput(jlOutputFile, basename);
jlOutputFile << "model_.static = " << basename << "Static.static!" << endl
<< "model_.dynamic = " << basename << "Dynamic.dynamic!" << endl
<< "model_.temporaries.static = " << basename << "Static.tmp_nbr" << endl
<< "model_.temporaries.dynamic = " << basename << "Dynamic.tmp_nbr" << endl
<< R"(if isfile(")" << basename << R"(SteadyState.jl"))" << endl
<< " model_.user_written_analytical_steady_state = true" << endl
<< " model_.steady_state = " << basename << "SteadyState.steady_state!" << endl
<< "end" << endl
<< R"(if isfile(")" << basename << R"(SteadyState2.jl"))" << endl
<< " model_.analytical_steady_state = true" << endl
<< " model_.steady_state = " << basename << "SteadyState2.steady_state!" << endl
<< "end" << endl
<< R"(if isfile(")" << basename << R"(StaticParamsDerivs.jl"))" << endl
<< " using " << basename << "StaticParamsDerivs" << endl
<< " model_.static_params_derivs = " << basename << "StaticParamsDerivs.params_derivs" << endl
<< "end" << endl
<< R"(if isfile(")" << basename << R"(DynamicParamsDerivs.jl"))" << endl
<< " using " << basename << "DynamicParamsDerivs" << endl
<< " model_.dynamic_params_derivs = " << basename << "DynamicParamsDerivs.params_derivs" << endl
<< "end" << endl
<< "end" << endl;
jlOutputFile.close();
cout << "done" << endl;
} }
void void

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2003-2020 Dynare Team * Copyright © 2003-2021 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -56,15 +56,6 @@ InitParamStatement::writeOutput(ostream &output, const string &basename, bool mi
output << symbol_table.getName(symb_id) << " = M_.params(" << id << ");" << endl; output << symbol_table.getName(symb_id) << " = M_.params(" << id << ");" << endl;
} }
void
InitParamStatement::writeJuliaOutput(ostream &output, const string &basename)
{
int id = symbol_table.getTypeSpecificID(symb_id) + 1;
output << "model_.params[ " << id << " ] = ";
param_value->writeOutput(output);
output << endl;
}
void void
InitParamStatement::writeJsonOutput(ostream &output) const InitParamStatement::writeJsonOutput(ostream &output) const
{ {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2003-2019 Dynare Team * Copyright © 2003-2021 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -41,7 +41,6 @@ public:
const SymbolTable &symbol_table_arg); const SymbolTable &symbol_table_arg);
void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override; void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings) override;
void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override; void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const override;
void writeJuliaOutput(ostream &output, const string &basename) override;
void writeJsonOutput(ostream &output) const override; void writeJsonOutput(ostream &output) const override;
//! Fill eval context with parameter value //! Fill eval context with parameter value
void fillEvalContext(eval_context_t &eval_context) const; void fillEvalContext(eval_context_t &eval_context) const;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2006-2020 Dynare Team * Copyright © 2006-2021 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -29,11 +29,6 @@ Statement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &wa
{ {
} }
void
Statement::writeJuliaOutput(ostream &output, const string &basename)
{
}
void void
Statement::computingPass() Statement::computingPass()
{ {

View File

@ -171,7 +171,6 @@ public:
\param basename is the name of the modfile (without extension) which can be used to build auxiliary files \param basename is the name of the modfile (without extension) which can be used to build auxiliary files
*/ */
virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const = 0; virtual void writeOutput(ostream &output, const string &basename, bool minimal_workspace) const = 0;
virtual void writeJuliaOutput(ostream &output, const string &basename);
virtual void writeJsonOutput(ostream &output) const = 0; virtual void writeJsonOutput(ostream &output) const = 0;
}; };

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2003-2020 Dynare Team * Copyright © 2003-2021 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -915,138 +915,6 @@ SymbolTable::getOrigEndogenous() const
return origendogs; return origendogs;
} }
void
SymbolTable::writeJuliaOutput(ostream &output) const noexcept(false)
{
if (!frozen)
throw NotYetFrozenException();
output << "# Endogenous Variables" << endl
<< "model_.endo = [" << endl;
if (endo_nbr() > 0)
for (int id = 0; id < endo_nbr(); id++)
output << R"( DynareModel.Endo(")"
<< getName(endo_ids[id]) << R"(", raw")"
<< getTeXName(endo_ids[id]) << R"(", ")"
<< getLongName(endo_ids[id]) << R"("))" << endl;
output << " ]" << endl;
output << "model_.endo_nbr = " << endo_nbr() << ";" << endl;
output << "# Exogenous Variables" << endl
<< "model_.exo = [" << endl;
if (exo_nbr() > 0)
for (int id = 0; id < exo_nbr(); id++)
output << R"( DynareModel.Exo(")"
<< getName(exo_ids[id]) << R"(", raw")"
<< getTeXName(exo_ids[id]) << R"(", ")"
<< getLongName(exo_ids[id]) << R"("))" << endl;
output << " ]" << endl;
output << "model_.exo_nbr = " << exo_nbr() << ";" << endl;
if (exo_det_nbr() > 0)
{
output << "# Exogenous Deterministic Variables" << endl
<< "model_.exo_det = [" << endl;
if (exo_det_nbr() > 0)
for (int id = 0; id < exo_det_nbr(); id++)
output << R"( DynareModel.ExoDet(")"
<< getName(exo_det_ids[id]) << R"(", raw")"
<< getTeXName(exo_det_ids[id]) << R"(", ")"
<< getLongName(exo_det_ids[id]) << R"("))" << endl;
output << " ]" << endl;
output << "model_.exo_det_nbr = " << exo_det_nbr() << ";" << endl;
}
output << "# Parameters" << endl
<< "model_.param = [" << endl;
if (param_nbr() > 0)
for (int id = 0; id < param_nbr(); id++)
output << R"( DynareModel.Param(")"
<< getName(param_ids[id]) << R"(", raw")"
<< getTeXName(param_ids[id]) << R"(", ")"
<< getLongName(param_ids[id]) << R"("))" << endl;
output << " ]" << endl;
output << "model_.param_nbr = " << param_nbr() << ";" << endl;
output << "model_.orig_endo_nbr = " << orig_endo_nbr() << endl;
if (aux_vars.size() > 0)
{
output << "# Auxiliary Variables" << endl
<< "model_.aux_vars = [" << endl;
for (const auto &aux_var : aux_vars)
{
output << " DynareModel.AuxVars("
<< getTypeSpecificID(aux_var.get_symb_id()) + 1 << ", "
<< aux_var.get_type_id() << ", ";
switch (aux_var.get_type())
{
case AuxVarType::endoLead:
case AuxVarType::exoLead:
case AuxVarType::endoLag:
case AuxVarType::exoLag:
case AuxVarType::varModel:
output << getTypeSpecificID(aux_var.get_orig_symb_id()) + 1 << ", "
<< aux_var.get_orig_lead_lag() << ", typemin(Int), string(), string()";
break;
case AuxVarType::unaryOp:
if (aux_var.get_orig_symb_id() >= 0)
output << getTypeSpecificID(aux_var.get_orig_symb_id()) + 1 << ", " << aux_var.get_orig_lead_lag();
else
output << "typemin(Int), typemin(Int)";
output << ", typemin(Int), string(), "
<< R"(")" << aux_var.get_unary_op() << R"(")" << endl;
break;
case AuxVarType::diff:
case AuxVarType::diffLag:
case AuxVarType::diffLead:
if (aux_var.get_orig_symb_id() >= 0)
output << getTypeSpecificID(aux_var.get_orig_symb_id()) + 1 << ", "
<< aux_var.get_orig_lead_lag() << ", typemin(Int), string(), string()";
break;
case AuxVarType::multiplier:
output << "typemin(Int), typemin(Int), " << aux_var.get_equation_number_for_multiplier() + 1
<< ", string(), string()";
break;
case AuxVarType::diffForward:
output << getTypeSpecificID(aux_var.get_orig_symb_id())+1 << ", typemin(Int), typemin(Int), string(), string()";
break;
case AuxVarType::expectation:
output << R"(typemin(Int), typemin(Int), typemin(Int), "\mathbb{E}_{t)"
<< (aux_var.get_information_set() < 0 ? "" : "+")
<< aux_var.get_information_set() << "}(";
aux_var.get_expr_node()->writeOutput(output, ExprNodeOutputType::latexDynamicModel);
output << R"lit()")lit";
break;
default:
output << " typemin(Int), typemin(Int), typemin(Int), string(), string()";
}
output << ")" << endl;
}
output << "]" << endl;
}
if (predeterminedNbr() > 0)
{
output << "# Predetermined Variables" << endl
<< "model_.pred_vars = [ " << endl;
for (int predetermined_variable : predetermined_variables)
output << " DynareModel.PredVars("
<< getTypeSpecificID(predetermined_variable)+1 << ")" << endl;
output << " ]" << endl;
}
if (observedVariablesNbr() > 0)
{
output << "# Observed Variables" << endl
<< "options_.obs_vars = [" << endl;
for (int varob : varobs)
output << " DynareModel.ObsVars("
<< getTypeSpecificID(varob)+1 << ")" << endl;
output << " ]" << endl;
}
}
void void
SymbolTable::writeJsonOutput(ostream &output) const SymbolTable::writeJsonOutput(ostream &output) const
{ {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright © 2003-2020 Dynare Team * Copyright © 2003-2021 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -390,8 +390,6 @@ public:
void writeOutput(ostream &output) const noexcept(false); void writeOutput(ostream &output) const noexcept(false);
//! Write JSON Output //! Write JSON Output
void writeJsonOutput(ostream &output) const; void writeJsonOutput(ostream &output) const;
//! Write Julia output of this class
void writeJuliaOutput(ostream &output) const noexcept(false);
//! Mark a symbol as predetermined variable //! Mark a symbol as predetermined variable
void markPredetermined(int symb_id) noexcept(false); void markPredetermined(int symb_id) noexcept(false);
//! Test if a given symbol is a predetermined variable //! Test if a given symbol is a predetermined variable