Expand description
PauliSum<W> — weighted sum of Pauli strings in structure-of-arrays form.
Storage is parallel Vec<[u64; W]> columns for the x and z parts plus
a Vec<Complex64> for coefficients. SoA is chosen so coefficient-only and
key-only scans get full cache utilization, and so each Vec maps directly
to a GPU device buffer.
Invariant: the x and z columns are sorted in lexicographic order as
a single key, and no two entries share a key. Every public operation
either preserves this invariant or returns a fresh PauliSum that does.
Build a PauliSum from unsorted inputs via BuildAccumulator; once
built, combine sums with PauliSum::add or scale coefficients with
PauliSum::scale.
See design doc §3.2.
§Examples
Construct the observable Z₀ + 0.5·X₁ on two qubits via
BuildAccumulator, then merge in a second sum.
use paulistrings::{BuildAccumulator, PauliString, PauliSum, Phase};
use num_complex::Complex64;
let mut acc = BuildAccumulator::<1>::new(2);
acc.add_term(PauliString::<1>::z(0), Phase::ONE, Complex64::new(1.0, 0.0));
acc.add_term(PauliString::<1>::x(1), Phase::ONE, Complex64::new(0.5, 0.0));
let a = acc.finalize();
assert_eq!(a.len(), 2);
let mut acc2 = BuildAccumulator::<1>::new(2);
acc2.add_term(PauliString::<1>::x(1), Phase::ONE, Complex64::new(-0.25, 0.0));
let b = acc2.finalize();
let merged = a.add(&b);
assert_eq!(merged.len(), 2); // Z₀ + 0.25·X₁Structs§
- Pauli
Sum - Weighted sum of Pauli operators, stored SoA, sorted and deduplicated.