use simplex_trace::{Method, Options, Problem, Relation, Status, reoptimize, solve};
fn report(solution: &simplex_trace::Solution) {
print!("{}", solution.trace);
if let Status::Optimal { objective, values } = &solution.status {
let values: Vec<String> = values.iter().map(ToString::to_string).collect();
println!("z* = {objective}, x* = ({})\n", values.join(", "));
}
}
fn main() {
let problem = Problem::minimize([3, 2])
.subject_to([3, 1], Relation::Ge, 3)
.subject_to([4, 3], Relation::Ge, 6)
.subject_to([1, 1], Relation::Le, 3);
println!("### Dual simplex\n");
report(&solve(&problem, Method::DualSimplex, &Options::default()).expect("valid problem"));
let toyco = Problem::maximize([3, 2, 5])
.subject_to([1, 2, 1], Relation::Le, 430)
.subject_to([3, 0, 2], Relation::Le, 460)
.subject_to([1, 4, 0], Relation::Le, 420);
let first = solve(&toyco, Method::Simplex, &Options::default()).expect("valid problem");
println!("### Adding 3x1 + 3x2 + x3 <= 500 to the solved TOYCO problem\n");
let extended = toyco.subject_to([3, 3, 1], Relation::Le, 500);
let second = reoptimize(&first, &extended, &Options::default()).expect("valid extension");
report(&second);
if let Some(sensitivity) = &second.sensitivity {
print!("{sensitivity}");
}
}