use crate::config::Config;
use num::Zero;
pub trait PauliError<T: Config> {
fn pauli_error(&mut self, addr0: usize, p: [T::Coeff; 3]);
fn x_error(&mut self, addr0: usize, p: T::Coeff) {
let zero = T::Coeff::zero();
self.pauli_error(addr0, [p, zero.clone(), zero])
}
fn y_error(&mut self, addr0: usize, p: T::Coeff) {
let zero = T::Coeff::zero();
self.pauli_error(addr0, [zero.clone(), p, zero])
}
fn z_error(&mut self, addr0: usize, p: T::Coeff) {
let zero = T::Coeff::zero();
self.pauli_error(addr0, [zero.clone(), zero, p])
}
fn pauli_error_many(&mut self, targets: &[usize], p: [T::Coeff; 3]) {
for &q in targets {
self.pauli_error(q, p.clone());
}
}
fn x_error_many(&mut self, targets: &[usize], p: T::Coeff) {
for &q in targets {
self.x_error(q, p.clone());
}
}
fn y_error_many(&mut self, targets: &[usize], p: T::Coeff) {
for &q in targets {
self.y_error(q, p.clone());
}
}
fn z_error_many(&mut self, targets: &[usize], p: T::Coeff) {
for &q in targets {
self.z_error(q, p.clone());
}
}
}
pub trait TwoQubitPauliError<T: Config> {
fn two_qubit_pauli_error(&mut self, addr0: usize, addr1: usize, p: [T::Coeff; 15]);
fn two_qubit_pauli_error_many(&mut self, pairs: &[(usize, usize)], p: [T::Coeff; 15]) {
for &(a, b) in pairs {
self.two_qubit_pauli_error(a, b, p.clone());
}
}
}
pub trait Depolarizing<T: Config> {
fn depolarize1(&mut self, addr0: usize, p: T::Coeff);
fn depolarize1_many(&mut self, targets: &[usize], p: T::Coeff) {
for &q in targets {
self.depolarize1(q, p.clone());
}
}
}
pub trait Depolarizing2<T: Config> {
fn depolarize2(&mut self, addr0: usize, addr1: usize, p: T::Coeff);
fn depolarize2_many(&mut self, pairs: &[(usize, usize)], p: T::Coeff) {
for &(a, b) in pairs {
self.depolarize2(a, b, p.clone());
}
}
}
pub trait AmplitudeDamping<T: Config> {
fn amplitude_damping(&mut self, addr0: usize, gamma: T::Coeff);
}
pub trait LossChannel<T: Config> {
fn loss_channel(&mut self, addr0: usize, p: T::Coeff);
}
pub trait CorrelatedLossChannel<T: Config> {
fn correlated_loss_channel(&mut self, addr0: usize, addr1: usize, p: [T::Coeff; 3]);
}
pub trait ResetLossChannel<T: Config> {
fn reset_loss_channel(&mut self, addr0: usize);
}
pub trait AsymmetricLossChannel<T: Config> {
fn asymmetric_loss_channel(&mut self, addr0: usize, p0: T::Coeff, p1: T::Coeff);
}
pub trait LeakageChannel<T: Config> {
fn leakage_channel(&mut self, addr0: usize, p0: T::Coeff, p1: T::Coeff);
}
pub trait ResetLeakageChannel<T: Config> {
fn reset_leakage_channel(&mut self, addr0: usize);
}