[Ipopt-tickets] [Ipopt] #177: setting multipliers for fixed variables gives assert/segfault if solve failed
Ipopt
coin-trac at coin-or.org
Thu Jan 26 05:43:42 EST 2012
#177: setting multipliers for fixed variables gives assert/segfault if solve
failed
-------------------+------------------------
Reporter: stefan | Owner: ipopt-team
Type: defect | Status: new
Priority: normal | Component: Ipopt
Version: 3.10 | Severity: minor
Keywords: |
-------------------+------------------------
Hi,
I run Ipopt with "fixed_variable_treatment make_constraint".
The solve failed with status RESTORATION_FAILURE.
In this case, I get a segmentation fault from
{{{TNLPAdapter::FinalizeSolution}}} in the lines
{{{
// Hopefully the following is correct to recover the bound
// multipliers for fixed variables (sign ok?)
if (fixed_variable_treatment_==MAKE_CONSTRAINT && n_x_fixed_>0) {
const DenseVector* dy_c = static_cast<const DenseVector*>(&y_c);
DBG_ASSERT(dynamic_cast<const DenseVector*>(&y_c));
DBG_ASSERT(!dy_c->IsHomogeneous());
const Number* values = dy_c->Values();
Index n_c_no_fixed = y_c.Dim() - n_x_fixed_;
for (Index i=0; i<n_x_fixed_; i++) {
full_z_L[x_fixed_map_[i]] = Max(0., -values[n_c_no_fixed+i]);
full_z_U[x_fixed_map_[i]] = Max(0., values[n_c_no_fixed+i]);
}
}
}}}
because the values pointer is NULL.
Debugging shows, that y_c is a homogeneous vector with value 0.0.
I believe this is because the solve failed.
Probably, I would get an assert if DBG_ASSERT is activated.
I committed a workaround to stable/3.10:
https://projects.coin-or.org/Ipopt/changeset/2066/
However, a better fix may be to skip setting the multipliers if no
solution is available.
--
Ticket URL: <https://projects.coin-or.org/ticket/177>
Ipopt <http://projects.coin-or.org/Ipopt>
Interior-point optimizer for nonlinear programs.
More information about the Ipopt-tickets
mailing list