use oximo::prelude::*;
use oximo::solvers::Highs;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let m = Model::new("parametric_pricing");
param!(m, p1 = 0.0);
variable!(m, x1 >= 0.0);
variable!(m, x2 >= 0.0);
constraint!(m, labor, 2.0 * x1 + x2 <= 100.0);
constraint!(m, material, x1 + 3.0 * x2 <= 90.0);
objective!(m, Max, 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] {
p1.set_param_value(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(())
}