use oximo::prelude::*;
use oximo::solvers::Highs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let m = Model::new("parametric_pricing");
let p1 = m.param("p1", 0.0);
let x1 = m.var("x1").lb(0.0).build();
let x2 = m.var("x2").lb(0.0).build();
m.constraint("labor", (2.0 * x1 + x2).le(100.0));
m.constraint("material", (x1 + 3.0 * x2).le(90.0));
m.maximize(p1 * x1 + 5.0 * x2);
assert_eq!(m.kind(), ModelKind::LP);
println!("model kind: {:?} (param * var stays linear)\n", m.kind());
println!(" p1 | x1 | x2 | profit");
println!("------+----------+----------+---------");
for price in [1.0, 1.6, 2.0, 5.0, 11.0] {
m.set_param(p1, price);
let result = Highs.solve(&m, &HighsOptions::default())?;
assert_eq!(result.status, SolverStatus::Optimal);
let x1v = result.value_of(x1).unwrap_or(0.0);
let x2v = result.value_of(x2).unwrap_or(0.0);
let profit = result.objective.unwrap_or(0.0);
println!(" {price:>4.1} | {x1v:>8.2} | {x2v:>8.2} | {profit:>7.2}");
}
Ok(())
}