@@ -304,7 +304,7 @@ pub fn lobpcg<
304
304
} ;
305
305
306
306
// mask and orthonormalize P and AP
307
- let p_ap = previous_p_ap
307
+ let mut p_ap = previous_p_ap
308
308
. as_ref ( )
309
309
. and_then ( |( p, ap) | {
310
310
let active_p = ndarray_mask ( p. view ( ) , & activemask) ;
@@ -356,6 +356,8 @@ pub fn lobpcg<
356
356
)
357
357
} )
358
358
. or_else ( |_| {
359
+ p_ap = None ;
360
+
359
361
sorted_eig (
360
362
stack ! [ Axis ( 0 ) , stack![ Axis ( 1 ) , xax, xar] , stack![ Axis ( 1 ) , xar. t( ) , rar] ] ,
361
363
Some ( stack ! [ Axis ( 0 ) , stack![ Axis ( 1 ) , xx, xr] , stack![ Axis ( 1 ) , xr. t( ) , rr] ] ) ,
@@ -431,14 +433,13 @@ mod tests {
431
433
use super :: Order ;
432
434
use crate :: close_l2;
433
435
use crate :: qr:: * ;
436
+ use crate :: generate;
434
437
use ndarray:: prelude:: * ;
435
- use ndarray_rand:: rand_distr:: Uniform ;
436
- use ndarray_rand:: RandomExt ;
437
438
438
439
/// Test the `sorted_eigen` function
439
440
#[ test]
440
441
fn test_sorted_eigen ( ) {
441
- let matrix = Array2 :: random ( ( 10 , 10 ) , Uniform :: new ( 0. , 10. ) ) ;
442
+ let matrix: Array2 < f64 > = generate :: random ( ( 10 , 10 ) ) * 10.0 ;
442
443
let matrix = matrix. t ( ) . dot ( & matrix) ;
443
444
444
445
// return all eigenvectors with largest first
@@ -454,15 +455,15 @@ mod tests {
454
455
/// Test the masking function
455
456
#[ test]
456
457
fn test_masking ( ) {
457
- let matrix = Array2 :: random ( ( 10 , 5 ) , Uniform :: new ( 0. , 10. ) ) ;
458
+ let matrix: Array2 < f64 > = generate :: random ( ( 10 , 5 ) ) * 10.0 ;
458
459
let masked_matrix = ndarray_mask ( matrix. view ( ) , & [ true , true , false , true , false ] ) ;
459
460
close_l2 ( & masked_matrix. slice ( s ! [ .., 2 ] ) , & matrix. slice ( s ! [ .., 3 ] ) , 1e-12 ) ;
460
461
}
461
462
462
463
/// Test orthonormalization of a random matrix
463
464
#[ test]
464
465
fn test_orthonormalize ( ) {
465
- let matrix: Array2 < f64 > = Array2 :: random ( ( 10 , 10 ) , Uniform :: new ( - 10. , 10. ) ) ;
466
+ let matrix: Array2 < f64 > = generate :: random ( ( 10 , 10 ) ) * 10.0 ;
466
467
467
468
let ( n, l) = orthonormalize ( matrix. clone ( ) ) . unwrap ( ) ;
468
469
@@ -483,10 +484,9 @@ mod tests {
483
484
assert_symmetric ( a) ;
484
485
485
486
let n = a. len_of ( Axis ( 0 ) ) ;
486
- let x: Array2 < f64 > = Array2 :: random ( ( n, num) , Uniform :: new ( 0.0 , 1.0 ) ) ;
487
+ let x: Array2 < f64 > = generate :: random ( ( n, num) ) ;
487
488
488
489
let result = lobpcg ( |y| a. dot ( & y) , x, |_| { } , None , 1e-5 , n * 2 , order) ;
489
- dbg ! ( & result) ;
490
490
match result {
491
491
LobpcgResult :: Ok ( vals, _, r_norms) | LobpcgResult :: Err ( vals, _, r_norms, _) => {
492
492
// check convergence
@@ -523,7 +523,7 @@ mod tests {
523
523
#[ test]
524
524
fn test_eigsolver_constructed ( ) {
525
525
let n = 50 ;
526
- let tmp = Array2 :: random ( ( n, n) , Uniform :: new ( 0.0 , 1.0 ) ) ;
526
+ let tmp = generate :: random ( ( n, n) ) ;
527
527
//let (v, _) = tmp.qr_square().unwrap();
528
528
let ( v, _) = orthonormalize ( tmp) . unwrap ( ) ;
529
529
@@ -540,7 +540,7 @@ mod tests {
540
540
fn test_eigsolver_constrained ( ) {
541
541
let diag = arr1 ( & [ 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9. , 10. ] ) ;
542
542
let a = Array2 :: from_diag ( & diag) ;
543
- let x: Array2 < f64 > = Array2 :: random ( ( 10 , 1 ) , Uniform :: new ( 0.0 , 1.0 ) ) ;
543
+ let x: Array2 < f64 > = generate :: random ( ( 10 , 1 ) ) ;
544
544
let y: Array2 < f64 > = arr2 ( & [
545
545
[ 1.0 , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ] ,
546
546
[ 0. , 1.0 , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ] ,
0 commit comments