preprocessor: remove extraneous varexo, update model and statements, #841

issue#70
Houtan Bastani 2015-03-06 15:58:11 +01:00
parent a43bac5842
commit 96a5949d9e
12 changed files with 272 additions and 10 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2014 Dynare Team
* Copyright (C) 2003-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -233,6 +233,7 @@ public:
//! Returns the minimum lag (as a negative number) of the given symbol in the whole data tree (and not only in the equations !!)
/*! Returns 0 if the symbol is not used */
int minLagForSymbol(int symb_id) const;
inline SymbolTable *getSymbolTable() const { return &symbol_table; };
//! Write the Header for getPowerDeriv when use_dll is used
void writePowerDerivCHeader(ostream &output) const;
//! Write getPowerDeriv

View File

@ -3425,6 +3425,22 @@ DynamicModel::writeDynamicFile(const string &basename, bool block, bool bytecode
writeDynamicMFile(t_basename);
}
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
DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
{

View File

@ -235,6 +235,9 @@ public:
/*! It assumes that the dynamic model given in argument has just been allocated */
void cloneDynamic(DynamicModel &dynamic_model) const;
//! reindex equations after change in symbol_table
void reindexEquations(DynamicModel &dynamic_model, SymbolTable &orig_symbol_table);
//! Replaces model equations with derivatives of Lagrangian w.r.t. endogenous
void computeRamseyPolicyFOCs(const StaticModel &static_model);
//! Replaces the model equations in dynamic_model with those in this model

View File

@ -354,6 +354,12 @@ NumConstNode::cloneDynamic(DataTree &dynamic_datatree) const
return dynamic_datatree.AddNonNegativeConstant(datatree.num_constants.get(id));
}
expr_t
NumConstNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
return dynamic_datatree.AddNonNegativeConstant(datatree.num_constants.get(id));
}
int
NumConstNode::maxEndoLead() const
{
@ -988,6 +994,12 @@ VariableNode::cloneDynamic(DataTree &dynamic_datatree) const
return dynamic_datatree.AddVariable(symb_id, lag);
}
expr_t
VariableNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
return dynamic_datatree.AddVariable(dynamic_datatree.symbol_table.getID(orig_symbol_table.getName(symb_id)), lag);
}
int
VariableNode::maxEndoLead() const
{
@ -2234,6 +2246,13 @@ UnaryOpNode::cloneDynamic(DataTree &dynamic_datatree) const
return buildSimilarUnaryOpNode(substarg, dynamic_datatree);
}
expr_t
UnaryOpNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
expr_t substarg = arg->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
return buildSimilarUnaryOpNode(substarg, dynamic_datatree);
}
int
UnaryOpNode::maxEndoLead() const
{
@ -3452,6 +3471,14 @@ BinaryOpNode::cloneDynamic(DataTree &dynamic_datatree) const
return buildSimilarBinaryOpNode(substarg1, substarg2, dynamic_datatree);
}
expr_t
BinaryOpNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
expr_t substarg1 = arg1->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
expr_t substarg2 = arg2->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
return buildSimilarBinaryOpNode(substarg1, substarg2, dynamic_datatree);
}
int
BinaryOpNode::maxEndoLead() const
{
@ -4120,6 +4147,15 @@ TrinaryOpNode::cloneDynamic(DataTree &dynamic_datatree) const
return buildSimilarTrinaryOpNode(substarg1, substarg2, substarg3, dynamic_datatree);
}
expr_t
TrinaryOpNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
expr_t substarg1 = arg1->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
expr_t substarg2 = arg2->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
expr_t substarg3 = arg3->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
return buildSimilarTrinaryOpNode(substarg1, substarg2, substarg3, dynamic_datatree);
}
int
TrinaryOpNode::maxEndoLead() const
{
@ -4689,6 +4725,17 @@ ExternalFunctionNode::cloneDynamic(DataTree &dynamic_datatree) const
return dynamic_datatree.AddExternalFunction(symb_id, dynamic_arguments);
}
expr_t
ExternalFunctionNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
vector<expr_t> dynamic_arguments;
for (vector<expr_t>::const_iterator it = arguments.begin();
it != arguments.end(); it++)
dynamic_arguments.push_back((*it)->cloneDynamicReindex(dynamic_datatree, orig_symbol_table));
return dynamic_datatree.AddExternalFunction(dynamic_datatree.symbol_table.getID(orig_symbol_table.getName(symb_id)),
dynamic_arguments);
}
int
AbstractExternalFunctionNode::maxEndoLead() const
{
@ -5182,6 +5229,18 @@ FirstDerivExternalFunctionNode::cloneDynamic(DataTree &dynamic_datatree) const
inputIndex);
}
expr_t
FirstDerivExternalFunctionNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
vector<expr_t> dynamic_arguments;
for (vector<expr_t>::const_iterator it = arguments.begin();
it != arguments.end(); it++)
dynamic_arguments.push_back((*it)->cloneDynamicReindex(dynamic_datatree, orig_symbol_table));
return dynamic_datatree.AddFirstDerivExternalFunction(dynamic_datatree.symbol_table.getID(orig_symbol_table.getName(symb_id)),
dynamic_arguments,
inputIndex);
}
expr_t
FirstDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
{
@ -5417,6 +5476,18 @@ SecondDerivExternalFunctionNode::cloneDynamic(DataTree &dynamic_datatree) const
inputIndex1, inputIndex2);
}
expr_t
SecondDerivExternalFunctionNode::cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const
{
vector<expr_t> dynamic_arguments;
for (vector<expr_t>::const_iterator it = arguments.begin();
it != arguments.end(); it++)
dynamic_arguments.push_back((*it)->cloneDynamicReindex(dynamic_datatree, orig_symbol_table));
return dynamic_datatree.AddSecondDerivExternalFunction(dynamic_datatree.symbol_table.getID(orig_symbol_table.getName(symb_id)),
dynamic_arguments,
inputIndex1, inputIndex2);
}
expr_t
SecondDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
{

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2007-2014 Dynare Team
* Copyright (C) 2007-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -407,6 +407,9 @@ public:
//! Add ExprNodes to the provided datatree
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const = 0;
//! Add ExprNodes to the provided datatree, changing the symbol id from those provided in orig_symbol_table
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const = 0;
//! Move a trend variable with lag/lead to time t by dividing/multiplying by its growth factor
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const = 0;
@ -467,6 +470,7 @@ public:
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
};
@ -529,6 +533,7 @@ public:
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
};
@ -606,6 +611,7 @@ public:
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
};
@ -696,6 +702,7 @@ public:
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
//! Function to write out the oPowerNode in expr_t terms as opposed to writing out the function itself
expr_t unpackPowerDeriv() const;
@ -766,6 +773,7 @@ public:
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
};
@ -841,6 +849,7 @@ public:
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const = 0;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const = 0;
virtual expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
virtual bool isInStaticForm() const;
};
@ -871,6 +880,7 @@ public:
virtual expr_t toStatic(DataTree &static_datatree) const;
virtual expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
};
class FirstDerivExternalFunctionNode : public AbstractExternalFunctionNode
@ -905,6 +915,7 @@ public:
virtual expr_t toStatic(DataTree &static_datatree) const;
virtual expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
};
class SecondDerivExternalFunctionNode : public AbstractExternalFunctionNode
@ -941,6 +952,7 @@ public:
virtual expr_t toStatic(DataTree &static_datatree) const;
virtual expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const;
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const;
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
};
#endif

