use crate::{error::DiffsolError, DefaultDenseMatrix, Matrix, Vector};
#[cfg(feature = "cuda")]
pub mod cuda;
#[cfg(feature = "nalgebra")]
pub mod nalgebra;
#[cfg(feature = "faer")]
pub mod faer;
pub trait Context: Clone + Default {
fn nbatch(&self) -> usize {
1
}
fn clone_with_nbatch(&self, nbatch: usize) -> Result<Self, DiffsolError>;
fn assert_compatible_nbatch(&self, other_nbatch: usize, op: &str) {
let self_nbatch = self.nbatch();
if self_nbatch != other_nbatch && self_nbatch != 1 && other_nbatch != 1 {
panic!(
"incompatible nbatch in {}: lhs={}, rhs={}",
op, self_nbatch, other_nbatch
);
}
}
fn vector_from_element<V: Vector<C = Self>>(&self, len: usize, value: V::T) -> V {
V::from_element(len, value, self.clone())
}
fn vector_from_vec<V: Vector<C = Self>>(&self, vec: Vec<V::T>) -> V {
V::from_vec(vec, self.clone())
}
fn vector_zeros<V: Vector<C = Self>>(&self, len: usize) -> V {
V::zeros(len, self.clone())
}
fn dense_mat_zeros<V: Vector<C = Self> + DefaultDenseMatrix>(
&self,
rows: usize,
cols: usize,
) -> <V as DefaultDenseMatrix>::M {
<<V as DefaultDenseMatrix>::M as Matrix>::zeros(rows, cols, self.clone())
}
}