#![cfg(feature = "ma57")]
use pounce_common::types::{Index, Number};
use pounce_hsl::Ma57SolverInterface;
use pounce_linsol::{ESymSolverStatus, TSymLinearSolver};
#[test]
fn ma57_solves_3x3_spd_via_t_sym_wrapper() {
let irn: [Index; 5] = [1, 2, 2, 3, 3];
let jcn: [Index; 5] = [1, 1, 2, 2, 3];
let vals: [Number; 5] = [4.0, -1.0, 4.0, -1.0, 4.0];
let mut tsym = TSymLinearSolver::new(Box::new(Ma57SolverInterface::new()), None, false);
assert_eq!(
tsym.initialize_structure(3, &irn, &jcn),
ESymSolverStatus::Success
);
let x1: Number = 41.0 / 28.0;
let x2: Number = 13.0 / 7.0;
let x3: Number = 55.0 / 28.0;
let mut rhs: [Number; 3] = [4.0, 4.0, 6.0];
let status = tsym.multi_solve(&vals, true, 1, &mut rhs, true, 0);
assert_eq!(status, ESymSolverStatus::Success);
assert!(
(rhs[0] - x1).abs() < 1e-12,
"x1: got {} want {}",
rhs[0],
x1
);
assert!(
(rhs[1] - x2).abs() < 1e-12,
"x2: got {} want {}",
rhs[1],
x2
);
assert!(
(rhs[2] - x3).abs() < 1e-12,
"x3: got {} want {}",
rhs[2],
x3
);
use pounce_linsol::SymLinearSolver;
assert_eq!(
<TSymLinearSolver as SymLinearSolver>::number_of_neg_evals(&tsym),
0
);
}
#[test]
fn ma57_reports_correct_inertia_on_indefinite_matrix() {
let irn: [Index; 3] = [1, 2, 2];
let jcn: [Index; 3] = [1, 1, 2];
let vals: [Number; 3] = [1.0, 2.0, 1.0];
let mut tsym = TSymLinearSolver::new(Box::new(Ma57SolverInterface::new()), None, false);
assert_eq!(
tsym.initialize_structure(2, &irn, &jcn),
ESymSolverStatus::Success
);
let mut rhs: [Number; 2] = [3.0, 3.0];
let status = tsym.multi_solve(&vals, true, 1, &mut rhs, false, 0);
assert_eq!(status, ESymSolverStatus::Success);
use pounce_linsol::SymLinearSolver;
assert_eq!(
<TSymLinearSolver as SymLinearSolver>::number_of_neg_evals(&tsym),
1
);
assert!((rhs[0] - 1.0_f64).abs() < 1e-12);
assert!((rhs[1] - 1.0_f64).abs() < 1e-12);
}