2
$\begingroup$

I'm using Pyomo to solve an optimization problem and I'm using as a solver IPOPT. Now I'm getting an error from IPOPT.

EXIT: Search Direction is becoming Too Small.

according to the docs, this means:

Search Direction is becoming Too Small.

This indicates that IPOPT is calculating very small step sizes and making very little progress. This could happen if the problem has been solved to the best numerical accuracy possible given the current scaling.

Question: I interpret this as that IPOPT has a value calculated, but is returning an error because it isn't 'satisfied'? I find it weird that they don't return a 'best possible value'. Why is this and can we make IPOPT return that best possible value (so that when the search direction is becoming too small, return the best found value at that point)?

edit I came across this document which seems useful for solving my case. https://coin-or.github.io/Ipopt/OPTIONS.html.

$\endgroup$
1
$\begingroup$

Ipopt and similar solvers rely on criteria such as KKT to find out whether they converged against a point which satisfies 2nd order optimality conditions. However for the sake of not running forever and in the face of finite precision of Floating point numbers it does not make sense to continue running. So it stopped early and reported a failure.

Imagine a function $f(x) = 0.5 (\varepsilon*x)^2$ where $\varepsilon$ is the floating point epsilon. The gradient as you approach 0 becomes vanishingly small so you Ipopt with the current settings might not feel confident that can do another step but knows from the KKT conditions that it has reached a point which satisfies 2nd order optimality conditions.

Here are some things you could check

  • On page 8 of the Short Ipopt tutorial it says the Ipopt might also get stuck in saddle points. Are you getting stuck in one? If so starting a different initial value probably help.
  • If you pass hessians/gradients into Ipopt are they correct?
  • Try rescaling the objective multiplying it by some largeish number

I'm not familiar with Pyomo but JuMP from the Julia ecosystem is able to extract the current iteration, the objective and so on, even on solver failure. These information are also available from the C Interface.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.