rlst_suitesparse/umfpack/
mod.rs1use rlst::{Array, MutableRawAccessArrayImpl, RawAccessArrayImpl};
4
5mod complex;
6mod csc;
7mod error;
8mod real;
9mod sys;
10
11#[cfg(test)]
12mod tests;
13
14pub use complex::UmfpackComplexNumeric;
15pub use error::{UmfpackError, UmfpackResult};
16pub use real::UmfpackNumeric;
17
18const UMFPACK_A: i32 = 0;
19const UMFPACK_WARNING_SINGULAR_MATRIX: i32 = 1;
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
23pub enum UmfpackFactorizationStatus {
24 Success,
26 SingularMatrix,
31 Warning(i32),
33}
34
35pub trait UmfpackFactorize {
41 type Numeric;
43
44 fn factorize(&self) -> UmfpackResult<Self::Numeric>;
51}
52
53fn factorization_status(status: i32) -> UmfpackFactorizationStatus {
54 match status {
55 0 => UmfpackFactorizationStatus::Success,
56 UMFPACK_WARNING_SINGULAR_MATRIX => UmfpackFactorizationStatus::SingularMatrix,
57 status => UmfpackFactorizationStatus::Warning(status),
58 }
59}
60
61fn array_data<'a, Item, ArrayImpl>(
62 array: &'a Array<ArrayImpl, 1>,
63 name: &'static str,
64) -> UmfpackResult<&'a [Item]>
65where
66 ArrayImpl: RawAccessArrayImpl<Item, 1>,
67{
68 if !array.is_contiguous() {
69 return Err(UmfpackError::NonContiguousArray(name));
70 }
71 array.data().ok_or(UmfpackError::DataUnavailable(name))
72}
73
74fn array_data_mut<'a, Item, ArrayImpl>(
75 array: &'a mut Array<ArrayImpl, 1>,
76 name: &'static str,
77) -> UmfpackResult<&'a mut [Item]>
78where
79 ArrayImpl: MutableRawAccessArrayImpl<Item, 1>,
80{
81 if !array.is_contiguous() {
82 return Err(UmfpackError::NonContiguousArray(name));
83 }
84 array.data_mut().ok_or(UmfpackError::DataUnavailable(name))
85}