use crate::{error::LaError, LinearOp, Matrix};
#[cfg(feature = "nalgebra")]
pub mod nalgebra;
#[cfg(feature = "faer")]
pub mod faer;
#[cfg(feature = "suitesparse")]
pub mod suitesparse;
#[cfg(feature = "cuda")]
pub mod cuda;
pub use faer::lu::LU as FaerLU;
pub use nalgebra::lu::LU as NalgebraLU;
pub trait LinearSolver<M: Matrix>: Default {
fn set_linearisation<C: LinearOp<V = M::V, T = M::T, M = M, C = M::C>>(&mut self, op: &C);
fn set_sparsity<C: LinearOp<V = M::V, T = M::T, M = M, C = M::C>>(&mut self, op: &C);
fn solve(&self, b: &M::V) -> Result<M::V, LaError> {
let mut b = b.clone();
self.solve_in_place(&mut b)?;
Ok(b)
}
fn solve_in_place(&self, b: &mut M::V) -> Result<(), LaError>;
}
#[cfg(test)]
pub(crate) mod tests {
use crate::{IndexType, LinearOp, Matrix, Vector};
pub struct DiagonalOp<M: Matrix> {
matrix: M,
}
pub fn diagonal_op<M: Matrix>(value: f64) -> DiagonalOp<M> {
use num_traits::FromPrimitive;
let v = M::T::from_f64(value).unwrap();
let diag = M::V::from_vec(vec![v, v], Default::default());
DiagonalOp {
matrix: M::from_diagonal(&diag),
}
}
impl<M: Matrix> LinearOp for DiagonalOp<M> {
type T = M::T;
type V = M::V;
type M = M;
type C = M::C;
fn nrows(&self) -> IndexType {
self.matrix.nrows()
}
fn ncols(&self) -> IndexType {
self.matrix.ncols()
}
fn context(&self) -> &Self::C {
self.matrix.context()
}
fn matrix_inplace(&self, y: &mut Self::M) {
y.copy_from(&self.matrix);
}
fn sparsity(&self) -> Option<<Self::M as Matrix>::Sparsity> {
self.matrix.sparsity().map(|s| {
use crate::matrix::sparsity::MatrixSparsityRef;
s.to_owned()
})
}
}
}