Skip to main content

ppvm_pauli_sum/sum/
proj.rs

1// SPDX-FileCopyrightText: 2026 The PPVM Authors
2// SPDX-License-Identifier: Apache-2.0
3
4use 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}