[Ipopt] intermediate_callback
Stefan Vigerske
stefan at vigerske.de
Thu Nov 27 10:07:37 EST 2008
Hi,
> Thank you for your reply,
> this seems to me very non intuitive ;-), can you give me an example so that I get an array back like in the eval_f function ( eval_f(... const Number* x ...) )
OK, you caught me. I forgot to mention that you get the vector of the
"transformed" problem, i.e., not the problem as you specify in TNLP, but
with slacks included and fixed variables removed.
It's a bit tricky to sort the vector back into the TNLP space, since you
need the TNLPAdapter. This is what Andreas once told me how to get the
TNLPAdapter:
1. Use IpoptCalculatedQuantities::GetIpoptNLP() to get a pointer to an
Ipopt::IpoptNLP.
2. Cast this Ipopt::IpoptNLP to an Ipopt::OrigIpoptNLP
3. Use Ipopt::OrigIpoptNLP::nlp() to get the Ipopt::NLP
4. This Ipopt::NLP is actually the TNLPAdapter
In code, this would be
OrigIpoptNLP* orignlp =
dynamic_cast<OrigIpoptNLP*>(GetRawPtr(ip_cq->GetIpoptNLP()));
assert(ip_cq);
TNLPAdapter* tnlp_adapter =
dynamic_cast<TNLPAdapter*>(GetRawPtr(orignlp->nlp()));
assert(tnlp_adapter);
Then you could use curr()->x() from IpoptData and ResortX from
TNLPAdapter to sort it back:
double* my_x = new double[... dimension in TNLP problem ...];
tnlp_adapter->ResortX(data->curr()->x(), my_x);
Best,
Stefan
More information about the Ipopt
mailing list