use mdarray::{Array, Dim, Layout, Slice};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum InvError {
#[error("Matrix must be square: got {rows}x{cols}")]
NotSquare { rows: i32, cols: i32 },
#[error("Backend error code: {0}")]
BackendError(i32),
#[error("Matrix is singular: zero pivot at position {pivot}")]
Singular { pivot: i32 },
#[error("The leading principal minor is not positive")]
NotPositiveDefinite { lpm: i32 },
}
pub trait LU<T, D0: Dim, D1: Dim> {
fn lu_write<L: Layout, Ll: Layout, Lu: Layout, Lp: Layout>(
&self,
a: &mut Slice<T, (D0, D1), L>,
l: &mut Slice<T, (D0, D0), Ll>,
u: &mut Slice<T, (D0, D1), Lu>,
p: &mut Slice<T, (D0, D0), Lp>,
);
fn lu<L: Layout>(
&self,
a: &mut Slice<T, (D0, D1), L>,
) -> (Array<T, (D0, D0)>, Array<T, (D0, D1)>, Array<T, (D0, D0)>);
fn inv_write<L: Layout>(&self, a: &mut Slice<T, (D0, D1), L>) -> Result<(), InvError>;
fn inv<L: Layout>(
&self,
a: &mut Slice<T, (D0, D1), L>,
) -> Result<Array<T, (D0, D1)>, InvError>;
fn det<L: Layout>(&self, a: &mut Slice<T, (D0, D1), L>) -> T;
fn cholesky<L: Layout>(
&self,
a: &mut Slice<T, (D0, D1), L>,
) -> Result<Array<T, (D0, D1)>, InvError>;
fn cholesky_write<L: Layout>(&self, a: &mut Slice<T, (D0, D1), L>) -> Result<(), InvError>;
}