opensrdk_linear_algebra/matrix/sp_hp/
tri.rs1use super::trf::{HPTRF, SPTRF};
2use crate::matrix::MatrixError;
3use crate::number::c64;
4use crate::SymmetricPackedMatrix;
5use lapack::{dsptri, zhptri, zsptri};
6
7impl SPTRF {
8 pub fn sptri(self) -> Result<SymmetricPackedMatrix, MatrixError> {
11 let SPTRF(mut mat, ipiv) = self;
12
13 let n = mat.dim();
14
15 let mut work = vec![f64::default(); n];
16 let mut info = 0;
17
18 let n = n as i32;
19
20 unsafe {
21 dsptri('L' as u8, n, &mut mat.elems, &ipiv, &mut work, &mut info);
22 }
23
24 match info {
25 0 => Ok(mat),
26 _ => Err(MatrixError::LapackRoutineError {
27 routine: "dsptri".to_owned(),
28 info,
29 }),
30 }
31 }
32}
33
34impl SPTRF<c64> {
35 pub fn sptri(self) -> Result<SymmetricPackedMatrix<c64>, MatrixError> {
38 let SPTRF::<c64>(mut mat, ipiv) = self;
39
40 let n = mat.dim();
41
42 let mut work = vec![c64::default(); n];
43 let mut info = 0;
44
45 let n = n as i32;
46
47 unsafe {
48 zsptri('L' as u8, n, &mut mat.elems, &ipiv, &mut work, &mut info);
49 }
50
51 match info {
52 0 => Ok(mat),
53 _ => Err(MatrixError::LapackRoutineError {
54 routine: "zsptri".to_owned(),
55 info,
56 }),
57 }
58 }
59}
60
61impl HPTRF {
62 pub fn hptri(self) -> Result<SymmetricPackedMatrix<c64>, MatrixError> {
65 let HPTRF(mut mat, ipiv) = self;
66
67 let n = mat.dim();
68
69 let mut work = vec![c64::default(); n];
70 let mut info = 0;
71
72 let n = n as i32;
73
74 unsafe {
75 zhptri('L' as u8, n, &mut mat.elems, &ipiv, &mut work, &mut info);
76 }
77
78 match info {
79 0 => Ok(mat),
80 _ => Err(MatrixError::LapackRoutineError {
81 routine: "zhptri".to_owned(),
82 info,
83 }),
84 }
85 }
86}