[Ipopt] Catch (...) statements in Ipopt
David Wilkinson
xyz-coin at effisols.com
Tue May 16 13:01:04 EDT 2017
Hi Stefan:
I am using Ipopt via Bonmin, and it is not immediately obvious now to get the
IpotApplication object on which to call RethrowNonIpoptException(). My goal is
to avoid making any modifications in the Bonmin/Ipopt source code (otherwise I
could just hard-wire rethrow_nonipoptexception_ to true in the IpoptApplication
constructors).
The way I use Bonmin (based on the example in the Bonmin documentation) is
something like
// BonminOptimizer.cpp
// Implementation of driver class for Bonmin
using namespace Bonmin;
using namespace Ipopt;
// m_babPtr member is a smart pointer to Bonmin::Bab object
void BonminOptimizer::Run()
{
BonminSetup bonmin(someArg);
// work with options
bonmin.initialize(GetRawPtr(myTminlp)); // creates first instance
try
{
m_babPtr.reset(new Bab());
m_babPtr->branchAndBound(bonmin); // creates second instance
}
// some catch statements
// save some results
}
This code indirectly creates two instances of IpoptApplication, as indicated in
the comments. It is the second one that catches exceptions thrown in the TMINLP
object of my driver application, but this IpoptApplication object is not
directly available in the above function, because the branchAndBound() call does
not return until the optimization is completed.
I have actually been able to get what I want by doing the following:
// BonminOptimizer.cpp
void BonminOptimizer::RethrowNonIpoptException(bool dorethrow) const
{
CbcModel& model = m_babPtr->model();
OsiTMINLPInterface* p = static_cast<OsiTMINLPInterface*>(model.solver());
IpoptSolver* pSolver = static_cast<IpoptSolver*>(p->solver());
IpoptApplication& app = pSolver->getIpoptApp();
app.RethrowNonIpoptException(dorethrow);
}
The above method is called from
// MyTMINLP.cpp
void MyTMINLP::CheckOptimizerStatus()
{
// This method is called from each evaluation method in MyTMINLP
// m_pOptimizer is a member pointer to BonminOptimizer object
// m_bRethrow is a member bool, initially false
if (!m_bRethrow) // IpoptApplication object is not yet in rethrow mode
{
m_pOptimizer->RethrowNonIpoptException(true); put in rethrow mode
m_bRethrow = true;
}
m_pOptimizer->CheckStatus(); // this may throw (by design)
}
This seems to work but, as you can imagine, it took me a long time to figure out
how to get the IpoptApplication object, and it is extremely clunky.
Might there be simpler way to do this?
If not, maybe this is a defect in Bonmin rather than Ipopt, but it would be much
easier if there were some global way to set rethrow_nonipoptexception_, or if it
could be set via the options.
Sorry for the long post...
David Wilkinson
==========================================
Stefan Vigerske wrote:
> Hi,
>
> you can change the value of rethrow_nonipoptexception_ via
> IpoptApplication::RethrowNonIpoptException():
>
> https://www.coin-or.org/Ipopt/doxygen/classIpopt_1_1IpoptApplication.html#a985d4b2f4b443b7aef8d6e924c49b5ce
>
>
> Best,
> Stefan
>
> On 05/13/2017 12:47 PM, David Wilkinson wrote:
>> I have a Bonmin/Ipopt client application that (rightly or wrongly) uses C++
>> exceptions for flow control in abnormal situations. In some of these
>> situations, the exception is getting caught by catch (...) statements in
>> Ipopt::IpoptApplication. The content in some (but not all) of these catch
>> (...) statements is protected by a variable rethrow_nonipoptexception_, but
>> this variable is hard-wired to be false, and so cannot be used to change
>> behavior without modifying source code.
>>
>> Suggestion:
>>
>> The content of all occurrences of catch (...) in Ipopt::IpoptApplication
>> should be protected by this rethrow_nonipoptexception_ variable, and its
>> value should be controllable by a preprocessor symbol.
>>
>> There are examples of catch (...) statements in other parts of COIN-OR (Bonmin
>> and Clp) that are not harmful to my client application, but perhaps these
>> should also be protected in a similar manner.
>>
>> Thanks,
>>
>> David Wilkinson
>> _______________________________________________
>> Ipopt mailing list
>> Ipopt at list.coin-or.org
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__list.coin-2Dor.org_mailman_listinfo_ipopt&d=DwICAg&c=Ngd-ta5yRYsqeUsEDgxhcqsYYY1Xs5ogLxWPA_2Wlc4&r=BRcuJnQr5NAzU29t80hk2rsLc4vrlRySBDabuq0O1ZI&m=uUZR1xuZjRHb2iwG1M6a4OZH7EZH4pOHxKw1tfWL5TE&s=_8Ow3ENlrd9SRhRDClaTgphGxyICFFwa7JbRD6uhG6o&e=
>>
>
>
More information about the Ipopt
mailing list