Skip to content

Commit c370f52

Browse files
committed
Use div_append
1 parent ee0788d commit c370f52

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/krylov/arnoldi.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,47 @@
1-
use super::Orthogonalizer;
2-
use crate::types::*;
3-
use ndarray::*;
1+
use super::*;
42

5-
pub struct Arnoldi<S, F, Ortho>
3+
pub struct Arnoldi<A, S, F, Ortho>
64
where
7-
S: DataMut,
5+
A: Scalar,
6+
S: DataMut<Elem = A>,
87
F: Fn(&mut ArrayBase<S, Ix1>),
9-
Ortho: Orthogonalizer,
8+
Ortho: Orthogonalizer<Elem = A>,
109
{
1110
a: F,
1211
v: ArrayBase<S, Ix1>,
1312
ortho: Ortho,
1413
}
1514

16-
impl<S, F, Ortho> Arnoldi<S, F, Ortho>
15+
impl<A, S, F, Ortho> Arnoldi<A, S, F, Ortho>
1716
where
18-
S: DataMut,
17+
A: Scalar,
18+
S: DataMut<Elem = A>,
1919
F: Fn(&mut ArrayBase<S, Ix1>),
20-
Ortho: Orthogonalizer,
20+
Ortho: Orthogonalizer<Elem = A>,
2121
{
2222
pub fn new(a: F, v: ArrayBase<S, Ix1>, ortho: Ortho) -> Self {
2323
Arnoldi { a, v, ortho }
2424
}
2525
}
2626

27-
impl<A, S, F, Ortho> Iterator for Arnoldi<S, F, Ortho>
27+
impl<A, S, F, Ortho> Iterator for Arnoldi<A, S, F, Ortho>
2828
where
2929
A: Scalar,
30-
S: DataMut<Elem = A>,
30+
S: DataMut<Elem = A> + DataClone,
3131
F: Fn(&mut ArrayBase<S, Ix1>),
3232
Ortho: Orthogonalizer<Elem = A>,
3333
{
34-
type Item = (Array2<A>, Array2<A>);
34+
type Item = Array1<A>;
3535

3636
fn next(&mut self) -> Option<Self::Item> {
3737
(self.a)(&mut self.v);
38-
let coef = self.ortho.decompose(&mut self.v);
39-
unimplemented!()
38+
match self.ortho.div_append(&mut self.v) {
39+
AppendResult::Added(coef) => {
40+
let norm = coef[coef.len() - 1].abs();
41+
azip!(mut a(&mut self.v) in { *a = a.div_real(norm) });
42+
Some(coef)
43+
}
44+
AppendResult::Dependent(_) => None,
45+
}
4046
}
4147
}

0 commit comments

Comments
 (0)