VAR models: output vector of constants in varmatrices.m
parent
1cf03a5f07
commit
a6add6127b
|
@ -3537,6 +3537,7 @@ DynamicModel::fillVarModelTableMatrices()
|
||||||
{
|
{
|
||||||
map<string, map<tuple<int, int, int>, expr_t>> AR;
|
map<string, map<tuple<int, int, int>, expr_t>> AR;
|
||||||
map<string, map<tuple<int, int>, expr_t>> A0;
|
map<string, map<tuple<int, int>, expr_t>> A0;
|
||||||
|
map<string, map<int, expr_t>> constants;
|
||||||
for (const auto &[model_name, eqns] : var_model_table.getEqNums())
|
for (const auto &[model_name, eqns] : var_model_table.getEqNums())
|
||||||
{
|
{
|
||||||
const vector<int> &lhs = var_model_table.getLhs(model_name);
|
const vector<int> &lhs = var_model_table.getLhs(model_name);
|
||||||
|
@ -3581,10 +3582,27 @@ DynamicModel::fillVarModelTableMatrices()
|
||||||
A0[model_name][{ i, lhs_symb_id }] = d;
|
A0[model_name][{ i, lhs_symb_id }] = d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill constants vector
|
||||||
|
// Constants are computed by replacing all (transformed) endos and exos by zero
|
||||||
|
constants[model_name] = {}; // Ensure that the map exists, even if constants are all zero
|
||||||
|
for (size_t i = 0; i < eqns.size(); i++)
|
||||||
|
{
|
||||||
|
auto rhs = equations[eqns[i]]->arg2;
|
||||||
|
map<VariableNode *, NumConstNode *> subst_table;
|
||||||
|
auto rhs_vars = var_model_table.getRhs(model_name)[i]; // All the (transformed) endogenous on RHS, as computed by updateVarAndTrendModel()
|
||||||
|
rhs->collectDynamicVariables(SymbolType::exogenous, rhs_vars); // Add exos
|
||||||
|
for (auto [symb_id, lag] : rhs_vars)
|
||||||
|
subst_table[AddVariable(symb_id, lag)] = Zero;
|
||||||
|
expr_t c = rhs->replaceVarsInEquation(subst_table);
|
||||||
|
if (c != Zero)
|
||||||
|
constants[model_name][i] = c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var_model_table.setAR(AR);
|
var_model_table.setAR(AR);
|
||||||
var_model_table.setA0(A0);
|
var_model_table.setA0(A0);
|
||||||
|
var_model_table.setConstants(constants);
|
||||||
}
|
}
|
||||||
|
|
||||||
map<string, map<tuple<int, int, int>, expr_t>>
|
map<string, map<tuple<int, int, int>, expr_t>>
|
||||||
|
|
|
@ -455,7 +455,7 @@ VarModelTable::writeOutput(const string &basename, ostream &output) const
|
||||||
cerr << "Error: Can't open file " << filename << " for writing" << endl;
|
cerr << "Error: Can't open file " << filename << " for writing" << endl;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
ar_output << "function [ar, a0] = varmatrices(model_name, params, reducedform)" << endl
|
ar_output << "function [ar, a0, constants] = varmatrices(model_name, params, reducedform)" << endl
|
||||||
<< "% File automatically generated by the Dynare preprocessor" << endl << endl
|
<< "% File automatically generated by the Dynare preprocessor" << endl << endl
|
||||||
<< "if nargin<3" << endl
|
<< "if nargin<3" << endl
|
||||||
<< " reducedform = false;" << endl
|
<< " reducedform = false;" << endl
|
||||||
|
@ -535,6 +535,15 @@ VarModelTable::writeOutput(const string &basename, ostream &output) const
|
||||||
<< " end" << endl
|
<< " end" << endl
|
||||||
<< " a0 = eye(" << lhs.size() << ");" << endl
|
<< " a0 = eye(" << lhs.size() << ");" << endl
|
||||||
<< " end" << endl
|
<< " end" << endl
|
||||||
|
<< " if nargout>2" << endl
|
||||||
|
<< " constants = zeros(" << lhs.size() << ");" << endl;
|
||||||
|
for (auto [eqn, expr] : constants.at(name))
|
||||||
|
{
|
||||||
|
ar_output << " constants(" << eqn + 1 << ") = ";
|
||||||
|
expr->writeOutput(ar_output, ExprNodeOutputType::matlabDynamicModel);
|
||||||
|
ar_output << ";" << endl;
|
||||||
|
}
|
||||||
|
ar_output << " end" << endl
|
||||||
<< " end" << endl
|
<< " end" << endl
|
||||||
<< " return" << endl
|
<< " return" << endl
|
||||||
<< "end" << endl << endl;
|
<< "end" << endl << endl;
|
||||||
|
@ -687,6 +696,12 @@ VarModelTable::setA0(map<string, map<tuple<int, int>, expr_t>> A0_arg)
|
||||||
A0 = move(A0_arg);
|
A0 = move(A0_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
VarModelTable::setConstants(map<string, map<int, expr_t>> constants_arg)
|
||||||
|
{
|
||||||
|
constants = move(constants_arg);
|
||||||
|
}
|
||||||
|
|
||||||
const vector<int> &
|
const vector<int> &
|
||||||
VarModelTable::getMaxLags(const string &name_arg) const
|
VarModelTable::getMaxLags(const string &name_arg) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -130,6 +130,7 @@ private:
|
||||||
VAR context is not the same thing as in the trend-component model
|
VAR context is not the same thing as in the trend-component model
|
||||||
context. */
|
context. */
|
||||||
map<string, map<tuple<int, int>, expr_t>> A0; // name -> (eqn, lhs_symb_id) -> param_expr_t
|
map<string, map<tuple<int, int>, expr_t>> A0; // name -> (eqn, lhs_symb_id) -> param_expr_t
|
||||||
|
map<string, map<int, expr_t>> constants; // name -> eqn -> constant
|
||||||
public:
|
public:
|
||||||
explicit VarModelTable(SymbolTable &symbol_table_arg);
|
explicit VarModelTable(SymbolTable &symbol_table_arg);
|
||||||
|
|
||||||
|
@ -161,6 +162,7 @@ public:
|
||||||
void setOrigDiffVar(map<string, vector<int>> orig_diff_var_arg);
|
void setOrigDiffVar(map<string, vector<int>> orig_diff_var_arg);
|
||||||
void setAR(map<string, map<tuple<int, int, int>, expr_t>> AR_arg);
|
void setAR(map<string, map<tuple<int, int, int>, expr_t>> AR_arg);
|
||||||
void setA0(map<string, map<tuple<int, int>, expr_t>> A0_arg);
|
void setA0(map<string, map<tuple<int, int>, expr_t>> A0_arg);
|
||||||
|
void setConstants(map<string, map<int, expr_t>> constants_arg);
|
||||||
|
|
||||||
//! Write output of this class
|
//! Write output of this class
|
||||||
void writeOutput(const string &basename, ostream &output) const;
|
void writeOutput(const string &basename, ostream &output) const;
|
||||||
|
|
Loading…
Reference in New Issue