ppvm_pauli_sum/sum/
proj.rs1use crate::sum::PauliSum;
5use ppvm_traits::char::Pauli;
6use ppvm_traits::config::Config;
7use ppvm_traits::traits::*;
8
9impl<T: Config> Projection for PauliSum<T>
10where
11 T::Coeff: std::ops::MulAssign + std::ops::Neg<Output = T::Coeff> + Clone,
12 T::Map: ACMapInsert<T::Storage, T::Coeff, T::BuildHasher, T::PauliWordType> + ACMapConsume,
13{
14 fn p0(&mut self, pos: usize) {
15 self.map_insert(|k, v| {
16 let half = v.half();
17 match k.get(pos) {
18 Pauli::I => {
19 *v *= half;
20 let nk = k.set_new(pos, Pauli::Z);
21 Some((nk, v.clone()))
22 }
23 Pauli::Z => {
24 *v *= half;
25 let nk = k.set_new(pos, Pauli::I);
26 Some((nk, v.clone()))
27 }
28 _ => None,
29 }
30 });
31 }
32
33 fn p1(&mut self, pos: usize) {
34 self.map_insert(|k, v| {
35 let half = v.half();
36 match k.get(pos) {
37 Pauli::I => {
38 *v *= half;
39 let nk = k.set_new(pos, Pauli::Z);
40 Some((nk, -v.clone()))
41 }
42 Pauli::Z => {
43 *v *= half;
44 let nk = k.set_new(pos, Pauli::I);
45 Some((nk, -v.clone()))
46 }
47 _ => None,
48 }
49 });
50 }
51}