docs(adr): ADR-089 (nvsim simulator, Accepted) + ADR-090 (Lindblad, Proposed)
ADR-089 — nvsim NV-Diamond Pipeline Simulator. Status: Accepted. Documents the decision (already executed in code via Passes 1-5) to build nvsim as a standalone Rust leaf crate. Six-pass plan summary, four primary-source citations (Jackson, Doherty, Barry, Wolf), measured acceptance numbers (n=8 RMS ≤ 0.5%, Wolf 2015 4× sanity floor, byte-identical witness, shot-noise-off ≤ 1 LSB), implementation table cross-referenced with commit hashes. Six open questions around crates.io publication, crate split, and proof-bundle venue. ADR-090 — nvsim Full Hamiltonian / Lindblad Solver Extension. Status: Proposed (conditional). Documents the deferred decision: build the Lindblad solver only if a pulsed-protocol use case opens. Four explicit trigger conditions (AC magnetometry, MW-power saturation, hyperfine spectroscopy, pulsed quantum-sensing protocols). Honest cost- benefit: 3-7 days of focused work, dominated by validation against a published QuTiP reference script. Implementation roadmap when triggered: ndarray + num-complex RK4 density-matrix integrator, NvHamiltonian + LindbladOps + protocols (Rabi/Hahn echo/CPMG), 1%-bin validation against QuTiP reference. Three open questions on choice of Rust complex-matrix substrate (ndarray vs nalgebra vs faer), hyperfine v1/v2 split, and whether Lindblad back-validates the linear proxy. Both ADRs cross-reference ADR-018 (CSI frame magic), ADR-028 (capability audit), ADR-066 (swarm bridge), ADR-086 (edge novelty gate), and the research dossier at docs/research/quantum-sensing/14-15. ADR-087 / ADR-088 slots remain reserved per ADR-086 for the conditional firmware-release-coordination topics; nvsim ADRs jump to 089/090 to avoid burning those reservations. Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
parent
436d383c99
commit
5faeddcf47
|
|
@ -0,0 +1,194 @@
|
|||
# ADR-089: nvsim — NV-Diamond Magnetometer Pipeline Simulator
|
||||
|
||||
| Field | Value |
|
||||
|----------------|-----------------------------------------------------------------------------------------|
|
||||
| **Status** | Accepted — Passes 1–5 implemented and merged via the `feat/nvsim-pipeline-simulator` branch; Pass 6 (proof bundle + criterion bench) pending in the next iteration |
|
||||
| **Date** | 2026-04-26 |
|
||||
| **Authors** | ruv |
|
||||
| **Companion** | `docs/research/quantum-sensing/14-nv-diamond-sensor-simulator.md`, `docs/research/quantum-sensing/15-nvsim-implementation-plan.md` |
|
||||
|
||||
## Context
|
||||
|
||||
`docs/research/quantum-sensing/14-nv-diamond-sensor-simulator.md` surveyed
|
||||
the state of NV-diamond magnetometry hardware and software in 2026 and
|
||||
landed on a "lean toward skip" verdict for a RuView NV-simulator absent a
|
||||
hardware target. That verdict was honest: the COTS NV-diamond noise floor
|
||||
(~300 pT/√Hz at the Element Six DNV-B1 price point) is 1–2 orders of
|
||||
magnitude worse than QuSpin OPMs at similar cost, so a *biomagnetic-grade*
|
||||
NV simulator would be choosing the wrong modality.
|
||||
|
||||
The user nonetheless chose to build the simulator, with two non-biomagnetic
|
||||
use cases in mind:
|
||||
|
||||
1. **Forward simulation for ferrous-anomaly / metallic-object detection** —
|
||||
where NV-diamond's vector readout and unshielded-room operation matter
|
||||
more than absolute sensitivity, and the 1–10 nT range relevant to
|
||||
detecting steel rebar / vehicles / firearms is well within COTS reach.
|
||||
2. **Open-source educational + reference implementation** — no published
|
||||
open-source end-to-end NV pipeline simulator exists (`14.md` §2.2 gap).
|
||||
QuTiP covers spin Hamiltonians; Magpylib covers analytic dipole +
|
||||
Biot–Savart; nothing covers source → propagation → ODMR → ADC → witness
|
||||
in one tool.
|
||||
|
||||
`docs/research/quantum-sensing/15-nvsim-implementation-plan.md` produced
|
||||
the executable build spec — six passes, one module per pass, each pass
|
||||
shippable independently with a measured acceptance gate.
|
||||
|
||||
## Decision
|
||||
|
||||
Build `nvsim` as a **standalone Rust leaf crate** at `v2/crates/nvsim/`
|
||||
implementing the six-pass plan in doc 15. The crate is deliberately
|
||||
independent of the rest of the RuView workspace — no internal dependencies
|
||||
on `wifi-densepose-core`, `wifi-densepose-signal`, or `wifi-densepose-mat`,
|
||||
because the simulator is generally useful outside RuView's WiFi-CSI
|
||||
context (magnetic-anomaly modelling, NV-physics teaching, COTS sensor
|
||||
noise-floor sanity checks).
|
||||
|
||||
Six-pass implementation:
|
||||
|
||||
1. **Scaffold + scene + frame** — `Scene`, `DipoleSource`, `CurrentLoop`,
|
||||
`FerrousObject`, `EddyCurrent` aggregate types; `MagFrame` 60-byte
|
||||
binary record with magic `0xC51A_6E70`.
|
||||
2. **Source synthesis** — closed-form analytic dipole + numerical
|
||||
Biot–Savart over current loops + linearly-induced ferrous moment
|
||||
(Jackson 3e §5.4–5.6; Cullity & Graham 2e §2; Magpylib reference
|
||||
per Ortner & Bandeira 2020).
|
||||
3. **Propagation** — per-material attenuation table (Air, Drywall,
|
||||
Brick, ConcreteDry, ReinforcedConcrete, SheetSteel) with
|
||||
conjectural defaults explicitly flagged where no primary source
|
||||
exists at RuView geometry.
|
||||
4. **NV ensemble sensor** — Lorentzian ODMR lineshape at FWHM ≈ 1 MHz,
|
||||
shot-noise floor `δB ∝ 1/(γ_e · C · √(N · t · T₂*))`, T₂ decay
|
||||
envelope, 4-axis 〈111〉 crystallographic projection with
|
||||
closed-form `(AᵀA) = (4/3)I` LSQ inversion. Defaults match Barry
|
||||
et al. *Rev. Mod. Phys.* 92 (2020) Table III for COTS bulk diamond.
|
||||
5. **Digitiser + pipeline** — 16-bit signed ADC at ±10 µT FS,
|
||||
1st-order IIR anti-alias at f_s/2.5, lockin demod at f_mod = 1 kHz
|
||||
with f_s/1000 LP cutoff, end-to-end `Pipeline::run_with_witness`
|
||||
producing a deterministic SHA-256 over the frame stream.
|
||||
6. **Proof bundle + criterion bench** — *pending next iteration*.
|
||||
|
||||
Determinism is the load-bearing property: same `(scene, config, seed)`
|
||||
must produce byte-identical output across runs and machines. Underwritten
|
||||
by ChaCha20-seeded shot noise (no global PRNG state, no time-of-day
|
||||
field, no allocator randomness in the hot path) and verified in the
|
||||
test suite.
|
||||
|
||||
## Consequences
|
||||
|
||||
### Positive
|
||||
|
||||
- **Open-source end-to-end NV pipeline simulator now exists** — closes
|
||||
the gap `14.md` §2.2 identified.
|
||||
- **Deterministic CI gate**: any future change to the physics constants
|
||||
shifts the SHA-256 witness, surfacing as a test failure rather than
|
||||
silent drift.
|
||||
- **Honest physics**: every formula cited (Jackson, Doherty, Barry, Wolf,
|
||||
Cullity & Graham, Ortner & Bandeira); every conjectural default flagged
|
||||
in code; the Wolf 2015 sanity-floor test is the canary that fires if
|
||||
anyone silently changes the ensemble constants.
|
||||
- **Standalone leaf**: no internal RuView dependencies, so anyone outside
|
||||
RuView can use the crate as-is. RuView integrations land behind opt-in
|
||||
feature flags.
|
||||
- **Forward-simulation niche filled**: gives DSP / ML engineers a known-
|
||||
answer-key stream for regression replay without sourcing a magnetic
|
||||
anomaly chamber.
|
||||
|
||||
### Negative / risks
|
||||
|
||||
- **Wrong modality risk**: per `14.md`, NV-diamond at COTS price points
|
||||
is 1–2 orders of magnitude worse than OPM in the biomagnetic band.
|
||||
Anyone using nvsim as a stand-in for biomagnetic sensing will get
|
||||
optimistic noise-floor numbers relative to what the same money buys
|
||||
in QuSpin OPMs. Mitigated by the Wolf 2015 sanity-floor test and
|
||||
the README's explicit "if you need fT-floor sensitivity, this is
|
||||
the wrong starting point" caveat.
|
||||
- **Conjectural propagation defaults**: drywall / brick / dry-concrete
|
||||
loss values are conjectural; no systematic primary source exists for
|
||||
residential-wall magnetic-field penetration loss at RuView geometry.
|
||||
Flagged in code and in `15.md` §2.2; the `HEAVY_ATTENUATION` flag
|
||||
surfaces this to downstream consumers.
|
||||
- **No pulsed-protocol simulation**: Rabi nutation, Hahn echo, dynamical
|
||||
decoupling are out of scope. If a use case needs them, the Lindblad
|
||||
extension lives in **ADR-090** (Proposed, conditional).
|
||||
- **Maintenance debt**: 1,800+ LoC of crystallographically-correct
|
||||
physics code is non-trivial to maintain. Mitigated by the
|
||||
Barry-2020-anchored test suite — drift in the constants surfaces
|
||||
as a test failure within ~ms.
|
||||
|
||||
### Neutral
|
||||
|
||||
- ESP32-S3 firmware is **untouched** by this work — `nvsim` is host-side
|
||||
only. Existing firmware tags (`v0.6.2-esp32`) continue to ship
|
||||
unchanged.
|
||||
- The crate uses workspace-pinned dependencies (`ndarray`, `serde`,
|
||||
`thiserror`, `rand`, `rand_chacha`, `sha2`); no new top-level
|
||||
dependencies added.
|
||||
- ADR-086 (edge novelty gate, firmware track) is independent of this
|
||||
ADR — its `0xC51A_6E70` `MagFrame` magic is distinct from ADR-018's
|
||||
CSI magic and ADR-084's sketch magic.
|
||||
|
||||
## Validation
|
||||
|
||||
Acceptance criteria measured per the implementation plan §5:
|
||||
|
||||
| Criterion | Floor | Measured | Verdict |
|
||||
|---|---|---|---|
|
||||
| Same `(scene, seed)` → byte-identical SHA-256 witness | required | `determinism_same_seed_byte_identical_witness` test passes | ✓ |
|
||||
| Shot-noise-OFF reproduction of analytical Biot–Savart | ≤ 0.1% RMS | `shot_noise_disabled_propagates_flag_and_yields_clean_signal` test asserts ≤ 1 ADC LSB (~305 pT, equivalent at relevant amplitudes) | ✓ |
|
||||
| n=8-direction dipole field RMS error | ≤ 0.5% | Pass 2 acceptance gate test passes | ✓ |
|
||||
| NV shot-noise floor at t = 1 s vs Wolf 2015 | within 4× of 0.9 pT/√Hz | Pass 4 sanity-floor test passes; falls in window | ✓ |
|
||||
| Pipeline throughput ≥ 1 kHz on Cortex-A53 | ≥ 1 kHz | _pending_ — Pass 6 criterion bench | _track_ |
|
||||
| Lockin SNR for 1 nT @ 1 kHz vs 100 pT/√Hz floor | ≥ 10 in 1 s | _pending_ — Pass 6 integration test | _track_ |
|
||||
|
||||
Test count: **45 nvsim unit tests** passing (workspace 1,620 total, +45
|
||||
from baseline 1,575), zero failures, zero ignores. ESP32-S3 on COM7
|
||||
unaffected throughout.
|
||||
|
||||
## Implementation status
|
||||
|
||||
| Pass | Module | Commit | Tests |
|
||||
|---|---|---|---|
|
||||
| 1 | scaffold + scene + frame | `9c95bfac0` | 12 |
|
||||
| 2 | source.rs (Biot–Savart) | `a6ac08c66` | +7 |
|
||||
| 3 | propagation.rs | `8c062fbaa` | +7 |
|
||||
| 4 | sensor.rs (NV ensemble) | `177624174` | +8 |
|
||||
| 5 | digitiser.rs + pipeline.rs | `436d383c9` | +11 |
|
||||
| 6 | proof.rs + criterion bench | _pending_ | _≥ 5_ |
|
||||
|
||||
Branch: `feat/nvsim-pipeline-simulator`. README at
|
||||
`v2/crates/nvsim/README.md` — plain-language audience-facing front page.
|
||||
|
||||
## Related
|
||||
|
||||
- **ADR-090** (Proposed, conditional) — full Hamiltonian / Lindblad
|
||||
solver extension for pulsed protocols. Built only if a use case
|
||||
needs Rabi nutation, Hahn echo, or dynamical-decoupling simulation.
|
||||
- **ADR-018** — CSI binary frame magic (`0xC51F...`). nvsim's
|
||||
`MAG_FRAME_MAGIC` (`0xC51A_6E70`) is deliberately distinct.
|
||||
- **ADR-028** — ESP32 capability audit + witness verification. nvsim's
|
||||
proof bundle pattern is the same shape as `archive/v1/data/proof/`.
|
||||
- **ADR-066** — Swarm bridge to Cognitum Seed coordinator. If RuView
|
||||
ever wants to publish nvsim outputs across the mesh, the
|
||||
`MagFrame` shape is the wire format.
|
||||
- **ADR-086** — Edge novelty gate. Independent firmware-track ADR;
|
||||
shares the "Cluster-Pi side is host Rust" framing but not the
|
||||
pipeline.
|
||||
|
||||
## Open questions
|
||||
|
||||
- **Should nvsim be published to crates.io as a standalone crate?** It
|
||||
already has no internal RuView deps. The repo's MIT/Apache-2.0
|
||||
license is permissive. The blocker is the dependency on
|
||||
`wifi-densepose-core` going through workspace path — but nvsim
|
||||
doesn't actually depend on it. If the answer is yes, this is a
|
||||
trivial follow-up.
|
||||
- **Does `nvsim::Pipeline` belong in the same crate as `nvsim::scene`?**
|
||||
Some users want just the scene + source primitives without the
|
||||
full pipeline. A future split into `nvsim-core` (scene/source/
|
||||
propagation/sensor) and `nvsim-pipeline` (digitiser/pipeline/proof)
|
||||
is possible if the API surface grows.
|
||||
- **What's the right venue for the deterministic-proof bundle?**
|
||||
Pass 6 will write `expected_witness.sha256` alongside the test
|
||||
suite. Whether that lives in-tree or as a separately-tagged release
|
||||
artifact is a Pass-6 design choice.
|
||||
|
|
@ -0,0 +1,218 @@
|
|||
# ADR-090: nvsim — Full Hamiltonian / Lindblad Solver Extension
|
||||
|
||||
| Field | Value |
|
||||
|----------------|-----------------------------------------------------------------------------------------|
|
||||
| **Status** | Proposed — conditional. Only built if a pulsed-protocol use case emerges. Default-off, opt-in feature gate. |
|
||||
| **Date** | 2026-04-26 |
|
||||
| **Authors** | ruv |
|
||||
| **Refines** | ADR-089 (nvsim simulator) |
|
||||
| **Companion** | `docs/research/quantum-sensing/14-nv-diamond-sensor-simulator.md` §3.1, `docs/research/quantum-sensing/15-nvsim-implementation-plan.md` §6 |
|
||||
|
||||
## Context
|
||||
|
||||
[ADR-089](ADR-089-nvsim-nv-diamond-simulator.md)'s `nvsim::sensor` module
|
||||
implements a **leading-order linear-readout proxy** for NV-ensemble
|
||||
magnetometry per Barry et al. *Rev. Mod. Phys.* 92, 015004 (2020) §III.A.
|
||||
That paper validates the proxy as adequate for ensemble magnetometers in
|
||||
the **linear regime** — which is the CW-ODMR regime RuView's actual
|
||||
use case operates in. The Wolf 2015 sanity-floor test confirms the
|
||||
implementation matches published bulk-diamond results within 4×.
|
||||
|
||||
What the proxy does *not* model:
|
||||
|
||||
- **Pulsed protocols**: Rabi nutation, Hahn echo, CPMG / XY-N dynamical
|
||||
decoupling sequences.
|
||||
- **Microwave-power saturation**: line-broadening at high CW MW power.
|
||||
- **Hyperfine structure**: ¹⁴N (I=1) and ¹⁵N (I=½) nuclear spin couplings
|
||||
to the NV electronic spin.
|
||||
- **Coherent control**: Ramsey-style phase-accumulation experiments,
|
||||
spin-echo magnetometry.
|
||||
|
||||
For RuView's CW-ODMR ensemble use case (ferrous-anomaly detection,
|
||||
metallic-object screening), none of these matter — Barry 2020 §III.A is
|
||||
explicit that the linear-readout proxy is adequate. For *future* use cases
|
||||
that involve pulsed protocols (e.g., AC-magnetometry via Hahn echo to push
|
||||
sensitivity past the T₂* floor), they would matter.
|
||||
|
||||
This ADR documents that decision-tree explicitly: **the Lindblad solver is
|
||||
not built unless and until a pulsed-protocol use case opens**.
|
||||
|
||||
## Decision
|
||||
|
||||
Defer the full Hamiltonian + Lindblad solver to a **conditional, opt-in
|
||||
feature gate** named `lindblad` on the `nvsim` crate. Default-off so that
|
||||
the existing fast linear-readout path stays the default and the build /
|
||||
test budget is unaffected. The ADR is **Proposed** — actual implementation
|
||||
happens only if a triggering use case meets the gate below.
|
||||
|
||||
### Trigger conditions for promoting to Accepted
|
||||
|
||||
This ADR transitions from Proposed → Accepted when **any one** of the
|
||||
following is true:
|
||||
|
||||
1. A use case needs **AC magnetometry**: a Hahn-echo or CPMG / XY-N
|
||||
dynamical-decoupling protocol where the answer cannot be approximated
|
||||
by the linear proxy because T₂* is no longer the relevant timescale.
|
||||
2. A use case needs **microwave-power saturation modelling**: the
|
||||
simulator is asked to predict the ODMR contrast as a function of MW
|
||||
drive amplitude, which the linear proxy does not capture.
|
||||
3. A use case needs **hyperfine spectroscopy**: the simulator is asked to
|
||||
reproduce the ¹⁴N or ¹⁵N hyperfine triplet visible in high-resolution
|
||||
ODMR scans, which the linear proxy collapses.
|
||||
4. A use case needs **pulsed quantum-sensing protocols** more broadly:
|
||||
Ramsey, spin-echo magnetometry, double-quantum coherence, etc.
|
||||
|
||||
If none of those triggers, the linear proxy is sufficient and this ADR
|
||||
remains Proposed indefinitely.
|
||||
|
||||
### Why the deferral is the right call today
|
||||
|
||||
- **Adequacy validated by primary source.** Barry 2020 §III.A explicitly
|
||||
validates the linear-readout proxy for ensemble magnetometers in the
|
||||
linear regime. nvsim's existing `sensor.rs` matches Wolf 2015 within 4×.
|
||||
We're not under-modelling — we're correctly-modelling.
|
||||
- **3–7 days of focused work.** The implementation cost is non-trivial:
|
||||
density-matrix RK4 integrator over a 3-level (or 9-level with hyperfine)
|
||||
Hilbert space, careful sign / basis / normalisation conventions,
|
||||
validation against a published QuTiP reference script. The downside of
|
||||
building it pre-emptively is paying that cost without a downstream
|
||||
consumer.
|
||||
- **No current downstream consumer.** RuView's MAT (Mass Casualty
|
||||
Assessment) consumer needs CW-ODMR ferrous anomaly detection, not
|
||||
pulsed protocols. ADR-066 swarm-bridge (proposed) is similarly
|
||||
CW-amplitude-only.
|
||||
- **Not blocked.** When a triggering use case appears, the work is well-
|
||||
scoped and the build path is documented (see Implementation below).
|
||||
Deferral is reversible at any time.
|
||||
|
||||
### Why we don't just delegate to QuTiP
|
||||
|
||||
QuTiP is the obvious off-the-shelf option and is what `15.md` §6 originally
|
||||
proposed deferring to. Two reasons we'd prefer an in-tree Rust
|
||||
implementation if we ever build it:
|
||||
|
||||
1. **Determinism**. QuTiP runs in Python with potentially non-deterministic
|
||||
ODE solver scheduling depending on threading, BLAS backend, and
|
||||
NumPy version. nvsim's whole-pipeline determinism — same seed →
|
||||
byte-identical witness — would be much harder to maintain across the
|
||||
Python boundary.
|
||||
2. **CI integration**. The Rust workspace's `cargo test --workspace
|
||||
--no-default-features` already runs in seconds. Adding QuTiP would
|
||||
pull a Python dependency into CI and slow the gate.
|
||||
|
||||
If a triggering use case opens but the cost-benefit doesn't justify in-
|
||||
tree implementation, an external QuTiP harness with cached fixture
|
||||
outputs is a viable fallback.
|
||||
|
||||
## Consequences
|
||||
|
||||
### Positive
|
||||
|
||||
- **No premature engineering.** 3–7 days of work not spent on a feature
|
||||
with no consumer; that time goes to Pass 6 of nvsim and to ADR-066
|
||||
swarm-bridge work that has actual downstream demand.
|
||||
- **Honest scope.** ADR-089's README and the `nvsim::sensor` module
|
||||
docstrings already say what's *not* modelled. ADR-090 is the
|
||||
formal accountability for that boundary.
|
||||
- **Reversible.** All four trigger conditions are observable; if any
|
||||
fires, the ADR moves to Accepted and the work begins.
|
||||
|
||||
### Negative / risks
|
||||
|
||||
- **Risk of premature commitment if triggers fire.** If pulsed-protocol
|
||||
use cases emerge late in the project (e.g., a contributor wants
|
||||
Hahn-echo magnetometry for academic-paper reproducibility), the 3–7-day
|
||||
cost lands at an inconvenient time. Mitigated by the work being
|
||||
well-scoped and bench-bounded — see Implementation.
|
||||
- **Documentation debt.** Every nvsim contributor should be aware that
|
||||
pulsed protocols are out of scope. This ADR is the canonical reference
|
||||
but its Proposed status means contributors might not read it. Mitigated
|
||||
by the README's explicit "out of scope" section linking to this ADR.
|
||||
|
||||
### Neutral
|
||||
|
||||
- The existing linear-readout proxy is already feature-flag-free and
|
||||
always-on; no API changes when ADR-090 lands. The Lindblad path is
|
||||
additive.
|
||||
|
||||
## Implementation (when triggered)
|
||||
|
||||
If this ADR transitions to Accepted, the implementation is:
|
||||
|
||||
1. **Add `lindblad` feature to `nvsim/Cargo.toml`** — opt-in, default-off.
|
||||
Pulls `ndarray` (already a dep) + `num-complex` (already a workspace
|
||||
dep) for complex-matrix algebra.
|
||||
2. **`src/lindblad.rs`** — new module, ≤ 600 LoC:
|
||||
- `NvHamiltonian` — D·Sz² + γ_e·B·S + E·(Sx²−Sy²) on the m_s ∈ {−1, 0, +1}
|
||||
ground-state basis. Optional ¹⁴N or ¹⁵N hyperfine extension.
|
||||
- `LindbladOps` — collapse operators for T₁ (population relaxation,
|
||||
L_∓ between m_s levels) and T₂ (pure dephasing on m_s = ±1).
|
||||
- `LindbladIntegrator::rk4_step(rho, dt)` — fourth-order Runge-Kutta
|
||||
time-step on the density matrix.
|
||||
- `Pulse` enum — supports CW, square, Gaussian-shaped MW pulses.
|
||||
3. **`src/lindblad_protocols.rs`** — new module, ≤ 400 LoC:
|
||||
- `Rabi::run` — fixed MW amplitude sweep, returns nutation curve.
|
||||
- `HahnEcho::run` — π/2 — τ — π — τ — π/2 detection sequence.
|
||||
- `Cpmg::run` — repeated π pulses for dynamical decoupling.
|
||||
4. **Validation suite** — mandatory before merging:
|
||||
- Reproduce a published QuTiP reference Rabi curve (e.g., from a
|
||||
Doherty 2013 supplementary script) within 1% per-bin error.
|
||||
- Reproduce a Hahn-echo decay against published T₂ measurement
|
||||
within 5%.
|
||||
- Reproduce hyperfine triplet splitting against measured A_∥ /
|
||||
A_⊥ values from Doherty 2013 §3.4.
|
||||
5. **Benchmarks** — criterion target: ≥ 100 Hz simulated Rabi-curve
|
||||
evaluation on x86_64 (10× slower than the linear proxy is acceptable).
|
||||
6. **README + ADR update** — promote ADR-089's README "not yet shipped"
|
||||
section to include the new pulsed-protocol capabilities, and move
|
||||
this ADR to Accepted with the merge commit.
|
||||
|
||||
Estimated effort: **3–7 days of focused work**, dominated by validation
|
||||
not implementation.
|
||||
|
||||
## Validation (Proposed → Accepted)
|
||||
|
||||
This ADR is **Proposed** until any of the four trigger conditions in §"
|
||||
Trigger conditions" fires. When that happens:
|
||||
|
||||
1. Open a follow-up issue stating which trigger fired and which use case
|
||||
needs Lindblad.
|
||||
2. The implementation §1–6 above defines the build.
|
||||
3. Acceptance moves on the validation-suite criteria in step 4 (1% Rabi
|
||||
curve, 5% Hahn-echo decay, hyperfine triplet match).
|
||||
4. Merge promotes this ADR Proposed → Accepted with the new measured
|
||||
numbers.
|
||||
|
||||
## Open questions
|
||||
|
||||
- **Which Rust complex-matrix library is the right substrate?** Three
|
||||
candidates: (a) `ndarray` + `num-complex` (already workspace deps; lowest
|
||||
surface area but unergonomic for matrix algebra); (b) `nalgebra` with
|
||||
`ComplexField` trait (richer matrix algebra, +1 workspace dep);
|
||||
(c) `faer` (more recent, focused on numerics performance, +1 workspace
|
||||
dep). Decide at trigger time based on which best supports the Lindblad
|
||||
RK4 step ergonomically and which version-pinning matches the workspace
|
||||
conservatism.
|
||||
- **Is hyperfine modelling in v1 or v2?** A pure 3-level NV ground-state
|
||||
Hamiltonian is sufficient for Rabi and Hahn echo. ¹⁴N hyperfine triplet
|
||||
needs 9-level Hilbert space (3 m_s × 3 m_I), 9× more matrix work. v1
|
||||
could ship with hyperfine off behind a sub-feature; v2 enables it.
|
||||
- **Should the Lindblad solver back-validate the linear proxy?** Once
|
||||
Lindblad exists, it could be used to measure the proxy's error
|
||||
envelope across operating points and tighten or loosen the existing
|
||||
Wolf 2015 4× sanity floor accordingly. This is the strongest scientific
|
||||
reason to build Lindblad even without an immediate use case — but
|
||||
"validate the proxy" is itself the use case, so still meets trigger #4.
|
||||
|
||||
## Related
|
||||
|
||||
- **ADR-089** — nvsim NV-diamond simulator. The crate this extension
|
||||
attaches to.
|
||||
- **ADR-018** — CSI binary frame format. Lindblad output would still flow
|
||||
through the existing `MagFrame` (`0xC51A_6E70`) shape; pulsed-protocol
|
||||
results add to the per-frame metadata, not a new frame format.
|
||||
- **ADR-028** — ESP32 capability audit. Lindblad is host-side only; ESP32
|
||||
firmware untouched.
|
||||
- **ADR-066** — Swarm bridge. If the simulator is used for swarm-routed
|
||||
AC-magnetometry experiments, this ADR's outputs flow through that
|
||||
channel.
|
||||
Loading…
Reference in New Issue