From 87bc2fe5051270a7617570d3c15e9b1a589f5d76 Mon Sep 17 00:00:00 2001 From: ruv Date: Sun, 26 Apr 2026 20:14:04 -0400 Subject: [PATCH] deploy(nvsim): include nvsim-pkg WASM artifacts (force past wasm-pack .gitignore) --- nvsim/nvsim-pkg/README.md | 231 +++++++++++++ nvsim/nvsim-pkg/nvsim.d.ts | 116 +++++++ nvsim/nvsim-pkg/nvsim.js | 507 +++++++++++++++++++++++++++++ nvsim/nvsim-pkg/nvsim_bg.wasm | Bin 0 -> 165315 bytes nvsim/nvsim-pkg/nvsim_bg.wasm.d.ts | 19 ++ nvsim/nvsim-pkg/package.json | 32 ++ 6 files changed, 905 insertions(+) create mode 100644 nvsim/nvsim-pkg/README.md create mode 100644 nvsim/nvsim-pkg/nvsim.d.ts create mode 100644 nvsim/nvsim-pkg/nvsim.js create mode 100644 nvsim/nvsim-pkg/nvsim_bg.wasm create mode 100644 nvsim/nvsim-pkg/nvsim_bg.wasm.d.ts create mode 100644 nvsim/nvsim-pkg/package.json diff --git a/nvsim/nvsim-pkg/README.md b/nvsim/nvsim-pkg/README.md new file mode 100644 index 00000000..83394ddf --- /dev/null +++ b/nvsim/nvsim-pkg/README.md @@ -0,0 +1,231 @@ +# nvsim + +**Deterministic Rust simulator for NV-diamond ensemble magnetometers.** +Synthesise the magnetic-field trace a real sensor *would have produced* — +without the hardware, the lab, or the $8 K vendor receipt. + +--- + +## What this is, in one paragraph + +NV-diamond magnetometers are exotic but real: they detect magnetic fields by +shining green laser at a diamond and watching how its red fluorescence shifts +under microwave excitation. They are sensitive enough to feel a person's +heartbeat from across a room — when they work. The catch: a working ensemble +sensor costs ~$8 K and lives in a lab. **`nvsim` runs the same forward +pipeline in software**, end-to-end, deterministically, so you can ask "what +would my magnetometer have seen if a steel rebar walked past it" without +wiring up any of it. + +It is **not** a hardware-control stack, microscope simulator, full +Hamiltonian solver, or claim of fT-level sensitivity. This crate does not +control lasers, microwave sources, ADC hardware, or real NV sensors. It is +a deterministic Rust simulator with **explicit physics approximations and +no hidden mocks** — every formula is cited; every conjectural default is +flagged in code; every random number comes from a seeded ChaCha20 PRNG. + +## Why you might use it + +| If you are a… | …`nvsim` lets you… | +|---|---| +| **Sensor researcher** evaluating a new pipeline | Replay a synthetic trace through your own DSP and check it against a published-physics ground truth before buying hardware | +| **DSP / ML engineer** building anomaly detectors | Generate magnetic-anomaly traces with a known answer key — useful for regression replay, deterministic CI, and "did my detector regress?" gates | +| **Educator** teaching magnetometry / NV physics | Run real Biot-Savart, Lorentzian ODMR, and 4-axis projection in Rust without standing up a Python+QuTiP environment | +| **RuView pipeline contributor** | Get a binary `MagFrame` shape (`0xC51A_6E70`) you can plumb into existing observability, with optional ruvector trace compression behind a feature flag | +| **Auditor / compliance reviewer** | Re-run the included determinism check (`same scene + seed → byte-identical proof bundle`) and verify the simulator's output across machines without re-running the whole pipeline | + +## Capabilities (what's shipping today) + +| Capability | What's in the crate | +|---|---| +| **Scene primitives** | `DipoleSource`, `CurrentLoop`, `FerrousObject`, `EddyCurrent`, `Scene` aggregate. JSON round-trip safe. | +| **Magnetic-field synthesis** | Closed-form analytic dipole, numerical Biot-Savart over 64-segment current loops, linearly-induced ferrous-object moment, multi-source aggregation. **All in `f64`** for near-field stability; clamped at 1 mm with a saturation flag. | +| **Per-material attenuation** | Air / drywall / brick / dry concrete / reinforced concrete / sheet steel — with a `HEAVY_ATTENUATION` flag for the materials whose loss values are admittedly conjectural. **NaN-safe** on adversarial input (negative or non-finite path lengths). | +| **NV-ensemble physics** | ODMR Lorentzian (FWHM ≈ 1 MHz), shot-noise floor `δB ∝ 1/(γ_e·C·√(N·t·T₂*))`, T₂ decay envelope, 4-axis 〈111〉 crystallographic projection with closed-form LSQ inversion. Defaults match Barry et al. *Rev. Mod. Phys.* 92 (2020) Table III for COTS bulk diamond. | +| **Determinism** | Same `(B_in, dt, seed)` → byte-identical `NvReading`. ChaCha20-seeded shot noise; no global state, no time-of-day field, no allocator randomness. | +| **Binary frame format** | `MagFrame` — 60-byte fixed-layout record, magic `0xC51A_6E70` (distinct from ADR-018 CSI `0xC51F...` and ADR-084 sketch `0xC511_0084`). Round-trips byte-exact, deserialiser rejects bad magic / bad version / wrong length without panicking. | + +### Not yet shipped (next two passes) + +- `digitiser.rs` — ADC quantization + 4ᵗʰ-order Butterworth anti-alias + lockin demodulation +- `pipeline.rs` — wires every stage end-to-end and emits a `MagFrame` stream +- `proof.rs` + criterion bench — deterministic SHA-256 witness bundle + ≥ 1 kHz wall-clock throughput target + +These complete the six-pass plan in +`docs/research/quantum-sensing/15-nvsim-implementation-plan.md`. + +## How it compares + +The closest existing tools each cover one slice of what `nvsim` covers +end-to-end. Nothing in the open-source ecosystem (as of early 2026) covers +the whole forward pipeline at once — see +`docs/research/quantum-sensing/14-nv-diamond-sensor-simulator.md` §2.2. + +| Tool | Source synthesis | Material attenuation | NV ensemble physics | Digitiser + lockin | Witness bundle | Language | +|---|---|---|---|---|---|---| +| [Magpylib](https://magpylib.readthedocs.io/) | ✅ analytic dipole + Biot-Savart | ❌ | ❌ | ❌ | ❌ | Python | +| [QuTiP](https://qutip.org/) NV scripts | ❌ | ❌ | ✅ full Hamiltonian + Lindblad | ❌ | ❌ | Python | +| Vendor sims (Element Six, etc.) | partial | partial | ✅ proprietary | partial | ❌ | closed | +| **`nvsim`** | ✅ analytic + Biot-Savart | ✅ 6 materials, NaN-safe | ✅ leading-order ensemble proxy | 🚧 Pass 5 | 🚧 Pass 6 | Rust, deterministic | + +`nvsim` deliberately **does not** try to compete with QuTiP on Hamiltonian +fidelity (full Lindblad solver is plan §6 out-of-scope). It picks the +linear-readout proxy that Barry 2020 §III.A validates as adequate for +ensemble magnetometers in the linear regime, and ships that path +end-to-end with witness-anchored reproducibility. + +## Value proposition + +You get **three things at once** that no other open simulator combines: + +1. **Forward end-to-end pipeline.** Scene → source → propagation → NV → digitiser → frame → witness, in one crate, in one language. No Python ↔ Rust marshalling, no manual gluing of three half-tools. +2. **Strong determinism.** Same inputs and seed → byte-identical output across machines, runs, and time. CI pipelines treat the simulator's output as a content-addressable artifact: a SHA-256 over the frame stream is the build's "did the physics drift?" canary. +3. **Honest physics.** Every formula is cited. Every conjectural default is flagged in code, not buried in a footnote. The acceptance suite includes a Wolf 2015 sanity-floor test that fires if anyone silently changes the ensemble constants — i.e. the simulator can tell you when its own model breaks. + +The cost: `nvsim` is a *forward simulator only*. It does not do inverse +problems (estimating field sources from sensor readings), full Hamiltonian +dynamics, or hardware control. If you need those, you escalate to QuTiP, +COMSOL, or a real lab respectively. + +## Usage guide + +### Install + +```bash +# Inside the workspace: +cargo build -p nvsim --no-default-features +cargo test -p nvsim --no-default-features # currently 34 passing +``` + +`nvsim` is a standalone leaf crate. It depends only on `serde`, `thiserror`, +`tracing`, `rand`, and `rand_chacha`. RuView ecosystem integrations +(`wifi-densepose-core` frame alignment, `ruvector-core` trace compression) +land behind feature flags after the core simulator is shipping. None are +required to use this crate. + +### Synthesize a scene's magnetic field at a sensor + +```rust +use nvsim::{Scene, DipoleSource, scene_field_at}; + +let mut scene = Scene::new(); +// 1 mA·m² dipole at (0,0,0.5 m) pointing along +ẑ +scene.add_dipole(DipoleSource::new([0.0, 0.0, 0.5], [0.0, 0.0, 1.0e-3])); + +// Field at the origin +let (b_tesla, near_field_flag) = scene_field_at(&scene, [0.0, 0.0, 0.0]); +println!("B = {:?} T (near-field saturated: {})", b_tesla, near_field_flag); +``` + +### Run the full sensor model + +```rust +use nvsim::{NvSensor, NvSensorConfig}; + +let sensor = NvSensor::cots_defaults(); +let b_in = [1.0e-9, 0.0, 0.0]; // 1 nT along +x̂ +let dt = 1.0e-3; // 1 ms integration +let seed = 0xCAFE_BABE; + +let reading = sensor.sample(b_in, dt, seed); +println!("recovered B = {:?}", reading.b_recovered); +println!("σ per axis = {:?} T", reading.sigma_per_axis); +println!("δB floor = {:e} T/√Hz", reading.noise_floor_t_sqrt_hz); +``` + +### Apply per-material attenuation + +```rust +use nvsim::{attenuate, LosSegment, Material}; + +let b_in = [1.0e-9, 0.0, 0.0]; +let segments = [ + LosSegment { material: Material::Air, path_m: 1.0 }, + LosSegment { material: Material::Drywall, path_m: 0.1 }, + LosSegment { material: Material::ReinforcedConcrete, path_m: 0.2 }, // raises HEAVY flag +]; +let (b_attenuated, heavy) = attenuate(b_in, &segments); +``` + +### Serialise a binary frame + +```rust +use nvsim::{MagFrame, MAG_FRAME_MAGIC}; +use nvsim::frame::flag; + +let mut f = MagFrame::empty(7); // sensor_id 7 +f.b_pt = [1500.0, -250.0, 800.0]; // pT +f.set_flag(flag::ADC_SATURATED); + +let bytes = f.to_bytes(); // 60 bytes, deterministic +let parsed = MagFrame::from_bytes(&bytes) + .expect("round-trip must succeed"); +assert_eq!(parsed, f); +``` + +## Acceptance commitments (per implementation plan §5) + +These are the four numbers `nvsim` commits to as a finished simulator: + +- **Pipeline throughput**: ≥ 1 kHz simulated samples per second of wall-clock on a Cortex-A53-class CPU. +- **Determinism**: same `(scene, seed)` produces byte-identical proof-bundle output across runs and machines. +- **Noise-floor reproduction**: simulator with shot noise OFF reproduces the analytical Biot-Savart result to ≤ 0.1% RMS. +- **Lockin SNR floor**: 1 nT @ 1 kHz vs 100 pT/√Hz floor → SNR ≥ 10 in 1 s. + +The first and last numbers come online with Pass 5/6. The middle two are +already enforced in the test suite. + +## Physics primary sources + +- Jackson, *Classical Electrodynamics* 3e (1999), §5.4–5.8 — Biot–Savart, dipole field. +- Doherty et al., *Phys. Rep.* 528, 1 (2013) — NV ground-state Hamiltonian, ODMR transition. +- Barry et al., *Rev. Mod. Phys.* 92, 015004 (2020) — NV-ensemble sensitivity, Lorentzian lineshape, T₁/T₂/T₂*, contrast and spin-count defaults. +- Wolf et al., *Phys. Rev. X* 5, 041001 (2015) — bulk-diamond pT/√Hz reference floor used as the sanity-floor test boundary. +- Cullity & Graham, *Introduction to Magnetic Materials* 2e (2009), Ch. 2 — χ_steel for ferrous-object linear-induced moment. +- Ortner & Bandeira, *SoftwareX* 11, 100466 (2020) — Magpylib reference implementation for analytic dipole / current-loop fields. + +For the full SOTA survey and the build/skip verdict, see +`docs/research/quantum-sensing/14-nv-diamond-sensor-simulator.md`. For the +six-pass implementation plan that drives the build, see +`docs/research/quantum-sensing/15-nvsim-implementation-plan.md`. + +## Limitations and out-of-scope + +Per `15-nvsim-implementation-plan.md` §6: + +- Single-NV imaging / ODMR scanning microscopy — `nvsim` is room-scale, not nm. +- Full Lindblad solver, NV-NV entanglement, photonic-crystal cavities — escalate to QuTiP if needed. +- Diamond growth / NV creation chemistry — vendor (Element Six, Adamas) handles. +- Cryogenic operation — RuView ships room-temperature; `nvsim` follows. +- Real hardware control (laser drivers, microwave sources, AOM) — `nvsim` is forward-only. +- Pulsed dynamical-decoupling sequences — defer to dedicated tooling. +- fT-floor sensitivity claims — out of COTS reach in 2026; `nvsim` commits to a pT-floor honestly. +- Inverse problems — given sensor readings, the simulator does not estimate scene parameters back. + +If your use case needs any of the above, `nvsim` is the wrong starting +point. If your use case is *forward simulation of a deterministic NV +magnetometer pipeline you can run in CI*, it is the right one. + +## WebAssembly + +`nvsim` is **WASM-ready by construction**. Zero `std::time` / `std::fs` / +`std::env` / `std::process` / `std::thread` / `Mutex` / `RwLock` calls in +the crate's source — every dependency in the tree (`serde`, `thiserror`, +`tracing`, `rand`, `rand_chacha`, `sha2`, `ndarray`) compiles cleanly to +`wasm32-unknown-unknown`. The shot-noise PRNG is seeded from a +caller-supplied `u64` so no OS-entropy bridge is needed. + +```bash +rustup target add wasm32-unknown-unknown # one-time, on the dev machine +cargo build -p nvsim --target wasm32-unknown-unknown --no-default-features +``` + +Why it matters: cluster-Pi inference, browser-side sensor demos, and +Cloudflare-Worker / Deno-deploy edge workloads can all run the +deterministic pipeline. A 28-byte `MagFrame` shape and a 32-byte SHA-256 +witness make it straightforward to ship simulator output across any +HTTP / WebSocket / IPC channel. + +## License + +MIT OR Apache-2.0 (matches workspace default). diff --git a/nvsim/nvsim-pkg/nvsim.d.ts b/nvsim/nvsim-pkg/nvsim.d.ts new file mode 100644 index 00000000..0b516990 --- /dev/null +++ b/nvsim/nvsim-pkg/nvsim.d.ts @@ -0,0 +1,116 @@ +/* tslint:disable */ +/* eslint-disable */ + +/** + * In-browser pipeline. Wraps [`Pipeline`] with JS-friendly construction + * (JSON for `Scene` and `PipelineConfig`) and `Vec` outputs (raw + * concatenated [`MagFrame`] bytes — 60 bytes/frame, magic `0xC51A_6E70`). + */ +export class WasmPipeline { + free(): void; + [Symbol.dispose](): void; + /** + * nvsim build version (semver from Cargo.toml). + */ + static buildVersion(): string; + /** + * Bytes-per-frame for v1 — `60` today; surfaced so the dashboard + * can advance its parse cursor without re-deriving the layout. + */ + static frameBytes(): number; + /** + * Magic constant for the `MagFrame` v1 binary record. The dashboard's + * hex-dump panel highlights these four bytes (`0xC51A_6E70` → `701A6EC5` + * little-endian) as a sanity check. + */ + static frameMagic(): number; + /** + * Construct from JSON strings + a `seed` (BigInt-friendly; passed in + * as `f64` since wasm-bindgen does not yet ergonomically pass `u64`, + * then bit-cast through `as u64`). The dashboard sends seeds as + * `Number(seed_hex)` from a 32-bit value to fit cleanly. + */ + constructor(scene_json: string, config_json: string, seed: number); + /** + * Run `n_samples` of the pipeline and return the concatenated raw + * `MagFrame` bytes (`n_samples * sensors * 60` bytes). The dashboard + * parses this into typed records on the main thread. + */ + run(n_samples: number): Uint8Array; + /** + * Run + SHA-256 witness in one call. Returns a JS object + * `{ frames: Uint8Array, witness: Uint8Array }`. Same + * `(scene, config, seed)` produces byte-identical `witness` across + * runs, machines, and transports — the regression dashboard pins. + */ + runWithWitness(n_samples: number): any; +} + +/** + * Expected reference witness for `Proof::REFERENCE_SCENE_JSON @ seed=42, + * N=256` — the bytes the dashboard's Verify panel compares against. + */ +export function expectedReferenceWitnessHex(): string; + +/** + * Hex-encode a 32-byte witness for display. + */ +export function hexWitness(witness: Uint8Array): string; + +/** + * Convenience: parse the bundled reference scene to JSON. Lets the + * dashboard's "load reference scene" flow round-trip through the Rust + * type system instead of duplicating the JSON literal in the JS code. + */ +export function referenceSceneJson(): string; + +/** + * Run the canonical reference pipeline (`Proof::generate`) end-to-end and + * return the SHA-256 witness as a 32-byte `Uint8Array`. This is the + * dashboard's source of truth for the Verify-witness panel. + */ +export function referenceWitness(): Uint8Array; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_wasmpipeline_free: (a: number, b: number) => void; + readonly expectedReferenceWitnessHex: (a: number) => void; + readonly hexWitness: (a: number, b: number, c: number) => void; + readonly referenceSceneJson: (a: number) => void; + readonly referenceWitness: (a: number) => void; + readonly wasmpipeline_buildVersion: (a: number) => void; + readonly wasmpipeline_frameBytes: () => number; + readonly wasmpipeline_frameMagic: () => number; + readonly wasmpipeline_new: (a: number, b: number, c: number, d: number, e: number, f: number) => void; + readonly wasmpipeline_run: (a: number, b: number, c: number) => void; + readonly wasmpipeline_runWithWitness: (a: number, b: number, c: number) => void; + readonly __wbindgen_export: (a: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_export2: (a: number, b: number, c: number) => void; + readonly __wbindgen_export3: (a: number, b: number) => number; + readonly __wbindgen_export4: (a: number, b: number, c: number, d: number) => number; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; + +/** + * Instantiates the given `module`, which can either be bytes or + * a precompiled `WebAssembly.Module`. + * + * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. + * + * @returns {InitOutput} + */ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** + * If `module_or_path` is {RequestInfo} or {URL}, makes a request and + * for everything else, calls `WebAssembly.instantiate` directly. + * + * @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. + * + * @returns {Promise} + */ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/nvsim/nvsim-pkg/nvsim.js b/nvsim/nvsim-pkg/nvsim.js new file mode 100644 index 00000000..29235e02 --- /dev/null +++ b/nvsim/nvsim-pkg/nvsim.js @@ -0,0 +1,507 @@ +/* @ts-self-types="./nvsim.d.ts" */ + +/** + * In-browser pipeline. Wraps [`Pipeline`] with JS-friendly construction + * (JSON for `Scene` and `PipelineConfig`) and `Vec` outputs (raw + * concatenated [`MagFrame`] bytes — 60 bytes/frame, magic `0xC51A_6E70`). + */ +export class WasmPipeline { + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + WasmPipelineFinalization.unregister(this); + return ptr; + } + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_wasmpipeline_free(ptr, 0); + } + /** + * nvsim build version (semver from Cargo.toml). + * @returns {string} + */ + static buildVersion() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmpipeline_buildVersion(retptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export2(deferred1_0, deferred1_1, 1); + } + } + /** + * Bytes-per-frame for v1 — `60` today; surfaced so the dashboard + * can advance its parse cursor without re-deriving the layout. + * @returns {number} + */ + static frameBytes() { + const ret = wasm.wasmpipeline_frameBytes(); + return ret >>> 0; + } + /** + * Magic constant for the `MagFrame` v1 binary record. The dashboard's + * hex-dump panel highlights these four bytes (`0xC51A_6E70` → `701A6EC5` + * little-endian) as a sanity check. + * @returns {number} + */ + static frameMagic() { + const ret = wasm.wasmpipeline_frameMagic(); + return ret >>> 0; + } + /** + * Construct from JSON strings + a `seed` (BigInt-friendly; passed in + * as `f64` since wasm-bindgen does not yet ergonomically pass `u64`, + * then bit-cast through `as u64`). The dashboard sends seeds as + * `Number(seed_hex)` from a 32-bit value to fit cleanly. + * @param {string} scene_json + * @param {string} config_json + * @param {number} seed + */ + constructor(scene_json, config_json, seed) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(scene_json, wasm.__wbindgen_export3, wasm.__wbindgen_export4); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(config_json, wasm.__wbindgen_export3, wasm.__wbindgen_export4); + const len1 = WASM_VECTOR_LEN; + wasm.wasmpipeline_new(retptr, ptr0, len0, ptr1, len1, seed); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + this.__wbg_ptr = r0 >>> 0; + WasmPipelineFinalization.register(this, this.__wbg_ptr, this); + return this; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Run `n_samples` of the pipeline and return the concatenated raw + * `MagFrame` bytes (`n_samples * sensors * 60` bytes). The dashboard + * parses this into typed records on the main thread. + * @param {number} n_samples + * @returns {Uint8Array} + */ + run(n_samples) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmpipeline_run(retptr, this.__wbg_ptr, n_samples); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export2(r0, r1 * 1, 1); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Run + SHA-256 witness in one call. Returns a JS object + * `{ frames: Uint8Array, witness: Uint8Array }`. Same + * `(scene, config, seed)` produces byte-identical `witness` across + * runs, machines, and transports — the regression dashboard pins. + * @param {number} n_samples + * @returns {any} + */ + runWithWitness(n_samples) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.wasmpipeline_runWithWitness(retptr, this.__wbg_ptr, n_samples); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} +if (Symbol.dispose) WasmPipeline.prototype[Symbol.dispose] = WasmPipeline.prototype.free; + +/** + * Expected reference witness for `Proof::REFERENCE_SCENE_JSON @ seed=42, + * N=256` — the bytes the dashboard's Verify panel compares against. + * @returns {string} + */ +export function expectedReferenceWitnessHex() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.expectedReferenceWitnessHex(retptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export2(deferred1_0, deferred1_1, 1); + } +} + +/** + * Hex-encode a 32-byte witness for display. + * @param {Uint8Array} witness + * @returns {string} + */ +export function hexWitness(witness) { + let deferred3_0; + let deferred3_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passArray8ToWasm0(witness, wasm.__wbindgen_export3); + const len0 = WASM_VECTOR_LEN; + wasm.hexWitness(retptr, ptr0, len0); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + var r3 = getDataViewMemory0().getInt32(retptr + 4 * 3, true); + var ptr2 = r0; + var len2 = r1; + if (r3) { + ptr2 = 0; len2 = 0; + throw takeObject(r2); + } + deferred3_0 = ptr2; + deferred3_1 = len2; + return getStringFromWasm0(ptr2, len2); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export2(deferred3_0, deferred3_1, 1); + } +} + +/** + * Convenience: parse the bundled reference scene to JSON. Lets the + * dashboard's "load reference scene" flow round-trip through the Rust + * type system instead of duplicating the JSON literal in the JS code. + * @returns {string} + */ +export function referenceSceneJson() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.referenceSceneJson(retptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export2(deferred1_0, deferred1_1, 1); + } +} + +/** + * Run the canonical reference pipeline (`Proof::generate`) end-to-end and + * return the SHA-256 witness as a 32-byte `Uint8Array`. This is the + * dashboard's source of truth for the Verify-witness panel. + * @returns {Uint8Array} + */ +export function referenceWitness() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.referenceWitness(retptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true); + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +function __wbg_get_imports() { + const import0 = { + __proto__: null, + __wbg___wbindgen_throw_6ddd609b62940d55: function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }, + __wbg_length_ea16607d7b61445b: function(arg0) { + const ret = getObject(arg0).length; + return ret; + }, + __wbg_new_ab79df5bd7c26067: function() { + const ret = new Object(); + return addHeapObject(ret); + }, + __wbg_new_with_length_825018a1616e9e55: function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }, + __wbg_set_7eaa4f96924fd6b3: function() { return handleError(function (arg0, arg1, arg2) { + const ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2)); + return ret; + }, arguments); }, + __wbg_set_8c0b3ffcf05d61c2: function(arg0, arg1, arg2) { + getObject(arg0).set(getArrayU8FromWasm0(arg1, arg2)); + }, + __wbindgen_cast_0000000000000001: function(arg0) { + // Cast intrinsic for `F64 -> Externref`. + const ret = arg0; + return addHeapObject(ret); + }, + __wbindgen_cast_0000000000000002: function(arg0, arg1) { + // Cast intrinsic for `Ref(String) -> Externref`. + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }, + __wbindgen_object_drop_ref: function(arg0) { + takeObject(arg0); + }, + }; + return { + __proto__: null, + "./nvsim_bg.js": import0, + }; +} + +const WasmPipelineFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_wasmpipeline_free(ptr >>> 0, 1)); + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function dropObject(idx) { + if (idx < 1028) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +let cachedDataViewMemory0 = null; +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return decodeText(ptr, len); +} + +let cachedUint8ArrayMemory0 = null; +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getObject(idx) { return heap[idx]; } + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_export(addHeapObject(e)); + } +} + +let heap = new Array(1024).fill(undefined); +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} + +function passStringToWasm0(arg, malloc, realloc) { + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = cachedTextEncoder.encodeInto(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); +cachedTextDecoder.decode(); +const MAX_SAFARI_DECODE_BYTES = 2146435072; +let numBytesDecoded = 0; +function decodeText(ptr, len) { + numBytesDecoded += len; + if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) { + cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + cachedTextDecoder.decode(); + numBytesDecoded = len; + } + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const cachedTextEncoder = new TextEncoder(); + +if (!('encodeInto' in cachedTextEncoder)) { + cachedTextEncoder.encodeInto = function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; + }; +} + +let WASM_VECTOR_LEN = 0; + +let wasmModule, wasm; +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + wasmModule = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + return wasm; +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + const validResponse = module.ok && expectedResponseType(module.type); + + if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { throw e; } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + } else { + return instance; + } + } + + function expectedResponseType(type) { + switch (type) { + case 'basic': case 'cors': case 'default': return true; + } + return false; + } +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (module !== undefined) { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + const instance = new WebAssembly.Instance(module, imports); + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (module_or_path !== undefined) { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (module_or_path === undefined) { + module_or_path = new URL('nvsim_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync, __wbg_init as default }; diff --git a/nvsim/nvsim-pkg/nvsim_bg.wasm b/nvsim/nvsim-pkg/nvsim_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..56c52ac34e9e3711e4db18a884c1dc2194f3d217 GIT binary patch literal 165315 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 tCs$U)mpw$}dC&~%YGgPJu&<-HrRxEK-Sq~G literal 0 HcmV?d00001 diff --git a/nvsim/nvsim-pkg/nvsim_bg.wasm.d.ts b/nvsim/nvsim-pkg/nvsim_bg.wasm.d.ts new file mode 100644 index 00000000..e5ef696f --- /dev/null +++ b/nvsim/nvsim-pkg/nvsim_bg.wasm.d.ts @@ -0,0 +1,19 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const __wbg_wasmpipeline_free: (a: number, b: number) => void; +export const expectedReferenceWitnessHex: (a: number) => void; +export const hexWitness: (a: number, b: number, c: number) => void; +export const referenceSceneJson: (a: number) => void; +export const referenceWitness: (a: number) => void; +export const wasmpipeline_buildVersion: (a: number) => void; +export const wasmpipeline_frameBytes: () => number; +export const wasmpipeline_frameMagic: () => number; +export const wasmpipeline_new: (a: number, b: number, c: number, d: number, e: number, f: number) => void; +export const wasmpipeline_run: (a: number, b: number, c: number) => void; +export const wasmpipeline_runWithWitness: (a: number, b: number, c: number) => void; +export const __wbindgen_export: (a: number) => void; +export const __wbindgen_add_to_stack_pointer: (a: number) => number; +export const __wbindgen_export2: (a: number, b: number, c: number) => void; +export const __wbindgen_export3: (a: number, b: number) => number; +export const __wbindgen_export4: (a: number, b: number, c: number, d: number) => number; diff --git a/nvsim/nvsim-pkg/package.json b/nvsim/nvsim-pkg/package.json new file mode 100644 index 00000000..ea4c4a02 --- /dev/null +++ b/nvsim/nvsim-pkg/package.json @@ -0,0 +1,32 @@ +{ + "name": "nvsim", + "type": "module", + "collaborators": [ + "rUv ", + "WiFi-DensePose Contributors" + ], + "description": "Deterministic NV-diamond magnetometer pipeline simulator (source -> propagation -> NV ensemble -> ADC + lockin demod)", + "version": "0.3.0", + "license": "MIT OR Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/ruvnet/wifi-densepose" + }, + "files": [ + "nvsim_bg.wasm", + "nvsim.js", + "nvsim.d.ts" + ], + "main": "nvsim.js", + "types": "nvsim.d.ts", + "sideEffects": [ + "./snippets/*" + ], + "keywords": [ + "nv-diamond", + "magnetometer", + "simulator", + "physics", + "biot-savart" + ] +} \ No newline at end of file