Skip to content

Commit d201ca1

Browse files
committed
Eliminate dependency on xoshiro
1 parent 462763f commit d201ca1

File tree

3 files changed

+32
-58
lines changed

3 files changed

+32
-58
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ ndarray = { version = "0.15", features = ["approx"] }
1414
num-traits = "0.2.0"
1515
thiserror = "1"
1616
rand = { version = "0.8", optional=true }
17-
rand_xoshiro = { version = "0.6", optional=true }
1817

1918
[dev-dependencies]
2019
approx = "0.4"

src/lobpcg/eig.rs

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ use num_traits::NumCast;
1212
use rand::Rng;
1313
use std::iter::Sum;
1414

15-
#[cfg(feature = "rand_xoshiro")]
16-
use rand_xoshiro::{rand_core::SeedableRng, Xoshiro256Plus};
17-
//#[cfg(feature="rand_xoshiro")]
18-
1915
#[derive(Debug, Clone)]
2016
/// Truncated eigenproblem solver
2117
///
@@ -29,11 +25,13 @@ use rand_xoshiro::{rand_core::SeedableRng, Xoshiro256Plus};
2925
/// ```rust
3026
/// use ndarray::{arr1, Array2};
3127
/// use ndarray_linalg_rs::{Order, lobpcg::TruncatedEig};
28+
/// use rand::SeedableRng;
29+
/// use rand_xoshiro::Xoshiro256Plus;
3230
///
3331
/// let diag = arr1(&[1., 2., 3., 4., 5.]);
3432
/// let a = Array2::from_diag(&diag);
3533
///
36-
/// let mut eig = TruncatedEig::new_from_seed(a, Order::Largest, 42)
34+
/// let mut eig = TruncatedEig::new_with_rng(a, Order::Largest, Xoshiro256Plus::seed_from_u64(42))
3735
/// .precision(1e-5)
3836
/// .maxiter(500);
3937
///
@@ -49,22 +47,6 @@ pub struct TruncatedEig<A: NdFloat, R: Rng> {
4947
rng: R,
5048
}
5149

