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 HopUse: Copy + Clone + Zero {
fn to_complex(&self) -> Complex64;
}
impl HopUse for f64 {
fn to_complex(&self) -> Complex64 {
Complex64::new(*self, 0.0)
}
}
impl HopUse for Complex64 {
fn to_complex(&self) -> Complex64 {
*self
}
}
impl SpinDirection {
pub fn from_index(index: usize) -> Option<SpinDirection> {
match Self::try_from_index(index) {
Ok(value) => value,
Err(error) => panic!("{error}"),
}
}
pub fn try_from_index(index: usize) -> crate::error::Result<Option<SpinDirection>> {
match index {
0 => Ok(None),
1 => Ok(Some(SpinDirection::X)),
2 => Ok(Some(SpinDirection::Y)),
3 => Ok(Some(SpinDirection::Z)),
_ => Err(TbError::InvalidSpinValue {
spin: index,
supported: vec![0, 1, 2, 3],
}),
}
}
}
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 {
1 => Ok(Dimension::one),
2 => Ok(Dimension::two),
3 => Ok(Dimension::three),
_ => Err(TbError::InvalidDimension {
dim: value,
supported: vec![1, 2, 3],
}),
}
}
}