#ifndef QLP_HH
#define QLP_HH

#include "matrix.hh"

/// inequality constrained quadratic program
class Ineq_constrained_qp {
    friend class Active_constraints;

    svec<Vector> cons;
    svec<Real> consrhs;
public:
    Matrix quad;
    Vector lin;
    Real const_term;

    ///
    void assert_solution(Vector sol) const;
    /**
      use a KKT method to assert optimality of sol
      */
    /// solve the problem using a projected gradient method
    Vector solve(Vector start) const;
    
    int dim() const{
	return lin.dim();
    }
    /** return the number of variables in the problem */
    ///
    void add_inequality_cons(Vector c, double r);
    /**
      add a constraint


        c*vars >= r

      PRE
      c.dim() == dim();
	
      */
    ///
    Ineq_constrained_qp(int novars);
    /** set up matrices to go with the problem. */

    Real eval(Vector v);
    /**
    evaluate the quadratic function for input #v#
    */

    void eliminate_var(int idx, Real value);
    void OK()const;
    void print() const;

};

/// Quadratic programming with mixed linear constraints
class Mixed_qp :public Ineq_constrained_qp {
    svec<int> eq_cons;
    svec<Real> eq_consrhs;
public:
    Mixed_qp(int n);
    void OK() const;
    void print() const;

    Vector solve(Vector start) const;
    void add_fixed_var(int i , Real value);
    
    ///
    void add_equality_cons(Vector c, double r);
    /**
      add a constraint,

        c*vars == r

      PRE
      c.dim()==dim();
     */

};
/**
  problem definition of a quadratic optimisation problem with linear
  inequality and equality constraints


    x^T QUAD x /2 + b^T x 
*/


#endif
