[Ipopt] ipopt - Multiple calls
Suresh Pamujula
suresh.pamujula at gmail.com
Wed Apr 22 20:23:50 EDT 2009
Hi Andreas -
I figured out my mistake. Thanks for your reply.
I had a mistake in the gradient.
suresh
On Wed, Apr 22, 2009 at 8:05 PM, Suresh Pamujula
<suresh.pamujula at gmail.com>wrote:
> Hi Andreas -
>
> The problem is not infeasible. I ran it with different lower bound and it
> gave me an answer I expected.
>
> Also, if I run the loop 10 times with same constraint bounds, e.g., g_L[0]
> = 0.065, I don't get any
> infeasible solution, but I get correct solution everytime.
>
> suresh
>
>
>
> On Wed, Apr 22, 2009 at 7:10 PM, Andreas Waechter <andreasw at watson.ibm.com
> > wrote:
>
>> Hi Suresh,
>>
>> Maybe this is not an error, maybe your problem is indeed infeasible if you
>> increase the lower bound on the first constraint...? Do you also get the
>> same behavior if you run the loop 10 times but always set the same
>> constraint bounds, e.g., g_L[0] = 0.065, or even relax it as j increases, as
>> g_L[0] = 0.065 - j*0.05 ?
>>
>> Andreas
>>
>>
>> On Tue, 21 Apr 2009, Suresh Pamujula wrote:
>>
>> More on multiple calls to IpoptSolve(...)
>>>
>>> I get following error when the function is invoked second time.
>>>
>>> EXIT: Converged to a point of local infeasibility. Problem may be
>>> infeasible.
>>>
>>>
>>> Attached is the code for your quick reference.
>>>
>>>
>>>
>>> Here is code snippet ......
>>>
>>> .................
>>> .................
>>> Index j; /* generic counter */
>>>
>>> for (j=0;j<10;j++) { /* Basically want to execute IpoptSolve 10 times
>>> with different values on constraints */
>>>
>>> /* Number of nonzeros in the Jacobian of the constraints */
>>> Index nele_jac = 6;
>>> /* Number of nonzeros in the Hessian of the Lagrangian (lower or
>>> upper triangual part only) */
>>> Index nele_hess = 6;
>>> /* indexing style for matrices */
>>> Index index_style = 0; /* C-style; start counting of rows and column
>>> indices at 0 */
>>>
>>> /* set the number of variables and allocate space for the bounds */
>>> n=3;
>>> x_L = (Number*)malloc(sizeof(Number)*n);
>>> x_U = (Number*)malloc(sizeof(Number)*n);
>>> /* set the values for the variable bounds */
>>> for (i=0; i<n; i++) {
>>> x_L[i] = 0.0;
>>> x_U[i] = 1.0;
>>> }
>>>
>>> /* set the number of constraints and allocate space for the bounds */
>>> m=2;
>>> g_L = (Number*)malloc(sizeof(Number)*m);
>>> g_U = (Number*)malloc(sizeof(Number)*m);
>>>
>>> /* set the values of the constraint bounds */
>>> g_L[0] = 0.065 + j*0.05; /* increment return by 5% */
>>> g_U[0] = 2e19;
>>> g_L[1] = 1;
>>> g_U[1] = 1;
>>>
>>> /* create the IpoptProblem */
>>> nlp = CreateIpoptProblem(n, x_L, x_U, m, g_L, g_U, nele_jac, nele_hess,
>>> index_style, &eval_f, &eval_g, &eval_grad_f,
>>> &eval_jac_g, &eval_h);
>>>
>>> /* We can free the memory now - the values for the bounds have been
>>> copied internally in CreateIpoptProblem */
>>> free(x_L);
>>> free(x_U);
>>> free(g_L);
>>> free(g_U);
>>>
>>> /* Set some options. Note the following ones are only examples,
>>> they might not be suitable for your problem. */
>>> AddIpoptNumOption(nlp, "tol", 1e-7);
>>> AddIpoptStrOption(nlp, "mu_strategy", "adaptive");
>>> AddIpoptStrOption(nlp, "output_file", "ipopt.out");
>>>
>>> /* allocate space for the initial point and set the values */
>>> x = (Number*)malloc(sizeof(Number)*n);
>>> x[0] = 0.2;
>>> x[1] = 0.4;
>>> x[2] = 0.4;
>>>
>>> /* allocate space to store the bound multipliers at the solution */
>>> mult_x_L = (Number*)malloc(sizeof(Number)*n);
>>> mult_x_U = (Number*)malloc(sizeof(Number)*n);
>>>
>>> /* solve the problem */
>>> status = IpoptSolve(nlp, x, NULL, &obj, NULL, mult_x_L, mult_x_U,
>>> NULL);
>>>
>>> if (status == Solve_Succeeded) {
>>> printf("\n\nSolution of the primal variables, x\n");
>>> for (i=0; i<n; i++) {
>>> printf("x[%d] = %e\n", i, x[i]);
>>> }
>>>
>>> printf("\n\nSolution of the bound multipliers, z_L and z_U\n");
>>> for (i=0; i<n; i++) {
>>> printf("z_L[%d] = %e\n", i, mult_x_L[i]);
>>> }
>>> for (i=0; i<n; i++) {
>>> printf("z_U[%d] = %e\n", i, mult_x_U[i]);
>>> }
>>>
>>> printf("\n\nObjective value\n");
>>> printf("f(x*) = %e\n", obj);
>>> }
>>>
>>> /* free allocated memory */
>>> FreeIpoptProblem(nlp);
>>> free(x);
>>> free(mult_x_L);
>>> free(mult_x_U);
>>> }
>>>
>>> ...........................
>>> ...........................
>>> ..........................
>>>
>>>
>>> On Tue, Apr 21, 2009 at 11:57 AM, Suresh Pamujula <
>>> suresh.pamujula at gmail.com
>>>
>>>> wrote:
>>>>
>>>
>>> On 4/20/09, Suresh Pamujula <suresh.pamujula at gmail.com> wrote:
>>>>
>>>>> Hello -
>>>>>
>>>>> I want to inquire if there is a way to invoke functions
>>>>>
>>>>> CreateIpoptProblem(....)
>>>>> and
>>>>> IpoptSolve(...)
>>>>>
>>>>> multiple times with different lower bound on one of the constraints.
>>>>>
>>>>>
>>>>>
>>>>> I tried to call within a for loop, but it gives me "infeasible
>>>>> solution"
>>>>> when it
>>>>> is invoked second time.
>>>>>
>>>>>
>>>>> Any help is truly appreciated.
>>>>>
>>>>>
>>>>>
>>>>> suresh
>>>>>
>>>>>
>>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://list.coin-or.org/pipermail/ipopt/attachments/20090422/069eafea/attachment-0001.html
More information about the Ipopt
mailing list