@@ -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