Skip to content

Commit fe4efae

Browse files
committed
Add test
1 parent 6a74fc9 commit fe4efae

File tree

1 file changed

+48
-8
lines changed

1 file changed

+48
-8
lines changed

src/krylov/arnoldi.rs

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ where
5454
pub fn complete(mut self) -> (Q<A>, H<A>) {
5555
for _ in &mut self {} // execute iteration until convergent
5656
let q = self.ortho.get_q();
57-
let n = self.dim();
57+
let n = self.h.len();
5858
let mut h = Array2::zeros((n, n).f());
5959
for (i, hc) in self.h.iter().enumerate() {
60-
let m = std::cmp::max(n, i + 1);
60+
let m = std::cmp::min(n, i + 2);
6161
for j in 0..m {
6262
h[(j, i)] = hc[j];
6363
}
@@ -79,12 +79,17 @@ where
7979
(self.a)(&mut self.v);
8080
let result = self.ortho.div_append(&mut self.v);
8181
azip!(mut v(&mut self.v) in { *v = v.div_real(result.residual_norm()) });
82-
if result.is_dependent() {
83-
None
84-
} else {
85-
let coef = result.into_coeff();
86-
self.h.push(coef.clone());
87-
Some(coef)
82+
match result {
83+
AppendResult::Added(coef) => {
84+
dbg!(&coef);
85+
self.h.push(coef.clone());
86+
Some(coef)
87+
}
88+
AppendResult::Dependent(coef) => {
89+
dbg!(&coef);
90+
self.h.push(coef);
91+
None
92+
}
8893
}
8994
}
9095
}
@@ -126,3 +131,38 @@ where
126131
let mgs = MGS::new(v.len(), tol);
127132
Arnoldi::new(mul_mat(a), v, mgs).complete()
128133
}
134+
135+
#[cfg(test)]
136+
mod tests {
137+
use super::*;
138+
use crate::generate::*;
139+
140+
#[test]
141+
fn aq_qh() {
142+
let a = array![[1.0, 2.0], [3.0, 5.0]];
143+
let mut v = Array::zeros(2);
144+
v[0] = 1.0;
145+
let (q, h) = arnoldi_mgs(a.clone(), v, 1e-9);
146+
println!("A = \n{:?}", &a);
147+
println!("Q = \n{:?}", &q);
148+
println!("H = \n{:?}", &h);
149+
println!("AQ = \n{:?}", a.dot(&q));
150+
println!("QH = \n{:?}", q.dot(&h));
151+
panic!()
152+
}
153+
154+
#[test]
155+
fn aq_qh_random() {
156+
let a: Array2<f64> = random((5, 5));
157+
let mut v = Array::zeros(5);
158+
v[0] = 1.0;
159+
let (q, h) = arnoldi_mgs(a.clone(), v, 1e-9);
160+
println!("A = \n{:?}", &a);
161+
println!("Q = \n{:?}", &q);
162+
println!("H = \n{:?}", &h);
163+
println!("AQ = \n{:?}", a.dot(&q));
164+
println!("QH = \n{:?}", q.dot(&h));
165+
panic!()
166+
}
167+
168+
}

0 commit comments

Comments
 (0)