@@ -54,10 +54,10 @@ where
54
54
pub fn complete ( mut self ) -> ( Q < A > , H < A > ) {
55
55
for _ in & mut self { } // execute iteration until convergent
56
56
let q = self . ortho . get_q ( ) ;
57
- let n = self . dim ( ) ;
57
+ let n = self . h . len ( ) ;
58
58
let mut h = Array2 :: zeros ( ( n, n) . f ( ) ) ;
59
59
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 ) ;
61
61
for j in 0 ..m {
62
62
h[ ( j, i) ] = hc[ j] ;
63
63
}
@@ -79,12 +79,17 @@ where
79
79
( self . a ) ( & mut self . v ) ;
80
80
let result = self . ortho . div_append ( & mut self . v ) ;
81
81
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
+ }
88
93
}
89
94
}
90
95
}
@@ -126,3 +131,38 @@ where
126
131
let mgs = MGS :: new ( v. len ( ) , tol) ;
127
132
Arnoldi :: new ( mul_mat ( a) , v, mgs) . complete ( )
128
133
}
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