opensrdk_linear_algebra/matrix/sp_hp/
tri.rs

1use super::trf::{HPTRF, SPTRF};
2use crate::matrix::MatrixError;
3use crate::number::c64;
4use crate::SymmetricPackedMatrix;
5use lapack::{dsptri, zhptri, zsptri};
6
7impl SPTRF {
8    /// # Inverse
9    /// with matrix decomposed by sptrf
10    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    /// # Inverse
36    /// with matrix decomposed by sptrf
37    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    /// # Inverse
63    /// with matrix decomposed by hptrf
64    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}