use diffsol::{FaerScalar, Matrix, NalgebraScalar};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum MatrixType {
NalgebraDense,
FaerDense,
FaerSparse,
}
pub(crate) trait MatrixKind {
const MATRIX_TYPE: MatrixType;
}
impl<T: NalgebraScalar> MatrixKind for diffsol::NalgebraMat<T> {
const MATRIX_TYPE: MatrixType = MatrixType::NalgebraDense;
}
impl<T: FaerScalar> MatrixKind for diffsol::FaerMat<T> {
const MATRIX_TYPE: MatrixType = MatrixType::FaerDense;
}
impl<T: FaerScalar> MatrixKind for diffsol::FaerSparseMat<T> {
const MATRIX_TYPE: MatrixType = MatrixType::FaerSparse;
}
impl MatrixType {
pub(crate) fn get_name(&self) -> &str {
match self {
MatrixType::NalgebraDense => "nalgebra_dense",
MatrixType::FaerDense => "faer_dense",
MatrixType::FaerSparse => "faer_sparse",
}
}
pub(crate) fn from_diffsol<M: Matrix + MatrixKind>() -> Self {
M::MATRIX_TYPE
}
}