preprocessor: move reindexing functions from DynamicModel to ModelTree

issue#70
Houtan Bastani 2015-04-07 15:11:39 +02:00
parent 47d0516d4f
commit ef640070c2
5 changed files with 73 additions and 68 deletions

View File

@ -3429,47 +3429,6 @@ DynamicModel::writeDynamicFile(const string &basename, bool block, bool bytecode
writeDynamicMFile(t_basename); writeDynamicMFile(t_basename);
} }
void
DynamicModel::reindexTrendSymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table)
{
map<int, expr_t> orig_trend_symbols_map = trend_symbols_map;
trend_symbols_map.clear();
for (map<int, expr_t>::const_iterator it = orig_trend_symbols_map.begin();
it != orig_trend_symbols_map.end(); it++)
try
{
vector<int> symb_id (1, symbol_table.getID(orig_symbol_table.getName(it->first)));
addTrendVariables(symb_id,
it->second->cloneDynamicReindex(dynamic_model, orig_symbol_table));
}
catch(...)
{
cerr << "Error: unused exo in trend symbols." << endl;
exit(EXIT_FAILURE);
}
}
void
DynamicModel::reindexNonstationarySymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table)
{
nonstationary_symbols_map_t orig_nonstationary_symbols_map = nonstationary_symbols_map;
nonstationary_symbols_map.clear();
for (nonstationary_symbols_map_t::const_iterator it = orig_nonstationary_symbols_map.begin();
it != orig_nonstationary_symbols_map.end(); it++)
try
{
vector<int> symb_id (1, symbol_table.getID(orig_symbol_table.getName(it->first)));
addNonstationaryVariables(symb_id,
it->second.first,
it->second.second->cloneDynamicReindex(dynamic_model, orig_symbol_table));
}
catch(...)
{
cerr << "Error: unused exo in nonstationary symbols." << endl;
exit(EXIT_FAILURE);
}
}
void void
DynamicModel::resetDataTree() DynamicModel::resetDataTree()
{ {
@ -3483,22 +3442,6 @@ DynamicModel::resetDataTree()
second_deriv_external_function_node_map.clear(); second_deriv_external_function_node_map.clear();
} }
void
DynamicModel::reindexEquations(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table)
{
map<int, expr_t> orig_local_variables_table = local_variables_table;
local_variables_table.clear();
for (map<int, expr_t>::const_iterator it = orig_local_variables_table.begin();
it != orig_local_variables_table.end(); it++)
dynamic_model.AddLocalVariable(symbol_table.getID(orig_symbol_table.getName(it->first)),
it->second->cloneDynamicReindex(dynamic_model, orig_symbol_table));
vector<BinaryOpNode *>eqbak = equations;
equations.clear();
for (size_t i = 0; i < eqbak.size(); i++)
dynamic_model.addEquation(eqbak[i]->cloneDynamicReindex(dynamic_model, orig_symbol_table), equations_lineno[i]);
}
void void
DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
{ {

View File

@ -235,15 +235,6 @@ public:
/*! It assumes that the dynamic model given in argument has just been allocated */ /*! It assumes that the dynamic model given in argument has just been allocated */
void cloneDynamic(DynamicModel &dynamic_model) const; void cloneDynamic(DynamicModel &dynamic_model) const;
//! reindex equations after change in symbol_table
void reindexEquations(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
//! reindex trend_symbol_map after change in symbol_table
void reindexTrendSymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
//! reindex nonstationary_symbol_map after change in symbol_table
void reindexNonstationarySymbolsMap(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
//! reset DataTree vars //! reset DataTree vars
void resetDataTree(); void resetDataTree();

View File

@ -314,7 +314,7 @@ ModFile::transformPass(bool nostrict)
SymbolTable orig_symbol_table = symbol_table; SymbolTable orig_symbol_table = symbol_table;
symbol_table.rmExo(unusedExo); symbol_table.rmExo(unusedExo);
dynamic_model.resetDataTree(); dynamic_model.resetDataTree();
dynamic_model.reindexEquations(dynamic_model, orig_symbol_table); dynamic_model.reindex(orig_symbol_table);
vector<Statement *> orig_statements = statements; vector<Statement *> orig_statements = statements;
statements.clear(); statements.clear();
for (vector<Statement *>::iterator it = orig_statements.begin(); it != orig_statements.end(); it++) for (vector<Statement *>::iterator it = orig_statements.begin(); it != orig_statements.end(); it++)

View File

@ -1413,6 +1413,70 @@ ModelTree::addAuxEquation(expr_t eq)
aux_equations.push_back(beq); aux_equations.push_back(beq);
} }
void
ModelTree::reindex(SymbolTable &orig_symbol_table)
{
reindexEquations(orig_symbol_table);
reindexTrendSymbolsMap(orig_symbol_table);
reindexNonstationarySymbolsMap(orig_symbol_table);
}
void
ModelTree::reindexEquations(SymbolTable &orig_symbol_table)
{
map<int, expr_t> orig_local_variables_table = local_variables_table;
local_variables_table.clear();
for (map<int, expr_t>::const_iterator it = orig_local_variables_table.begin();
it != orig_local_variables_table.end(); it++)
AddLocalVariable(symbol_table.getID(orig_symbol_table.getName(it->first)),
it->second->cloneDynamicReindex(*this, orig_symbol_table));
vector<BinaryOpNode *>eqbak = equations;
equations.clear();
for (size_t i = 0; i < eqbak.size(); i++)
addEquation(eqbak[i]->cloneDynamicReindex(*this, orig_symbol_table), equations_lineno[i]);
}
void
ModelTree::reindexTrendSymbolsMap(SymbolTable &orig_symbol_table)
{
map<int, expr_t> orig_trend_symbols_map = trend_symbols_map;
trend_symbols_map.clear();
for (map<int, expr_t>::const_iterator it = orig_trend_symbols_map.begin();
it != orig_trend_symbols_map.end(); it++)
try
{
vector<int> symb_id (1, symbol_table.getID(orig_symbol_table.getName(it->first)));
addTrendVariables(symb_id, it->second->cloneDynamicReindex(*this, orig_symbol_table));
}
catch(...)
{
cerr << "Error: unused exo in trend symbols." << endl;
exit(EXIT_FAILURE);
}
}
void
ModelTree::reindexNonstationarySymbolsMap(SymbolTable &orig_symbol_table)
{
nonstationary_symbols_map_t orig_nonstationary_symbols_map = nonstationary_symbols_map;
nonstationary_symbols_map.clear();
for (nonstationary_symbols_map_t::const_iterator it = orig_nonstationary_symbols_map.begin();
it != orig_nonstationary_symbols_map.end(); it++)
try
{
vector<int> symb_id (1, symbol_table.getID(orig_symbol_table.getName(it->first)));
addNonstationaryVariables(symb_id,
it->second.first,
it->second.second->cloneDynamicReindex(*this, orig_symbol_table));
}
catch(...)
{
cerr << "Error: unused exo in nonstationary symbols." << endl;
exit(EXIT_FAILURE);
}
}
void void
ModelTree::addTrendVariables(vector<int> trend_vars, expr_t growth_factor) throw (TrendException) ModelTree::addTrendVariables(vector<int> trend_vars, expr_t growth_factor) throw (TrendException)
{ {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2003-2014 Dynare Team * Copyright (C) 2003-2015 Dynare Team
* *
* This file is part of Dynare. * This file is part of Dynare.
* *
@ -303,6 +303,13 @@ public:
void addEquation(expr_t eq, int lineno, vector<pair<string, string> > &eq_tags); void addEquation(expr_t eq, int lineno, vector<pair<string, string> > &eq_tags);
//! Declare a node as an auxiliary equation of the model, adding it at the end of the list of auxiliary equations //! Declare a node as an auxiliary equation of the model, adding it at the end of the list of auxiliary equations
void addAuxEquation(expr_t eq); void addAuxEquation(expr_t eq);
void reindex(SymbolTable &orig_symbol_table);
//! reindex equations after change in symbol_table
void reindexEquations(SymbolTable &orig_symbol_table);
//! reindex trend_symbol_map after change in symbol_table
void reindexTrendSymbolsMap(SymbolTable &orig_symbol_table);
//! reindex nonstationary_symbol_map after change in symbol_table
void reindexNonstationarySymbolsMap(SymbolTable &orig_symbol_table);
//! Returns the number of equations in the model //! Returns the number of equations in the model
int equation_number() const; int equation_number() const;
//! Adds a trend variable with its growth factor //! Adds a trend variable with its growth factor