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
Sébastien Villemot 2020-04-28 14:12:29 +02:00
parent 2c69f1f31e
commit 470cb5fcb0
No known key found for this signature in database
GPG Key ID: 2CECE9350ECEBE4A
4 changed files with 7 additions and 51 deletions

View File

@ -213,8 +213,6 @@ DynamicModel::computeTemporaryTermsOrdered()
}
for (const auto &[ignore, id] : blocks_derivatives[block])
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])
it.second->computeTemporaryTerms(reference_count, temporary_terms, first_occurence, block, v_temporary_terms, block_size-1);
v_temporary_terms_inuse[block] = {};
@ -240,8 +238,6 @@ DynamicModel::computeTemporaryTermsOrdered()
}
for (const auto &[ignore, id] : blocks_derivatives[block])
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])
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])
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])
it.second->collectTemporary_terms(temporary_terms, temporary_terms_in_use, block);
for (const auto &it : derivative_exo[block])
@ -314,7 +308,7 @@ DynamicModel::writeModelEquationsOrdered_M(const string &basename) const
//recursive_variables.clear();
feedback_variables.clear();
//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_exo = derivative_exo[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);
exo_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_exo = 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 };
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 };
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
{

View File

@ -122,8 +122,6 @@ ModelTree::copyHelper(const ModelTree &m)
dt2[it.first] = f(it.second);
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)
derivative_other_endo.push_back(convert_derivative_t(it));
for (const auto &it : m.derivative_exo)
@ -210,7 +208,6 @@ ModelTree::operator=(const ModelTree &m)
map_idx = m.map_idx;
equation_type_and_normalized_equation.clear();
blocks_derivatives.clear();
derivative_endo.clear();
derivative_other_endo.clear();
derivative_exo.clear();
derivative_exo_det.clear();

View File

@ -185,7 +185,7 @@ protected:
//! Map the derivatives for a block tuple<lag, eq, var>
using derivative_t = map<tuple<int, int, int>, expr_t>;
//! 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
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;

View File

@ -326,7 +326,7 @@ StaticModel::writeModelEquationsOrdered_M(const string &basename) const
//The Temporary terms
if (simulation_type != BlockSimulationType::evaluateBackward
&& 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())
{
@ -2141,41 +2141,10 @@ StaticModel::computeChainRuleJacobian()
void
StaticModel::collect_block_first_order_derivatives()
{
//! vector for an equation or a variable indicates the block number
vector<int> equation_2_block(eq_idx_block2orig.size()), variable_2_block(endo_idx_block2orig.size());
int nb_blocks = blocks.size();
for (int block = 0; block < nb_blocks; block++)
{
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;
}
}
endo_max_leadlag_block.clear();
endo_max_leadlag_block.resize(blocks.size(), { 0, 0 });
max_leadlag_block.clear();
max_leadlag_block.resize(blocks.size(), { 0, 0 });
}
void