Skip to content

Commit 3a6fd32

Browse files
author
Ian
committed
test push
1 parent 87da616 commit 3a6fd32

File tree

2 files changed

+18
-36
lines changed

2 files changed

+18
-36
lines changed

src/lib.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,28 +158,32 @@ mod simple_comparison_tests {
158158
let test_matrix = create_sparse_matrix(100, 100, 0.0098); // 0.98% non-zeros
159159

160160
// Should no longer fail with convergence error
161-
let result = svd_dim_seed(&test_matrix, 50, 42); // Using your modified imtqlb
161+
let result = svd_dim_seed(&test_matrix, 50, 42);
162162
assert!(result.is_ok(), "{}", format!("SVD failed on 99.02% sparse matrix, {:?}", result.err().unwrap()));
163163
}
164164

165165
#[test]
166166
fn test_real_sparse_matrix_very_big() {
167167
// Create a matrix with similar sparsity to your real one (99.02%)
168-
let test_matrix = create_sparse_matrix(10000, 1000, 0.0098); // 0.98% non-zeros
168+
let test_matrix = create_sparse_matrix(10000, 1000, 0.01); // 0.98% non-zeros
169169

170170
// Should no longer fail with convergence error
171-
let result = svd_dim_seed(&test_matrix, 50, 42); // Using your modified imtqlb
172-
assert!(result.is_ok(), "{}", format!("SVD failed on 99.02% sparse matrix, {:?}", result.err().unwrap()));
171+
let thread_pool = rayon::ThreadPoolBuilder::new().num_threads(3).build().unwrap();
172+
let result = thread_pool.install(|| {
173+
svd_dim_seed(&test_matrix, 50, 42)
174+
});
175+
assert!(result.is_ok(), "{}", format!("SVD failed on 99% sparse matrix, {:?}", result.err().unwrap()));
173176
}
174177

175178
#[test]
176179
fn test_real_sparse_matrix_very_very_big() {
177180
// Create a matrix with similar sparsity to your real one (99.02%)
178-
let test_matrix = create_sparse_matrix(100000, 2500, 0.0098); // 0.98% non-zeros
181+
let test_matrix = create_sparse_matrix(100000, 2500, 0.01); // 0.98% non-zeros
179182

180183
// Should no longer fail with convergence error
181-
let result = svd(&test_matrix); // Using your modified imtqlb
182-
assert!(result.is_ok(), "{}", format!("SVD failed on 99.02% sparse matrix, {:?}", result.err().unwrap()));
184+
185+
let result = svd(&test_matrix);
186+
assert!(result.is_ok(), "{}", format!("SVD failed on 99% sparse matrix, {:?}", result.err().unwrap()));
183187
}
184188

185189
//#[test]

src/new.rs

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,7 +1157,7 @@ fn ritvec<T: SvdFloat>(
11571157

11581158
let sparsity = T::one()
11591159
- (T::from_usize(A.nnz()).unwrap()
1160-
/ (T::from_usize(A.nrows()).unwrap() * T::from_usize(A.ncols()).unwrap()));
1160+
/ (T::from_usize(A.nrows()).unwrap() * T::from_usize(A.ncols()).unwrap()));
11611161

