#![allow(clippy::pedantic, clippy::unnecessary_wraps)]
use quantrs2_tytan::*;
use scirs2_core::ndarray::Array;
#[cfg(feature = "dwave")]
use quantrs2_tytan::compile::Compile;
#[cfg(feature = "dwave")]
use quantrs2_tytan::symbol::symbols;
#[test]
#[cfg(feature = "dwave")]
fn test_compile_simple_expression() {
let x = symbols("x");
let y = symbols("y");
let two = quantrs2_symengine_pure::Expression::from(2);
let expr = x + y * two;
let (qubo, offset) = Compile::new(expr).get_qubo().unwrap();
let (matrix, var_map) = qubo;
assert_eq!(offset, 0.0);
assert_eq!(var_map.len(), 2);
assert!(var_map.contains_key("x"));
assert!(var_map.contains_key("y"));
assert_eq!(matrix.shape(), &[2, 2]);
let x_idx = var_map["x"];
let y_idx = var_map["y"];
assert_eq!(matrix[[x_idx, x_idx]], 1.0); assert_eq!(matrix[[y_idx, y_idx]], 2.0); }
#[test]
#[cfg(feature = "dwave")]
fn test_compile_quadratic_expression() {
let x = symbols("x");
let y = symbols("y");
let expr = x.clone() * y + x.pow(&quantrs2_symengine_pure::Expression::from(2));
let (qubo, offset) = Compile::new(expr).get_qubo().unwrap();
let (matrix, var_map) = qubo;
assert_eq!(offset, 0.0);
assert_eq!(var_map.len(), 2);
assert_eq!(matrix.shape(), &[2, 2]);
let x_idx = var_map["x"];
let y_idx = var_map["y"];
assert_eq!(matrix[[x_idx, x_idx]], 1.0);
assert!(matrix[[x_idx, y_idx]] == 1.0 || matrix[[y_idx, x_idx]] == 1.0);
}
#[test]
#[cfg(feature = "dwave")]
fn test_compile_constraint_expression() {
let x = symbols("x");
let y = symbols("y");
let z = symbols("z");
let one = quantrs2_symengine_pure::Expression::from(1);
let two = quantrs2_symengine_pure::Expression::from(2);
let expr = (x + y + z - one).pow(&two);
let (qubo, offset) = Compile::new(expr).get_qubo().unwrap();
let (matrix, var_map) = qubo;
assert_eq!(offset, 1.0);
assert_eq!(var_map.len(), 3);
assert_eq!(matrix.shape(), &[3, 3]);
let x_idx = var_map["x"];
let y_idx = var_map["y"];
let z_idx = var_map["z"];
assert_eq!(matrix[[x_idx, x_idx]], -1.0);
assert_eq!(matrix[[y_idx, y_idx]], -1.0);
assert_eq!(matrix[[z_idx, z_idx]], -1.0);
assert_eq!(matrix[[x_idx, y_idx]], 2.0);
assert_eq!(matrix[[x_idx, z_idx]], 2.0);
assert_eq!(matrix[[y_idx, z_idx]], 2.0);
}
#[test]
#[cfg(feature = "dwave")]
fn test_compile_cubic_expression() {
let x = symbols("x");
let y = symbols("y");
let z = symbols("z");
let expr = x * y * z;
let (hobo, offset) = Compile::new(expr).get_hobo().unwrap();
let (tensor, var_map) = hobo;
assert_eq!(offset, 0.0);
assert_eq!(var_map.len(), 3);
assert_eq!(tensor.ndim(), 3);
assert_eq!(tensor.shape(), &[3, 3, 3]);
let x_idx = var_map["x"];
let y_idx = var_map["y"];
let z_idx = var_map["z"];
let indices = [x_idx, y_idx, z_idx];
let mut sorted_indices = indices;
sorted_indices.sort_unstable();
assert_eq!(tensor[scirs2_core::ndarray::IxDyn(&sorted_indices)], 1.0);
}