use crate::DType;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
use crate::optimize::error::OptimizeResult;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum QpMethod {
ActiveSet,
#[default]
InteriorPoint,
}
#[derive(Debug, Clone)]
pub struct QpOptions {
pub method: QpMethod,
pub max_iter: usize,
pub tol: f64,
}
impl Default for QpOptions {
fn default() -> Self {
Self {
method: QpMethod::InteriorPoint,
max_iter: 200,
tol: 1e-8,
}
}
}
#[derive(Debug, Clone)]
pub struct QpResult<R: Runtime<DType = DType>> {
pub x: Tensor<R>,
pub fun: f64,
pub iterations: usize,
pub converged: bool,
pub dual_eq: Option<Tensor<R>>,
pub dual_ineq: Option<Tensor<R>>,
}
pub trait QpAlgorithms<R: Runtime<DType = DType>> {
#[allow(clippy::too_many_arguments)]
fn solve_qp(
&self,
q: &Tensor<R>,
c: &Tensor<R>,
a_eq: Option<&Tensor<R>>,
b_eq: Option<&Tensor<R>>,
a_ineq: Option<&Tensor<R>>,
b_ineq: Option<&Tensor<R>>,
options: &QpOptions,
) -> OptimizeResult<QpResult<R>>;
}