optimatika / ojAlgo

oj! Algorithms
http://ojalgo.org
MIT License
459 stars 207 forks source link

QP-solver for ojAlgo! #221

Closed DanielMartensson closed 5 years ago

DanielMartensson commented 5 years ago

Hello.

I have a suggestion: A QP-solver for ojAlgo!

min 0.5 x'*H*x + x'*q 

subject to

A*x = b 
lb <= x <= ub 
A_lb <= A_in*x <= A_ub

Notice that Octave's QP-solver have lower bound inequality constraints A_lb. Very usefull for control theory. MATLAB's quadprog don't have that.

https://octave.org/doc/v4.4.0/Quadratic-Programming.html

apete commented 5 years ago

It's already there. (or did I misunderstand you)

org.ojalgo.optimisation.convex is essentially/still just a collection o QP solvers (unconstrained, equality constrained and/or inequality constrained).

Just model your problem with ExpressionsBasedModel...

No quadratic constraints!

DanielMartensson commented 5 years ago

It's already there. (or did I misunderstand you)

org.ojalgo.optimisation.convex is essentially/still just a collection o QP solvers (unconstrained, equality constrained and/or inequality constrained).

Just model your problem with ExpressionsBasedModel...

No quadratic constraints!

But the subject constraints are only

min 1/2 [X]T[Q][X] - [C]T[X] when [AE][X] == [BE] and [AI][X] <= [BI]

apete commented 5 years ago

In ExpressionsBasedModel you can model everything. Then it gets transformed to fit the requirements of the individual solver.

DanielMartensson commented 5 years ago

In ExpressionsBasedModel you can model everything. Then it gets transformed to fit the requirements of the individual solver.

Jag tar det på Svenska istället. Det skulle ha varit ett bra exempel på detta. OjAlgo verkar vara ett igenomtänkt bibliotek med tanke på att den använder sig varken av JBlas eller C++ i grunden. Jag har vissa planer med att använda OjAlgo med JavaFX för Iphone och Android apputveckling. Men problemet är att jag som "kund" eller användare med andra ord, finner OjAlgo svårt att använda.

Om jag ska t.ex. använda din QP-lösare i Java så måste den ha samma begränsingar som QP i Octave har. Den måste alltså vara identisk. Som jag ser så har den två begränsingar. Likhetsbegränsingar och olikhetsbegränsingar. Men det är inga begärnsingar på X vektorn.

Jag har själv gjort ett liknande bibliotek som heter EmbeddedLapack som följer "MATLAB/Octave" struktur: https://github.com/DanielMartensson/EmbeddedLapack Den är dessutom snabbare än Armadillo C++ i ett granska stort arbetsexempel. Problemet är att det är inte gjort i Java.

Det skulle vara bra om OjAlgo också följde en sådan struktur. Nu vet jag att det inte kommer ske. Men det skulle ha funnits arbetsexempel för jag har noll koll på vad man kan använda i en JavaDoc, trots att det står klart och tydligt. :)

Jag vet att det finns en grundläggande matris- och vektormanual, men det skulle vara bra om varje JavaDoc hade ett arbetsexempel. http://www.ojalgo.org/2019/03/linear-algebra-introduction/

Här är ett exempel på Model Predictive Control där jag använder en QP-lösare med begränsingar på både IN och UT. https://github.com/DanielMartensson/Matavecontrol/blob/master/sourcecode/lmpc.m

u = qp([], H, q, [], [], U_LB, U_UB, Y_LB, A_IN, Y_UB);

http://www.ojalgo.org/2019/03/linear-algebra-introduction/

apete commented 5 years ago

There are code examples of how to use ExpressionsBasedModel at https://www.ojalgo.org/code-examples/

ojAlgo is intended to be primarily for Java developers. Being compatible with various legacy fortran, c or matlab api:s is not a priority.

That said, creating a utility method with your desired signature would be very little coding – a few loops over the supplied arrays is all that's required.

For a paying customer I build what they want...

DanielMartensson commented 5 years ago

Men objektivfunktionen visar ju att optimeringen är konkav och inte konvex och konkav på samma gång. Om du tittar på begärningarna som GNU Octave's QP-lösare visar så ser du vad jag menar :)

apete commented 5 years ago

Do this: Forget about Octave/Matlab and what you think you know about ojAlgo's solvers. Instead start with ExpressionsBasedModel. Spend a little time to figure out how it works (rather than how you expect or would like it to work) and just model the problem you want to solve.

Some examples can be found here:

https://www.ojalgo.org/code-examples/

and some further advice here:

https://github.com/optimatika/ojAlgo/wiki/Optimisation-Modelling-Advice

And if you want to ask more questions like these then please use Stack Overflow