preprocessor: issue error when exogenous included in planner_objective. closes #1264

issue#70
Houtan Bastani 2016-08-12 11:50:57 +02:00
parent e4745e040a
commit 01552008ba
5 changed files with 69 additions and 0 deletions

View File

@ -1254,6 +1254,13 @@ void
PlannerObjectiveStatement::checkPass(ModFileStructure &mod_file_struct, WarningConsolidation &warnings)
{
assert(model_tree->equation_number() == 1);
if (model_tree->exoPresentInEqs())
{
cerr << "ERROR: You cannot include exogenous variables in the planner objective. Please "
<< "define an auxiliary endogenous variable like eps_aux=epsilon and use it instead "
<< "of the varexo." << endl;
exit(EXIT_FAILURE);
}
mod_file_struct.planner_objective_present = true;
}

View File

@ -478,6 +478,12 @@ NumConstNode::containsEndogenous(void) const
return false;
}
bool
NumConstNode::containsExogenous() const
{
return false;
}
expr_t
NumConstNode::replaceTrendVar() const
{
@ -1406,6 +1412,12 @@ VariableNode::containsEndogenous(void) const
return false;
}
bool
VariableNode::containsExogenous() const
{
return (type == eExogenous || type == eExogenousDet);
}
expr_t
VariableNode::replaceTrendVar() const
{
@ -2525,6 +2537,12 @@ UnaryOpNode::containsEndogenous(void) const
return arg->containsEndogenous();
}
bool
UnaryOpNode::containsExogenous() const
{
return arg->containsExogenous();
}
expr_t
UnaryOpNode::replaceTrendVar() const
{
@ -3824,6 +3842,12 @@ BinaryOpNode::containsEndogenous(void) const
return (arg1->containsEndogenous() || arg2->containsEndogenous());
}
bool
BinaryOpNode::containsExogenous() const
{
return (arg1->containsExogenous() || arg2->containsExogenous());
}
expr_t
BinaryOpNode::replaceTrendVar() const
{
@ -4487,6 +4511,12 @@ TrinaryOpNode::containsEndogenous(void) const
return (arg1->containsEndogenous() || arg2->containsEndogenous() || arg3->containsEndogenous());
}
bool
TrinaryOpNode::containsExogenous() const
{
return (arg1->containsExogenous() || arg2->containsExogenous() || arg3->containsExogenous());
}
expr_t
TrinaryOpNode::replaceTrendVar() const
{
@ -4781,6 +4811,16 @@ AbstractExternalFunctionNode::containsEndogenous(void) const
return result;
}
bool
AbstractExternalFunctionNode::containsExogenous() const
{
for (vector<expr_t>::const_iterator it = arguments.begin();
it != arguments.end(); it++)
if ((*it)->containsExogenous())
return true;
return false;
}
expr_t
AbstractExternalFunctionNode::replaceTrendVar() const
{

View File

@ -416,6 +416,9 @@ public:
//! Returns true if the expression contains one or several endogenous variable
virtual bool containsEndogenous(void) const = 0;
//! Returns true if the expression contains one or several exogenous variable
virtual bool containsExogenous() const = 0;
//! Return true if the nodeID is a variable withe a type equal to type_arg, a specific variable id aqual to varfiable_id and a lag equal to lag_arg and false otherwise
/*!
\param[in] the type (type_arg), specifique variable id (variable_id and the lag (lag_arg)
@ -499,6 +502,7 @@ public:
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const;
virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
@ -564,6 +568,7 @@ public:
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const;
virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
@ -649,6 +654,7 @@ public:
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const;
virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
@ -747,6 +753,7 @@ public:
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const;
virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
@ -827,6 +834,7 @@ public:
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const;
virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual expr_t replaceTrendVar() const;
virtual expr_t detrend(int symb_id, bool log_trend, expr_t trend) const;
@ -907,6 +915,7 @@ public:
virtual expr_t differentiateForwardVars(const vector<string> &subset, subst_table_t &subst_table, vector<BinaryOpNode *> &neweqs) const;
virtual bool isNumConstNodeEqualTo(double value) const;
virtual bool containsEndogenous(void) const;
virtual bool containsExogenous() const;
virtual bool isVariableNodeEqualTo(SymbolType type_arg, int variable_id, int lag_arg) const;
virtual void writePrhs(ostream &output, ExprNodeOutputType output_type, const temporary_terms_t &temporary_terms, deriv_node_temp_terms_t &tef_terms, const string &ending) const;
virtual expr_t replaceTrendVar() const;

View File

@ -1747,6 +1747,15 @@ StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode,
writeSetAuxiliaryVariables(basename, julia);
}
bool
StaticModel::exoPresentInEqs() const
{
for (int i = 0; i < (int) equations.size(); i++)
if (equations[i]->containsExogenous())
return true;
return false;
}
void
StaticModel::writeStaticBlockMFSFile(const string &basename) const
{

View File

@ -186,6 +186,10 @@ public:
void writeSetAuxiliaryVariables(const string &basename, const bool julia) const;
void writeAuxVarRecursiveDefinitions(ostream &output, ExprNodeOutputType output_type) const;
//! To ensure that no exogenous is present in the planner objective
//! See #1264
bool exoPresentInEqs() const;
virtual int getDerivID(int symb_id, int lag) const throw (UnknownDerivIDException);
virtual void addAllParamDerivId(set<int> &deriv_id_set);