use ndarray::{Array, Dimension};
pub trait ToLapack: Sized + 'static {
type Lapack: ndarray_linalg::Lapack;
fn to_lapack(&self) -> Self::Lapack;
fn from_lapack(lapack: &Self::Lapack) -> Self;
fn array_to_lapack<D: Dimension>(array: Array<Self, D>) -> Array<Self::Lapack, D> {
array.map(|s| s.to_lapack())
}
}
pub trait IsLapack: ndarray_linalg::Lapack {}
impl IsLapack for f64 {}
impl IsLapack for f32 {}
impl<T: IsLapack> ToLapack for T {
type Lapack = Self;
fn to_lapack(&self) -> Self::Lapack {
*self
}
fn from_lapack(lapack: &Self::Lapack) -> Self {
*lapack
}
fn array_to_lapack<D: Dimension>(array: Array<Self, D>) -> Array<Self::Lapack, D> {
array
}
}
#[cfg(feature = "num-bigfloat")]
impl ToLapack for num_bigfloat::BigFloat {
type Lapack = f64;
fn to_lapack(&self) -> Self::Lapack {
self.to_f64()
}
fn from_lapack(lapack: &Self::Lapack) -> Self {
Self::from_f64(*lapack)
}
}