declare parameters when adl is encountered

issue#70
Houtan Bastani 2017-06-30 15:56:56 +02:00
parent ec5068623c
commit b7b0a6f73a
4 changed files with 8 additions and 33 deletions

View File

@ -4316,12 +4316,12 @@ BinaryOpNode::substituteAdlAndDiff() const
expr_t arg1subst = arg1->substituteAdlAndDiff();
int i = 1;
expr_t retval = datatree.AddTimes(datatree.AddVariable(datatree.symbol_table.addAdlParameter(adlparam, i), 0),
arg1subst->decreaseLeadsLags(i));
int param_symb_id = datatree.symbol_table.getID(adlparam + "_lag_" + to_string(i));
expr_t retval = datatree.AddTimes(datatree.AddVariable(param_symb_id, 0), arg1subst->decreaseLeadsLags(i));
i++;
for (; i <= (int) arg2->eval(eval_context_t()); i++)
retval = datatree.AddPlus(retval,
datatree.AddTimes(datatree.AddVariable(datatree.symbol_table.addAdlParameter(adlparam, i), 0),
datatree.AddTimes(datatree.AddVariable(datatree.symbol_table.getID(adlparam + "_lag_" + to_string(i)), 0),
arg1subst->decreaseLeadsLags(i)));
return retval;
}

View File

@ -2596,6 +2596,11 @@ ParsingDriver::add_adl(expr_t arg1, string *name, string *lag)
{
expr_t id = data_tree->AddAdl(arg1, *name,
data_tree->AddNonNegativeConstant(*lag));
// Declare parameters here so that parameters can be initialized after the model block
for (int i = 0; i < atoi(lag->c_str()); i++)
declare_parameter(new string(*name + "_lag_" + to_string(i+1)));
delete name;
delete lag;
return id;

View File

@ -649,29 +649,6 @@ SymbolTable::addLagAuxiliaryVarInternal(bool endo, int orig_symb_id, int orig_le
return symb_id;
}
int
SymbolTable::addAdlParameter(const string &basename, int lag) throw (FrozenException)
{
ostringstream varname;
varname << basename << "_lag_" << lag;
try
{
int symb_id = addSymbol(varname.str(), eParameter);
adl_params.push_back(symb_id);
return symb_id;
}
catch (AlreadyDeclaredException &e)
{
int symb_id = getID(varname.str());
if (find(adl_params.begin(), adl_params.end(), symb_id) != adl_params.end())
return symb_id;
cerr << "ERROR: you should rename your variable called " << varname.str() << ", this name is internally used by Dynare" << endl;
exit(EXIT_FAILURE);
}
}
int
SymbolTable::addEndoLeadAuxiliaryVar(int index, expr_t expr_arg) throw (FrozenException)
{

View File

@ -153,9 +153,6 @@ private:
//! Stores the list of observed exogenous variables
vector<int> varexobs;
//! Stores list of parameters declared in adl substitution
vector<int> adl_params;
public:
SymbolTable();
//! Thrown when trying to access an unknown symbol (by name)
@ -287,10 +284,6 @@ public:
//! Adds an auxiliary variable when var_model is used with an order that is greater in absolute value
//! than the largest lag present in the model.
int addVarModelEndoLagAuxiliaryVar(int orig_symb_id, int orig_lead_lag, expr_t expr_arg) throw (AlreadyDeclaredException, FrozenException);
/*
// Adds a parameter for the transformation of the adl operator
*/
int addAdlParameter(const string &basename, int lag) throw (FrozenException);
//! Returns the number of auxiliary variables
int
AuxVarsSize() const