<p>g defintly send a useful value, which is out of bound I checked it. So in this case ipopt would be supposed to try a closer point, but does not. More specificly, my constraint is for a matrix to be positive definite, so I check that its determinent is positive. log(det) is a good barrier for positive definite matricix, but not a good check, so I check that my matrix is positive definite by Cholesky, and then return a negative determinent if not, such that I still have a continous g.<br /> <br /> I'll try to figure out how to use secondary variables, but it definintly looks complicated since deriving determinent implied inverse matrix</p>
<p>&nbsp;</p>
<p>Thank you<br /> <br /><br /></p>
<blockquote style="padding-left: 5px; margin-left: 5px; border-left: #ff0000 2px solid;">&gt; Message du 18/04/13 20:23<br />&gt; De : "Stefan Vigerske" <br />&gt; A : "aurelien lambert" <br />&gt; Copie &agrave; : ipopt@list.coin-or.org<br />&gt; Objet : Re: [Ipopt] How to deal with out of constraints evaluation requests ?<br />&gt; <br />&gt; Hi,<br />&gt; <br />&gt; On 04/17/2013 02:48 PM, aurelien lambert wrote:<br />&gt; &gt; Hello<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt; Im using Ipopt with its python interface in my internship, and it seems to do well, thank you for this nice job :-) I compiled the last sources of every needed libraries (including MUMPS, on Ubuntu), so I should be up to date. But my problem is I cant evaluate f, grad_f and jac_g (no h because in quasi-Newton mode) when Im out of my constraints, because I need to compute inverse of some matrices constrained to be positive definite, but which can have non inverse when not. So how can I do that ?<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt; * If g returns false (which make python return false in the C++ interface according to the source code), I have the message "Warning: Cutting back alpha due to evaluation error". It's just a warning and works fine, but if I lower the output level in order to not write these warnings, I have no useful output left.<br />&gt; <br />&gt; One solution is to comment out the printing of the warning in<br />&gt; Ipopt/src/Algorithm/IpBacktrackingLineSearch.cpp<br />&gt; <br />&gt; Alternatively, but I don't know if that's possible via the python <br />&gt; interface, you can set a specific printlevel only for the J_LINE_SEARCH <br />&gt; category via the Ipopt::Journal::SetPrintLevel() function.<br />&gt; The Journal that prints to the stdout you can get from the Ipopt <br />&gt; Journalist via the GetJournal("console"), I believe (haven't tried it).<br />&gt; <br />&gt; &gt; * If I compute g (which gives out of constraint g, I checked it), ipopt also try to evaluate f and grad_f, and grad_f returning false gives "EXIT: Invalid number in NLP function or derivative detected.", which stops the algorithm.<br />&gt; <br />&gt; Maybe there is a way that you can modify the implementation of your <br />&gt; function g() so that it still reports useful values in points where it <br />&gt; is not defined.<br />&gt; You will still have the constraints that tell Ipopt that this point is <br />&gt; infeasible, so better return some numeric value instead of NaN.<br />&gt; Maybe you can use a generalized inverse / pseudoinverse for this purpose.<br />&gt; <br />&gt; &gt; Is there a way to disable these warnings ? Is not ipopt suppose to handle silently false return value, or detect out of constraints g ?<br />&gt; <br />&gt; Ipopt expects that all functions are smooth within the box, so it is a <br />&gt; failure if a function cannot be evaluated. The "cutting back alpha" <br />&gt; procedure is a feature that allow to sometimes still work with functions <br />&gt; that cannot be evaluated everywhere.<br />&gt; <br />&gt; Sometimes, introducing new variables helps, since variable bounds are <br />&gt; always obeyed by Ipopt, e.g., rewriting a constraint like log(f(x)) &gt;= 1<br />&gt; as log(z) &gt;= 1, z = f(x), z &gt;= 1e-6.<br />&gt; <br />&gt; Hope that helps,<br />&gt; Stefan<br />&gt; <br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt; Thank you<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt; PS : I dont give my source code because it's quite long, and my problem doesnt seem to be related to it. But if you need it I can ...<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt;<br />&gt; &gt; _______________________________________________<br />&gt; &gt; Ipopt mailing list<br />&gt; &gt; Ipopt@list.coin-or.org<br />&gt; &gt; http://list.coin-or.org/mailman/listinfo/ipopt<br />&gt; &gt;<br />&gt; <br />&gt; </blockquote>