Module pauli_sum

Module pauli_sum 

Source
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§

PauliSum
Weighted sum of Pauli operators, stored SoA, sorted and deduplicated.