View File

@ -307,6 +307,19 @@ ModFile::checkPass()
void
ModFile::transformPass(bool nostrict)
{
// Remove unused exogenous from symbol table and update dynamic_model
set<int> unusedExo = dynamic_model.findUnusedExogenous();
if (unusedExo.size() > 0)
{
SymbolTable orig_symbol_table = symbol_table;
symbol_table.rmExo(unusedExo);
dynamic_model.reindexEquations(dynamic_model, orig_symbol_table);
vector<Statement *> orig_statements = statements;
statements.clear();
for (vector<Statement *>::iterator it = orig_statements.begin(); it != orig_statements.end(); it++)
addStatement((*it)->cloneAndReindexSymbIds(dynamic_model, orig_symbol_table));
}
// Save the original model (must be done before any model transformations by preprocessor)
dynamic_model.cloneDynamic(original_model);

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2014 Dynare Team
* Copyright (C) 2003-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -73,6 +73,24 @@ InitParamStatement::fillEvalContext(eval_context_t &eval_context) const
}
}
Statement *
InitParamStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
{
SymbolTable *new_symbol_table = dynamic_datatree.getSymbolTable();
try
{
cout << orig_symbol_table.getName(symb_id) << " " << symb_id << "->" << new_symbol_table->getID(orig_symbol_table.getName(symb_id)) << endl;
return new InitParamStatement(new_symbol_table->getID(orig_symbol_table.getName(symb_id)),
param_value->cloneDynamicReindex(dynamic_datatree, orig_symbol_table),
*new_symbol_table);
}
catch (SymbolTable::UnknownSymbolIDException &e)
{
cerr << "ERROR: encountered in InitParamStatement::cloneAndReindexSymbIds. Should not arrive here" << endl;
exit(EXIT_FAILURE);
}
}
InitOrEndValStatement::InitOrEndValStatement(const init_values_t &init_values_arg,
const SymbolTable &symbol_table_arg,
const bool &all_values_required_arg) :
@ -208,6 +226,27 @@ InitValStatement::writeOutputPostInit(ostream &output) const
<<"end;" << endl;
}
Statement *
InitValStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
{
init_values_t new_init_values;
SymbolTable *new_symbol_table = dynamic_datatree.getSymbolTable();
try
{
for (init_values_t::const_iterator it=init_values.begin();
it != init_values.end(); it++)
new_init_values.push_back(make_pair(new_symbol_table->getID(orig_symbol_table.getName(it->first)),
it->second->cloneDynamicReindex(dynamic_datatree, orig_symbol_table)));
}
catch (SymbolTable::UnknownSymbolIDException &e)
{
cerr << "ERROR: A variable in the initval statement was not found in the symbol table" << endl
<< " This likely means that you have declared a varexo that is not used in the model" << endl;
exit(EXIT_FAILURE);
}
return new InitValStatement(new_init_values, *new_symbol_table, all_values_required);
}
EndValStatement::EndValStatement(const init_values_t &init_values_arg,
const SymbolTable &symbol_table_arg,
const bool &all_values_required_arg) :
@ -254,6 +293,27 @@ EndValStatement::writeOutput(ostream &output, const string &basename) const
writeInitValues(output);
}
Statement *
EndValStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
{
init_values_t new_init_values;
SymbolTable *new_symbol_table = dynamic_datatree.getSymbolTable();
try
{
for (init_values_t::const_iterator it=init_values.begin();
it != init_values.end(); it++)
new_init_values.push_back(make_pair(new_symbol_table->getID(orig_symbol_table.getName(it->first)),
it->second->cloneDynamicReindex(dynamic_datatree, orig_symbol_table)));
}
catch (SymbolTable::UnknownSymbolIDException &e)
{
cerr << "ERROR: A variable in the endval statement was not found in the symbol table" << endl
<< " This likely means that you have declared a varexo that is not used in the model" << endl;
exit(EXIT_FAILURE);
}
return new EndValStatement(new_init_values, *new_symbol_table, all_values_required);
}
HistValStatement::HistValStatement(const hist_values_t &hist_values_arg,
const SymbolTable &symbol_table_arg) :
hist_values(hist_values_arg),
@ -320,6 +380,28 @@ HistValStatement::writeOutput(ostream &output, const string &basename) const
}
}
Statement *
HistValStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
{
hist_values_t new_hist_values;
SymbolTable *new_symbol_table = dynamic_datatree.getSymbolTable();
try
{
for (hist_values_t::const_iterator it=hist_values.begin();
it != hist_values.end(); it++)
new_hist_values[make_pair(new_symbol_table->getID(orig_symbol_table.getName(it->first.first)),
it->first.second)] =
it->second->cloneDynamicReindex(dynamic_datatree, orig_symbol_table);
}
catch (SymbolTable::UnknownSymbolIDException &e)
{
cerr << "ERROR: A variable in the hist_val statement was not found in the symbol table" << endl
<< " This likely means that you have declared a varexo that is not used in the model" << endl;
exit(EXIT_FAILURE);
}
return new HistValStatement(new_hist_values, *new_symbol_table);
}
InitvalFileStatement::InitvalFileStatement(const string &filename_arg) :
filename(filename_arg)
{
@ -393,9 +475,10 @@ SaveParamsAndSteadyStateStatement::writeOutput(ostream &output, const string &ba
output << "save_params_and_steady_state('" << filename << "');" << endl;
}
LoadParamsAndSteadyStateStatement::LoadParamsAndSteadyStateStatement(const string &filename,
LoadParamsAndSteadyStateStatement::LoadParamsAndSteadyStateStatement(const string &filename_arg,
const SymbolTable &symbol_table_arg,
WarningConsolidation &warnings) :
filename(filename_arg),
symbol_table(symbol_table_arg)
{
cout << "Reading " << filename << "." << endl;
@ -465,3 +548,10 @@ LoadParamsAndSteadyStateStatement::fillEvalContext(eval_context_t &eval_context)
it != content.end(); it++)
eval_context[it->first] = atof(it->second.c_str());
}
Statement *
LoadParamsAndSteadyStateStatement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
{
WarningConsolidation warnings(false);
return new LoadParamsAndSteadyStateStatement(filename, *(dynamic_datatree.getSymbolTable()), warnings);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2014 Dynare Team
* Copyright (C) 2003-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -44,6 +44,7 @@ public:
virtual void writeCOutput(ostream &output, const string &basename);
//! Fill eval context with parameter value
void fillEvalContext(eval_context_t &eval_context) const;
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
};
class InitOrEndValStatement : public Statement
@ -80,6 +81,7 @@ public:
virtual void writeOutput(ostream &output, const string &basename) const;
//! Writes initializations for oo_.exo_simul and oo_.exo_det_simul
void writeOutputPostInit(ostream &output) const;
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
};
class EndValStatement : public InitOrEndValStatement
@ -91,6 +93,7 @@ public:
//! Workaround for trac ticket #35
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
virtual void writeOutput(ostream &output, const string &basename) const;
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
};
class HistValStatement : public Statement
@ -111,6 +114,7 @@ public:
//! Workaround for trac ticket #157
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
virtual void writeOutput(ostream &output, const string &basename) const;
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
};
class InitvalFileStatement : public Statement
@ -158,17 +162,19 @@ public:
class LoadParamsAndSteadyStateStatement : public Statement
{
private:
const string filename;
const SymbolTable &symbol_table;
//! Content of the file
/*! Maps symbol ID to numeric value (stored as string) */
map<int, string> content;
public:
LoadParamsAndSteadyStateStatement(const string &filename,
LoadParamsAndSteadyStateStatement(const string &filename_arg,
const SymbolTable &symbol_table_arg,
WarningConsolidation &warnings);
virtual void writeOutput(ostream &output, const string &basename) const;
//! Fill eval context with parameters/variables values
void fillEvalContext(eval_context_t &eval_context) const;
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
};
#endif

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2006-2014 Dynare Team
* Copyright (C) 2006-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -73,6 +73,12 @@ Statement::computingPass()
{
}
Statement *
Statement::cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table)
{
return this;
}
NativeStatement::NativeStatement(const string &native_statement_arg) :
native_statement(native_statement_arg)
{

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2006-2014 Dynare Team
* Copyright (C) 2006-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -27,6 +27,8 @@
#include "SymbolList.hh"
#include "WarningConsolidation.hh"
#include "SymbolTable.hh"
#include "DataTree.hh"
class ModFileStructure
{
@ -136,6 +138,11 @@ public:
*/
virtual void writeOutput(ostream &output, const string &basename) const = 0;
virtual void writeCOutput(ostream &output, const string &basename);
//! clone a statement while updating all symbol ids that are contained within it.
/* Symbol id's are updated from the symbol table contained in dynamic_datatree
The original symbol table is contained in orig_symbol_table
*/
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
};
class NativeStatement : public Statement

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2014 Dynare Team
* Copyright (C) 2003-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -21,6 +21,7 @@
#include <sstream>
#include <iostream>
#include <cassert>
#include <list>
#include "SymbolTable.hh"
@ -473,6 +474,40 @@ SymbolTable::addLeadAuxiliaryVarInternal(bool endo, int index) throw (FrozenExce
return symb_id;
}
void
SymbolTable::rmExo(set<int> &unused) throw (FrozenException)
{
if (frozen)
throw FrozenException();
list<int> idxs;
for (set<int>::const_iterator it = unused.begin(); it != unused.end(); it++)
{
string name = getName(*it);
idxs.push_back(symbol_table[name]);
symbol_table.erase(name);
size--;
}
idxs.sort();
idxs.reverse();
for (list<int>::const_iterator it = idxs.begin(); it != idxs.end(); it++)
{
type_table.erase(type_table.begin() + *it);
name_table.erase(name_table.begin() + *it);
tex_name_table.erase(tex_name_table.begin() + *it);
long_name_table.erase(long_name_table.begin() + *it);
}
symbol_table.clear();
int i = 0;
for (vector<string>::const_iterator it=name_table.begin();
it != name_table.end(); it++)
symbol_table[*it] = i++;
assert(size == symbol_table.size());
}
int
SymbolTable::addLagAuxiliaryVarInternal(bool endo, int orig_symb_id, int orig_lead_lag) throw (FrozenException)
{

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2014 Dynare Team
* Copyright (C) 2003-2015 Dynare Team
*
* This file is part of Dynare.
*
@ -303,6 +303,8 @@ public:
bool isAuxiliaryVariable(int symb_id) const;
//! Get list of endogenous variables without aux vars
set <int> getOrigEndogenous() const;
//! Remove exogenous variables contained in the set
void rmExo(set<int> &unused) throw (FrozenException);
};
inline bool