opensrdk_linear_algebra/matrix/sp_hp/
trf.rs1use 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 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 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 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}