use crate::qubo::Qubo;
use ndarray::Array1;
pub fn beck_proof(qubo: &Qubo, x: &Array1<usize>) -> bool {
let x_float = x.mapv(|x| x as f64);
let qx_b = (&qubo.q * &x_float) + &qubo.c;
let lhs = 2.0 * (2.0 * &x_float - 1.0) * &qx_b;
let eigs = qubo.hess_eigenvalues();
let min_eig = eigs.iter().fold(f64::INFINITY, |acc, &x| x.min(acc));
for i in 0..qubo.num_x() {
if lhs[i] > min_eig {
return false;
}
}
true
}
#[cfg(test)]
mod tests {
use super::*;
use ndarray::Array1;
use sprs::TriMat;
#[test]
fn test_beck_proof() {
let mut Q = TriMat::new((1, 1));
Q.add_triplet(0, 0, 0.1);
let c = -Array1::ones(1);
let p = Qubo::new_with_c(Q.to_csc(), c);
let cand_sol = Array1::ones(1);
assert!(beck_proof(&p, &cand_sol));
}
}