use anyhow::Result;
use sparsetools::csr::CSR;
use spsolve::Solver;
use crate::common::{Lambda, Options};
use crate::ipm::nlp;
use crate::math::dot;
use crate::traits::{ObjectiveFunction, ProgressMonitor};
struct LinearObjectiveFunction {
nx: usize,
c: Vec<f64>,
}
impl ObjectiveFunction for LinearObjectiveFunction {
fn f(&self, x: &[f64], hessian: bool) -> (f64, Vec<f64>, Option<CSR<usize, f64>>) {
let f = dot(&self.c, &x);
let df = self.c.to_owned();
if !hessian {
(f, df, None)
} else {
(f, df, Some(CSR::with_size(self.nx, self.nx)))
}
}
}
pub fn lp<S>(
c: Option<&Vec<f64>>,
a_mat: &CSR<usize, f64>,
l: &[f64],
u: &[f64],
xmin: &[f64],
xmax: &[f64],
x0: &[f64],
solver: &S,
progress: Option<&dyn ProgressMonitor>,
opt: &Options,
) -> Result<(Vec<f64>, f64, bool, usize, Lambda)>
where
S: Solver<usize, f64>,
{
let nx = a_mat.cols();
let lp = LinearObjectiveFunction {
nx,
c: match c {
Some(c) => c.to_owned(),
None => vec![0.0; nx],
},
};
nlp(
&lp, &x0, a_mat, l, u, xmin, xmax, None, solver, opt, progress,
)
}