Skip to main content

clarabel_constrained_l2/
clarabel_constrained_l2.rs

1use resopt::{
2    Bounds, ConstrainedResidualProblem, LinearEqualities, LinearInequalities, LinearResidual, Loss,
3    Matrix,
4};
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7    let residual = LinearResidual::new(
8        Matrix::from_row_major(3, 2, vec![1.0, 0.0, 0.0, 1.0, 1.0, 1.0])?,
9        vec![1.0, 2.0, 2.5],
10    )?;
11
12    let eq = LinearEqualities::new(Matrix::from_row_major(1, 2, vec![1.0, -1.0])?, vec![0.0])?;
13
14    let ineq = LinearInequalities::new(Matrix::from_row_major(1, 2, vec![1.0, 1.0])?, vec![3.0])?;
15
16    let bounds = Bounds::new(vec![Some(0.0), Some(0.0)], vec![Some(10.0), Some(10.0)])?;
17
18    let problem = ConstrainedResidualProblem::new(residual, Loss::L2Squared)?
19        .add_equalities(eq)?
20        .add_inequalities(ineq)?
21        .with_bounds(bounds)?;
22
23    let result = problem.solve()?;
24
25    println!("status      : {:?}", result.status());
26    println!("objective   : {:?}", result.objective_value());
27    println!("diagnostics : {:?}", result.diagnostics());
28
29    if let Some(solution) = result.solution() {
30        println!("x           : {:?}", solution.x());
31        println!("residual    : {:?}", solution.residual());
32    }
33
34    Ok(())
35}