@@ -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