@@ -57,26 +57,28 @@ pub struct EigWork<T: Scalar> {
57
57
pub rwork : Option < Vec < MaybeUninit < T :: Real > > > ,
58
58
}
59
59
60
+ #[ derive( Debug , Clone , PartialEq ) ]
61
+ pub struct Eig < T : Scalar > {
62
+ pub eigs : Vec < T :: Complex > ,
63
+ pub vr : Option < Vec < T :: Complex > > ,
64
+ pub vl : Option < Vec < T :: Complex > > ,
65
+ }
66
+
67
+ #[ derive( Debug , Clone , PartialEq ) ]
68
+ pub struct EigRef < ' work , T : Scalar > {
69
+ pub eigs : & ' work [ T :: Complex ] ,
70
+ pub vr : Option < & ' work [ T :: Complex ] > ,
71
+ pub vl : Option < & ' work [ T :: Complex ] > ,
72
+ }
73
+
60
74
pub trait EigWorkImpl : Sized {
61
75
type Elem : Scalar ;
62
76
/// Create new working memory for eigenvalues compution.
63
77
fn new ( calc_v : bool , l : MatrixLayout ) -> Result < Self > ;
64
78
/// Compute eigenvalues and vectors on this working memory.
65
- fn calc < ' work > (
66
- & ' work mut self ,
67
- a : & mut [ Self :: Elem ] ,
68
- ) -> Result < (
69
- & ' work [ <Self :: Elem as Scalar >:: Complex ] ,
70
- Option < & ' work [ <Self :: Elem as Scalar >:: Complex ] > ,
71
- ) > ;
79
+ fn calc < ' work > ( & ' work mut self , a : & mut [ Self :: Elem ] ) -> Result < EigRef < ' work , Self :: Elem > > ;
72
80
/// Compute eigenvalues and vectors by consuming this working memory.
73
- fn eval (
74
- self ,
75
- a : & mut [ Self :: Elem ] ,
76
- ) -> Result < (
77
- Vec < <Self :: Elem as Scalar >:: Complex > ,
78
- Option < Vec < <Self :: Elem as Scalar >:: Complex > > ,
79
- ) > ;
81
+ fn eval ( self , a : & mut [ Self :: Elem ] ) -> Result < Eig < Self :: Elem > > ;
80
82
}
81
83
82
84
impl EigWorkImpl for EigWork < c64 > {
@@ -137,7 +139,7 @@ impl EigWorkImpl for EigWork<c64> {
137
139
} )
138
140
}
139
141
140
- fn calc < ' work > ( & ' work mut self , a : & mut [ c64 ] ) -> Result < ( & ' work [ c64 ] , Option < & ' work [ c64 ] > ) > {
142
+ fn calc < ' work > ( & ' work mut self , a : & mut [ c64 ] ) -> Result < EigRef < ' work , c64 > > {
141
143
let lwork = self . work . len ( ) . to_i32 ( ) . unwrap ( ) ;
142
144
let mut info = 0 ;
143
145
unsafe {
@@ -173,15 +175,20 @@ impl EigWorkImpl for EigWork<c64> {
173
175
value. im = -value. im ;
174
176
}
175
177
}
176
- let v = match ( self . vl . as_ref ( ) , self . vr . as_ref ( ) ) {
177
- ( Some ( v) , None ) | ( None , Some ( v) ) => Some ( unsafe { v. slice_assume_init_ref ( ) } ) ,
178
- ( None , None ) => None ,
179
- _ => unreachable ! ( ) ,
180
- } ;
181
- Ok ( ( eigs, v) )
178
+ Ok ( EigRef {
179
+ eigs,
180
+ vl : self
181
+ . vl
182
+ . as_ref ( )
183
+ . map ( |v| unsafe { v. slice_assume_init_ref ( ) } ) ,
184
+ vr : self
185
+ . vr
186
+ . as_ref ( )
187
+ . map ( |v| unsafe { v. slice_assume_init_ref ( ) } ) ,
188
+ } )
182
189
}
183
190
184
- fn eval ( mut self , a : & mut [ c64 ] ) -> Result < ( Vec < c64 > , Option < Vec < c64 > > ) > {
191
+ fn eval ( mut self , a : & mut [ c64 ] ) -> Result < Eig < c64 > > {
185
192
let lwork = self . work . len ( ) . to_i32 ( ) . unwrap ( ) ;
186
193
let mut info = 0 ;
187
194
unsafe {
@@ -212,12 +219,11 @@ impl EigWorkImpl for EigWork<c64> {
212
219
value. im = -value. im ;
213
220
}
214
221
}
215
- let v = match ( self . vl , self . vr ) {
216
- ( Some ( v) , None ) | ( None , Some ( v) ) => Some ( unsafe { v. assume_init ( ) } ) ,
217
- ( None , None ) => None ,
218
- _ => unreachable ! ( ) ,
219
- } ;
220
- Ok ( ( eigs, v) )
222
+ Ok ( Eig {
223
+ eigs,
224
+ vl : self . vl . map ( |v| unsafe { v. assume_init ( ) } ) ,
225
+ vr : self . vr . map ( |v| unsafe { v. assume_init ( ) } ) ,
226
+ } )
221
227
}
222
228
}
223
229
0 commit comments