Skip to main content

basic_l2/
basic_l2.rs

1use resopt::{ConstrainedResidualProblem, LinearResidual, Loss, Matrix};
2
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    // Problem:
5    // minimize_x 1/2 ||M x - r||_2^2
6    //
7    // with
8    // M = [[1, 0],
9    //      [0, 1],
10    //      [1, 1]]
11    // r = [1, 2, 2.5]
12    //
13    // Least-squares intuition:
14    // x should be close to [0.8333, 1.8333]
15
16    let residual = LinearResidual::new(
17        Matrix::from_row_major(3, 2, vec![1.0, 0.0, 0.0, 1.0, 1.0, 1.0])?,
18        vec![1.0, 2.0, 2.5],
19    )?;
20
21    let problem = ConstrainedResidualProblem::new(residual, Loss::L2Squared)?;
22
23    let result = problem.solve()?;
24
25    println!("=== basic_l2 ===");
26    println!("status      : {:?}", result.status());
27    println!("objective   : {:?}", result.objective_value());
28    println!("diagnostics : {:?}", result.diagnostics());
29
30    if let Some(solution) = result.solution() {
31        println!("x           : {:?}", solution.x());
32        println!("residual    : {:?}", solution.residual());
33    } else {
34        println!("no solution returned");
35    }
36
37    Ok(())
38}