Skip to content

Continuous-time Pauli propagation: real-space adaptive Lindbladian evolution - #181

Merged
david-pl merged 9 commits into
split/1-translation-symmetryfrom
split/2-ctpp-core
Sep 28, 2026
Merged

david-pl merged 9 commits into
split/1-translation-symmetryfrom
split/2-ctpp-core

Conversation

@AlexSchuckert

Copy link
Copy Markdown
Collaborator

PR 2 of 4 splitting #178 (stacked on #180). Full history: branch continuous-time-pauli-propagation.

The core CTPP method: direct Heisenberg-picture evolution O ← exp(dt·L*) O of Pauli observables under a Lindbladian, on an adaptively truncated Pauli-string basis. Exact in dt within the working basis — no Trotter splitting; the only approximation is truncation.

  • ppvm-lindblad crate: LindbladSpec precompiles Hermitian-Pauli jumps (fast diagonal path) and general complex Pauli-sum jumps (σ±/amplitude damping via a precomputed L†L expansion). pc_step = two-hop leakage enrichment + predictor/corrector matrix-free exponential (cached-CSC columns fed to quspin-expm, MIT-licensed pin; Al-Mohy–Higham Taylor partition selection with a truncation-matched relaxed table). Truncation policy in one PcStepConfig: max_basis rank cap (primary dial), admit_basis working-set bound (displacement truncation), drop_tol prune, tau_add admission filter.
  • Python: ppvm.Lindbladian with a numpy-array hot path plus string-keyed convenience API; mimalloc as the extension's global allocator (~50% peak-RSS reduction on the allocation-heavy adaptive paths); two jupytext demos.
  • Tests: action/generator/leakage against dense-Liouvillian and Pauli-table references; adaptive-evolution convergence to a closed bilinear solution; pc_step pinned against numpy.linalg.eig; O(dt³) per-step scaling of the predictor-corrector.

Benchmarks backing the design choices (190× vs Trotter at L=21 matched accuracy; external cross-validation vs Begušić & Chan, PRX Quantum 6, 020302 at L=41): ledgers arrive in PR 4 of the stack.

The translation-symmetric (momentum-sector) variant follows in PR 3.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Jul 16, 2026 •

Copy link
Copy Markdown
PR Preview Action v1.8.1
Preview removed because the pull request was closed.
2026-09-28 13:46 UTC

david-pl added a commit that referenced this pull request Sep 1, 2026
This implements the split suggested in
#180 (comment)
and fixes some issues that surfaced during the split or from copilot
findings.

Should be merged before #181 

cc @AlexSchuckert

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
AlexSchuckert and others added 7 commits September 1, 2026 17:12
…daptive Lindbladian evolution

Direct Heisenberg-picture evolution O ← exp(dt·L*)O on an adaptively
truncated Pauli-string basis: exact in dt within the working basis, no
Trotter splitting. LindbladSpec precompiles Hermitian-Pauli (fast
diagonal) and general complex Pauli-sum jumps (σ±, amplitude damping,
precomputed L†L); pc_step does two-hop leakage enrichment + predictor/
corrector matrix-free exponential via quspin-expm (MIT), with the
truncation policy in one PcStepConfig (max_basis rank cap, admit_basis
displacement bound, drop_tol prune, tau_add admission filter).

Python: ppvm.Lindbladian with numpy hot path + string convenience API,
mimalloc global allocator (~50% peak-RSS cut on adaptive paths), two
jupytext demos, tests against dense-Liouvillian / closed-form / eig
references.

Split 2/4 of the CTPP work; the momentum-sector (orbit-rep) evolution
follows in split 3. Full history: branch continuous-time-pauli-propagation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ord) — cargo machete

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bitvec implements BitStore for u64 only on 64-bit targets, so the
[u64; 2] word storage broke the wasm32 workspace build. The chunk type
is now target-gated: two u64 chunks on 64-bit targets (bit-identical to
before), four u32 chunks elsewhere — 128 qubits either way. The
chunk loops (anti_commutes / pauli_mul) were already width-agnostic.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
david-pl and others added 2 commits September 2, 2026 08:58
## Summary
- Same kind of cleanup as #193 did for #180: split the 1300-line
`ppvm-lindblad` `lib.rs` / `LindbladSpec` impl into `word`, `algebra`,
`spec`, `basis`, `step`, and `tests`, keeping the public
`ppvm_lindblad::*` API.
- Collapses the timed/untimed `pc_step` copy, demotes `ppvm-pauli-sum`
to a dev-dependency, drops unused `approx`, strips 182-forward
`orbit_rep` doc links, and forwards `admit_basis` / `tau_add` on the
Python string `pc_step`.
- **Base is #181 (`split/2-ctpp-core`) on purpose.** #193 replaces #180
and is not an ancestor of #181; retargeting this at #193 now would mix
the whole CTPP crate into the diff. After #193 merges and #181 is
rebased onto it, this PR rebases with #181.

## Test plan
- [x] `cargo test -p ppvm-lindblad` (6 passed)
- [x] `cargo clippy -p ppvm-lindblad --all-targets -- -D warnings`
- [x] `cargo check -p ppvm-python-native`
- [ ] Rebase onto #181 after #181 is retargeted onto #193


Made with [Cursor](https://cursor.com)

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
**PR 3 of 4** splitting #178 (stacked on #181). Full history: branch
[`continuous-time-pauli-propagation`](https://github.com/QuEraComputing/ppvm/tree/continuous-time-pauli-propagation).

The two consumers of the translation-symmetry primitive from PR 1:

- **Trotter path**: `PauliSum.symmetry_merge` (k = 0) and
`PauliSum.momentum_merge` (k ≠ 0, complex operator carried as a *real
pair*; character-weighted fold rescaled by |G| to the summing projector,
so merging after every gate layer is idempotent). `TranslationGroup`,
`canonicalize_basis_arr{,_complex}`, and `check_momentum_sector_arr`
exposed via `ppvm._core`. All inputs validated at the FFI boundary
(`ValueError`, not panics).
- **CTPP path**: `pc_step_orbit_rep` — per-step adaptive evolution
entirely in orbit-representative form (complex coefficients, phase-aware
action, same cached-CSC expm engine and `PcStepConfig` truncation policy
as the real-space step). The live basis is ~|G|× smaller than full-basis
evolution, and the reduction persists through every step; observables
come out per momentum mode.

Tests: momentum-merge correctness incl. k-resolved Trotter convergence
vs exact diagonalization; orbit-rep evolution vs full-basis-then-project
(exact match); real/complex equivalence at k = 0. Regression gates rerun
on this exact tree: L=5 momentum sanity bit-identical to the recorded
reference; the τ_add real-space cell reproduces median 5.19e-3 / peak
basis 77,820 exactly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: David Plankensteiner <dplankensteiner@quera.com>
Co-authored-by: David Plankensteiner <david-pl@users.noreply.github.com>
@david-pl
david-pl merged commit fa28430 into split/1-translation-symmetry Sep 28, 2026
4 of 5 checks passed
@david-pl
david-pl deleted the split/2-ctpp-core branch September 28, 2026 13:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants