#![allow(non_snake_case)]
use clarabel::{algebra::*, solver::*};
#[allow(clippy::type_complexity)]
fn eq_constrained_A1() -> CscMatrix<f64> {
CscMatrix::new(
2, 3, vec![0, 0, 2, 4], vec![0, 1, 0, 1], vec![1., 1., 1., -1.], )
}
fn eq_constrained_A2() -> CscMatrix<f64> {
CscMatrix::new(
4, 3, vec![0, 2, 6, 10], vec![2, 3, 0, 1, 2, 3, 0, 1, 2, 3], vec![1., 2., 1., 1., 2., -1., 1., -1., -1., 3.], )
}
#[test]
fn test_eq_constrained_feasible() {
let P = CscMatrix::identity(3);
let c = [0., 0., 0.];
let A = eq_constrained_A1(); let b = [2., 0.];
let cones = [ZeroConeT(2)];
let settings = DefaultSettings::default();
let mut solver = DefaultSolver::new(&P, &c, &A, &b, &cones, settings).unwrap();
solver.solve();
let refsol = [0., 1., 1.];
assert_eq!(solver.solution.status, SolverStatus::Solved);
assert!(solver.solution.x.dist(&refsol) <= 1e-6);
}
#[test]
fn test_eq_constrained_primal_infeasible() {
let P = CscMatrix::identity(3);
let c = [0.; 3];
let A = eq_constrained_A2(); let b = [1.; 4];
let cones = [ZeroConeT(4)];
let settings = DefaultSettings::default();
let mut solver = DefaultSolver::new(&P, &c, &A, &b, &cones, settings).unwrap();
solver.solve();
assert_eq!(solver.solution.status, SolverStatus::PrimalInfeasible);
}
#[test]
fn test_eq_constrained_dual_infeasible() {
let mut P = CscMatrix::identity(3);
P.nzval[0] = 0.;
let c = [1.; 3];
let A = eq_constrained_A1(); let b = [2., 0.];
let cones = [ZeroConeT(2)];
let settings = DefaultSettings::default();
let mut solver = DefaultSolver::new(&P, &c, &A, &b, &cones, settings).unwrap();
solver.solve();
assert_eq!(solver.solution.status, SolverStatus::DualInfeasible);
}