use crate::SpinDirection;
use crate::TbError;
use crate::model::Dimension;
use num_complex::Complex64;
use num_traits::identities::Zero;
pub trait ToFloat {
fn to_float(self) -> f64;
}
impl ToFloat for usize {
fn to_float(self) -> f64 {
self as f64
}
}
impl ToFloat for isize {
fn to_float(self) -> f64 {
self as f64
}
}
impl ToFloat for f32 {
fn to_float(self) -> f64 {
self as f64
}
}
impl ToFloat for f64 {
fn to_float(self) -> f64 {
self
}
}
pub trait usefloat: Copy + Clone + Zero + std::fmt::Display + PartialOrd {
fn from<T: ToFloat>(n: T) -> Self;
}
impl usefloat for f32 {
fn from<T: ToFloat>(n: T) -> Self {
n.to_float() as f32
}
}
impl usefloat for f64 {
fn from<T: ToFloat>(n: T) -> Self {
n.to_float()
}
}
pub trait hop_use: Copy + Clone + Zero {
fn to_complex(&self) -> Complex64;
}
impl hop_use for f64 {
fn to_complex(&self) -> Complex64 {
Complex64::new(*self, 0.0)
}
}
impl hop_use for Complex64 {
fn to_complex(&self) -> Complex64 {
*self
}
}
impl From<u8> for SpinDirection {
fn from(value: u8) -> Self {
match value {
0 => SpinDirection::None,
1 => SpinDirection::x,
2 => SpinDirection::y,
3 => SpinDirection::z,
_ => panic!("Invalid value for SpinDirection"),
}
}
}
impl From<usize> for SpinDirection {
fn from(value: usize) -> Self {
match value {
0 => SpinDirection::None,
1 => SpinDirection::x,
2 => SpinDirection::y,
3 => SpinDirection::z,
_ => panic!("Invalid value for SpinDirection"),
}
}
}
impl From<i32> for SpinDirection {
fn from(value: i32) -> Self {
match value {
0 => SpinDirection::None,
1 => SpinDirection::x,
2 => SpinDirection::y,
3 => SpinDirection::z,
_ => panic!("Invalid value for SpinDirection"),
}
}
}
impl From<Dimension> for usize {
fn from(d: Dimension) -> Self {
d as usize
}
}
impl TryFrom<usize> for Dimension {
type Error = TbError;
fn try_from(value: usize) -> Result<Self, Self::Error> {
match value {
0 => Ok(Dimension::zero),
1 => Ok(Dimension::one),
2 => Ok(Dimension::two),
3 => Ok(Dimension::three),
_ => Err(TbError::InvalidDimension {
dim: value,
supported: vec![0, 1, 2, 3],
}),
}
}
}