resopt 0.3.0

Declarative constrained residual optimization in Rust
Documentation
use resopt::{ConstrainedResidualProblem, LinearResidual, Loss, Matrix};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Problem:
    // minimize_x 1/2 ||M x - r||_2^2
    //
    // with
    // M = [[1, 0],
    //      [0, 1],
    //      [1, 1]]
    // r = [1, 2, 2.5]
    //
    // Least-squares intuition:
    // x should be close to [0.8333, 1.8333]

    let residual = LinearResidual::new(
        Matrix::from_row_major(3, 2, vec![1.0, 0.0, 0.0, 1.0, 1.0, 1.0])?,
        vec![1.0, 2.0, 2.5],
    )?;

    let problem = ConstrainedResidualProblem::new(residual, Loss::L2Squared)?;

    let result = problem.solve()?;

    println!("=== basic_l2 ===");
    println!("status      : {:?}", result.status());
    println!("objective   : {:?}", result.objective_value());
    println!("diagnostics : {:?}", result.diagnostics());

    if let Some(solution) = result.solution() {
        println!("x           : {:?}", solution.x());
        println!("residual    : {:?}", solution.residual());
    } else {
        println!("no solution returned");
    }

    Ok(())
}