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])
|
||||
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
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue