use rlst::{Array, MutableRawAccessArrayImpl, RawAccessArrayImpl};
mod complex;
mod csc;
mod error;
mod real;
mod sys;
#[cfg(test)]
mod tests;
pub use complex::UmfpackComplexNumeric;
pub use error::{UmfpackError, UmfpackResult};
pub use real::UmfpackNumeric;
const UMFPACK_A: i32 = 0;
const UMFPACK_WARNING_SINGULAR_MATRIX: i32 = 1;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UmfpackFactorizationStatus {
Success,
SingularMatrix,
Warning(i32),
}
pub trait UmfpackFactorize {
type Numeric;
fn factorize(&self) -> UmfpackResult<Self::Numeric>;
}
fn factorization_status(status: i32) -> UmfpackFactorizationStatus {
match status {
0 => UmfpackFactorizationStatus::Success,
UMFPACK_WARNING_SINGULAR_MATRIX => UmfpackFactorizationStatus::SingularMatrix,
status => UmfpackFactorizationStatus::Warning(status),
}
}
fn array_data<'a, Item, ArrayImpl>(
array: &'a Array<ArrayImpl, 1>,
name: &'static str,
) -> UmfpackResult<&'a [Item]>
where
ArrayImpl: RawAccessArrayImpl<Item, 1>,
{
if !array.is_contiguous() {
return Err(UmfpackError::NonContiguousArray(name));
}
array.data().ok_or(UmfpackError::DataUnavailable(name))
}
fn array_data_mut<'a, Item, ArrayImpl>(
array: &'a mut Array<ArrayImpl, 1>,
name: &'static str,
) -> UmfpackResult<&'a mut [Item]>
where
ArrayImpl: MutableRawAccessArrayImpl<Item, 1>,
{
if !array.is_contiguous() {
return Err(UmfpackError::NonContiguousArray(name));
}
array.data_mut().ok_or(UmfpackError::DataUnavailable(name))
}