From 27506f77a0ebc8db048ded210c7c350dcd59d405 Mon Sep 17 00:00:00 2001 From: SauersML <123714540+SauersML@users.noreply.github.com> Date: Wed, 24 Sep 2025 00:51:15 -0500 Subject: [PATCH] Align PCA test with sample scaling and silence backend warnings --- src/linalg_backends.rs | 34 +++++++++++++++++++++------------- tests/pca_tests.rs | 15 ++++++++++++--- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/linalg_backends.rs b/src/linalg_backends.rs index d3f6d56..36344fe 100644 --- a/src/linalg_backends.rs +++ b/src/linalg_backends.rs @@ -22,15 +22,18 @@ impl LinAlgBackendProvider { feature = "faer_links_ndarray_static_openblas" ))] use ndarray::s; -#[cfg(any( - feature = "backend_openblas", - feature = "backend_openblas_system", - feature = "backend_mkl", - feature = "backend_mkl_system", - feature = "faer_links_ndarray_static_openblas" +use ndarray::{Array1, Array2}; +#[cfg(all( + not(feature = "backend_faer"), + any( + feature = "backend_openblas", + feature = "backend_openblas_system", + feature = "backend_mkl", + feature = "backend_mkl_system", + feature = "faer_links_ndarray_static_openblas" + ) ))] use ndarray_linalg::Lapack; -use ndarray::{Array1, Array2}; // use num_traits::Float; // No longer needed directly by provider use std::error::Error; use std::marker::PhantomData; @@ -90,9 +93,11 @@ mod ndarray_backend_impl { use ndarray_linalg::{Eigh, Lapack, SVDInto, QR, UPLO}; use std::error::Error; + #[cfg_attr(feature = "backend_faer", allow(dead_code))] #[derive(Debug, Default, Copy, Clone)] pub struct NdarrayLinAlgBackend; + #[cfg_attr(feature = "backend_faer", allow(dead_code))] fn to_dyn_error(e: E) -> Box { Box::new(e) } @@ -185,12 +190,15 @@ mod ndarray_backend_impl { pub use NdarrayLinAlgBackend as Backend; } -#[cfg(any( - feature = "backend_openblas", - feature = "backend_openblas_system", - feature = "backend_mkl", - feature = "backend_mkl_system", - feature = "faer_links_ndarray_static_openblas" +#[cfg(all( + not(feature = "backend_faer"), + any( + feature = "backend_openblas", + feature = "backend_openblas_system", + feature = "backend_mkl", + feature = "backend_mkl_system", + feature = "faer_links_ndarray_static_openblas" + ) ))] use ndarray_backend_impl::Backend as NdarrayLinAlgBackend; diff --git a/tests/pca_tests.rs b/tests/pca_tests.rs index 61e03d4..78c2f5e 100644 --- a/tests/pca_tests.rs +++ b/tests/pca_tests.rs @@ -91,7 +91,7 @@ fn eigenvalues_descending(matrix: &Array2) -> Vec { fn eigenvalues_descending(matrix: &Array2) -> Vec { use ndarray_linalg::{Eigh, UPLO}; - let (mut eigenvalues, _) = matrix.eigh(UPLO::Upper).expect("eigendecomposition failed"); + let (eigenvalues, _) = matrix.eigh(UPLO::Upper).expect("eigendecomposition failed"); let mut values = eigenvalues.to_vec(); values.sort_by(|a, b| b.partial_cmp(a).expect("eigenvalues must be comparable")); values @@ -1953,8 +1953,17 @@ mod pca_tests { } if explained_variance_fit_eff_v161.len() > 0 { - if !approx::abs_diff_eq!(explained_variance_fit_eff_v161[0], 4.0, epsilon = TOLERANCE) { - panic!("Efficient PCA (fit) first explained variance for hardcoded data should be approx 4.0. Got: {}", explained_variance_fit_eff_v161[0]); + let expected_first_ev = n_features as f64; + if !approx::abs_diff_eq!( + explained_variance_fit_eff_v161[0], + expected_first_ev, + epsilon = TOLERANCE + ) { + panic!( + "Efficient PCA (fit) first explained variance for hardcoded data should reflect sample-variance scaling (~{}). Got: {}", + expected_first_ev, + explained_variance_fit_eff_v161[0] + ); } }