use std::collections::BTreeMap;
use itertools::Itertools;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum Pauli {
PauliX,
PauliY,
PauliZ,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PauliTerm {
pub pauli: Pauli,
pub qubit: usize,
}
impl PauliTerm {
#[must_use]
pub fn map(&self, mapping: &BTreeMap<usize, usize>) -> Self {
Self {
pauli: self.pauli,
qubit: mapping[&self.qubit],
}
}
}
pub type PauliString = Vec<PauliTerm>;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct Hamiltonian {
pub pauli_strings: Vec<PauliString>,
pub coefficients: Vec<f64>,
}
impl Hamiltonian {
#[must_use]
pub fn new() -> Self {
Self::default()
}
pub fn add_pauli_string(&mut self, pauli_string: PauliString, coefficient: f64) {
self.pauli_strings.push(pauli_string);
self.coefficients.push(coefficient);
}
#[must_use]
pub fn map(&self, mapping: &BTreeMap<usize, usize>) -> Self {
Self {
pauli_strings: self
.pauli_strings
.iter()
.map(|pauli_string| {
pauli_string
.iter()
.map(|term| term.map(mapping))
.collect_vec()
})
.collect_vec(),
coefficients: self.coefficients.clone(),
}
}
}