use crate::error::{Result, SimulatorError};
use scirs2_core::ndarray::{
s, Array1, Array2, ArrayView1, ArrayView2, ArrayViewMut1, ArrayViewMut2,
};
use scirs2_core::random::prelude::*;
use scirs2_core::Complex64;
use std::collections::HashMap;
#[cfg(feature = "advanced_math")]
use super::types::{AdvancedLinearAlgebra, SparseSolvers};
use super::types::{FftEngine, Matrix, MemoryPool, SparseMatrix, Vector};
pub fn benchmark_scirs2_integration() -> Result<HashMap<String, f64>> {
let mut results = HashMap::new();
#[cfg(feature = "advanced_math")]
{
let start = std::time::Instant::now();
let engine = FftEngine::new();
let test_vector = Vector::from_array1(
&Array1::from_vec((0..1024).map(|i| Complex64::new(i as f64, 0.0)).collect()).view(),
&MemoryPool::new(),
)?;
for _ in 0..100 {
let _ = engine.forward(&test_vector)?;
}
let fft_time = start.elapsed().as_millis() as f64;
results.insert("fft_1024_100_iterations".to_string(), fft_time);
}
#[cfg(feature = "advanced_math")]
{
let start = std::time::Instant::now();
let mut row_indices = vec![0usize; 1000];
let mut col_indices = vec![0usize; 1000];
let mut values = vec![Complex64::new(0.0, 0.0); 1000];
for i in 0..100 {
for j in 0..10 {
let idx = i * 10 + j;
row_indices[idx] = i;
col_indices[idx] = (i + j) % 100;
values[idx] = Complex64::new(1.0, 0.0);
}
}
let sparse_matrix =
SparseMatrix::from_triplets(values, row_indices, col_indices, (100, 100))?;
let b = Vector::from_array1(&Array1::ones(100).view(), &MemoryPool::new())?;
let _ = SparseSolvers::conjugate_gradient(&sparse_matrix, &b, None, 1e-6, 100)?;
let sparse_solver_time = start.elapsed().as_millis() as f64;
results.insert("cg_solver_100x100".to_string(), sparse_solver_time);
}
#[cfg(feature = "advanced_math")]
{
let start = std::time::Instant::now();
let test_matrix = Matrix::from_array2(&Array2::eye(50).view(), &MemoryPool::new())?;
for _ in 0..10 {
let _ = AdvancedLinearAlgebra::qr_decomposition(&test_matrix)?;
}
let qr_time = start.elapsed().as_millis() as f64;
results.insert("qr_decomposition_50x50_10_iterations".to_string(), qr_time);
}
Ok(results)
}