[Ipopt] Ipopt report issue

Stefan Vigerske stefan at math.hu-berlin.de
Mon Dec 6 08:44:30 EST 2010


Hi,

it looks like you access Ipopt via the C-interface, with which I do not
have experience. Maybe someone else on the mailing list can give some hint.
But I think with Ipopt 3.9, the IntermediateCallback function was added
to Ipopt's C-interface. If you implement that callback, then you should
get the number of iterations and infeasibilities for each iteration.
That should be sufficient to get also the final ones.

http://www.coin-or.org/Doxygen/Ipopt/_ip_std_c_interface_8h.html#f1e7698978a08607a8661c8ed430f9be

Stefan

Sebastian Ferrera Ferrera wrote:
> Thanks for the help Stefan,
> 
> Actually, my objective is to catch the number of iterations and accuracy of the minimization process.
> 
> I am running Ipopt through a precompiled dll (Ipopt38.dll) and I have a class on my project (VS2008) that makes the conection between my source code and the Ipopt's functions.
> 
> The way I use Ipopt is something like:
> 
> [DllImport(Ipopt38)]
>         unsafe private static extern IntPtr CreateIpoptProblem(int n, double* x_L, double* x_U, int m, double* g_L, double* g_U,  int nele_jac, 
>             int nele_hess, int index_style, Eval_F_CB eval_f, Eval_G_CB eval_g, Eval_Grad_F_CB eval_grad_f, Eval_Jac_G_CB eval_jac_g, Eval_H_CB eval_h);
> 
> [DllImport(Ipopt38)]
>         unsafe private static extern int IpoptSolve(
>             IntPtr ipopt_problem, double* x, double* g, double* obj_val, double* mult_g, double* mult_x_L, double* mult_x_U, void* user_data);
> 
> 
> 
> public IpoptReturnCode SolveProblem(double[] x, out double obj_val, double[] g, double[] mult_g, double[] mult_x_L, double[] mult_x_U)
>         {
>             unsafe
>             {
>                 fixed (double* p_obj_val = &obj_val, p_x = x, p_g = g, p_mult_g = mult_g, p_mult_x_L = mult_x_L, p_mult_x_U = mult_x_U)
>                 {
>                     return (IpoptReturnCode)IpoptSolve(m_problem, p_x, p_g, p_obj_val, p_mult_g, p_mult_x_L, p_mult_x_U, null);
>                 }
>             }
>         }
> 
> public Ipopt(int n, double[] x_L, double[] x_U, int m, double[] g_L, double[] g_U, int nele_jac, int nele_hess,
>             EvaluateObjectiveDelegate eval_f, EvaluateConstraintsDelegate eval_g, EvaluateObjectiveGradientDelegate eval_grad_f, 
>             EvaluateJacobianDelegate eval_jac_g, EvaluateHessianDelegate eval_h)
>         {
>             unsafe
>             {
>                 fixed (double* p_x_L = x_L, p_x_U = x_U, p_g_L = g_L, p_g_U = g_U)
>                 {
>                     m_eval_f = new ObjectiveEvaluator(eval_f).Evaluate;
>                     m_eval_g = new ConstraintsEvaluator(eval_g).Evaluate; 
>                     m_eval_grad_f = new ObjectiveGradientEvaluator(eval_grad_f).Evaluate;
>                     m_eval_jac_g = new JacobianEvaluator(eval_jac_g).Evaluate;
>                     m_eval_h = new HessianEvaluator(eval_h).Evaluate;
> 
>                     m_problem = CreateIpoptProblem(n, p_x_L, p_x_U, m, p_g_L, p_g_U, nele_jac, nele_hess, 0,
>                         m_eval_f, m_eval_g, m_eval_grad_f, m_eval_jac_g, m_eval_h);
> 
>                     if (m_problem == IntPtr.Zero)
>                     {
>                         throw new ArgumentException("Failed to initialize IPOPT problem");
>                     }
>                 }
>             }
> 
>             m_disposed = false;
>         }
> 
> That is a part of my conection (Ipopt.cs) to the Ipopt38.dll and in my main project I have this:
> 
> 		    double[] dbl_x = { 1.0, 5.0, 5.0, 1.0 };
> 		    double obj;
>                 IpoptReturnCode status;
>                 using (Ipopt problem = new Ipopt(p_dbl.n, p_dbl.x_L, p_dbl.x_U, p_dbl.m, p_dbl.g_L, p_dbl.g_U, p_dbl.nele_jac, p_dbl.nele_hess,
>                 p_dbl.eval_f, p_dbl.eval_g, p_dbl.eval_grad_f, p_dbl.eval_jac_g, p_dbl.eval_h))
>                 {
>                     problem.AddOption("tol", 1e-7);
>                     problem.AddOption("mu_strategy", "adaptive");
>                     problem.AddOption("output_file", "hs071.txt");    
> 
>                     /* solve the problem */
>                     
>                     status = problem.SolveProblem(dbl_x, out obj, null, null, null, null);
>                 }
> 
> 
> p_dbl is a class that manages the evaluations, number of constraints, etc.
> 
> So, I need to find something that can return the number of iterations and accuracy (optimal_solution, etc)... my first idea was to read the result file (hs071.txt) or return the journal to a string variable, but I think there must be another way...
> 
> Sorry for my poor english and I hope you understand,
> 
> Sebastián.
> 
> 
> 
> -----Mensaje original-----
> De: Stefan Vigerske [mailto:stefan at math.hu-berlin.de] 
> Enviado el: Viernes, 03 de Diciembre de 2010 15:10
> Para: Sebastian Ferrera Ferrera
> CC: ipopt at list.coin-or.org
> Asunto: Re: [Ipopt] Ipopt report issue
> 
> Hi,
> 
> Ipopt has the concept of Journals that can be used to redirect output to 
> whereever you like.
> 
> When you create the IpoptApplication object, just give it as argument a 
> "false", so it does not create the default journal:
>         ipopt = new IpoptApplication(false);
> 
> Then you can create your own journal and pass it to Ipopt. It should be 
> called "console", otherwise Ipopt may create another one later, if I 
> rembember correct.
>    SmartPtr<Journal> jrnl = new MyJournal(gev, "console", J_ITERSUMMARY);
>    jrnl->SetPrintLevel(J_DBG, J_NONE);
>    if (!ipopt->Jnlst()->AddJournal(jrnl))
>      std::cerr << "Failed to register MyJournal for IPOPT output."
>                << std::endl;
> 
> There are also some Journals implemented already, you may be interested 
> in the StreamJournal, which you can give a stringstream, that you can 
> transform into a string object afterwards.
> http://www.coin-or.org/Doxygen/Ipopt/class_ipopt_1_1_journal.html
> 
> 
> Stefan
> 
> 
> Am 03.12.2010 15:05, schrieb Sebastian Ferrera Ferrera:
>> Hello friends,
>>
>> I am currently working on a project using the Ipopt minimization.
>>
>> I am writing because I would like to know whether it is posible to configure Ipopt so that the report does not appear in the Windows command prompt but e.g. in a string variable.
>>
>> Thank you and regards,
>>
>>
>> Atte.,
>>
>> Sebastián Ferrera.
>> Ingeniero Financiero en Sistemas Junior
>> Ingeniería Financiera
>> Rosario Norte Nº 660 Piso 7
>> Fono: 660 2413
>> E-mail : sebastian.ferrera at corpbanca.cl<mailto:david.matamala at corpbanca.cl>
>> www.corpbanca.cl<http://www.corpbanca.cl/>
>>
>>
>>
>>
>> _______________________________________________
>> Ipopt mailing list
>> Ipopt at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/ipopt
> 


-- 
Stefan Vigerske
Humboldt University Berlin, Numerical Mathematics
http://www.math.hu-berlin.de/~stefan



More information about the Ipopt mailing list