use std::collections::{HashMap, HashSet};
#[derive(Debug, Clone)]
pub struct EntanglementTracker {
groups: HashMap<usize, usize>,
next_group_id: usize,
}
impl EntanglementTracker {
pub fn new(n_qubits: usize) -> Self {
let mut groups = HashMap::new();
for i in 0..n_qubits {
groups.insert(i, i);
}
EntanglementTracker {
groups,
next_group_id: n_qubits,
}
}
pub fn entangle(&mut self, qubit1: usize, qubit2: usize) {
let group1 = self.groups[&qubit1];
let group2 = self.groups[&qubit2];
if group1 != group2 {
for (_q, g) in self.groups.iter_mut() {
if *g == group2 {
*g = group1;
}
}
}
}
pub fn are_entangled(&self, qubit1: usize, qubit2: usize) -> bool {
self.groups.get(&qubit1) == self.groups.get(&qubit2)
}
pub fn get_entangled_qubits(&self, qubit: usize) -> HashSet<usize> {
let group = match self.groups.get(&qubit) {
Some(g) => *g,
None => return HashSet::new(),
};
self.groups
.iter()
.filter(|(_, g)| **g == group)
.map(|(q, _)| *q)
.collect()
}
pub fn measure(&mut self, qubit: usize) {
self.groups.insert(qubit, self.next_group_id);
self.next_group_id += 1;
}
}