#[cfg(all(test, feature = "gpu"))]
mod tests {
use quantrs2_ml::gpu_backend_impl::GPUBackend;
use quantrs2_ml::simulator_backends::{Backend, DynamicCircuit, Observable, SimulatorBackend};
#[test]
fn test_gpu_backend_creation() {
let result = GPUBackend::new(0, 20);
#[cfg(all(feature = "gpu", not(target_os = "macos")))]
{
match result {
Ok(backend) => {
assert_eq!(backend.name(), "gpu_full");
assert!(backend.capabilities().gpu_acceleration);
assert_eq!(backend.max_qubits(), 20);
}
Err(err) => {
assert!(err.to_string().contains("GPU not available"));
}
}
}
#[cfg(not(all(feature = "gpu", not(target_os = "macos"))))]
{
assert!(result.is_err());
assert!(result
.unwrap_err()
.to_string()
.contains("not available on this platform"));
}
}
#[test]
#[cfg(feature = "gpu")]
fn test_gpu_backend_stub_behavior() {
if let Ok(gpu) = GPUBackend::new(0, 10) {
let backend = Backend::GPU(gpu);
let capabilities = backend.capabilities();
#[cfg(all(feature = "gpu", not(target_os = "macos")))]
{
assert!(capabilities.gpu_acceleration);
assert_eq!(backend.name(), "gpu_full");
}
#[cfg(not(all(feature = "gpu", not(target_os = "macos"))))]
{
assert!(!capabilities.gpu_acceleration);
assert_eq!(backend.name(), "gpu_stub");
}
}
}
#[test]
#[cfg(all(feature = "gpu", not(target_os = "macos")))]
fn test_gpu_backend_circuit_execution() {
use quantrs2_circuit::prelude::Circuit;
if let Ok(backend) = GPUBackend::new(0, 10) {
let circuit = Circuit::<2>::new();
let dynamic_circuit = DynamicCircuit::Circuit2(circuit);
let result = backend.execute_circuit(&dynamic_circuit, &[], None);
match result {
Ok(sim_result) => {
assert!(sim_result.metadata.contains_key("gpu_time_ms"));
assert!(sim_result.metadata.contains_key("num_qubits"));
}
Err(err) => {
assert!(err.to_string().contains("GPU"));
}
}
}
}
#[test]
#[cfg(all(feature = "gpu", not(target_os = "macos")))]
fn test_gpu_backend_expectation_value() {
use quantrs2_circuit::prelude::Circuit;
if let Ok(backend) = GPUBackend::new(0, 10) {
let circuit = Circuit::<2>::new();
let dynamic_circuit = DynamicCircuit::Circuit2(circuit);
let observable = Observable::PauliZ(vec![0]);
let result = backend.expectation_value(&dynamic_circuit, &[], &observable);
assert!(result.is_ok() || result.unwrap_err().to_string().contains("GPU"));
}
}
#[test]
#[cfg(all(feature = "gpu", not(target_os = "macos")))]
fn test_gpu_backend_memory_management() {
if let Ok(backend) = GPUBackend::new(0, 15) {
use quantrs2_circuit::prelude::Circuit;
for _ in 0..3 {
let circuit = Circuit::<4>::new();
let dynamic_circuit = DynamicCircuit::Circuit4(circuit);
let _ = backend.execute_circuit(&dynamic_circuit, &[], None);
}
}
}
#[test]
#[ignore = "Skipping GPU gradient computation test"]
fn test_gpu_backend_gradient_computation() {
use quantrs2_circuit::prelude::Circuit;
use quantrs2_ml::simulator_backends::GradientMethod;
if let Ok(backend) = GPUBackend::new(0, 10) {
let circuit = Circuit::<2>::new();
let dynamic_circuit = DynamicCircuit::Circuit2(circuit);
let observable = Observable::PauliZ(vec![0]);
let result = backend.compute_gradients(
&dynamic_circuit,
&[0.5, 1.0],
&observable,
GradientMethod::ParameterShift,
);
assert!(result.is_ok() || result.unwrap_err().to_string().contains("not"));
}
}
}