Block decomposition: remove mostly unused structure ModelTree::derivative_endo
It has been superseded by ModelTree::blocks_derivatives. By the way, fix the initial number of non-zero elements in sparse Jacobian. Also avoid computing suboptimal temporary terms.issue#70
parent
2c69f1f31e
commit
470cb5fcb0
|
@ -213,8 +213,6 @@ DynamicModel::computeTemporaryTermsOrdered()
|
||||||
}
|
}
|
||||||
for (const auto &[ignore, id] : blocks_derivatives[block])
|
for (const auto &[ignore, id] : blocks_derivatives[block])
|
||||||
id->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
id->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
||||||
for (const auto &it : derivative_endo[block])
|
|
||||||
it.second->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
|
||||||
for (const auto &it : derivative_other_endo[block])
|
for (const auto &it : derivative_other_endo[block])
|
||||||
it.second->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
it.second->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
||||||
v_temporary_terms_inuse[block] = {};
|
v_temporary_terms_inuse[block] = {};
|
||||||
|
@ -240,8 +238,6 @@ DynamicModel::computeTemporaryTermsOrdered()
|
||||||
}
|
}
|
||||||
for (const auto &[ignore, id] : blocks_derivatives[block])
|
for (const auto &[ignore, id] : blocks_derivatives[block])
|
||||||
id->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
id->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
||||||
for (const auto &it : derivative_endo[block])
|
|
||||||
it.second->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
|
||||||
for (const auto &it : derivative_other_endo[block])
|
for (const auto &it : derivative_other_endo[block])
|
||||||
it.second->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
it.second->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
|
||||||
}
|
}
|
||||||
|
@ -263,8 +259,6 @@ DynamicModel::computeTemporaryTermsOrdered()
|
||||||
}
|
}
|
||||||
for (const auto &[ignore, id] : blocks_derivatives[block])
|
for (const auto &[ignore, id] : blocks_derivatives[block])
|
||||||
id->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
|
id->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
|
||||||
for (const auto &it : derivative_endo[block])
|
|
||||||
it.second->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
|
|
||||||
for (const auto &it : derivative_other_endo[block])
|
for (const auto &it : derivative_other_endo[block])
|
||||||
it.second->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
|
it.second->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
|
||||||
for (const auto &it : derivative_exo[block])
|
for (const auto &it : derivative_exo[block])
|
||||||
|
@ -314,7 +308,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const
|
||||||
//recursive_variables.clear();
|
//recursive_variables.clear();
|
||||||
feedback_variables.clear();
|
feedback_variables.clear();
|
||||||
//For a block composed of a single equation determines wether we have to evaluate or to solve the equation
|
//For a block composed of a single equation determines wether we have to evaluate or to solve the equation
|
||||||
nze = derivative_endo[block].size();
|
nze = blocks_derivatives[block].size();
|
||||||
nze_other_endo = derivative_other_endo[block].size();
|
nze_other_endo = derivative_other_endo[block].size();
|
||||||
nze_exo = derivative_exo[block].size();
|
nze_exo = derivative_exo[block].size();
|
||||||
nze_exo_det = derivative_exo_det[block].size();
|
nze_exo_det = derivative_exo_det[block].size();
|
||||||
|
@ -5060,7 +5054,6 @@ DynamicModel::collect_block_first_order_derivatives()
|
||||||
other_endo_block = vector<lag_var_t>(nb_blocks);
|
other_endo_block = vector<lag_var_t>(nb_blocks);
|
||||||
exo_block = vector<lag_var_t>(nb_blocks);
|
exo_block = vector<lag_var_t>(nb_blocks);
|
||||||
exo_det_block = vector<lag_var_t>(nb_blocks);
|
exo_det_block = vector<lag_var_t>(nb_blocks);
|
||||||
derivative_endo = vector<derivative_t>(nb_blocks);
|
|
||||||
derivative_other_endo = vector<derivative_t>(nb_blocks);
|
derivative_other_endo = vector<derivative_t>(nb_blocks);
|
||||||
derivative_exo = vector<derivative_t>(nb_blocks);
|
derivative_exo = vector<derivative_t>(nb_blocks);
|
||||||
derivative_exo_det = vector<derivative_t>(nb_blocks);
|
derivative_exo_det = vector<derivative_t>(nb_blocks);
|
||||||
|
@ -5088,9 +5081,6 @@ DynamicModel::collect_block_first_order_derivatives()
|
||||||
endo_max_leadlag_block[block_eq] = { -lag, endo_max_leadlag_block[block_eq].second };
|
endo_max_leadlag_block[block_eq] = { -lag, endo_max_leadlag_block[block_eq].second };
|
||||||
if (lag > 0 && lag > endo_max_leadlag_block[block_eq].second)
|
if (lag > 0 && lag > endo_max_leadlag_block[block_eq].second)
|
||||||
endo_max_leadlag_block[block_eq] = { endo_max_leadlag_block[block_eq].first, lag };
|
endo_max_leadlag_block[block_eq] = { endo_max_leadlag_block[block_eq].first, lag };
|
||||||
tmp_derivative = derivative_endo[block_eq];
|
|
||||||
tmp_derivative[{ lag, eq, var }] = derivatives[1][{ eq, getDerivID(symbol_table.getID(SymbolType::endogenous, var), lag) }];
|
|
||||||
derivative_endo[block_eq] = tmp_derivative;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -122,8 +122,6 @@ ModelTree::copyHelper(const ModelTree &m)
|
||||||
dt2[it.first] = f(it.second);
|
dt2[it.first] = f(it.second);
|
||||||
return dt2;
|
return dt2;
|
||||||
};
|
};
|
||||||
for (const auto &it : m.derivative_endo)
|
|
||||||
derivative_endo.push_back(convert_derivative_t(it));
|
|
||||||
for (const auto &it : m.derivative_other_endo)
|
for (const auto &it : m.derivative_other_endo)
|
||||||
derivative_other_endo.push_back(convert_derivative_t(it));
|
derivative_other_endo.push_back(convert_derivative_t(it));
|
||||||
for (const auto &it : m.derivative_exo)
|
for (const auto &it : m.derivative_exo)
|
||||||
|
@ -210,7 +208,6 @@ ModelTree::operator=(const ModelTree &m)
|
||||||
map_idx = m.map_idx;
|
map_idx = m.map_idx;
|
||||||
equation_type_and_normalized_equation.clear();
|
equation_type_and_normalized_equation.clear();
|
||||||
blocks_derivatives.clear();
|
blocks_derivatives.clear();
|
||||||
derivative_endo.clear();
|
|
||||||
derivative_other_endo.clear();
|
derivative_other_endo.clear();
|
||||||
derivative_exo.clear();
|
derivative_exo.clear();
|
||||||
derivative_exo_det.clear();
|
derivative_exo_det.clear();
|
||||||
|
|
|
@ -185,7 +185,7 @@ protected:
|
||||||
//! Map the derivatives for a block tuple<lag, eq, var>
|
//! Map the derivatives for a block tuple<lag, eq, var>
|
||||||
using derivative_t = map<tuple<int, int, int>, expr_t>;
|
using derivative_t = map<tuple<int, int, int>, expr_t>;
|
||||||
//! Vector of derivative for each blocks
|
//! Vector of derivative for each blocks
|
||||||
vector<derivative_t> derivative_endo, derivative_other_endo, derivative_exo, derivative_exo_det;
|
vector<derivative_t> derivative_other_endo, derivative_exo, derivative_exo_det;
|
||||||
|
|
||||||
//!Maximum lead and lag for each block on endogenous of the block, endogenous of the previous blocks, exogenous and deterministic exogenous
|
//!Maximum lead and lag for each block on endogenous of the block, endogenous of the previous blocks, exogenous and deterministic exogenous
|
||||||
vector<pair<int, int>> endo_max_leadlag_block, other_endo_max_leadlag_block, exo_max_leadlag_block, exo_det_max_leadlag_block, max_leadlag_block;
|
vector<pair<int, int>> endo_max_leadlag_block, other_endo_max_leadlag_block, exo_max_leadlag_block, exo_det_max_leadlag_block, max_leadlag_block;
|
||||||
|
|
|
@ -326,7 +326,7 @@ StaticModel::writeModelEquationsOrdered_M(const string &basename) const
|
||||||
//The Temporary terms
|
//The Temporary terms
|
||||||
if (simulation_type != BlockSimulationType::evaluateBackward
|
if (simulation_type != BlockSimulationType::evaluateBackward
|
||||||
&& simulation_type != BlockSimulationType::evaluateForward)
|
&& simulation_type != BlockSimulationType::evaluateForward)
|
||||||
output << " g1 = spalloc(" << block_mfs << ", " << block_mfs << ", " << derivative_endo[block].size() << ");" << endl;
|
output << " g1 = spalloc(" << block_mfs << ", " << block_mfs << ", " << blocks_derivatives[block].size() << ");" << endl;
|
||||||
|
|
||||||
if (v_temporary_terms_inuse[block].size())
|
if (v_temporary_terms_inuse[block].size())
|
||||||
{
|
{
|
||||||
|
@ -2141,41 +2141,10 @@ StaticModel::computeChainRuleJacobian()
|
||||||
void
|
void
|
||||||
StaticModel::collect_block_first_order_derivatives()
|
StaticModel::collect_block_first_order_derivatives()
|
||||||
{
|
{
|
||||||
//! vector for an equation or a variable indicates the block number
|
endo_max_leadlag_block.clear();
|
||||||
vector<int> equation_2_block(eq_idx_block2orig.size()), variable_2_block(endo_idx_block2orig.size());
|
endo_max_leadlag_block.resize(blocks.size(), { 0, 0 });
|
||||||
int nb_blocks = blocks.size();
|
max_leadlag_block.clear();
|
||||||
for (int block = 0; block < nb_blocks; block++)
|
max_leadlag_block.resize(blocks.size(), { 0, 0 });
|
||||||
{
|
|
||||||
int block_size = blocks[block].size;
|
|
||||||
for (int i = 0; i < block_size; i++)
|
|
||||||
{
|
|
||||||
equation_2_block[getBlockEquationID(block, i)] = block;
|
|
||||||
variable_2_block[getBlockVariableID(block, i)] = block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
derivative_endo = vector<derivative_t>(nb_blocks);
|
|
||||||
endo_max_leadlag_block = vector<pair<int, int>>(nb_blocks, { 0, 0 });
|
|
||||||
max_leadlag_block = vector<pair<int, int>>(nb_blocks, { 0, 0 });
|
|
||||||
for (auto &first_derivative : derivatives[1])
|
|
||||||
{
|
|
||||||
int eq = first_derivative.first[0];
|
|
||||||
int var = symbol_table.getTypeSpecificID(getSymbIDByDerivID(first_derivative.first[1]));
|
|
||||||
int lag = 0;
|
|
||||||
int block_eq = equation_2_block[eq];
|
|
||||||
int block_var = variable_2_block[var];
|
|
||||||
max_leadlag_block[block_eq] = { 0, 0 };
|
|
||||||
max_leadlag_block[block_eq] = { 0, 0 };
|
|
||||||
endo_max_leadlag_block[block_eq] = { 0, 0 };
|
|
||||||
endo_max_leadlag_block[block_eq] = { 0, 0 };
|
|
||||||
derivative_t tmp_derivative;
|
|
||||||
lag_var_t lag_var;
|
|
||||||
if (getTypeByDerivID(first_derivative.first[1]) == SymbolType::endogenous && block_eq == block_var)
|
|
||||||
{
|
|
||||||
tmp_derivative = derivative_endo[block_eq];
|
|
||||||
tmp_derivative[{ lag, eq, var }] = derivatives[1][{ eq, getDerivID(symbol_table.getID(SymbolType::endogenous, var), lag) }];
|
|
||||||
derivative_endo[block_eq] = tmp_derivative;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue