@@ -17,10 +17,17 @@ pub trait ImplSolve: Sized {
17
17
ipiv : & Vec < i32 > ,
18
18
b : Vec < Self > )
19
19
-> Result < Vec < Self > , LapackError > ;
20
+ /// solve triangular linear problem
21
+ fn solve_triangle ( layout : Layout ,
22
+ uplo : u8 ,
23
+ size : usize ,
24
+ a : & Vec < Self > ,
25
+ b : Vec < Self > )
26
+ -> Result < Vec < Self > , LapackError > ;
20
27
}
21
28
22
29
macro_rules! impl_solve {
23
- ( $scalar: ty, $getrf: path, $getri: path, $getrs: path) => {
30
+ ( $scalar: ty, $getrf: path, $getri: path, $getrs: path, $trtrs : path ) => {
24
31
impl ImplSolve for $scalar {
25
32
fn lu( layout: Layout , m: usize , n: usize , mut a: Vec <Self >) -> Result <( Vec <i32 >, Vec <Self >) , LapackError > {
26
33
let m = m as i32 ;
@@ -51,7 +58,17 @@ impl ImplSolve for $scalar {
51
58
fn solve( layout: Layout , size: usize , a: & Vec <Self >, ipiv: & Vec <i32 >, mut b: Vec <Self >) -> Result <Vec <Self >, LapackError > {
52
59
let n = size as i32 ;
53
60
let lda = n;
54
- let info = $getrs( layout, 'N' as u8 , n, 1 , a, lda, & ipiv, & mut b, n) ;
61
+ let info = $getrs( layout, 'N' as u8 , n, 1 , a, lda, ipiv, & mut b, n) ;
62
+ if info == 0 {
63
+ Ok ( b)
64
+ } else {
65
+ Err ( From :: from( info) )
66
+ }
67
+ }
68
+ fn solve_triangle( layout: Layout , uplo: u8 , size: usize , a: & Vec <Self >, mut b: Vec <Self >) -> Result <Vec <Self >, LapackError > {
69
+ let n = size as i32 ;
70
+ let lda = n;
71
+ let info = $trtrs( layout, uplo, 'N' as u8 , 'N' as u8 , n, 1 , a, lda, & mut b, n) ;
55
72
if info == 0 {
56
73
Ok ( b)
57
74
} else {
@@ -61,5 +78,5 @@ impl ImplSolve for $scalar {
61
78
}
62
79
} } // end macro_rules
63
80
64
- impl_solve ! ( f64 , dgetrf, dgetri, dgetrs) ;
65
- impl_solve ! ( f32 , sgetrf, sgetri, sgetrs) ;
81
+ impl_solve ! ( f64 , dgetrf, dgetri, dgetrs, dtrtrs ) ;
82
+ impl_solve ! ( f32 , sgetrf, sgetri, sgetrs, strtrs ) ;
0 commit comments