# [Ipopt] Problems about derivative checker and iteration

Stefan Vigerske stefan at math.hu-berlin.de
Fri Feb 26 05:01:28 EST 2010

```Hi,

you may do something like this:

class MyTNLP : public class TNLP {
private:
double  funcvalue;
double* funchess;

void computeFunction(double* x) {
// compute function value, gradient, and hessian
// and store in funcvalue, funcgrad, funchess
}

public:

bool eval_f(bool new_x, double* x, double* objval) {
if (new_x) {
computeFunction(x);
}
*objval = funcvalue;
return true;
}

if (new_x) {
computeFunction(x);
}
return true;
}

bool eval_h(bool new_x, double* x, ..., double* values, ...) {
if (new_x) {
computeFunction(x);
}
// add hessian values from funchess into values array
return true;
}

// and so on for constraint functions...
}

Stefan

lqc234 wrote:
> Hi Stefan,
>
> Thank you for your help! I noticed the new_x flag after your advise.In every eval_* function,the document said about the new_x flag:
>
> The boolean variable new_x will be false if the last call to any of the evaluation methods(eval_*) used
> the same x values.This can be helpful when users have efficient implementations that calculate multiple
> outputs at once. Ipopt internally caches results from the TNLP and generally,this ﬂag can be ignored.
>
> I don't understand the meaning of this section very cleary.I guess the meaning is that we can calculate the value,grandient,and hessian for my function in only one of the eval_* function.If so,how should I write my program? Would you please explain the new_x flag in detail?Thank you very much!
>
>
> 在2010-02-24 17:31:21，"Stefan Vigerske" <stefan at math.hu-berlin.de> 写道：
>> Hi,
>>
>> you may use the new_x flag that Ipopt provides for all the eval_*
>> functions. That is, if new_x is set to true in any of these routines,
>> then you compute value, gradient, and hessian for your function and
>> store these values in your TNLP object. As long as new_x is false, you
>> can use return this evaluated data in all eval_* functions.
>>
>> Stefan
>>
>> lqc234 wrote:
>>>  Hi everybody:
>>>  I have had a problem during using the Ipopt-3.6.1.And I have no idea about this problem for several days,I think that you might not think of this situation .
>>>  Suppose f(x)= x^2+2*x+1/x+3*x+4*x^3. This formula is very simple,however consider this situation: in my application,for example,1/x+3*x+4*x^3 is a very complicated part that I can't write this part of formula directly,in other words I must use some codes to describe this part,for example
>>>  a set of "for" cycle codes with complicated processing. Now I thought there are two problem.
>>>  First , the direvative checker tools can't deal with this situation because the complicated part 1/x+3*x+4*x^3 is not described directly.
>>>  The second problem is not easily to describe somewhat.
>>>  The variable x changes in every iteration,while I can't write 1/x+3*x+4*x^3 directly.So in every iteration I have to describe the  1/x+3*x+4*x^3 part using some codes every time .However, I found that the excution sequence is "eval_jac_g,eval_grad_f,eval_g,eval_f,eval_h" sometime,sometimes it is not this sequence.Now I don't know which part I should write these codes in,it should be in the eval_f? or eval_g? or in eval_grad_f?eval_jac?eval_h?.
>>>  I don't know the processing procedure during one iteration in Ipopt,those codes should used only once,I can't used those codes in eval_f ,eval_g,eval_grad_f,eval_jac_g,eval_h all.
>>>  I don't know if I have described the problem clearly.I hope so.
>>>  Anyone can give some suggestion?Thank you very much in advance.
>>>
>>>
>>>
>>>
>>>  ------------------------------------------------------------------------
>>>
>>>  _______________________________________________
>>>  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

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

```