use crate::DType;
use numr::error::Result;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
#[derive(Debug, Clone)]
pub struct LinProgOptions {
pub max_iter: usize,
pub tol: f64,
pub presolve: bool,
}
impl Default for LinProgOptions {
fn default() -> Self {
Self {
max_iter: 1000,
tol: 1e-9,
presolve: true,
}
}
}
#[derive(Debug, Clone)]
pub struct LinProgTensorConstraints<R: Runtime<DType = DType>> {
pub a_ub: Option<Tensor<R>>,
pub b_ub: Option<Tensor<R>>,
pub a_eq: Option<Tensor<R>>,
pub b_eq: Option<Tensor<R>>,
pub lower_bounds: Option<Tensor<R>>,
pub upper_bounds: Option<Tensor<R>>,
}
#[derive(Debug, Clone)]
pub struct LinProgTensorResult<R: Runtime<DType = DType>> {
pub x: Tensor<R>,
pub fun: f64,
pub success: bool,
pub nit: usize,
pub message: String,
pub slack: Tensor<R>,
}
pub trait LinProgAlgorithms<R: Runtime<DType = DType>> {
fn linprog(
&self,
c: &Tensor<R>,
constraints: &LinProgTensorConstraints<R>,
options: &LinProgOptions,
) -> Result<LinProgTensorResult<R>>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_options() {
let opts = LinProgOptions::default();
assert_eq!(opts.max_iter, 1000);
assert!((opts.tol - 1e-9).abs() < 1e-12);
}
}