Add line numbers of equations in preprocessor error messages.

Closes #584
issue#70
Sébastien Villemot 2014-01-27 16:41:43 +01:00
parent 4d2f91813b
commit 47a8fd0147
5 changed files with 42 additions and 34 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 Dynare Team
* Copyright (C) 2003-2014 Dynare Team
*
* This file is part of Dynare.
*
@ -3427,9 +3427,8 @@ DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
dynamic_model.AddLocalVariable(it->first, it->second->cloneDynamic(dynamic_model));
// Convert equations
for (vector<BinaryOpNode *>::const_iterator it = equations.begin();
it != equations.end(); it++)
dynamic_model.addEquation((*it)->cloneDynamic(dynamic_model));
for (size_t i = 0; i < equations.size(); i++)
dynamic_model.addEquation(equations[i]->cloneDynamic(dynamic_model), equations_lineno[i]);
// Convert auxiliary equations
for (deque<BinaryOpNode *>::const_iterator it = aux_equations.begin();
@ -3437,18 +3436,18 @@ DynamicModel::cloneDynamic(DynamicModel &dynamic_model) const
dynamic_model.addAuxEquation((*it)->cloneDynamic(dynamic_model));
// Convert static_only equations
for (vector<BinaryOpNode *>::const_iterator it = static_only_equations.begin();
it != static_only_equations.end(); it++)
dynamic_model.addStaticOnlyEquation((*it)->cloneDynamic(dynamic_model));
for (size_t i = 0; i < static_only_equations.size(); i++)
dynamic_model.addStaticOnlyEquation(static_only_equations[i]->cloneDynamic(dynamic_model),
static_only_equations_lineno[i]);
}
void
DynamicModel::replaceMyEquations(DynamicModel &dynamic_model) const
{
dynamic_model.equations.clear();
for (vector<BinaryOpNode *>::const_iterator it = equations.begin();
it != equations.end(); it++)
dynamic_model.addEquation((*it)->cloneDynamic(dynamic_model));
for (size_t i = 0; i < equations.size(); i++)
dynamic_model.addEquation(equations[i]->cloneDynamic(dynamic_model),
equations_lineno[i]);
}
void
@ -3468,7 +3467,7 @@ DynamicModel::computeRamseyPolicyFOCs(const StaticModel &static_model)
// Add Planner Objective to equations to include in computeDerivIDs
assert(static_model.equations.size() == 1);
addEquation(static_model.equations[0]->cloneDynamic(*this));
addEquation(static_model.equations[0]->cloneDynamic(*this), static_model.equations_lineno[0]);
// Get max endo lead and max endo lag
set<pair<int, int> > dynvars;
@ -3513,7 +3512,7 @@ DynamicModel::computeRamseyPolicyFOCs(const StaticModel &static_model)
}
equations.clear();
addEquation(AddEqual(lagrangian, Zero));
addEquation(AddEqual(lagrangian, Zero), -1);
computeDerivIDs();
//Compute derivatives and overwrite equations
@ -3527,7 +3526,7 @@ DynamicModel::computeRamseyPolicyFOCs(const StaticModel &static_model)
// Add new equations
equations.clear();
for (int i = 0; i < (int) neweqs.size(); i++)
addEquation(neweqs[i]);
addEquation(neweqs[i], -1);
}
void
@ -3559,11 +3558,11 @@ DynamicModel::toStatic(StaticModel &static_model) const
// If yes, replace it by an equation marked [static]
if (is_dynamic_only)
{
static_model.addEquation(static_only_equations[static_only_index]->toStatic(static_model));
static_model.addEquation(static_only_equations[static_only_index]->toStatic(static_model), static_only_equations_lineno[static_only_index]);
static_only_index++;
}
else
static_model.addEquation(equations[i]->toStatic(static_model));
static_model.addEquation(equations[i]->toStatic(static_model), equations_lineno[i]);
}
// Convert auxiliary equations
@ -3795,7 +3794,8 @@ DynamicModel::testTrendDerivativesEqualToZero(const eval_context_t &eval_context
double nearZero = testeq->getDerivative(endogit->second)->eval(eval_context); // eval d F / d Trend d Endog
if (fabs(nearZero) > ZERO_BAND)
{
cerr << "ERROR: trends not compatible with balanced growth path; the second-order cross partial of equation " << eq + 1 << " w.r.t. trend variable "
cerr << "ERROR: trends not compatible with balanced growth path; the second-order cross partial of equation " << eq + 1 << " (line "
<< equations_lineno[eq] << ") w.r.t. trend variable "
<< symbol_table.getName(it->first.first) << " and endogenous variable "
<< symbol_table.getName(endogit->first.first) << " is not null. " << endl;
exit(EXIT_FAILURE);
@ -4075,7 +4075,7 @@ DynamicModel::substituteLeadLagInternal(aux_var_t type, bool deterministic_model
// Add new equations
for (int i = 0; i < (int) neweqs.size(); i++)
addEquation(neweqs[i]);
addEquation(neweqs[i], -1);
// Order of auxiliary variable definition equations:
// - expectation (entered before this function is called)
@ -4135,7 +4135,7 @@ DynamicModel::substituteExpectation(bool partial_information_model)
// Add new equations
for (int i = 0; i < (int) neweqs.size(); i++)
addEquation(neweqs[i]);
addEquation(neweqs[i], -1);
// Add the new set of equations at the *beginning* of aux_equations
copy(neweqs.rbegin(), neweqs.rend(), front_inserter(aux_equations));
@ -4256,12 +4256,13 @@ DynamicModel::isModelLocalVariableUsed() const
}
void
DynamicModel::addStaticOnlyEquation(expr_t eq)
DynamicModel::addStaticOnlyEquation(expr_t eq, int lineno)
{
BinaryOpNode *beq = dynamic_cast<BinaryOpNode *>(eq);
assert(beq != NULL && beq->get_op_code() == oEqual);
static_only_equations.push_back(beq);
static_only_equations_lineno.push_back(lineno);
}
size_t

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 Dynare Team
* Copyright (C) 2003-2014 Dynare Team
*
* This file is part of Dynare.
*
@ -35,6 +35,9 @@ private:
/*! They will be used in toStatic() to replace equations marked as [dynamic] */
vector<BinaryOpNode *> static_only_equations;
//! Stores line numbers of equations declared as [static]
vector<int> static_only_equations_lineno;
typedef map<pair<int, int>, int> deriv_id_table_t;
//! Maps a pair (symbol_id, lag) to a deriv ID
deriv_id_table_t deriv_id_table;
@ -237,7 +240,7 @@ public:
void replaceMyEquations(DynamicModel &dynamic_model) const;
//! Adds an equation marked as [static]
void addStaticOnlyEquation(expr_t eq);
void addStaticOnlyEquation(expr_t eq, int lineno);
//! Returns number of static only equations
size_t staticOnlyEquationsNbr() const;

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 Dynare Team
* Copyright (C) 2003-2014 Dynare Team
*
* This file is part of Dynare.
*
@ -270,7 +270,7 @@ ModelTree::evaluateAndReduceJacobian(const eval_context_t &eval_context, jacob_m
}
catch (ExprNode::EvalException &e)
{
cerr << "ERROR: evaluation of Jacobian failed for equation " << eq+1 << " and variable " << symbol_table.getName(symb) << "(" << lag << ") [" << symb << "] !" << endl;
cerr << "ERROR: evaluation of Jacobian failed for equation " << eq+1 << " (line " << equations_lineno[eq] << ") and variable " << symbol_table.getName(symb) << "(" << lag << ") [" << symb << "] !" << endl;
Id->writeOutput(cerr, oMatlabDynamicModelSparse, temporary_terms);
cerr << endl;
exit(EXIT_FAILURE);
@ -1376,21 +1376,22 @@ ModelTree::writeLatexModelFile(const string &filename, ExprNodeOutputType output
}
void
ModelTree::addEquation(expr_t eq)
ModelTree::addEquation(expr_t eq, int lineno)
{
BinaryOpNode *beq = dynamic_cast<BinaryOpNode *>(eq);
assert(beq != NULL && beq->get_op_code() == oEqual);
equations.push_back(beq);
equations_lineno.push_back(lineno);
}
void
ModelTree::addEquation(expr_t eq, vector<pair<string, string> > &eq_tags)
ModelTree::addEquation(expr_t eq, int lineno, vector<pair<string, string> > &eq_tags)
{
int n = equation_number();
for (size_t i = 0; i < eq_tags.size(); i++)
equation_tags.push_back(make_pair(n, eq_tags[i]));
addEquation(eq);
addEquation(eq, lineno);
}
void

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 Dynare Team
* Copyright (C) 2003-2014 Dynare Team
*
* This file is part of Dynare.
*
@ -54,6 +54,9 @@ protected:
//! Stores declared and generated auxiliary equations
vector<BinaryOpNode *> equations;
//! Stores line numbers of declared equations; -1 means undefined
vector<int> equations_lineno;
//! Only stores generated auxiliary equations, in an order meaningful for evaluation
deque<BinaryOpNode *> aux_equations;
@ -295,10 +298,10 @@ public:
3 : the variables belonging to a non normalizable non linear equation are considered as feedback variables
default value = 0 */
int mfs;
//! Declare a node as an equation of the model
void addEquation(expr_t eq);
//! Declare a node as an equation of the model; also give its line number
void addEquation(expr_t eq, int lineno);
//! Declare a node as an equation of the model, also giving its tags
void addEquation(expr_t eq, 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
void addAuxEquation(expr_t eq);
//! Returns the number of equations in the model

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2003-2013 Dynare Team
* Copyright (C) 2003-2014 Dynare Team
*
* This file is part of Dynare.
*
@ -1741,7 +1741,7 @@ ParsingDriver::end_planner_objective(expr_t expr)
{
// Add equation corresponding to expression
expr_t eq = model_tree->AddEqual(expr, model_tree->Zero);
model_tree->addEquation(eq);
model_tree->addEquation(eq, location.begin.line);
mod_file->addStatement(new PlannerObjectiveStatement(dynamic_cast<StaticModel *>(model_tree)));
@ -1988,10 +1988,10 @@ ParsingDriver::add_model_equal(expr_t arg1, expr_t arg2)
if (!id->isInStaticForm())
error("An equation tagged [static] cannot contain leads, lags, expectations or STEADY_STATE operators");
dynamic_model->addStaticOnlyEquation(id);
dynamic_model->addStaticOnlyEquation(id, location.begin.line);
}
else
model_tree->addEquation(id, eq_tags);
model_tree->addEquation(id, location.begin.line, eq_tags);
eq_tags.clear();
return id;