52-
#[cfg(feature = "rand_xoshiro")]
53-
impl<A: NdFloat + Sum> TruncatedEig<A, Xoshiro256Plus> {
54-
/// Create a new truncated eigenproblem solver
55-
///
56-
/// # Properties
57-
/// * `problem`: problem matrix
58-
/// * `order`: ordering of the eigenvalues with [Order](crate::Order)
59-
pub fn new_from_seed(
60-
problem: Array2<A>,
61-
order: Order,
62-
seed: u64,
63-
) -> TruncatedEig<A, Xoshiro256Plus> {
64-
Self::new_with_rng(problem, order, Xoshiro256Plus::seed_from_u64(seed))
65-
}
66-
}
67-
6850
impl<A: NdFloat + Sum, R: Rng> TruncatedEig<A, R> {
6951
/// Create a new truncated eigenproblem solver
7052
///
@@ -141,11 +123,13 @@ impl<A: NdFloat + Sum, R: Rng> TruncatedEig<A, R> {
141123
/// ```rust
142124
/// use ndarray::{arr1, Array2};
143125
/// use ndarray_linalg_rs::{Order, lobpcg::TruncatedEig};
126+
/// use rand::SeedableRng;
127+
/// use rand_xoshiro::Xoshiro256Plus;
144128
///
145129
/// let diag = arr1(&[1., 2., 3., 4., 5.]);
146130
/// let a = Array2::from_diag(&diag);
147131
///
148-
/// let mut eig = TruncatedEig::new_from_seed(a, Order::Largest, 42)
132+
/// let mut eig = TruncatedEig::new_with_rng(a, Order::Largest, Xoshiro256Plus::seed_from_u64(42))
149133
/// .precision(1e-5)
150134
/// .maxiter(500);
151135
///
@@ -217,11 +201,13 @@ impl<A: NdFloat + Sum, R: Rng> TruncatedEig<A, R> {
217201
/// ```rust
218202
/// use ndarray::{arr1, Array2};
219203
/// use ndarray_linalg_rs::{Order, lobpcg::TruncatedEig};
204+
/// use rand::SeedableRng;
205+
/// use rand_xoshiro::Xoshiro256Plus;
220206
///
221207
/// let diag = arr1(&[1., 2., 3., 4., 5.]);
222208
/// let a = Array2::from_diag(&diag);
223209
///
224-
/// let teig = TruncatedEig::new_from_seed(a, Order::Largest, 42)
210+
/// let teig = TruncatedEig::new_with_rng(a, Order::Largest, Xoshiro256Plus::seed_from_u64(42))
225211
/// .precision(1e-5)
226212
/// .maxiter(500);
227213
///
@@ -306,11 +292,13 @@ impl<A: NdFloat + Sum, R: Rng> Iterator for TruncatedEigIterator<A, R> {
306292
}
307293
}
308294

309-
#[cfg(all(test, feature = "rand_xoshiro"))]
295+
#[cfg(test)]
310296
mod tests {
311297
use super::Order;
312298
use super::TruncatedEig;
313299
use ndarray::{arr1, Array2};
300+
use rand::SeedableRng;
301+
use rand_xoshiro::Xoshiro256Plus;
314302

315303
#[test]
316304
fn test_truncated_eig() {
@@ -320,7 +308,7 @@ mod tests {
320308
]);
321309
let a = Array2::from_diag(&diag);
322310

323-
let teig = TruncatedEig::new_from_seed(a, Order::Largest, 42)
311+
let teig = TruncatedEig::new_with_rng(a, Order::Largest, Xoshiro256Plus::seed_from_u64(42))
324312
.precision(1e-5)
325313
.maxiter(500);
326314

src/lobpcg/svd.rs

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ use std::iter::Sum;
1111

1212
use rand::Rng;
1313

14-
#[cfg(feature = "rand_xoshiro")]
15-
use rand_xoshiro::{rand_core::SeedableRng, Xoshiro256Plus};
16-
1714
/// The result of a eigenvalue decomposition, not yet transformed into singular values/vectors
1815
///
1916
/// Provides methods for either calculating just the singular values with reduced cost or the
@@ -115,23 +112,6 @@ pub struct TruncatedSvd<A: NdFloat, R: Rng> {
115112
rng: R,
116113
}
117114

118-
#[cfg(feature = "rand_xoshiro")]
119-
impl<A: NdFloat + Sum> TruncatedSvd<A, Xoshiro256Plus> {
120-
/// Create a new truncated SVD problem
121-
///
122-
/// # Parameters
123-
/// * `problem`: rectangular matrix which is decomposed
124-
/// * `order`: whether to return large or small (close to zero) singular values
125-
/// * `seed`: seed of the random number generator
126-
pub fn new_from_seed(
127-
problem: Array2<A>,
128-
order: Order,
129-
seed: u64,
130-
) -> TruncatedSvd<A, Xoshiro256Plus> {
131-
Self::new_with_rng(problem, order, Xoshiro256Plus::seed_from_u64(seed))
132-
}
133-
}
134-
135115
impl<A: NdFloat + Sum, R: Rng> TruncatedSvd<A, R> {
136116
/// Create a new truncated SVD problem
137117
///
@@ -183,11 +163,13 @@ impl<A: NdFloat + Sum, R: Rng> TruncatedSvd<A, R> {
183163
/// ```rust
184164
/// use ndarray::{arr1, Array2};
185165
/// use ndarray_linalg_rs::{Order, lobpcg::TruncatedSvd};
166+
/// use rand::SeedableRng;
167+
/// use rand_xoshiro::Xoshiro256Plus;
186168
///
187169
/// let diag = arr1(&[1., 2., 3., 4., 5.]);
188170
/// let a = Array2::from_diag(&diag);
189171
///
190-
/// let eig = TruncatedSvd::new_from_seed(a, Order::Largest, 42)
172+
/// let eig = TruncatedSvd::new_with_rng(a, Order::Largest, Xoshiro256Plus::seed_from_u64(42))
191173
/// .precision(1e-5)
192174
/// .maxiter(500);
193175
///
@@ -280,7 +262,7 @@ impl MagnitudeCorrection for f64 {
280262
}
281263
}
282264

283-
#[cfg(all(test, feature = "rand_xoshiro"))]
265+
#[cfg(test)]
284266
mod tests {
285267
use super::Order;
286268
use super::TruncatedSvd;
@@ -306,7 +288,7 @@ mod tests {
306288
fn test_truncated_svd() {
307289
let a = arr2(&[[3., 2., 2.], [2., 3., -2.]]);
308290

309-
let res = TruncatedSvd::new_from_seed(a, Order::Largest, 42)
291+
let res = TruncatedSvd::new_with_rng(a, Order::Largest, Xoshiro256Plus::seed_from_u64(42))
310292
.precision(1e-5)
311293
.maxiter(10)
312294
.decompose(2)
@@ -321,11 +303,15 @@ mod tests {
321303
fn test_truncated_svd_random() {
322304
let a: Array2<f64> = random((50, 10));
323305

324-
let res = TruncatedSvd::new_from_seed(a.clone(), Order::Largest, 42)
325-
.precision(1e-5)
326-
.maxiter(10)
327-
.decompose(10)
328-
.unwrap();
306+
let res = TruncatedSvd::new_with_rng(
307+
a.clone(),
308+
Order::Largest,
309+
Xoshiro256Plus::seed_from_u64(42),
310+
)
311+
.precision(1e-5)
312+
.maxiter(10)
313+
.decompose(10)
314+
.unwrap();
329315

330316
let (u, sigma, v_t) = res.values_vectors();
331317
let reconstructed = u.dot(&Array2::from_diag(&sigma).dot(&v_t));
@@ -349,10 +335,11 @@ mod tests {
349335
// generate normal distribution random data with N >> p
350336
let data = Array2::random_using((1000, 500), StandardNormal, &mut rng) / 1000f64.sqrt();
351337

352-
let res = TruncatedSvd::new_from_seed(data, Order::Largest, 42)
353-
.precision(1e-3)
354-
.decompose(500)
355-
.unwrap();
338+
let res =
339+
TruncatedSvd::new_with_rng(data, Order::Largest, Xoshiro256Plus::seed_from_u64(42))
340+
.precision(1e-3)
341+
.decompose(500)
342+
.unwrap();
356343

357344
let sv = res.values().mapv(|x: f64| x * x);
358345

0 commit comments

Comments
 (0)