[Ipopt] inf_du doesn't get smaller

Sean C McDuffee scmcduff at blueskystudios.com
Tue Dec 16 10:56:51 EST 2014


Hi Stefan

Thanks for replying.  So I tried setting those similarly in the past but 
still didn't get the desired result.  I just tried the following:

app->Options ()->SetNumericValue ("acceptable_tol",1.e-4);
app->Options ()->SetNumericValue ("acceptable_obj_change_tol", 0.01);
app->Options ()->SetNumericValue ("acceptable_constr_viol_tol", 1.e-4);
app->Options ()->SetNumericValue ("acceptable_dual_inf_tol", 1.e10);
app->Options ()->SetIntegerValue ("acceptable_iter", 5);

And still got the following output:

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du 
alpha_pr  ls
    0  5.4023963e-01 2.56e-03 7.24e-01   0.0 0.00e+00    - 0.00e+00 
0.00e+00   0
    1  5.3791059e-01 1.71e-13 5.49e-02 -11.0 2.32e-03    - 1.00e+00 
1.00e+00h  1
    2  5.3791459e-01 1.71e-13 2.20e-03 -11.0 3.33e-05    - 1.00e+00 
1.00e+00h  1
    3  5.3791482e-01 1.71e-13 2.57e-03 -11.0 4.96e-06    - 1.00e+00 
1.00e+00h  1
    4  5.3791479e-01 1.71e-13 2.21e-03 -11.0 2.70e-06    - 1.00e+00 
1.00e+00h  1
    5  5.3791479e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
    6  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
    7  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
    8  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
    9  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du 
alpha_pr  ls
   10  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   11  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   12  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   13  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   14  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   15  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   16  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   17  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   18  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   19  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du 
alpha_pr  ls
   20  5.3791481e-01 1.71e-13 2.21e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1
   21  5.3791478e-01 1.71e-13 2.56e-03 -11.0 2.60e-06    - 1.00e+00 
1.00e+00h  1

...


I had earlier tried using the default acceptable_dual_inf_tol. The 
cycling nature in inf_du is something I don't understand either.

Thanks
Sean


On 12/12/2014 12:42 PM, Stefan Vigerske wrote:
> Hi,
>
> acceptable_tol only applies if there were acceptable_iter (15 by 
> default) iterations in a row that were acceptable.
>
> If you set
>   acceptable_tol 1e-4
>   acceptable_constr_viol_tol 1e-4
>   acceptable_obj_change_tol 0.01
> Ipopt should stop if there have been 15 iterations in a row with
> - inf_pr < 1e-4,
> - violation of complementarity < 0.01 (default for
> acceptable_compl_inf_tol),
> - objective change < 1%
> - arbitary inf_du (default for
> acceptable_dual_inf_tol)
>
> If 15 iterations is too much, then set acceptable_iter to a smaller 
> value.
>
> I don't remember an option to stop if ||d|| is small, but this is 
> somewhat related to the objective change.
>
> Hope that helps,
> Stefan
>
> On 12/10/2014 06:20 PM, Sean C McDuffee wrote:
>> I have a problem that results in output like:
>>
>> iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du
>> alpha_pr  ls
>>     0  3.7869112e-03 0.00e+00 3.20e-04   0.0 0.00e+00    - 0.00e+00
>> 0.00e+00   0
>>     1  3.7869106e-03 3.10e-35 3.24e-04 -11.0 3.32e-08    - 1.00e+00
>> 1.00e+00f  1
>>     2  3.7869101e-03 1.76e-37 2.26e-04 -11.0 1.92e-09    - 1.00e+00
>> 1.00e+00f  1
>>     3  3.7869104e-03 5.29e-37 2.59e-04 -11.0 7.08e-10    - 1.00e+00
>> 1.00e+00h  1
>>     4  3.7869100e-03 6.88e-36 2.57e-04 -11.0 8.14e-10    - 1.00e+00
>> 1.00e+00f  1
>>     5  3.7869104e-03 4.41e-37 2.59e-04 -11.0 8.08e-10    - 1.00e+00
>> 1.00e+00h  1
>>     6  3.7869100e-03 1.41e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00f  1
>>     7  3.7869104e-03 7.05e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00h  1
>>     8  3.7869100e-03 2.91e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00f  1
>>     9  3.7869104e-03 2.03e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00h  1
>> iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du
>> alpha_pr  ls
>>    10  3.7869100e-03 1.94e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00f  1
>>    11  3.7869104e-03 9.79e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00h  1
>>    12  3.7869100e-03 2.38e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00f  1
>>    13  3.7869104e-03 8.38e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00h  1
>>    14  3.7869100e-03 5.29e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00f  1
>>    15  3.7869104e-03 1.23e-35 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00h  1
>>    16  3.7869100e-03 8.82e-37 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00f  1
>>    17  3.7869104e-03 3.17e-36 2.59e-04 -11.0 8.13e-10    - 1.00e+00
>> 1.00e+00h  1
>>
>> ...
>>
>> What could cause this and can I stop the solver effectively when the
>> inf_du can't be lowered anymore?  I've tried using acceptable_tol and
>> acceptable_dual_inf_tol but inf_du is still being considered for the
>> acceptable_tol.  I'd like to accept an iteration here if ||d||, inf_pr,
>> and change in obj are all small.
>>
>>
>>
>> _______________________________________________
>> Ipopt mailing list
>> Ipopt at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/ipopt
>>
>



More information about the Ipopt mailing list