preprocessor: remove extraneous varexo, update model and statements, #841
parent
9ab6be8995
commit
6c937b1554
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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 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 */
|
/*! Returns 0 if the symbol is not used */
|
||||||
int minLagForSymbol(int symb_id) const;
|
int minLagForSymbol(int symb_id) const;
|
||||||
|
inline SymbolTable *getSymbolTable() const { return &symbol_table; };
|
||||||
//! Write the Header for getPowerDeriv when use_dll is used
|
//! Write the Header for getPowerDeriv when use_dll is used
|
||||||
void writePowerDerivCHeader(ostream &output) const;
|
void writePowerDerivCHeader(ostream &output) const;
|
||||||
//! Write getPowerDeriv
|
//! Write getPowerDeriv
|
||||||
|
|
|
@ -3425,6 +3425,22 @@ DynamicModel::writeDynamicFile(const string &basename, bool block, bool bytecode
|
||||||
writeDynamicMFile(t_basename);
|
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
|
void
|
||||||
DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
|
DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -235,6 +235,9 @@ 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);
|
||||||
|
|
||||||
//! Replaces model equations with derivatives of Lagrangian w.r.t. endogenous
|
//! Replaces model equations with derivatives of Lagrangian w.r.t. endogenous
|
||||||
void computeRamseyPolicyFOCs(const StaticModel &static_model);
|
void computeRamseyPolicyFOCs(const StaticModel &static_model);
|
||||||
//! Replaces the model equations in dynamic_model with those in this model
|
//! Replaces the model equations in dynamic_model with those in this model
|
||||||
|
|
|
@ -354,6 +354,12 @@ NumConstNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
return dynamic_datatree.AddNonNegativeConstant(datatree.num_constants.get(id));
|
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
|
int
|
||||||
NumConstNode::maxEndoLead() const
|
NumConstNode::maxEndoLead() const
|
||||||
{
|
{
|
||||||
|
@ -988,6 +994,12 @@ VariableNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
return dynamic_datatree.AddVariable(symb_id, lag);
|
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
|
int
|
||||||
VariableNode::maxEndoLead() const
|
VariableNode::maxEndoLead() const
|
||||||
{
|
{
|
||||||
|
@ -2234,6 +2246,13 @@ UnaryOpNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
return buildSimilarUnaryOpNode(substarg, dynamic_datatree);
|
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
|
int
|
||||||
UnaryOpNode::maxEndoLead() const
|
UnaryOpNode::maxEndoLead() const
|
||||||
{
|
{
|
||||||
|
@ -3452,6 +3471,14 @@ BinaryOpNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
return buildSimilarBinaryOpNode(substarg1, substarg2, dynamic_datatree);
|
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
|
int
|
||||||
BinaryOpNode::maxEndoLead() const
|
BinaryOpNode::maxEndoLead() const
|
||||||
{
|
{
|
||||||
|
@ -4120,6 +4147,15 @@ TrinaryOpNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
return buildSimilarTrinaryOpNode(substarg1, substarg2, substarg3, dynamic_datatree);
|
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
|
int
|
||||||
TrinaryOpNode::maxEndoLead() const
|
TrinaryOpNode::maxEndoLead() const
|
||||||
{
|
{
|
||||||
|
@ -4689,6 +4725,17 @@ ExternalFunctionNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
return dynamic_datatree.AddExternalFunction(symb_id, dynamic_arguments);
|
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
|
int
|
||||||
AbstractExternalFunctionNode::maxEndoLead() const
|
AbstractExternalFunctionNode::maxEndoLead() const
|
||||||
{
|
{
|
||||||
|
@ -5182,6 +5229,18 @@ FirstDerivExternalFunctionNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
inputIndex);
|
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
|
expr_t
|
||||||
FirstDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
|
FirstDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
|
||||||
{
|
{
|
||||||
|
@ -5417,6 +5476,18 @@ SecondDerivExternalFunctionNode::cloneDynamic(DataTree &dynamic_datatree) const
|
||||||
inputIndex1, inputIndex2);
|
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
|
expr_t
|
||||||
SecondDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
|
SecondDerivExternalFunctionNode::buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_datatree) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2007-2014 Dynare Team
|
* Copyright (C) 2007-2015 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -407,6 +407,9 @@ public:
|
||||||
//! Add ExprNodes to the provided datatree
|
//! Add ExprNodes to the provided datatree
|
||||||
virtual expr_t cloneDynamic(DataTree &dynamic_datatree) const = 0;
|
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
|
//! 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;
|
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 replaceTrendVar() const;
|
||||||
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) 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 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 expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
|
||||||
virtual bool isInStaticForm() const;
|
virtual bool isInStaticForm() const;
|
||||||
};
|
};
|
||||||
|
@ -529,6 +533,7 @@ public:
|
||||||
virtual expr_t replaceTrendVar() const;
|
virtual expr_t replaceTrendVar() const;
|
||||||
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) 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 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 expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
|
||||||
virtual bool isInStaticForm() const;
|
virtual bool isInStaticForm() const;
|
||||||
};
|
};
|
||||||
|
@ -606,6 +611,7 @@ public:
|
||||||
virtual expr_t replaceTrendVar() const;
|
virtual expr_t replaceTrendVar() const;
|
||||||
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) 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 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 expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
|
||||||
virtual bool isInStaticForm() const;
|
virtual bool isInStaticForm() const;
|
||||||
};
|
};
|
||||||
|
@ -696,6 +702,7 @@ public:
|
||||||
virtual expr_t replaceTrendVar() const;
|
virtual expr_t replaceTrendVar() const;
|
||||||
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) 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 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 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
|
//! Function to write out the oPowerNode in expr_t terms as opposed to writing out the function itself
|
||||||
expr_t unpackPowerDeriv() const;
|
expr_t unpackPowerDeriv() const;
|
||||||
|
@ -766,6 +773,7 @@ public:
|
||||||
virtual expr_t replaceTrendVar() const;
|
virtual expr_t replaceTrendVar() const;
|
||||||
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) 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 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 expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
|
||||||
virtual bool isInStaticForm() const;
|
virtual bool isInStaticForm() const;
|
||||||
};
|
};
|
||||||
|
@ -841,6 +849,7 @@ public:
|
||||||
virtual expr_t replaceTrendVar() const;
|
virtual expr_t replaceTrendVar() const;
|
||||||
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) 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 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 expr_t removeTrendLeadLag(map<int, expr_t> trend_symbols_map) const;
|
||||||
virtual bool isInStaticForm() const;
|
virtual bool isInStaticForm() const;
|
||||||
};
|
};
|
||||||
|
@ -871,6 +880,7 @@ public:
|
||||||
virtual expr_t toStatic(DataTree &static_datatree) const;
|
virtual expr_t toStatic(DataTree &static_datatree) const;
|
||||||
virtual expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_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 cloneDynamic(DataTree &dynamic_datatree) const;
|
||||||
|
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class FirstDerivExternalFunctionNode : public AbstractExternalFunctionNode
|
class FirstDerivExternalFunctionNode : public AbstractExternalFunctionNode
|
||||||
|
@ -905,6 +915,7 @@ public:
|
||||||
virtual expr_t toStatic(DataTree &static_datatree) const;
|
virtual expr_t toStatic(DataTree &static_datatree) const;
|
||||||
virtual expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_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 cloneDynamic(DataTree &dynamic_datatree) const;
|
||||||
|
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SecondDerivExternalFunctionNode : public AbstractExternalFunctionNode
|
class SecondDerivExternalFunctionNode : public AbstractExternalFunctionNode
|
||||||
|
@ -941,6 +952,7 @@ public:
|
||||||
virtual expr_t toStatic(DataTree &static_datatree) const;
|
virtual expr_t toStatic(DataTree &static_datatree) const;
|
||||||
virtual expr_t buildSimilarExternalFunctionNode(vector<expr_t> &alt_args, DataTree &alt_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 cloneDynamic(DataTree &dynamic_datatree) const;
|
||||||
|
virtual expr_t cloneDynamicReindex(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -307,6 +307,19 @@ ModFile::checkPass()
|
||||||
void
|
void
|
||||||
ModFile::transformPass(bool nostrict)
|
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)
|
// Save the original model (must be done before any model transformations by preprocessor)
|
||||||
dynamic_model.cloneDynamic(original_model);
|
dynamic_model.cloneDynamic(original_model);
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -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,
|
InitOrEndValStatement::InitOrEndValStatement(const init_values_t &init_values_arg,
|
||||||
const SymbolTable &symbol_table_arg,
|
const SymbolTable &symbol_table_arg,
|
||||||
const bool &all_values_required_arg) :
|
const bool &all_values_required_arg) :
|
||||||
|
@ -208,6 +226,27 @@ InitValStatement::writeOutputPostInit(ostream &output) const
|
||||||
<<"end;" << endl;
|
<<"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,
|
EndValStatement::EndValStatement(const init_values_t &init_values_arg,
|
||||||
const SymbolTable &symbol_table_arg,
|
const SymbolTable &symbol_table_arg,
|
||||||
const bool &all_values_required_arg) :
|
const bool &all_values_required_arg) :
|
||||||
|
@ -254,6 +293,27 @@ EndValStatement::writeOutput(ostream &output, const string &basename) const
|
||||||
writeInitValues(output);
|
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,
|
HistValStatement::HistValStatement(const hist_values_t &hist_values_arg,
|
||||||
const SymbolTable &symbol_table_arg) :
|
const SymbolTable &symbol_table_arg) :
|
||||||
hist_values(hist_values_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) :
|
InitvalFileStatement::InitvalFileStatement(const string &filename_arg) :
|
||||||
filename(filename_arg)
|
filename(filename_arg)
|
||||||
{
|
{
|
||||||
|
@ -393,9 +475,10 @@ SaveParamsAndSteadyStateStatement::writeOutput(ostream &output, const string &ba
|
||||||
output << "save_params_and_steady_state('" << filename << "');" << endl;
|
output << "save_params_and_steady_state('" << filename << "');" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadParamsAndSteadyStateStatement::LoadParamsAndSteadyStateStatement(const string &filename,
|
LoadParamsAndSteadyStateStatement::LoadParamsAndSteadyStateStatement(const string &filename_arg,
|
||||||
const SymbolTable &symbol_table_arg,
|
const SymbolTable &symbol_table_arg,
|
||||||
WarningConsolidation &warnings) :
|
WarningConsolidation &warnings) :
|
||||||
|
filename(filename_arg),
|
||||||
symbol_table(symbol_table_arg)
|
symbol_table(symbol_table_arg)
|
||||||
{
|
{
|
||||||
cout << "Reading " << filename << "." << endl;
|
cout << "Reading " << filename << "." << endl;
|
||||||
|
@ -465,3 +548,10 @@ LoadParamsAndSteadyStateStatement::fillEvalContext(eval_context_t &eval_context)
|
||||||
it != content.end(); it++)
|
it != content.end(); it++)
|
||||||
eval_context[it->first] = atof(it->second.c_str());
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -44,6 +44,7 @@ public:
|
||||||
virtual void writeCOutput(ostream &output, const string &basename);
|
virtual void writeCOutput(ostream &output, const string &basename);
|
||||||
//! Fill eval context with parameter value
|
//! Fill eval context with parameter value
|
||||||
void fillEvalContext(eval_context_t &eval_context) const;
|
void fillEvalContext(eval_context_t &eval_context) const;
|
||||||
|
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
};
|
};
|
||||||
|
|
||||||
class InitOrEndValStatement : public Statement
|
class InitOrEndValStatement : public Statement
|
||||||
|
@ -80,6 +81,7 @@ public:
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const;
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
//! Writes initializations for oo_.exo_simul and oo_.exo_det_simul
|
//! Writes initializations for oo_.exo_simul and oo_.exo_det_simul
|
||||||
void writeOutputPostInit(ostream &output) const;
|
void writeOutputPostInit(ostream &output) const;
|
||||||
|
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
};
|
};
|
||||||
|
|
||||||
class EndValStatement : public InitOrEndValStatement
|
class EndValStatement : public InitOrEndValStatement
|
||||||
|
@ -91,6 +93,7 @@ public:
|
||||||
//! Workaround for trac ticket #35
|
//! Workaround for trac ticket #35
|
||||||
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const;
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
|
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
};
|
};
|
||||||
|
|
||||||
class HistValStatement : public Statement
|
class HistValStatement : public Statement
|
||||||
|
@ -111,6 +114,7 @@ public:
|
||||||
//! Workaround for trac ticket #157
|
//! Workaround for trac ticket #157
|
||||||
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
virtual void checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings);
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const;
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
|
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
};
|
};
|
||||||
|
|
||||||
class InitvalFileStatement : public Statement
|
class InitvalFileStatement : public Statement
|
||||||
|
@ -158,17 +162,19 @@ public:
|
||||||
class LoadParamsAndSteadyStateStatement : public Statement
|
class LoadParamsAndSteadyStateStatement : public Statement
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
const string filename;
|
||||||
const SymbolTable &symbol_table;
|
const SymbolTable &symbol_table;
|
||||||
//! Content of the file
|
//! Content of the file
|
||||||
/*! Maps symbol ID to numeric value (stored as string) */
|
/*! Maps symbol ID to numeric value (stored as string) */
|
||||||
map<int, string> content;
|
map<int, string> content;
|
||||||
public:
|
public:
|
||||||
LoadParamsAndSteadyStateStatement(const string &filename,
|
LoadParamsAndSteadyStateStatement(const string &filename_arg,
|
||||||
const SymbolTable &symbol_table_arg,
|
const SymbolTable &symbol_table_arg,
|
||||||
WarningConsolidation &warnings);
|
WarningConsolidation &warnings);
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const;
|
virtual void writeOutput(ostream &output, const string &basename) const;
|
||||||
//! Fill eval context with parameters/variables values
|
//! Fill eval context with parameters/variables values
|
||||||
void fillEvalContext(eval_context_t &eval_context) const;
|
void fillEvalContext(eval_context_t &eval_context) const;
|
||||||
|
virtual Statement *cloneAndReindexSymbIds(DataTree &dynamic_datatree, SymbolTable &orig_symbol_table);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2006-2014 Dynare Team
|
* Copyright (C) 2006-2015 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* 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) :
|
NativeStatement::NativeStatement(const string &native_statement_arg) :
|
||||||
native_statement(native_statement_arg)
|
native_statement(native_statement_arg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2006-2014 Dynare Team
|
* Copyright (C) 2006-2015 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -27,6 +27,8 @@
|
||||||
|
|
||||||
#include "SymbolList.hh"
|
#include "SymbolList.hh"
|
||||||
#include "WarningConsolidation.hh"
|
#include "WarningConsolidation.hh"
|
||||||
|
#include "SymbolTable.hh"
|
||||||
|
#include "DataTree.hh"
|
||||||
|
|
||||||
class ModFileStructure
|
class ModFileStructure
|
||||||
{
|
{
|
||||||
|
@ -136,6 +138,11 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void writeOutput(ostream &output, const string &basename) const = 0;
|
virtual void writeOutput(ostream &output, const string &basename) const = 0;
|
||||||
virtual void writeCOutput(ostream &output, const string &basename);
|
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
|
class NativeStatement : public Statement
|
||||||
|
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
@ -21,6 +21,7 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
#include "SymbolTable.hh"
|
#include "SymbolTable.hh"
|
||||||
|
|
||||||
|
@ -473,6 +474,40 @@ SymbolTable::addLeadAuxiliaryVarInternal(bool endo, int index) throw (FrozenExce
|
||||||
return symb_id;
|
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
|
int
|
||||||
SymbolTable::addLagAuxiliaryVarInternal(bool endo, int orig_symb_id, int orig_lead_lag) throw (FrozenException)
|
SymbolTable::addLagAuxiliaryVarInternal(bool endo, int orig_symb_id, int orig_lead_lag) throw (FrozenException)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,8 @@ public:
|
||||||
bool isAuxiliaryVariable(int symb_id) const;
|
bool isAuxiliaryVariable(int symb_id) const;
|
||||||
//! Get list of endogenous variables without aux vars
|
//! Get list of endogenous variables without aux vars
|
||||||
set <int> getOrigEndogenous() const;
|
set <int> getOrigEndogenous() const;
|
||||||
|
//! Remove exogenous variables contained in the set
|
||||||
|
void rmExo(set<int> &unused) throw (FrozenException);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
|
|
Loading…
Reference in New Issue