use cvxrust::prelude::*;
fn main() {
println!("=== Quadratic Programming ===\n");
println!("Problem: Find point closest to [3, 2]");
println!("Subject to: x1 + x2 = 4, x >= 0\n");
let x = variable(2);
let target = constant_vec(vec![3.0, 2.0]);
let objective = sum_squares(&(&x - &target));
println!("Solving...");
let solution = Problem::minimize(objective)
.subject_to([constraint!((sum(&x)) == 4.0), constraint!(x >= 0.0)])
.solve()
.expect("Failed to solve");
println!("\nResults:");
println!(" Status: {:?}", solution.status);
println!(" Optimal value: {:.6}", solution.value.unwrap());
let x_vals = &solution[&x];
println!(" x1 = {:.6}", x_vals[(0, 0)]);
println!(" x2 = {:.6}", x_vals[(1, 0)]);
println!(" Sum: {:.6}", x_vals[(0, 0)] + x_vals[(1, 0)]);
println!(" Distance: {:.6}", solution.value.unwrap().sqrt());
}