diff options
Diffstat (limited to 'hdr/qlpsolve.hh')
-rw-r--r-- | hdr/qlpsolve.hh | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/hdr/qlpsolve.hh b/hdr/qlpsolve.hh new file mode 100644 index 0000000000..4d29bcc4a0 --- /dev/null +++ b/hdr/qlpsolve.hh @@ -0,0 +1,78 @@ +#include "qlp.hh" +#include "matrix.hh" + + +class Active_constraints { + friend class Inactive_iter; + + + Matrix A,H; + svec<int> active; + svec<int> inactive; // actually this is a set, not an array. + const Ineq_constrained_qp *opt; + +public: + String status()const; + + Vector vec(int k) const { return opt->cons[k]; } + Real rhs(int k) const { return opt->consrhs[k]; } + + /// drop constraint + void drop (int k); + /** drop constraint k from the active set. k is the index of the + constraint in #active# + + */ + + /// add constraint j + void add(int j); + /** + add constraint j to the active set j is the index of the + constraint in #inactive# + */ + + /// exchange in and out. + void exchange(int in, int out) { add(in); drop (out); } + + /// + Vector find_active_optimum(Vector g); + + /// get lagrange multipliers. + Vector get_lagrange(Vector v); + + Active_constraints(Ineq_constrained_qp const *op); + /** construct: no constraints active, n vars. Put the equalities + into the constraints. */ + + /// check invariants + void OK(); +}; + +/** + This class represents the set of active (binding) constraints + which can be active while the QLP algorithm is in a feasible + point. The active constraints are numbered. + If the constraints are of the form + + A^T*x >= b + + then the binding constraints are those where the >= is equality. + + */ + +/// +class Inactive_iter { + int j; + Active_constraints const* ac; +public: + Inactive_iter(Active_constraints const &c) { ac=&c; j=0; } + int idx() const { return j; } + void operator ++(int) { j++; } + int constraint_id() const { return ac->inactive[j]; } + Vector vec() const { return ac->vec(constraint_id()); } + Real rhs() const { return ac->rhs(constraint_id()); } + bool ok() const { return j < ac->inactive.sz(); } +}; +/** + loop through the inactive constraints. + */ |