11621162
let epsilon = T::epsilon();
11631163
let adaptive_eps = if sparsity > T::from_f64(0.99).unwrap() {
@@ -1179,7 +1179,7 @@ fn ritvec<T: SvdFloat>(
11791179
Some(300)
11801180
} else if sparsity > T::from_f64(0.9).unwrap() {
11811181
// Moderately sparse (>90%) - needs somewhat more iterations
1182-
Some(100)
1182+
Some(200)
11831183
} else {
11841184
// Default iterations for less sparse matrices
11851185
Some(50)
@@ -1262,35 +1262,15 @@ fn ritvec<T: SvdFloat>(
12621262
// Sort by k value to maintain original order
12631263
vt_vectors.sort_by_key(|(k, _)| *k);
12641264

1265-
// Rotate the singular vectors and values.
1266-
// `x` is now the location of the highest singular value.
1267-
if x > 0 {
1268-
rotate_array(&mut Vt.value, x * Vt.cols);
1269-
}
1270-
12711265
// final dimension size
12721266
let d = dimensions.min(nsig);
12731267
let mut S = vec![T::zero(); d];
12741268
let mut Ut = DMat {
12751269
cols: wrk.nrows,
12761270
value: vec![T::zero(); wrk.nrows * d],
12771271
};
1278-
let mut Vt = DMat {
1279-
cols: wrk.ncols,
1280-
value: vec![T::zero(); wrk.ncols * d],
1281-
};
1282-
1283-
for (i, (_, vec)) in vt_vectors.into_iter().take(d).enumerate() {
1284-
let vt_offset = i * Vt.cols;
1285-
Vt.value[vt_offset..vt_offset + Vt.cols].copy_from_slice(&vec);
1286-
}
12871272

1288-
let d = dimensions.min(nsig);
1289-
let mut S = vec![T::zero(); d];
1290-
let mut Ut = DMat {
1291-
cols: wrk.nrows,
1292-
value: vec![T::zero(); wrk.nrows * d],
1293-
};
1273+
// Create new Vt with the correct size
12941274
let mut Vt = DMat {
12951275
cols: wrk.ncols,
12961276
value: vec![T::zero(); wrk.ncols * d],
@@ -1342,12 +1322,10 @@ fn ritvec<T: SvdFloat>(
13421322
S[i] = sval;
13431323
let ut_offset = i * Ut.cols;
13441324
let mut ut_vec = a_products[i].clone();
1345-
1346-
// Safe scaling - avoid division by very small numbers
1325+
13471326
if sval > adaptive_eps {
13481327
svd_dscal(T::one() / sval, &mut ut_vec);
13491328
} else {
1350-
// For extremely small singular values, use a bounded scaling factor
13511329
let dls = sval.max(adaptive_eps);
13521330
let safe_scale = T::one() / dls;
13531331
svd_dscal(safe_scale, &mut ut_vec);
@@ -1528,7 +1506,7 @@ impl<T: SvdFloat + 'static> SvdRec<T> {
15281506
}
15291507

15301508
#[rustfmt::skip]
1531-
impl<T: Float + Zero + AddAssign + Clone> SMat<T> for nalgebra_sparse::csc::CscMatrix<T> {
1509+
impl<T: Float + Zero + AddAssign + Clone + Sync> SMat<T> for nalgebra_sparse::csc::CscMatrix<T> {
15321510
fn nrows(&self) -> usize { self.nrows() }
15331511
fn ncols(&self) -> usize { self.ncols() }
15341512
fn nnz(&self) -> usize { self.nnz() }
@@ -1563,7 +1541,7 @@ impl<T: Float + Zero + AddAssign + Clone> SMat<T> for nalgebra_sparse::csc::CscM
15631541
}
15641542

15651543
#[rustfmt::skip]
1566-
impl<T: Float + Zero + AddAssign + Clone> SMat<T> for nalgebra_sparse::csr::CsrMatrix<T> {
1544+
impl<T: Float + Zero + AddAssign + Clone + Sync> SMat<T> for nalgebra_sparse::csr::CsrMatrix<T> {
15671545
fn nrows(&self) -> usize { self.nrows() }
15681546
fn ncols(&self) -> usize { self.ncols() }
15691547
fn nnz(&self) -> usize { self.nnz() }
@@ -1599,7 +1577,7 @@ impl<T: Float + Zero + AddAssign + Clone> SMat<T> for nalgebra_sparse::csr::CsrM
15991577
}
16001578

16011579
#[rustfmt::skip]
1602-
impl<T: Float + Zero + AddAssign + Clone> SMat<T> for nalgebra_sparse::coo::CooMatrix<T> {
1580+
impl<T: Float + Zero + AddAssign + Clone + Sync> SMat<T> for nalgebra_sparse::coo::CooMatrix<T> {
16031581
fn nrows(&self) -> usize { self.nrows() }
16041582
fn ncols(&self) -> usize { self.ncols() }
16051583
fn nnz(&self) -> usize { self.nnz() }

0 commit comments

Comments
 (0)