opensrdk_linear_algebra/matrix/sp_hp/
trf.rs

1use crate::matrix::MatrixError;
2use crate::number::c64;
3use crate::Number;
4use crate::SymmetricPackedMatrix;
5use lapack::{dsptrf, zhptrf, zsptrf};
6use serde::Deserialize;
7use serde::Serialize;
8
9#[derive(Clone, Debug, Serialize, Deserialize)]
10pub struct SPTRF<T = f64>(pub SymmetricPackedMatrix<T>, pub Vec<i32>)
11where
12    T: Number;
13
14#[derive(Clone, Debug)]
15pub struct HPTRF(pub SymmetricPackedMatrix<c64>, pub Vec<i32>);
16
17impl SymmetricPackedMatrix {
18    ///
19    pub fn sptrf(self) -> Result<SPTRF, MatrixError> {
20        let n = self.dim;
21
22        let mut info = 0;
23        let mut slf = self;
24        let mut ipiv = vec![0; n];
25        let n = n as i32;
26
27        unsafe {
28            dsptrf('L' as u8, n, &mut slf.elems, &mut ipiv, &mut info);
29        }
30
31        match info {
32            0 => Ok(SPTRF(slf, ipiv)),
33            _ => Err(MatrixError::LapackRoutineError {
34                routine: "dsptrf".to_owned(),
35                info,
36            }),
37        }
38    }
39}
40
41impl SymmetricPackedMatrix<c64> {
42    ///
43    pub fn sptrf(self) -> Result<SPTRF<c64>, MatrixError> {
44        let n = self.dim;
45
46        let mut info = 0;
47        let mut slf = self;
48        let mut ipiv = vec![0; n];
49        let n = n as i32;
50
51        unsafe {
52            zsptrf('L' as u8, n, &mut slf.elems, &mut ipiv, &mut info);
53        }
54
55        match info {
56            0 => Ok(SPTRF::<c64>(slf, ipiv)),
57            _ => Err(MatrixError::LapackRoutineError {
58                routine: "zsptrf".to_owned(),
59                info,
60            }),
61        }
62    }
63
64    ///
65    pub fn hptrf(self) -> Result<HPTRF, MatrixError> {
66        let n = self.dim;
67
68        let mut info = 0;
69        let mut slf = self;
70        let mut ipiv = vec![0; n];
71        let n = n as i32;
72
73        unsafe {
74            zhptrf('L' as u8, n, &mut slf.elems, &mut ipiv, &mut info);
75        }
76
77        match info {
78            0 => Ok(HPTRF(slf, ipiv)),
79            _ => Err(MatrixError::LapackRoutineError {
80                routine: "zhptrf".to_owned(),
81                info,
82            }),
83        }
84    }
85}