forked from M-Labs/nalgebra
Merge SolveError into OperationError
This commit is contained in:
parent
7b6333e9d1
commit
ccf1f18991
@ -1,7 +1,7 @@
|
|||||||
use crate::csc::CscMatrix;
|
use crate::csc::CscMatrix;
|
||||||
use crate::ops::Op;
|
use crate::ops::Op;
|
||||||
use crate::ops::serial::cs::{spmm_cs_prealloc, spmm_cs_dense, spadd_cs_prealloc};
|
use crate::ops::serial::cs::{spmm_cs_prealloc, spmm_cs_dense, spadd_cs_prealloc};
|
||||||
use crate::ops::serial::OperationError;
|
use crate::ops::serial::{OperationError, OperationErrorKind};
|
||||||
use nalgebra::{Scalar, ClosedAdd, ClosedMul, DMatrixSliceMut, DMatrixSlice, RealField};
|
use nalgebra::{Scalar, ClosedAdd, ClosedMul, DMatrixSliceMut, DMatrixSlice, RealField};
|
||||||
use num_traits::{Zero, One};
|
use num_traits::{Zero, One};
|
||||||
|
|
||||||
@ -91,30 +91,6 @@ pub fn spmm_csc_prealloc<T>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO
|
|
||||||
#[non_exhaustive]
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
|
||||||
pub enum SolveErrorKind {
|
|
||||||
/// TODO
|
|
||||||
Singular,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// TODO
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
|
||||||
pub struct SolveError {
|
|
||||||
kind: SolveErrorKind,
|
|
||||||
message: String
|
|
||||||
}
|
|
||||||
|
|
||||||
impl SolveError {
|
|
||||||
fn from_type_and_message(kind: SolveErrorKind, message: String) -> Self {
|
|
||||||
Self {
|
|
||||||
kind,
|
|
||||||
message
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Solve the lower triangular system `op(L) X = B`.
|
/// Solve the lower triangular system `op(L) X = B`.
|
||||||
///
|
///
|
||||||
/// Only the lower triangular part of L is read, and the result is stored in B.
|
/// Only the lower triangular part of L is read, and the result is stored in B.
|
||||||
@ -125,7 +101,7 @@ impl SolveError {
|
|||||||
pub fn spsolve_csc_lower_triangular<'a, T: RealField>(
|
pub fn spsolve_csc_lower_triangular<'a, T: RealField>(
|
||||||
l: Op<&CscMatrix<T>>,
|
l: Op<&CscMatrix<T>>,
|
||||||
b: impl Into<DMatrixSliceMut<'a, T>>)
|
b: impl Into<DMatrixSliceMut<'a, T>>)
|
||||||
-> Result<(), SolveError>
|
-> Result<(), OperationError>
|
||||||
{
|
{
|
||||||
let b = b.into();
|
let b = b.into();
|
||||||
let l_matrix = l.into_inner();
|
let l_matrix = l.into_inner();
|
||||||
@ -137,10 +113,10 @@ pub fn spsolve_csc_lower_triangular<'a, T: RealField>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn spsolve_csc_lower_triangular_no_transpose<'a, T: RealField>(
|
fn spsolve_csc_lower_triangular_no_transpose<T: RealField>(
|
||||||
l: &CscMatrix<T>,
|
l: &CscMatrix<T>,
|
||||||
b: DMatrixSliceMut<'a, T>)
|
b: DMatrixSliceMut<T>)
|
||||||
-> Result<(), SolveError>
|
-> Result<(), OperationError>
|
||||||
{
|
{
|
||||||
let mut x = b;
|
let mut x = b;
|
||||||
|
|
||||||
@ -188,15 +164,15 @@ fn spsolve_csc_lower_triangular_no_transpose<'a, T: RealField>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn spsolve_encountered_zero_diagonal() -> Result<(), SolveError> {
|
fn spsolve_encountered_zero_diagonal() -> Result<(), OperationError> {
|
||||||
let message = "Matrix contains at least one diagonal entry that is zero.";
|
let message = "Matrix contains at least one diagonal entry that is zero.";
|
||||||
Err(SolveError::from_type_and_message(SolveErrorKind::Singular, String::from(message)))
|
Err(OperationError::from_kind_and_message(OperationErrorKind::Singular, String::from(message)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn spsolve_csc_lower_triangular_transpose<'a, T: RealField>(
|
fn spsolve_csc_lower_triangular_transpose<T: RealField>(
|
||||||
l: &CscMatrix<T>,
|
l: &CscMatrix<T>,
|
||||||
b: DMatrixSliceMut<'a, T>)
|
b: DMatrixSliceMut<T>)
|
||||||
-> Result<(), SolveError>
|
-> Result<(), OperationError>
|
||||||
{
|
{
|
||||||
let mut x = b;
|
let mut x = b;
|
||||||
|
|
||||||
|
@ -65,6 +65,8 @@ mod cs;
|
|||||||
pub use csc::*;
|
pub use csc::*;
|
||||||
pub use csr::*;
|
pub use csr::*;
|
||||||
pub use pattern::*;
|
pub use pattern::*;
|
||||||
|
use std::fmt::Formatter;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
/// A description of the error that occurred during an arithmetic operation.
|
/// A description of the error that occurred during an arithmetic operation.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
@ -83,6 +85,9 @@ pub enum OperationErrorKind {
|
|||||||
/// For example, this could indicate that the sparsity pattern of the output is not able to
|
/// For example, this could indicate that the sparsity pattern of the output is not able to
|
||||||
/// contain the result of the operation.
|
/// contain the result of the operation.
|
||||||
InvalidPattern,
|
InvalidPattern,
|
||||||
|
|
||||||
|
/// Indicates that a matrix is singular when it is expected to be invertible.
|
||||||
|
Singular,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OperationError {
|
impl OperationError {
|
||||||
@ -94,4 +99,22 @@ impl OperationError {
|
|||||||
pub fn kind(&self) -> &OperationErrorKind {
|
pub fn kind(&self) -> &OperationErrorKind {
|
||||||
&self.error_kind
|
&self.error_kind
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The underlying error message.
|
||||||
|
pub fn message(&self) -> &str {
|
||||||
|
self.message.as_str()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for OperationError {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(f, "Sparse matrix operation error: ")?;
|
||||||
|
match self.kind() {
|
||||||
|
OperationErrorKind::InvalidPattern => { write!(f, "InvalidPattern")?; }
|
||||||
|
OperationErrorKind::Singular => { write!(f, "Singular")?; }
|
||||||
|
}
|
||||||
|
write!(f, " Message: {}", self.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::error::Error for OperationError {}
|
Loading…
Reference in New Issue
Block a user