You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.9 KiB
87 lines
2.9 KiB
#ifndef IGL_QUADPROG_H
|
|
#define IGL_QUADPROG_H
|
|
#include "igl_inline.h"
|
|
#include <Eigen/Core>
|
|
namespace igl
|
|
{
|
|
// Solve a convex quadratic program. Optimized for small dense problems.
|
|
// Still works for Eigen::Dynamic (and then everything needs to be Dynamic).
|
|
//
|
|
// min_x ½ xᵀ H x + xᵀf
|
|
// subject to:
|
|
// lbi ≤ Ai x ≤ ubi
|
|
// lb ≤ x ≤ u
|
|
//
|
|
// Templates:
|
|
// Scalar (e.g., double)
|
|
// n #H or Eigen::Dynamic if not known at compile time
|
|
// ni #Ai or Eigen::Dynamic if not known at compile time
|
|
// Inputs:
|
|
// H #H by #H quadratic coefficients (only lower triangle used)
|
|
// f #H linear coefficients
|
|
// Ai #Ai by #H list of linear equality constraint coefficients
|
|
// lbi #Ai list of linear equality lower bounds
|
|
// ubi #Ai list of linear equality upper bounds
|
|
// lb #H list of lower bounds
|
|
// ub #H list of lower bounds
|
|
// Returns #H-long solution x
|
|
template <typename Scalar, int n, int ni>
|
|
IGL_INLINE Eigen::Matrix<Scalar,n,1> quadprog(
|
|
const Eigen::Matrix<Scalar,n,n> & H,
|
|
const Eigen::Matrix<Scalar,n,1> & f,
|
|
const Eigen::Matrix<Scalar,ni,n> & Ai,
|
|
const Eigen::Matrix<Scalar,ni,1> & lbi,
|
|
const Eigen::Matrix<Scalar,ni,1> & ubi,
|
|
const Eigen::Matrix<Scalar,n,1> & lb,
|
|
const Eigen::Matrix<Scalar,n,1> & ub);
|
|
// min_x ½ xᵀ H x + xᵀf
|
|
// subject to:
|
|
// A x = b
|
|
// lb ≤ x ≤ u
|
|
//
|
|
// Templates:
|
|
// Scalar (e.g., double)
|
|
// n #H or Eigen::Dynamic if not known at compile time
|
|
// m #A or Eigen::Dynamic if not known at compile time
|
|
// Inputs:
|
|
// H #H by #H quadratic coefficients (only lower triangle used)
|
|
// f #H linear coefficients
|
|
// A #A by #H list of linear equality constraint coefficients
|
|
// b #A list of linear equality lower bounds
|
|
// lb #H list of lower bounds
|
|
// ub #H list of lower bounds
|
|
// Returns #H-long solution x
|
|
template <typename Scalar, int n, int m>
|
|
IGL_INLINE Eigen::Matrix<Scalar,n,1> quadprog(
|
|
const Eigen::Matrix<Scalar,n,n> & H,
|
|
const Eigen::Matrix<Scalar,n,1> & f,
|
|
const Eigen::Matrix<Scalar,m,n> & A,
|
|
const Eigen::Matrix<Scalar,m,1> & b,
|
|
const Eigen::Matrix<Scalar,n,1> & lb,
|
|
const Eigen::Matrix<Scalar,n,1> & ub);
|
|
// min_x ½ xᵀ H x + xᵀf
|
|
// subject to:
|
|
// lb ≤ x ≤ u
|
|
//
|
|
// Templates:
|
|
// Scalar (e.g., double)
|
|
// n #H or Eigen::Dynamic if not known at compile time
|
|
// Inputs:
|
|
// H #H by #H quadratic coefficients (only lower triangle used)
|
|
// f #H linear coefficients
|
|
// lb #H list of lower bounds
|
|
// ub #H list of lower bounds
|
|
// Returns #H-long solution x
|
|
template <typename Scalar, int n>
|
|
IGL_INLINE Eigen::Matrix<Scalar,n,1> quadprog(
|
|
const Eigen::Matrix<Scalar,n,n> & H,
|
|
const Eigen::Matrix<Scalar,n,1> & f,
|
|
const Eigen::Matrix<Scalar,n,1> & lb,
|
|
const Eigen::Matrix<Scalar,n,1> & ub);
|
|
}
|
|
|
|
#ifndef IGL_STATIC_LIBRARY
|
|
# include "quadprog.cpp"
|
|
#endif
|
|
|
|
#endif
|
|
|