@@ -6,28 +6,22 @@ use std::cmp::min;
6
6
use error:: LapackError ;
7
7
8
8
pub trait ImplSolve : Sized {
9
- fn inv ( layout : Layout , size : usize , a : Vec < Self > ) -> Result < Vec < Self > , LapackError > ;
9
+ /// execute LU decomposition
10
10
fn lu ( layout : Layout , m : usize , n : usize , a : Vec < Self > ) -> Result < ( Vec < i32 > , Vec < Self > ) , LapackError > ;
11
+ /// calc inverse matrix with LU factorized matrix
12
+ fn inv ( layout : Layout , size : usize , a : Vec < Self > , ipiv : & Vec < i32 > ) -> Result < Vec < Self > , LapackError > ;
13
+ /// solve linear problem with LU factorized matrix
14
+ fn solve ( layout : Layout ,
15
+ size : usize ,
16
+ a : & Vec < Self > ,
17
+ ipiv : & Vec < i32 > ,
18
+ b : Vec < Self > )
19
+ -> Result < Vec < Self > , LapackError > ;
11
20
}
12
21
13
22
macro_rules! impl_solve {
14
- ( $scalar: ty, $getrf: path, $getri: path, $laswp : path) => {
23
+ ( $scalar: ty, $getrf: path, $getri: path, $getrs : path) => {
15
24
impl ImplSolve for $scalar {
16
- fn inv( layout: Layout , size: usize , mut a: Vec <Self >) -> Result <Vec <Self >, LapackError > {
17
- let n = size as i32 ;
18
- let lda = n;
19
- let mut ipiv = vec![ 0 ; size] ;
20
- let info = $getrf( layout, n, n, & mut a, lda, & mut ipiv) ;
21
- if info != 0 {
22
- return Err ( From :: from( info) ) ;
23
- }
24
- let info = $getri( layout, n, & mut a, lda, & mut ipiv) ;
25
- if info == 0 {
26
- Ok ( a)
27
- } else {
28
- Err ( From :: from( info) )
29
- }
30
- }
31
25
fn lu( layout: Layout , m: usize , n: usize , mut a: Vec <Self >) -> Result <( Vec <i32 >, Vec <Self >) , LapackError > {
32
26
let m = m as i32 ;
33
27
let n = n as i32 ;
@@ -44,8 +38,28 @@ impl ImplSolve for $scalar {
44
38
Err ( From :: from( info) )
45
39
}
46
40
}
41
+ fn inv( layout: Layout , size: usize , mut a: Vec <Self >, ipiv: & Vec <i32 >) -> Result <Vec <Self >, LapackError > {
42
+ let n = size as i32 ;
43
+ let lda = n;
44
+ let info = $getri( layout, n, & mut a, lda, & ipiv) ;
45
+ if info == 0 {
46
+ Ok ( a)
47
+ } else {
48
+ Err ( From :: from( info) )
49
+ }
50
+ }
51
+ fn solve( layout: Layout , size: usize , a: & Vec <Self >, ipiv: & Vec <i32 >, mut b: Vec <Self >) -> Result <Vec <Self >, LapackError > {
52
+ let n = size as i32 ;
53
+ let lda = n;
54
+ let info = $getrs( layout, 'N' as u8 , n, 1 , a, lda, & ipiv, & mut b, n) ;
55
+ if info == 0 {
56
+ Ok ( b)
57
+ } else {
58
+ Err ( From :: from( info) )
59
+ }
60
+ }
47
61
}
48
62
} } // end macro_rules
49
63
50
- impl_solve ! ( f64 , dgetrf, dgetri, dlaswp ) ;
51
- impl_solve ! ( f32 , sgetrf, sgetri, slaswp ) ;
64
+ impl_solve ! ( f64 , dgetrf, dgetri, dgetrs ) ;
65
+ impl_solve ! ( f32 , sgetrf, sgetri, sgetrs ) ;
0 commit comments