pub trait QuditSystem {
fn radices(&self) -> crate::Radices;
#[inline(always)]
fn num_qudits(&self) -> usize {
self.radices().num_qudits()
}
#[inline(always)]
fn dimension(&self) -> usize {
self.radices().dimension()
}
#[inline(always)]
fn is_qubit_only(&self) -> bool {
self.radices().is_qubit_only()
}
#[inline(always)]
fn is_qutrit_only(&self) -> bool {
self.radices().is_qutrit_only()
}
#[inline(always)]
fn is_qudit_only<T: Into<crate::Radix>>(&self, radix: T) -> bool {
self.radices().is_qudit_only(radix)
}
#[inline(always)]
fn is_homogenous(&self) -> bool {
self.radices().is_homogenous()
}
}
pub trait ClassicalSystem {
fn radices(&self) -> crate::Radices;
fn num_dits(&self) -> usize {
self.radices().len()
}
#[inline(always)]
fn dimension(&self) -> usize {
self.radices().dimension()
}
#[inline(always)]
fn is_bit_only(&self) -> bool {
self.radices().is_qubit_only() }
#[inline(always)]
fn is_trit_only(&self) -> bool {
self.radices().is_qutrit_only()
}
#[inline(always)]
fn is_dit_only<T: Into<crate::radix::Radix>>(&self, radix: T) -> bool {
self.radices().is_qudit_only(radix)
}
#[inline(always)]
fn is_homogenous(&self) -> bool {
self.radices().is_homogenous()
}
}
pub trait HybridSystem: QuditSystem + ClassicalSystem {
#[inline(always)]
fn qudit_radices(&self) -> crate::Radices {
QuditSystem::radices(self)
}
fn dit_radices(&self) -> crate::Radices {
ClassicalSystem::radices(self)
}
#[inline(always)]
fn is_pure_quantum(&self) -> bool {
self.num_dits() == 0
}
#[inline(always)]
fn is_classical_only(&self) -> bool {
self.num_qudits() == 0
}
#[inline(always)]
fn is_hybrid(&self) -> bool {
!self.is_pure_quantum() && !self.is_classical_only()
}
}