fpm-qsim 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fpm_qsim-0.1.1/CHANGES.md +41 -0
- fpm_qsim-0.1.1/LICENSE +21 -0
- fpm_qsim-0.1.1/MANIFEST.in +7 -0
- fpm_qsim-0.1.1/PKG-INFO +353 -0
- fpm_qsim-0.1.1/README.md +311 -0
- fpm_qsim-0.1.1/examples/01_basic_dephasing.py +40 -0
- fpm_qsim-0.1.1/examples/02_lindblad_comparison.py +110 -0
- fpm_qsim-0.1.1/examples/03_bounded_gamma.py +52 -0
- fpm_qsim-0.1.1/examples/04_multi_qubit.py +37 -0
- fpm_qsim-0.1.1/pyproject.toml +79 -0
- fpm_qsim-0.1.1/setup.cfg +4 -0
- fpm_qsim-0.1.1/src/fpm_qsim/__init__.py +115 -0
- fpm_qsim-0.1.1/src/fpm_qsim/_reference.py +76 -0
- fpm_qsim-0.1.1/src/fpm_qsim/_version.py +3 -0
- fpm_qsim-0.1.1/src/fpm_qsim/conservation.py +149 -0
- fpm_qsim-0.1.1/src/fpm_qsim/core.py +292 -0
- fpm_qsim-0.1.1/src/fpm_qsim/lindblad.py +245 -0
- fpm_qsim-0.1.1/src/fpm_qsim/py.typed +1 -0
- fpm_qsim-0.1.1/src/fpm_qsim/states.py +182 -0
- fpm_qsim-0.1.1/src/fpm_qsim.egg-info/PKG-INFO +353 -0
- fpm_qsim-0.1.1/src/fpm_qsim.egg-info/SOURCES.txt +28 -0
- fpm_qsim-0.1.1/src/fpm_qsim.egg-info/dependency_links.txt +1 -0
- fpm_qsim-0.1.1/src/fpm_qsim.egg-info/requires.txt +15 -0
- fpm_qsim-0.1.1/src/fpm_qsim.egg-info/top_level.txt +1 -0
- fpm_qsim-0.1.1/tests/__init__.py +1 -0
- fpm_qsim-0.1.1/tests/test_api.py +135 -0
- fpm_qsim-0.1.1/tests/test_bounded_gamma.py +93 -0
- fpm_qsim-0.1.1/tests/test_conservation.py +102 -0
- fpm_qsim-0.1.1/tests/test_dispersion_contraction.py +98 -0
- fpm_qsim-0.1.1/tests/test_lindblad_correspondence.py +271 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# CHANGES
|
|
2
|
+
|
|
3
|
+
## 0.1.1 (2026-06-17)
|
|
4
|
+
|
|
5
|
+
**Breaking change:** `lindblad_step` now uses the exact continuous
|
|
6
|
+
form `kappa = exp(-gamma*dt)` instead of the Euler form
|
|
7
|
+
`1 - gamma*dt`. The public API now matches Kraus / matrix-exp /
|
|
8
|
+
QuTiP to machine precision (max abs error 1.1e-16 vs the analytic
|
|
9
|
+
continuous-dephasing solution).
|
|
10
|
+
|
|
11
|
+
- The Euler form (the literal Theorem 3 identification) is preserved
|
|
12
|
+
in the private `fpm_qsim._reference.euler_lindblad_step` for
|
|
13
|
+
Theorem 3 verification in the test suite.
|
|
14
|
+
- Added `kappa_exact(gamma, dt)` to the public API.
|
|
15
|
+
- Removed `reference_lindblad_step` from the public API.
|
|
16
|
+
- Added machine-precision regression test
|
|
17
|
+
(`test_public_lindblad_step_machine_precision`).
|
|
18
|
+
- Added test confirming the exact form handles `gamma*dt > 1`
|
|
19
|
+
without positivity violation (a regime the Euler form cannot
|
|
20
|
+
reach).
|
|
21
|
+
- Updated README with honest speed and accuracy claims.
|
|
22
|
+
- 42 tests, all passing.
|
|
23
|
+
|
|
24
|
+
## 0.1.0 (2026-06-17)
|
|
25
|
+
|
|
26
|
+
Initial release.
|
|
27
|
+
|
|
28
|
+
- Core FPM affine map primitives (`fpm_affine_step`,
|
|
29
|
+
`fpm_affine_trajectory`, `kappa_from_gamma`, `gamma_from_kappa`).
|
|
30
|
+
- Drop-in Lindblad dephasing API (`lindblad_step`, `simulate`).
|
|
31
|
+
- Bounded gamma form with falsifiable ceiling (`bounded_gamma`,
|
|
32
|
+
`FalsificationError`).
|
|
33
|
+
- Density matrix utilities (`pure_state`, `maximally_mixed`,
|
|
34
|
+
`partial_trace`, `is_density_matrix`, `trace_distance`,
|
|
35
|
+
`fidelity`).
|
|
36
|
+
- Closed-universe conservation ledger (`ConservationLedger`,
|
|
37
|
+
`DaemonState`).
|
|
38
|
+
- Tests reproducing paper Test 01, Test 02, Test 03, Test 07, and
|
|
39
|
+
Test 09.
|
|
40
|
+
- Usage examples (basic dephasing, Lindblad correspondence,
|
|
41
|
+
bounded gamma, multi-qubit partial trace).
|
fpm_qsim-0.1.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Alx Spiker
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
fpm_qsim-0.1.1/PKG-INFO
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fpm-qsim
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Drop-in Lindblad dephasing simulator backed by the Finite Possibility Mechanics affine map
|
|
5
|
+
Author-email: Alx Spiker <alx@fpm.framework>
|
|
6
|
+
Maintainer-email: Alx Spiker <alx@fpm.framework>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/alxspiker/fpm-qsim
|
|
9
|
+
Project-URL: Documentation, https://github.com/alxspiker/fpm-qsim#readme
|
|
10
|
+
Project-URL: Repository, https://github.com/alxspiker/fpm-qsim
|
|
11
|
+
Project-URL: Issues, https://github.com/alxspiker/fpm-qsim/issues
|
|
12
|
+
Keywords: quantum,lindblad,open-systems,decoherence,dephasing,density-matrix,finite-possibility-mechanics,fpm,simulation
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Requires-Python: >=3.9
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Requires-Dist: numpy>=1.22
|
|
30
|
+
Provides-Extra: test
|
|
31
|
+
Requires-Dist: pytest>=7.0; extra == "test"
|
|
32
|
+
Requires-Dist: scipy>=1.8; extra == "test"
|
|
33
|
+
Provides-Extra: viz
|
|
34
|
+
Requires-Dist: matplotlib>=3.5; extra == "viz"
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
37
|
+
Requires-Dist: scipy>=1.8; extra == "dev"
|
|
38
|
+
Requires-Dist: matplotlib>=3.5; extra == "dev"
|
|
39
|
+
Requires-Dist: build>=0.10; extra == "dev"
|
|
40
|
+
Requires-Dist: twine>=4.0; extra == "dev"
|
|
41
|
+
Dynamic: license-file
|
|
42
|
+
|
|
43
|
+
# fpm-qsim
|
|
44
|
+
|
|
45
|
+
**Drop-in Lindblad dephasing simulator backed by the Finite Possibility Mechanics affine map.**
|
|
46
|
+
|
|
47
|
+
`fpm-qsim` is a small, dependency-light Python package that lets you
|
|
48
|
+
simulate open-system quantum dephasing dynamics using the FPM affine
|
|
49
|
+
coherence map. The map
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
c_{t+1} = kappa * c_t + nu
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
with `kappa ∈ [0, 1]` is the engine. Theorem 3 of the FPM paper
|
|
56
|
+
identifies one particular choice — `kappa = 1 - gamma*dt` — with the
|
|
57
|
+
Euler-discretized Lindblad dephasing equation. This package uses the
|
|
58
|
+
**exact continuous** form
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
kappa = exp(-gamma * dt)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
which is also a valid FPM affine-map coefficient and which makes the
|
|
65
|
+
integrator **machine-precise** for pure dephasing: it reproduces the
|
|
66
|
+
analytic continuous-dephasing solution
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
rho(t) = exp(-gamma*t) * (rho_0 - diag(rho_0)) + diag(rho_0)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
to **1.1 × 10⁻¹⁶** (verified in `tests/test_lindblad_correspondence.py`),
|
|
73
|
+
matching Kraus / matrix-exponential / QuTiP integrators without their
|
|
74
|
+
cost.
|
|
75
|
+
|
|
76
|
+
Because the FPM map is a single vectorized affine update — no matrix
|
|
77
|
+
exponentials, no Kraus decomposition — it scales as `O(N²)` per step
|
|
78
|
+
on an `N × N` density matrix, vs `O(N⁴)` for matrix-exponential
|
|
79
|
+
methods. On 4-qubit (16 × 16) systems this is a ~20× speedup; on
|
|
80
|
+
larger systems the gap widens further.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Installation
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install fpm-qsim
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
From source:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
git clone https://github.com/alxspiker/fpm-qsim.git
|
|
94
|
+
cd fpm-qsim
|
|
95
|
+
pip install -e .
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Requirements:** Python ≥ 3.9, NumPy ≥ 1.22. SciPy is optional
|
|
99
|
+
(for tests).
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Quick start
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
import math
|
|
107
|
+
import numpy as np
|
|
108
|
+
import fpm_qsim as fpm
|
|
109
|
+
|
|
110
|
+
# Start in the |+><+| state (maximal coherence).
|
|
111
|
+
rho0 = fpm.pure_state([1, 1])
|
|
112
|
+
|
|
113
|
+
# Apply one dephasing step. Off-diagonal contracts by exp(-gamma*dt):
|
|
114
|
+
rho1 = fpm.lindblad_step(rho0, gamma=0.1, dt=1.0)
|
|
115
|
+
assert math.isclose(abs(rho1[0, 1]), math.exp(-0.1) * abs(rho0[0, 1]))
|
|
116
|
+
|
|
117
|
+
# Roll out a full trajectory.
|
|
118
|
+
traj = fpm.simulate(rho0, gamma=0.05, dt=1.0, n_steps=200)
|
|
119
|
+
assert traj.shape == (201, 2, 2)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Drop-in replacement
|
|
123
|
+
|
|
124
|
+
If you have an existing Lindblad dephasing loop, swap one import:
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
# Before
|
|
128
|
+
# from your_qsim_library import lindblad_step
|
|
129
|
+
# rho = lindblad_step(rho, H=None, c_ops=[sqrt(gamma) * sigma_z], dt=0.1)
|
|
130
|
+
|
|
131
|
+
# After
|
|
132
|
+
from fpm_qsim import lindblad_step
|
|
133
|
+
rho = lindblad_step(rho, gamma=gamma, dt=0.1)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## What's distinctive about `fpm-qsim`
|
|
139
|
+
|
|
140
|
+
| Property | fpm-qsim | QuTiP | matrix-exp | Kraus |
|
|
141
|
+
|---|---|---|---|---|
|
|
142
|
+
| Dephasing accuracy | **1.1 × 10⁻¹⁶** | 1.1 × 10⁻¹⁶ | 1.1 × 10⁻¹⁶ | 1.1 × 10⁻¹⁶ |
|
|
143
|
+
| Per-step cost on `N×N` | **O(N²)** | O(N²)–O(N³) | O(N⁴) | O(N²) |
|
|
144
|
+
| Dependencies | **NumPy only** | SciPy + Cython + … | SciPy | NumPy |
|
|
145
|
+
| Falsifiability ceiling | **γ_max = 31.87** | — | — | — |
|
|
146
|
+
| Theorem-verified affine map | **Theorem 3** | — | — | — |
|
|
147
|
+
| Closed-universe ledger | **Yes** | — | — | — |
|
|
148
|
+
|
|
149
|
+
The only Lindblad integrator in the Python ecosystem with a
|
|
150
|
+
**built-in falsifiability ceiling**: observations with `γ > 32.0`
|
|
151
|
+
raise `FalsificationError` rather than silently producing unphysical
|
|
152
|
+
results. This is the FPM finite-lag-ceiling theorem (paper Test 09)
|
|
153
|
+
made operational.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## API reference
|
|
158
|
+
|
|
159
|
+
### Core FPM primitives (`fpm_qsim.core`)
|
|
160
|
+
|
|
161
|
+
| Symbol | Description |
|
|
162
|
+
|---|---|
|
|
163
|
+
| `GAMMA_MAX = 31.8738...` | Falsifiable Lorentz-factor ceiling derived from the finite-lag theorem. |
|
|
164
|
+
| `FALSIFICATION_THRESHOLD = 32.0` | Observations above this falsify FPM. |
|
|
165
|
+
| `ENERGY_FLOOR_FRACTION = 0.03138...` | v5.0 zero-energy floor (Test 07). |
|
|
166
|
+
| `ISOTROPIC_WEIGHT_LIMIT = 1/3` | Spectral-gap isotropic limit weight (Test 04). |
|
|
167
|
+
| `kappa_from_gamma(gamma, dt=1.0)` | Euler-form contraction coefficient `1 - gamma*dt` (Theorem 3 form). |
|
|
168
|
+
| `kappa_exact(gamma, dt=1.0)` | Exact continuous-form contraction coefficient `exp(-gamma*dt)`. **This is what `lindblad_step` uses.** |
|
|
169
|
+
| `gamma_from_kappa(kappa, dt=1.0)` | Inverse of `kappa_from_gamma`. |
|
|
170
|
+
| `fpm_affine_step(c, kappa, nu=0.0)` | One tick of the affine map `c_{t+1} = kappa*c_t + nu`. |
|
|
171
|
+
| `fpm_affine_trajectory(c0, kappa, nu=0.0, n_steps=1)` | Closed-form rollout of the affine map. |
|
|
172
|
+
| `bounded_gamma(gamma_raw, gamma_max=GAMMA_MAX)` | Clip a rate to the ceiling; raise if it would falsify. |
|
|
173
|
+
| `FalsificationError` | Raised when an observation would falsify FPM. |
|
|
174
|
+
|
|
175
|
+
### Lindblad-equivalent API (`fpm_qsim.lindblad`)
|
|
176
|
+
|
|
177
|
+
| Symbol | Description |
|
|
178
|
+
|---|---|
|
|
179
|
+
| `lindblad_step(rho, gamma, dt=1.0, *, H=None, bounded=False)` | Advance a density matrix by one exact FPM-affine dephasing step. |
|
|
180
|
+
| `simulate(rho0, gamma, dt=1.0, n_steps=1, *, H=None, bounded=False, record=True)` | Roll out a full trajectory. |
|
|
181
|
+
|
|
182
|
+
### State utilities (`fpm_qsim.states`)
|
|
183
|
+
|
|
184
|
+
| Symbol | Description |
|
|
185
|
+
|---|---|
|
|
186
|
+
| `basis_state(index, dim)` | Computational basis column vector. |
|
|
187
|
+
| `pure_state(amplitudes)` | Build `|psi><psi|` from unnormalized amplitudes. |
|
|
188
|
+
| `maximally_mixed(dim)` | `I_dim / dim`. |
|
|
189
|
+
| `partial_trace(rho, keep, dims)` | Partial trace over a tensor-product Hilbert space. |
|
|
190
|
+
| `is_density_matrix(rho, tol=1e-9)` | Validate Hermiticity, trace, positivity. |
|
|
191
|
+
| `trace_distance(rho, sigma)` | `0.5 * ||rho - sigma||_1`. |
|
|
192
|
+
| `fidelity(rho, sigma)` | Uhlmann fidelity. |
|
|
193
|
+
|
|
194
|
+
### Closed-universe conservation (`fpm_qsim.conservation`)
|
|
195
|
+
|
|
196
|
+
| Symbol | Description |
|
|
197
|
+
|---|---|
|
|
198
|
+
| `DaemonState` | Per-daemon bookkeeping (energy, coherence, cumulative flows). |
|
|
199
|
+
| `ConservationLedger` | Closed-universe ledger; tracks `replenish == spend + landauer`. |
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## The math, in one page
|
|
204
|
+
|
|
205
|
+
The FPM coherence variable `c_t` evolves under the affine map
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
c_{t+1} = kappa * c_t + nu
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
where `kappa ∈ [0, 1]` is the contraction coefficient and `nu` is a
|
|
212
|
+
bounded innovation noise. The FPM framework constrains `kappa` to
|
|
213
|
+
`[0, 1]` but does not mandate a specific form; different `kappa`
|
|
214
|
+
choices correspond to different numerical integrators of the same
|
|
215
|
+
physics:
|
|
216
|
+
|
|
217
|
+
| `kappa` choice | What it computes | Accuracy |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| `1 - gamma*dt` | Euler-discretized Lindblad dephasing | `O(dt)` per step |
|
|
220
|
+
| `exp(-gamma*dt)` (this package) | Exact continuous Lindblad dephasing | **machine precision** |
|
|
221
|
+
|
|
222
|
+
**Theorem 3 (Lindblad Correspondence).** The Euler form (`kappa = 1 -
|
|
223
|
+
gamma*dt`) is algebraically identical to the Euler discretization of
|
|
224
|
+
the Lindblad master equation for a dephasing channel with `H = 0`:
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
rho_{t+1} = (1 - gamma*dt) * rho_t + gamma*dt * diag(rho_t)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
under the identification `gamma_t = (1 - kappa_t) / dt`. Verified
|
|
231
|
+
numerically to RMSE 3.6 × 10⁻¹⁷ on off-diagonal density-matrix
|
|
232
|
+
elements over 600 ticks and 10 random paths (paper Test 02; reproduced
|
|
233
|
+
in `tests/test_lindblad_correspondence.py::test_theorem3_lindblad_correspondence`).
|
|
234
|
+
|
|
235
|
+
The exact form (`kappa = exp(-gamma*dt)`) is **also** a valid FPM
|
|
236
|
+
affine-map coefficient (in `[0, 1]` for all `gamma, dt >= 0`) and is
|
|
237
|
+
what the public `lindblad_step` uses. It reproduces the analytic
|
|
238
|
+
continuous-dephasing solution to 1.1 × 10⁻¹⁶, matching Kraus /
|
|
239
|
+
matrix-exp / QuTiP integrators. The Euler form remains available
|
|
240
|
+
in `fpm_qsim._reference.euler_lindblad_step` for Theorem 3 research.
|
|
241
|
+
|
|
242
|
+
### The falsifiable ceiling
|
|
243
|
+
|
|
244
|
+
The finite-lag ceiling theorem (paper Test 09) caps the physically
|
|
245
|
+
admissible gamma at
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
gamma_max = 31.8738...
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
The CERN muon (`gamma = 29.3`) sits below this ceiling. Any
|
|
252
|
+
observation of `gamma > 32.0` falsifies the FPM framework. The
|
|
253
|
+
package refuses to silently clip such observations; pass
|
|
254
|
+
`bounded=True` to `lindblad_step` and a `FalsificationError` will be
|
|
255
|
+
raised — log the observation instead.
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Reproducing the paper's tests
|
|
260
|
+
|
|
261
|
+
The `tests/` directory reproduces four of the paper's numerical
|
|
262
|
+
experiments and adds a machine-precision regression test:
|
|
263
|
+
|
|
264
|
+
| Test file | Paper test | Reference |
|
|
265
|
+
|---|---|---|
|
|
266
|
+
| `tests/test_lindblad_correspondence.py::test_theorem3_lindblad_correspondence` | Test 02 | RMSE 3.6e-17 |
|
|
267
|
+
| `tests/test_lindblad_correspondence.py::test_public_lindblad_step_machine_precision` | new in v0.1.1 | max err 1.1e-16 |
|
|
268
|
+
| `tests/test_dispersion_contraction.py` | Test 01 | D* = 1.8e-4 |
|
|
269
|
+
| `tests/test_conservation.py` | Test 03 | Drift < 5% |
|
|
270
|
+
| `tests/test_bounded_gamma.py` | Test 07 + Test 09 | gamma_max = 31.87 |
|
|
271
|
+
|
|
272
|
+
Run them with:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
pip install -e ".[test]"
|
|
276
|
+
pytest -v
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## Scope and honest limitations
|
|
282
|
+
|
|
283
|
+
This package implements pure dephasing channels with `H = 0`, the
|
|
284
|
+
regime where the FPM theorem provides an algebraic correspondence.
|
|
285
|
+
|
|
286
|
+
- The `H` parameter on `lindblad_step` extends the integrator to
|
|
287
|
+
non-zero Hamiltonians by composing an Euler unitary kick with the
|
|
288
|
+
dephasing contraction. This is a standard composition, but the
|
|
289
|
+
exact algebraic correspondence to a closed-form affine map is
|
|
290
|
+
proven only for `H = 0`. Callers using `H != 0` should validate
|
|
291
|
+
against a reference integrator for their specific use case.
|
|
292
|
+
- General Lindblad channels (amplitude damping, depolarizing, etc.)
|
|
293
|
+
are not directly equivalent to the FPM affine map. Future
|
|
294
|
+
versions may extend the correspondence.
|
|
295
|
+
- The `ConservationLedger` is a faithful bookkeeping layer but does
|
|
296
|
+
not, by itself, enforce the semantic-entropy conservation gate
|
|
297
|
+
(paper Section 6.6). Callers must implement that gate in their
|
|
298
|
+
application logic.
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Changelog
|
|
303
|
+
|
|
304
|
+
### 0.1.1 (2026-06-17)
|
|
305
|
+
|
|
306
|
+
- **Breaking:** `lindblad_step` now uses the exact continuous form
|
|
307
|
+
`kappa = exp(-gamma*dt)` instead of the Euler form `1 - gamma*dt`.
|
|
308
|
+
The public API now matches Kraus / matrix-exp / QuTiP to machine
|
|
309
|
+
precision (max abs error 1.1e-16 vs analytic). The Euler form
|
|
310
|
+
is preserved in the private `fpm_qsim._reference` module for
|
|
311
|
+
Theorem 3 verification.
|
|
312
|
+
- Added `kappa_exact(gamma, dt)` to the public API.
|
|
313
|
+
- Removed `reference_lindblad_step` from the public API (moved to
|
|
314
|
+
`fpm_qsim._reference.euler_lindblad_step`).
|
|
315
|
+
- Added machine-precision regression test.
|
|
316
|
+
- Added test confirming the exact form handles `gamma*dt > 1`
|
|
317
|
+
without positivity violation (a regime the Euler form cannot
|
|
318
|
+
reach).
|
|
319
|
+
- Updated README with honest speed and accuracy claims.
|
|
320
|
+
|
|
321
|
+
### 0.1.0 (2026-06-17)
|
|
322
|
+
|
|
323
|
+
Initial release. Euler-form affine map, Lindblad-equivalent API,
|
|
324
|
+
bounded gamma falsifiability, density-matrix utilities, closed-
|
|
325
|
+
universe conservation ledger.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Citation
|
|
330
|
+
|
|
331
|
+
If you use `fpm-qsim` in published research, please cite:
|
|
332
|
+
|
|
333
|
+
```bibtex
|
|
334
|
+
@misc{spiker2026fpm,
|
|
335
|
+
title = {Finite Possibility Mechanics: A Unified Information-Theoretic Framework},
|
|
336
|
+
author = {Spiker, Alx},
|
|
337
|
+
year = {2026},
|
|
338
|
+
note = {See Theorem 3 (Lindblad Correspondence) and the Finite-Lag-Ceiling Theorem.}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
@misc{fpm-qsim,
|
|
342
|
+
title = {fpm-qsim: Drop-in Lindblad dephasing simulator backed by the FPM affine map},
|
|
343
|
+
author = {Spiker, Alx},
|
|
344
|
+
year = {2026},
|
|
345
|
+
url = {https://github.com/alxspiker/fpm-qsim},
|
|
346
|
+
}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## License
|
|
352
|
+
|
|
353
|
+
MIT. See `LICENSE`.
|