From 2ad6861dcec2e5d532ad96e7f5897aa18683fb3a Mon Sep 17 00:00:00 2001 From: daharoni Date: Mon, 8 Jun 2026 13:28:04 -0700 Subject: [PATCH 1/2] fix: address pre-merge audit findings (WASM drift, RLS PII, FFI panics, config, tests) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sweep across the codebase resolving the highest-priority audit items: 1. Stale WASM (critical): the committed crates/solver/pkg/ was force-added against its own `*` gitignore, so local rebuilds were invisible to git and the binary drifted ~2 months behind the Rust source. Untrack pkg/, add scripts/ensure-wasm.mjs (rebuilds only when stale) wired as pre-hooks for dev/typecheck/test/build:apps, and give both CI `check` jobs the Rust+wasm-pack toolchain so the binding is always built fresh. 2. Submission PII (high): migration 010 restricts catune/cadecon base-table SELECT to owner+admin and exposes PII-free *_public views for community browsing (omits orcid/lab_name/notes). App reads repointed to the views; writes/deletes stay on the base tables. Adds 9 RLS matrix assertions. 3. FFI panic surfaces (high): clamp simulate bins_per_frame >= 1; validate array lengths in the WASM/PyO3 kernel-estimation wrappers (throw JsError / raise PyValueError instead of aborting the module); defensive guards + debug_assert in the core. (Audit's downsample factor==0 was a false positive — already guarded.) 4. Config-overridable tuning params: CaDecon inner-loop FISTA params moved to algorithm-store signals (identical defaults); Python kernel-length 5.0 -> named constant. 5. Cleanup + coverage: broaden .gitignore (crates/*/target, crates/*/pkg, .test_data, .playwright-mcp); add worker-pool state-machine tests. No behavior change for valid inputs; WASM binding surface is byte-identical. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 23 + .github/workflows/deploy.yml | 19 + .gitignore | 8 +- apps/cadecon/src/lib/algorithm-store.ts | 21 + .../src/lib/community/cadecon-service.ts | 7 +- apps/cadecon/src/lib/iteration-manager.ts | 31 +- .../src/lib/community/catune-service.ts | 7 +- crates/solver/pkg/README.md | 98 -- crates/solver/pkg/calab_solver.d.ts | 313 ----- crates/solver/pkg/calab_solver.js | 1130 ----------------- crates/solver/pkg/calab_solver_bg.wasm | Bin 498514 -> 0 bytes crates/solver/pkg/calab_solver_bg.wasm.d.ts | 42 - crates/solver/pkg/package.json | 15 - crates/solver/src/js_indeca.rs | 22 +- crates/solver/src/kernel_est.rs | 23 +- crates/solver/src/peak_seed.rs | 19 +- crates/solver/src/py_api.rs | 14 + crates/solver/src/simulate.rs | 27 +- package.json | 6 + packages/community/src/submission-service.ts | 8 +- .../compute/src/__tests__/worker-pool.test.ts | 199 +++ python/src/calab/_bridge/_apps.py | 9 +- scripts/ensure-wasm.mjs | 67 + supabase/README.md | 9 +- .../010_restrict_submission_pii.sql | 77 ++ supabase/tests/rls/test.sql | 78 ++ 26 files changed, 640 insertions(+), 1632 deletions(-) delete mode 100644 crates/solver/pkg/README.md delete mode 100644 crates/solver/pkg/calab_solver.d.ts delete mode 100644 crates/solver/pkg/calab_solver.js delete mode 100644 crates/solver/pkg/calab_solver_bg.wasm delete mode 100644 crates/solver/pkg/calab_solver_bg.wasm.d.ts delete mode 100644 crates/solver/pkg/package.json create mode 100644 packages/compute/src/__tests__/worker-pool.test.ts create mode 100644 scripts/ensure-wasm.mjs create mode 100644 supabase/migrations/010_restrict_submission_pii.sql diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a72623a..f567db95 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,29 @@ jobs: - run: npm ci + # The wasm-pack output (crates/solver/pkg/) is build-only and gitignored, + # so it must be built here before typecheck/test/build consume it. This is + # the single source of truth for the WASM binding surface — building it in + # CI is what prevents the binary from silently drifting from the Rust + # source (the previous, committed-and-stale failure mode). + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable (2026-04-15) + with: + targets: wasm32-unknown-unknown + + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + with: + workspaces: 'crates/solver -> target' + + - name: Install wasm-pack + uses: taiki-e/install-action@e49978b799e49ff429d162b7a30601a569ab6538 # v2.81.1 + with: + tool: wasm-pack@0.13.1 + + - name: Build WASM + run: npm run build:wasm + - name: Cache build artifacts uses: actions/cache@v5 with: diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b61bbe50..22ad9363 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -33,6 +33,25 @@ jobs: - run: npm ci + # pkg/ is build-only/gitignored — build it before typecheck/test consume it. + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable (2026-04-15) + with: + targets: wasm32-unknown-unknown + + - name: Cache Rust dependencies + uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 + with: + workspaces: 'crates/solver -> target' + + - name: Install wasm-pack + uses: taiki-e/install-action@e49978b799e49ff429d162b7a30601a569ab6538 # v2.81.1 + with: + tool: wasm-pack@0.13.1 + + - name: Build WASM + run: npm run build:wasm + - name: Format check run: npm run format:check diff --git a/.gitignore b/.gitignore index 0b8eea3d..024aaa6e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,14 @@ apps/*/dist/ packages/*/dist/ *.tsbuildinfo .vite/ -crates/solver/target/ +# Rust build output and wasm-pack artifacts are build-only — never committed. +# (`crates/*/target` covers solver and any future crate; `pkg/` is the +# wasm-pack output, rebuilt by scripts/ensure-wasm.mjs.) +crates/*/target/ +crates/*/pkg/ test/ +.test_data/ +.playwright-mcp/ .env .env.local .claude/ diff --git a/apps/cadecon/src/lib/algorithm-store.ts b/apps/cadecon/src/lib/algorithm-store.ts index 82ffc4a0..ffb28df1 100644 --- a/apps/cadecon/src/lib/algorithm-store.ts +++ b/apps/cadecon/src/lib/algorithm-store.ts @@ -9,6 +9,17 @@ const [lpFilterEnabled, setLpFilterEnabled] = createSignal(false); const [maxIterations, setMaxIterations] = createSignal(20); const [convergenceTol, setConvergenceTol] = createSignal(0.01); +// Inner-loop solver parameters. These directly affect deconvolution output, so +// they are configurable (not hardcoded) and travel with the run; defaults match +// the previously hardcoded values. Per-trace FISTA: +const [traceFistaMaxIters, setTraceFistaMaxIters] = createSignal(500); +const [traceFistaTol, setTraceFistaTol] = createSignal(1e-4); +// Per-subset free-form kernel estimation FISTA: +const [kernelFistaMaxIters, setKernelFistaMaxIters] = createSignal(200); +const [kernelFistaTol, setKernelFistaTol] = createSignal(1e-4); +// TV-L1 smoothness penalty for kernel estimation (0 = no smoothness): +const [kernelSmoothLambda, setKernelSmoothLambda] = createSignal(0); + // --- Derived --- const upsampleFactor = createMemo(() => { @@ -28,5 +39,15 @@ export { setMaxIterations, convergenceTol, setConvergenceTol, + traceFistaMaxIters, + setTraceFistaMaxIters, + traceFistaTol, + setTraceFistaTol, + kernelFistaMaxIters, + setKernelFistaMaxIters, + kernelFistaTol, + setKernelFistaTol, + kernelSmoothLambda, + setKernelSmoothLambda, upsampleFactor, }; diff --git a/apps/cadecon/src/lib/community/cadecon-service.ts b/apps/cadecon/src/lib/community/cadecon-service.ts index 8b497e2a..60c0ed1d 100644 --- a/apps/cadecon/src/lib/community/cadecon-service.ts +++ b/apps/cadecon/src/lib/community/cadecon-service.ts @@ -3,7 +3,12 @@ import { createSubmissionService } from '@calab/community'; import type { CadeconSubmission } from './types.ts'; -const service = createSubmissionService('cadecon_submissions'); +// Reads go through the PII-free public view (migration 010); writes/deletes +// target the base table under owner-scoped RLS. +const service = createSubmissionService( + 'cadecon_submissions', + 'cadecon_submissions_public', +); export const submitParameters = service.submit; export const fetchSubmissions = service.fetch; diff --git a/apps/cadecon/src/lib/iteration-manager.ts b/apps/cadecon/src/lib/iteration-manager.ts index 6bc1ee78..e3276e29 100644 --- a/apps/cadecon/src/lib/iteration-manager.ts +++ b/apps/cadecon/src/lib/iteration-manager.ts @@ -40,6 +40,11 @@ import { convergenceTol, hpFilterEnabled, lpFilterEnabled, + traceFistaMaxIters, + traceFistaTol, + kernelFistaMaxIters, + kernelFistaTol, + kernelSmoothLambda, } from './algorithm-store.ts'; import { parsedData, @@ -54,15 +59,9 @@ import { dataIndex } from './data-utils.ts'; import { median } from './math-utils.ts'; import { reconvolveAR2 } from './reconvolve.ts'; -/** Per-trace FISTA solver parameters (shared between subset and finalization passes). */ -const TRACE_FISTA_MAX_ITERS = 500; -const TRACE_FISTA_TOL = 1e-4; - -/** Per-subset kernel estimation solver parameters. */ -const KERNEL_FISTA_MAX_ITERS = 200; -const KERNEL_FISTA_TOL = 1e-4; -/** TV-L1 smoothness penalty for free-form kernel estimation. */ -const KERNEL_SMOOTH_LAMBDA = 0; +// Per-trace and per-kernel FISTA solver parameters are configurable via +// algorithm-store (traceFistaMaxIters/Tol, kernelFistaMaxIters/Tol, +// kernelSmoothLambda) so they are overridable and recorded with the run. /** Number of early free-kernel samples to skip in bi-exponential fitting. */ export const BIEXP_FIT_SKIP = 0; @@ -269,10 +268,10 @@ function dispatchKernelJobs( baselines, kernelLength, fs, - maxIters: KERNEL_FISTA_MAX_ITERS, - tol: KERNEL_FISTA_TOL, + maxIters: kernelFistaMaxIters(), + tol: kernelFistaTol(), refine: true, - smoothLambda: KERNEL_SMOOTH_LAMBDA, + smoothLambda: kernelSmoothLambda(), biexpSkip: BIEXP_FIT_SKIP, warmKernel, warmBiexp, @@ -512,8 +511,8 @@ export async function startRun(): Promise { tauD, fs, upFactor, - TRACE_FISTA_MAX_ITERS, - TRACE_FISTA_TOL, + traceFistaMaxIters(), + traceFistaTol(), hpOn, lpOn, sparsityLambda, @@ -793,8 +792,8 @@ export async function startRun(): Promise { tauDecay: tauD, fs, upsampleFactor: upFactor, - maxIters: TRACE_FISTA_MAX_ITERS, - tol: TRACE_FISTA_TOL, + maxIters: traceFistaMaxIters(), + tol: traceFistaTol(), hpEnabled: hpOn, lpEnabled: lpOn, lambda: sparsityLambda, diff --git a/apps/catune/src/lib/community/catune-service.ts b/apps/catune/src/lib/community/catune-service.ts index 3e906658..2005ccfa 100644 --- a/apps/catune/src/lib/community/catune-service.ts +++ b/apps/catune/src/lib/community/catune-service.ts @@ -3,7 +3,12 @@ import { createSubmissionService } from '@calab/community'; import type { CatuneSubmission } from './types.ts'; -const service = createSubmissionService('catune_submissions'); +// Reads go through the PII-free public view (migration 010); writes/deletes +// target the base table under owner-scoped RLS. +const service = createSubmissionService( + 'catune_submissions', + 'catune_submissions_public', +); export const submitParameters = service.submit; export const fetchSubmissions = service.fetch; diff --git a/crates/solver/pkg/README.md b/crates/solver/pkg/README.md deleted file mode 100644 index a362fb95..00000000 --- a/crates/solver/pkg/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# calab-solver - -Rust FISTA deconvolution solver with dual WASM/PyO3 targets. - -## Overview - -This crate implements the FISTA (Fast Iterative Shrinkage-Thresholding Algorithm) solver used by CaTune for calcium trace deconvolution. It is compiled to WebAssembly via `wasm-pack` and runs in Web Workers in the browser. The compiled output in `pkg/` is committed to the repository so that CI and development do not require a Rust toolchain. - -## Algorithm - -The solver minimizes the following objective with a non-negativity constraint: - -``` -minimize (1/2)||y - K·s - b||² + λ·G_dc·||s||₁ subject to s ≥ 0 -``` - -| Symbol | Meaning | -| ------ | ------------------------------------------------------------------------------------------ | -| `y` | Input fluorescence trace | -| `K` | Convolution matrix from double-exponential kernel | -| `s` | Deconvolved activity (output) | -| `b` | Scalar baseline, estimated jointly as `mean(y - K·s)` | -| `λ` | Sparsity penalty (user-adjustable) | -| `G_dc` | Kernel DC gain `Σh`, scales λ so the sparsity slider is effective across all kernel shapes | - -**Kernel:** `h(t) = exp(-t/τ_decay) - exp(-t/τ_rise)`, normalized to peak = 1.0. Length extends until the decay envelope drops below 1e-6 of peak. - -**FISTA iteration:** Standard Beck & Teboulle (2009) with momentum extrapolation. Step size is `1/L` where `L` (Lipschitz constant) = max|H(ω)|² computed via DFT of the kernel. - -**Adaptive restart:** O'Donoghue & Candes (2015) gradient-mapping criterion — resets momentum to `t = 1` when the proximal step undoes the momentum direction. - -**Convergence:** Primal residual criterion `||x_{k+1} - x_k|| / ||x_k|| < 1e-6` after iteration 5. This avoids an expensive forward convolution + objective evaluation per iteration. - -## Modules - -| Module | Description | -| ----------- | ------------------------------------------------------------------------------------------------------------------------ | -| `lib.rs` | `Solver` struct — public wasm-bindgen API, parameter management, state serialization, bandpass filter methods | -| `kernel.rs` | `build_kernel` (double-exponential), `compute_lipschitz` (spectral bound via DFT) | -| `fista.rs` | `step_batch` — FISTA iteration loop with FFT convolutions, adaptive restart, convergence check | -| `fft.rs` | `FftConvolver` — self-contained FFT convolution engine with pre-computed kernel spectrum, forward and adjoint operations | -| `filter.rs` | `BandpassFilter` — FFT-based bandpass filter derived from kernel time constants, cosine-tapered transitions | - -## Public API - -Methods exposed to JavaScript via `wasm-bindgen`: - -| Method | Description | -| -------------------------------------------------- | ------------------------------------------------------------------------------- | -| `new()` | Create solver with default parameters (τ_rise=0.02, τ_decay=0.4, λ=0.01, fs=30) | -| `set_params(tau_rise, tau_decay, lambda, fs)` | Update parameters and rebuild kernel | -| `set_trace(trace)` | Load a trace, grow buffers if needed, reset iteration state | -| `step_batch(n_steps)` | Run N FISTA iterations, return true if converged | -| `get_solution()` | Get deconvolved activity (owned copy) | -| `get_reconvolution()` | Get K·s (lazy-computed, owned copy) | -| `get_reconvolution_with_baseline()` | Get K·s + b (owned copy) | -| `get_baseline()` | Get estimated scalar baseline | -| `get_trace()` | Get current trace (may be filtered) | -| `converged()` | Check convergence flag | -| `iteration_count()` | Get iteration count | -| `reset_momentum()` | Reset FISTA momentum for warm-start after kernel change | -| `export_state()` / `load_state(state)` | Serialize/restore solver state for warm-start cache | -| `set_filter_enabled(enabled)` / `filter_enabled()` | Toggle bandpass filter | -| `apply_filter()` | Apply bandpass filter to loaded trace | -| `get_power_spectrum()` | Get \|FFT\|² of current trace | -| `get_spectrum_frequencies()` | Get frequency axis in Hz | -| `get_filter_cutoffs()` | Get [f_hp, f_lp] cutoff frequencies | - -## Build - -```bash -cd crates/solver -wasm-pack build --target web --release -``` - -Output goes to `pkg/` which is committed to the repository. You only need to rebuild when modifying the solver Rust source. - -From the repo root: - -```bash -npm run build:wasm -``` - -## Performance - -- **Pre-allocated buffers** — grow but never shrink to prevent WASM memory fragmentation -- **f32 precision** — halves memory per worker compared to f64 (Lipschitz constant computed in f64 for step-size accuracy) -- **FFT convolution** — O(n log n) via `realfft`/`rustfft` for both forward and adjoint operations -- **Release profile** — `opt-level = 3`, LTO, single codegen unit, wasm-opt with bulk-memory - -## Dependencies - -| Crate | Purpose | -| -------------------------- | ------------------------------------------ | -| `wasm-bindgen` | JavaScript interop | -| `console_error_panic_hook` | Readable panic messages in browser console | -| `realfft` | Real-valued FFT (wraps rustfft) | -| `rustfft` | FFT computation | diff --git a/crates/solver/pkg/calab_solver.d.ts b/crates/solver/pkg/calab_solver.d.ts deleted file mode 100644 index 436961a4..00000000 --- a/crates/solver/pkg/calab_solver.d.ts +++ /dev/null @@ -1,313 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ - -/** - * Constraint type for the proximal step. - */ -export enum Constraint { - /** - * Current: max(0, z - threshold) — L1 + non-negativity. - */ - NonNegative = 0, - /** - * InDeCa Eq. 3: clamp(z, 0, 1) — box constraint, no L1 penalty. - */ - Box01 = 1, -} - -/** - * Convolution mode for forward/adjoint operations in FISTA. - */ -export enum ConvMode { - /** - * FFT-based O(T log T) per call — the original implementation. - */ - Fft = 0, - /** - * Banded AR(2) recursion O(T) per call — faster for long traces. - */ - BandedAR2 = 1, -} - -/** - * FISTA solver for calcium deconvolution. - * - * Minimizes (1/2)||y - K*s - b||^2 + lambda*G_dc*||s||_1 subject to s >= 0, - * where K is the convolution matrix derived from a double-exponential kernel, - * b is a scalar baseline estimated jointly, and G_dc = sum(K) scales lambda - * so the sparsity slider is effective across all kernel configurations. - * - * Pre-allocated buffers grow but never shrink to prevent WASM memory fragmentation. - */ -export class Solver { - free(): void; - [Symbol.dispose](): void; - /** - * Apply bandpass filter to the active trace region. Returns true if filtering was applied. - * - * Sets `self.filtered = true` only when HP is active, because HP removes DC and - * baseline estimation should be skipped. LP-only preserves DC, so baseline - * estimation must still run. - */ - apply_filter(): boolean; - /** - * Returns whether the solver has converged. - */ - converged(): boolean; - /** - * Serialize solver state for warm-start cache. - * Format: [active_len (u32)] [t_fista (f64)] [iteration (u32)] [baseline (f64)] [solution f32...] [solution_prev f32...] - */ - export_state(): Uint8Array; - filter_enabled(): boolean; - /** - * Returns the estimated scalar baseline (EMA-smoothed for stable display). - * Lazily computes reconvolution if stale, to ensure the EMA is up to date. - */ - get_baseline(): number; - /** - * Get filter cutoff frequencies as [f_hp, f_lp]. - */ - get_filter_cutoffs(): Float32Array; - /** - * Returns a copy of the kernel. - * - * Returns `Vec` which wasm-bindgen copies into a JS-owned `Float32Array`. - * A WASM memory view would be unsound here: any subsequent WASM allocation - * (e.g. `set_trace`) can grow the memory and invalidate the view. The JS side - * also transfers these buffers via `postMessage`, which requires ownership. - */ - get_kernel(): Float32Array; - /** - * Get the power spectrum of the current trace (N/2+1 bins). - */ - get_power_spectrum(): Float32Array; - /** - * Returns the reconvolution (K * solution) for the active region. - * Computes the reconvolution lazily if it is stale (not computed during iteration). - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - */ - get_reconvolution(): Float32Array; - /** - * Returns reconvolution with baseline added: K*s + b for the active region. - * Computes the reconvolution lazily if it is stale. - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - */ - get_reconvolution_with_baseline(): Float32Array; - /** - * Returns the current solution (spike train) for the active region. - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - */ - get_solution(): Float32Array; - /** - * Get frequency axis in Hz for the spectrum bins. - */ - get_spectrum_frequencies(): Float32Array; - /** - * Returns the current trace for the active region. - * After apply_filter(), this contains the filtered trace. - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - */ - get_trace(): Float32Array; - /** - * Returns the current iteration count. - */ - iteration_count(): number; - /** - * Load warm-start state. If state is empty or wrong size, performs cold-start (zero solution). - */ - load_state(state: Uint8Array): void; - /** - * Create a new Solver with default parameters. - */ - constructor(); - /** - * Reset FISTA momentum. Used for warm-start after kernel change. - * Sets t_fista = 1.0 and copies solution into solution_prev. - */ - reset_momentum(): void; - /** - * Set the constraint type (NonNegative or Box01). - */ - set_constraint(c: Constraint): void; - /** - * Set the convolution mode (FFT or BandedAR2). - * Recomputes the Lipschitz constant for the selected mode. - * Does NOT reset solution/iteration state — warm-start is preserved. - */ - set_conv_mode(mode: ConvMode): void; - /** - * Convenience: set both HP and LP together (used by CaTune's single toggle). - */ - set_filter_enabled(enabled: boolean): void; - set_hp_filter_enabled(enabled: boolean): void; - set_lp_filter_enabled(enabled: boolean): void; - /** - * Update solver parameters and rebuild kernel. - */ - set_params(tau_rise: number, tau_decay: number, lambda: number, fs: number): void; - /** - * Load a trace for deconvolution. Grows buffers if needed (never shrinks). - * Resets iteration state for a fresh solve. - */ - set_trace(trace: Float32Array): void; - /** - * Run n_steps of FISTA iterations. Returns true if converged. - * - * Uses the standard Beck & Teboulle FISTA with two sequences: - * - x_k (solution): the proximal update point - * - y_k (solution_prev used as extrapolated point): where gradient is evaluated - * - * The algorithm evaluates the gradient at the extrapolated point y_k, takes - * the proximal step to get x_{k+1}, then extrapolates to get y_{k+1}. - * - * Includes adaptive restart (O'Donoghue & Candes 2015): when the gradient-mapping - * criterion detects momentum is hurting progress, reset to avoid oscillation. - * - * Uses FFT-based O(n log n) convolutions instead of time-domain O(n*k), and - * primal residual convergence criterion to eliminate one convolution per iteration. - */ - step_batch(n_steps: number): boolean; - /** - * Subtract a rolling-percentile baseline from the active trace. - * - * Brings the trace floor to ~0, removing slow baseline drift while - * preserving positive-going calcium transients. After subtraction the - * baseline is ~0 so FISTA baseline estimation can be skipped (same - * rationale as when HP removes DC). - */ - subtract_baseline(): void; -} - -/** - * Get all built-in simulation preset names and their configs. - * - * Returns: JsValue containing Vec<(name, SimulationConfig)>. - */ -export function get_simulation_presets(): any; - -/** - * Compute the upsample factor for a given sampling rate and target rate. - */ -export function indeca_compute_upsample_factor(fs: number, target_fs: number): number; - -/** - * Estimate a free-form kernel from multiple traces and their spike trains. - * - * `warm_kernel`: optional kernel from a previous iteration. Pass an empty slice - * for cold-start. - * - * Returns the estimated kernel as Float32Array (via Vec). - */ -export function indeca_estimate_kernel(traces_flat: Float32Array, spikes_flat: Float32Array, trace_lengths: Uint32Array, alphas: Float64Array, baselines: Float64Array, kernel_length: number, max_iters: number, tol: number, warm_kernel: Float32Array, smooth_lambda: number): Float32Array; - -/** - * Fit a bi-exponential model to a free-form kernel. - * - * Warm-start: pass `use_warm=true` and the previous result's fields to add - * the previous result as an additional refined candidate alongside the cold - * grid search. This gives faster convergence when the kernel evolves smoothly. - * Pass `use_warm=false` (and any values for warm_* fields) for cold-start only. - * - * Returns a JsValue containing the serialized BiexpResult: - * { tau_rise, tau_decay, beta, residual, tau_rise_fast, tau_decay_fast, beta_fast } - */ -export function indeca_fit_biexponential(h_free: Float32Array, fs: number, refine: boolean, skip: number, warm_tau_rise: number, warm_tau_decay: number, warm_tau_rise_fast: number, warm_tau_decay_fast: number, warm_beta: number, warm_beta_fast: number, warm_residual: number, use_warm: boolean): any; - -/** - * Solve a single trace using the InDeCa pipeline. - * - * `warm_counts`: optional spike counts from a previous iteration at the original - * sampling rate. Pass an empty slice for cold-start. - * - * Returns a JsValue containing the serialized InDecaResult: - * { s_counts, alpha, baseline, threshold, pve, iterations, converged } - */ -export function indeca_solve_trace(trace: Float32Array, tau_r: number, tau_d: number, fs: number, upsample_factor: number, max_iters: number, tol: number, hp_enabled: boolean, lp_enabled: boolean, warm_counts: Float32Array, lambda: number): any; - -/** - * Run peak-seeded spike detection on a single trace. - * - * Returns a JsValue containing the serialized SeedTraceResult: - * { s_counts, alpha, baseline } - */ -export function seed_trace(trace: Float32Array, fs: number): any; - -/** - * Generate synthetic calcium traces from a config object. - * - * Accepts: JsValue containing a SimulationConfig-shaped object. - * Returns: JsValue containing a SimulationResult-shaped object. - */ -export function simulate_traces(config_js: any): any; - -export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; - -export interface InitOutput { - readonly memory: WebAssembly.Memory; - readonly __wbg_solver_free: (a: number, b: number) => void; - readonly get_simulation_presets: () => number; - readonly indeca_compute_upsample_factor: (a: number, b: number) => number; - readonly indeca_estimate_kernel: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number) => void; - readonly indeca_fit_biexponential: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number) => number; - readonly indeca_solve_trace: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number) => number; - readonly seed_trace: (a: number, b: number, c: number) => number; - readonly simulate_traces: (a: number) => number; - readonly solver_apply_filter: (a: number) => number; - readonly solver_converged: (a: number) => number; - readonly solver_export_state: (a: number, b: number) => void; - readonly solver_filter_enabled: (a: number) => number; - readonly solver_get_baseline: (a: number) => number; - readonly solver_get_filter_cutoffs: (a: number, b: number) => void; - readonly solver_get_kernel: (a: number, b: number) => void; - readonly solver_get_power_spectrum: (a: number, b: number) => void; - readonly solver_get_reconvolution: (a: number, b: number) => void; - readonly solver_get_reconvolution_with_baseline: (a: number, b: number) => void; - readonly solver_get_solution: (a: number, b: number) => void; - readonly solver_get_spectrum_frequencies: (a: number, b: number) => void; - readonly solver_get_trace: (a: number, b: number) => void; - readonly solver_iteration_count: (a: number) => number; - readonly solver_load_state: (a: number, b: number, c: number) => void; - readonly solver_new: () => number; - readonly solver_reset_momentum: (a: number) => void; - readonly solver_set_constraint: (a: number, b: number) => void; - readonly solver_set_conv_mode: (a: number, b: number) => void; - readonly solver_set_filter_enabled: (a: number, b: number) => void; - readonly solver_set_hp_filter_enabled: (a: number, b: number) => void; - readonly solver_set_lp_filter_enabled: (a: number, b: number) => void; - readonly solver_set_params: (a: number, b: number, c: number, d: number, e: number) => void; - readonly solver_set_trace: (a: number, b: number, c: number) => void; - readonly solver_step_batch: (a: number, b: number) => number; - readonly solver_subtract_baseline: (a: number) => void; - readonly __wbindgen_export: (a: number, b: number) => number; - readonly __wbindgen_export2: (a: number, b: number, c: number, d: number) => number; - readonly __wbindgen_export3: (a: number) => void; - readonly __wbindgen_export4: (a: number, b: number, c: number) => void; - readonly __wbindgen_add_to_stack_pointer: (a: 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/crates/solver/pkg/calab_solver.js b/crates/solver/pkg/calab_solver.js deleted file mode 100644 index 9e78bb07..00000000 --- a/crates/solver/pkg/calab_solver.js +++ /dev/null @@ -1,1130 +0,0 @@ -/* @ts-self-types="./calab_solver.d.ts" */ - -/** - * Constraint type for the proximal step. - * @enum {0 | 1} - */ -export const Constraint = Object.freeze({ - /** - * Current: max(0, z - threshold) — L1 + non-negativity. - */ - NonNegative: 0, "0": "NonNegative", - /** - * InDeCa Eq. 3: clamp(z, 0, 1) — box constraint, no L1 penalty. - */ - Box01: 1, "1": "Box01", -}); - -/** - * Convolution mode for forward/adjoint operations in FISTA. - * @enum {0 | 1} - */ -export const ConvMode = Object.freeze({ - /** - * FFT-based O(T log T) per call — the original implementation. - */ - Fft: 0, "0": "Fft", - /** - * Banded AR(2) recursion O(T) per call — faster for long traces. - */ - BandedAR2: 1, "1": "BandedAR2", -}); - -/** - * FISTA solver for calcium deconvolution. - * - * Minimizes (1/2)||y - K*s - b||^2 + lambda*G_dc*||s||_1 subject to s >= 0, - * where K is the convolution matrix derived from a double-exponential kernel, - * b is a scalar baseline estimated jointly, and G_dc = sum(K) scales lambda - * so the sparsity slider is effective across all kernel configurations. - * - * Pre-allocated buffers grow but never shrink to prevent WASM memory fragmentation. - */ -export class Solver { - __destroy_into_raw() { - const ptr = this.__wbg_ptr; - this.__wbg_ptr = 0; - SolverFinalization.unregister(this); - return ptr; - } - free() { - const ptr = this.__destroy_into_raw(); - wasm.__wbg_solver_free(ptr, 0); - } - /** - * Apply bandpass filter to the active trace region. Returns true if filtering was applied. - * - * Sets `self.filtered = true` only when HP is active, because HP removes DC and - * baseline estimation should be skipped. LP-only preserves DC, so baseline - * estimation must still run. - * @returns {boolean} - */ - apply_filter() { - const ret = wasm.solver_apply_filter(this.__wbg_ptr); - return ret !== 0; - } - /** - * Returns whether the solver has converged. - * @returns {boolean} - */ - converged() { - const ret = wasm.solver_converged(this.__wbg_ptr); - return ret !== 0; - } - /** - * Serialize solver state for warm-start cache. - * Format: [active_len (u32)] [t_fista (f64)] [iteration (u32)] [baseline (f64)] [solution f32...] [solution_prev f32...] - * @returns {Uint8Array} - */ - export_state() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_export_state(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayU8FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 1, 1); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * @returns {boolean} - */ - filter_enabled() { - const ret = wasm.solver_filter_enabled(this.__wbg_ptr); - return ret !== 0; - } - /** - * Returns the estimated scalar baseline (EMA-smoothed for stable display). - * Lazily computes reconvolution if stale, to ensure the EMA is up to date. - * @returns {number} - */ - get_baseline() { - const ret = wasm.solver_get_baseline(this.__wbg_ptr); - return ret; - } - /** - * Get filter cutoff frequencies as [f_hp, f_lp]. - * @returns {Float32Array} - */ - get_filter_cutoffs() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_filter_cutoffs(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Returns a copy of the kernel. - * - * Returns `Vec` which wasm-bindgen copies into a JS-owned `Float32Array`. - * A WASM memory view would be unsound here: any subsequent WASM allocation - * (e.g. `set_trace`) can grow the memory and invalidate the view. The JS side - * also transfers these buffers via `postMessage`, which requires ownership. - * @returns {Float32Array} - */ - get_kernel() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_kernel(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Get the power spectrum of the current trace (N/2+1 bins). - * @returns {Float32Array} - */ - get_power_spectrum() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_power_spectrum(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Returns the reconvolution (K * solution) for the active region. - * Computes the reconvolution lazily if it is stale (not computed during iteration). - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - * @returns {Float32Array} - */ - get_reconvolution() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_reconvolution(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Returns reconvolution with baseline added: K*s + b for the active region. - * Computes the reconvolution lazily if it is stale. - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - * @returns {Float32Array} - */ - get_reconvolution_with_baseline() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_reconvolution_with_baseline(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Returns the current solution (spike train) for the active region. - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - * @returns {Float32Array} - */ - get_solution() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_solution(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Get frequency axis in Hz for the spectrum bins. - * @returns {Float32Array} - */ - get_spectrum_frequencies() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_spectrum_frequencies(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Returns the current trace for the active region. - * After apply_filter(), this contains the filtered trace. - * - * See `get_kernel` for why this returns an owned copy rather than a memory view. - * @returns {Float32Array} - */ - get_trace() { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.solver_get_trace(retptr, this.__wbg_ptr); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v1 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v1; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } - } - /** - * Returns the current iteration count. - * @returns {number} - */ - iteration_count() { - const ret = wasm.solver_iteration_count(this.__wbg_ptr); - return ret >>> 0; - } - /** - * Load warm-start state. If state is empty or wrong size, performs cold-start (zero solution). - * @param {Uint8Array} state - */ - load_state(state) { - const ptr0 = passArray8ToWasm0(state, wasm.__wbindgen_export); - const len0 = WASM_VECTOR_LEN; - wasm.solver_load_state(this.__wbg_ptr, ptr0, len0); - } - /** - * Create a new Solver with default parameters. - */ - constructor() { - const ret = wasm.solver_new(); - this.__wbg_ptr = ret >>> 0; - SolverFinalization.register(this, this.__wbg_ptr, this); - return this; - } - /** - * Reset FISTA momentum. Used for warm-start after kernel change. - * Sets t_fista = 1.0 and copies solution into solution_prev. - */ - reset_momentum() { - wasm.solver_reset_momentum(this.__wbg_ptr); - } - /** - * Set the constraint type (NonNegative or Box01). - * @param {Constraint} c - */ - set_constraint(c) { - wasm.solver_set_constraint(this.__wbg_ptr, c); - } - /** - * Set the convolution mode (FFT or BandedAR2). - * Recomputes the Lipschitz constant for the selected mode. - * Does NOT reset solution/iteration state — warm-start is preserved. - * @param {ConvMode} mode - */ - set_conv_mode(mode) { - wasm.solver_set_conv_mode(this.__wbg_ptr, mode); - } - /** - * Convenience: set both HP and LP together (used by CaTune's single toggle). - * @param {boolean} enabled - */ - set_filter_enabled(enabled) { - wasm.solver_set_filter_enabled(this.__wbg_ptr, enabled); - } - /** - * @param {boolean} enabled - */ - set_hp_filter_enabled(enabled) { - wasm.solver_set_hp_filter_enabled(this.__wbg_ptr, enabled); - } - /** - * @param {boolean} enabled - */ - set_lp_filter_enabled(enabled) { - wasm.solver_set_lp_filter_enabled(this.__wbg_ptr, enabled); - } - /** - * Update solver parameters and rebuild kernel. - * @param {number} tau_rise - * @param {number} tau_decay - * @param {number} lambda - * @param {number} fs - */ - set_params(tau_rise, tau_decay, lambda, fs) { - wasm.solver_set_params(this.__wbg_ptr, tau_rise, tau_decay, lambda, fs); - } - /** - * Load a trace for deconvolution. Grows buffers if needed (never shrinks). - * Resets iteration state for a fresh solve. - * @param {Float32Array} trace - */ - set_trace(trace) { - const ptr0 = passArrayF32ToWasm0(trace, wasm.__wbindgen_export); - const len0 = WASM_VECTOR_LEN; - wasm.solver_set_trace(this.__wbg_ptr, ptr0, len0); - } - /** - * Run n_steps of FISTA iterations. Returns true if converged. - * - * Uses the standard Beck & Teboulle FISTA with two sequences: - * - x_k (solution): the proximal update point - * - y_k (solution_prev used as extrapolated point): where gradient is evaluated - * - * The algorithm evaluates the gradient at the extrapolated point y_k, takes - * the proximal step to get x_{k+1}, then extrapolates to get y_{k+1}. - * - * Includes adaptive restart (O'Donoghue & Candes 2015): when the gradient-mapping - * criterion detects momentum is hurting progress, reset to avoid oscillation. - * - * Uses FFT-based O(n log n) convolutions instead of time-domain O(n*k), and - * primal residual convergence criterion to eliminate one convolution per iteration. - * @param {number} n_steps - * @returns {boolean} - */ - step_batch(n_steps) { - const ret = wasm.solver_step_batch(this.__wbg_ptr, n_steps); - return ret !== 0; - } - /** - * Subtract a rolling-percentile baseline from the active trace. - * - * Brings the trace floor to ~0, removing slow baseline drift while - * preserving positive-going calcium transients. After subtraction the - * baseline is ~0 so FISTA baseline estimation can be skipped (same - * rationale as when HP removes DC). - */ - subtract_baseline() { - wasm.solver_subtract_baseline(this.__wbg_ptr); - } -} -if (Symbol.dispose) Solver.prototype[Symbol.dispose] = Solver.prototype.free; - -/** - * Get all built-in simulation preset names and their configs. - * - * Returns: JsValue containing Vec<(name, SimulationConfig)>. - * @returns {any} - */ -export function get_simulation_presets() { - const ret = wasm.get_simulation_presets(); - return takeObject(ret); -} - -/** - * Compute the upsample factor for a given sampling rate and target rate. - * @param {number} fs - * @param {number} target_fs - * @returns {number} - */ -export function indeca_compute_upsample_factor(fs, target_fs) { - const ret = wasm.indeca_compute_upsample_factor(fs, target_fs); - return ret >>> 0; -} - -/** - * Estimate a free-form kernel from multiple traces and their spike trains. - * - * `warm_kernel`: optional kernel from a previous iteration. Pass an empty slice - * for cold-start. - * - * Returns the estimated kernel as Float32Array (via Vec). - * @param {Float32Array} traces_flat - * @param {Float32Array} spikes_flat - * @param {Uint32Array} trace_lengths - * @param {Float64Array} alphas - * @param {Float64Array} baselines - * @param {number} kernel_length - * @param {number} max_iters - * @param {number} tol - * @param {Float32Array} warm_kernel - * @param {number} smooth_lambda - * @returns {Float32Array} - */ -export function indeca_estimate_kernel(traces_flat, spikes_flat, trace_lengths, alphas, baselines, kernel_length, max_iters, tol, warm_kernel, smooth_lambda) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - const ptr0 = passArrayF32ToWasm0(traces_flat, wasm.__wbindgen_export); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passArrayF32ToWasm0(spikes_flat, wasm.__wbindgen_export); - const len1 = WASM_VECTOR_LEN; - const ptr2 = passArray32ToWasm0(trace_lengths, wasm.__wbindgen_export); - const len2 = WASM_VECTOR_LEN; - const ptr3 = passArrayF64ToWasm0(alphas, wasm.__wbindgen_export); - const len3 = WASM_VECTOR_LEN; - const ptr4 = passArrayF64ToWasm0(baselines, wasm.__wbindgen_export); - const len4 = WASM_VECTOR_LEN; - const ptr5 = passArrayF32ToWasm0(warm_kernel, wasm.__wbindgen_export); - const len5 = WASM_VECTOR_LEN; - wasm.indeca_estimate_kernel(retptr, ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3, ptr4, len4, kernel_length, max_iters, tol, ptr5, len5, smooth_lambda); - var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); - var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); - var v7 = getArrayF32FromWasm0(r0, r1).slice(); - wasm.__wbindgen_export4(r0, r1 * 4, 4); - return v7; - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); - } -} - -/** - * Fit a bi-exponential model to a free-form kernel. - * - * Warm-start: pass `use_warm=true` and the previous result's fields to add - * the previous result as an additional refined candidate alongside the cold - * grid search. This gives faster convergence when the kernel evolves smoothly. - * Pass `use_warm=false` (and any values for warm_* fields) for cold-start only. - * - * Returns a JsValue containing the serialized BiexpResult: - * { tau_rise, tau_decay, beta, residual, tau_rise_fast, tau_decay_fast, beta_fast } - * @param {Float32Array} h_free - * @param {number} fs - * @param {boolean} refine - * @param {number} skip - * @param {number} warm_tau_rise - * @param {number} warm_tau_decay - * @param {number} warm_tau_rise_fast - * @param {number} warm_tau_decay_fast - * @param {number} warm_beta - * @param {number} warm_beta_fast - * @param {number} warm_residual - * @param {boolean} use_warm - * @returns {any} - */ -export function indeca_fit_biexponential(h_free, fs, refine, skip, warm_tau_rise, warm_tau_decay, warm_tau_rise_fast, warm_tau_decay_fast, warm_beta, warm_beta_fast, warm_residual, use_warm) { - const ptr0 = passArrayF32ToWasm0(h_free, wasm.__wbindgen_export); - const len0 = WASM_VECTOR_LEN; - const ret = wasm.indeca_fit_biexponential(ptr0, len0, fs, refine, skip, warm_tau_rise, warm_tau_decay, warm_tau_rise_fast, warm_tau_decay_fast, warm_beta, warm_beta_fast, warm_residual, use_warm); - return takeObject(ret); -} - -/** - * Solve a single trace using the InDeCa pipeline. - * - * `warm_counts`: optional spike counts from a previous iteration at the original - * sampling rate. Pass an empty slice for cold-start. - * - * Returns a JsValue containing the serialized InDecaResult: - * { s_counts, alpha, baseline, threshold, pve, iterations, converged } - * @param {Float32Array} trace - * @param {number} tau_r - * @param {number} tau_d - * @param {number} fs - * @param {number} upsample_factor - * @param {number} max_iters - * @param {number} tol - * @param {boolean} hp_enabled - * @param {boolean} lp_enabled - * @param {Float32Array} warm_counts - * @param {number} lambda - * @returns {any} - */ -export function indeca_solve_trace(trace, tau_r, tau_d, fs, upsample_factor, max_iters, tol, hp_enabled, lp_enabled, warm_counts, lambda) { - const ptr0 = passArrayF32ToWasm0(trace, wasm.__wbindgen_export); - const len0 = WASM_VECTOR_LEN; - const ptr1 = passArrayF32ToWasm0(warm_counts, wasm.__wbindgen_export); - const len1 = WASM_VECTOR_LEN; - const ret = wasm.indeca_solve_trace(ptr0, len0, tau_r, tau_d, fs, upsample_factor, max_iters, tol, hp_enabled, lp_enabled, ptr1, len1, lambda); - return takeObject(ret); -} - -/** - * Run peak-seeded spike detection on a single trace. - * - * Returns a JsValue containing the serialized SeedTraceResult: - * { s_counts, alpha, baseline } - * @param {Float32Array} trace - * @param {number} fs - * @returns {any} - */ -export function seed_trace(trace, fs) { - const ptr0 = passArrayF32ToWasm0(trace, wasm.__wbindgen_export); - const len0 = WASM_VECTOR_LEN; - const ret = wasm.seed_trace(ptr0, len0, fs); - return takeObject(ret); -} - -/** - * Generate synthetic calcium traces from a config object. - * - * Accepts: JsValue containing a SimulationConfig-shaped object. - * Returns: JsValue containing a SimulationResult-shaped object. - * @param {any} config_js - * @returns {any} - */ -export function simulate_traces(config_js) { - const ret = wasm.simulate_traces(addHeapObject(config_js)); - return takeObject(ret); -} - -function __wbg_get_imports() { - const import0 = { - __proto__: null, - __wbg_Error_8c4e43fe74559d73: function(arg0, arg1) { - const ret = Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }, - __wbg_Number_04624de7d0e8332d: function(arg0) { - const ret = Number(getObject(arg0)); - return ret; - }, - __wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2: function(arg0, arg1) { - const v = getObject(arg1); - const ret = typeof(v) === 'bigint' ? v : undefined; - getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true); - getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); - }, - __wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25: function(arg0) { - const v = getObject(arg0); - const ret = typeof(v) === 'boolean' ? v : undefined; - return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0; - }, - __wbg___wbindgen_debug_string_0bc8482c6e3508ae: function(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); - const len1 = WASM_VECTOR_LEN; - getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); - getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); - }, - __wbg___wbindgen_in_47fa6863be6f2f25: function(arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - return ret; - }, - __wbg___wbindgen_is_bigint_31b12575b56f32fc: function(arg0) { - const ret = typeof(getObject(arg0)) === 'bigint'; - return ret; - }, - __wbg___wbindgen_is_function_0095a73b8b156f76: function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; - }, - __wbg___wbindgen_is_object_5ae8e5880f2c1fbd: function(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; - }, - __wbg___wbindgen_is_undefined_9e4d92534c42d778: function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; - }, - __wbg___wbindgen_jsval_eq_11888390b0186270: function(arg0, arg1) { - const ret = getObject(arg0) === getObject(arg1); - return ret; - }, - __wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811: function(arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - return ret; - }, - __wbg___wbindgen_number_get_8ff4255516ccad3e: function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'number' ? obj : undefined; - getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); - getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); - }, - __wbg___wbindgen_string_get_72fb696202c56729: function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); - var len1 = WASM_VECTOR_LEN; - getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); - getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); - }, - __wbg___wbindgen_throw_be289d5034ed271b: function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }, - __wbg_call_389efe28435a9388: function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments); }, - __wbg_done_57b39ecd9addfe81: function(arg0) { - const ret = getObject(arg0).done; - return ret; - }, - __wbg_entries_58c7934c745daac7: function(arg0) { - const ret = Object.entries(getObject(arg0)); - return addHeapObject(ret); - }, - __wbg_error_7534b8e9a36f1ab4: function(arg0, arg1) { - let deferred0_0; - let deferred0_1; - try { - deferred0_0 = arg0; - deferred0_1 = arg1; - console.error(getStringFromWasm0(arg0, arg1)); - } finally { - wasm.__wbindgen_export4(deferred0_0, deferred0_1, 1); - } - }, - __wbg_get_9b94d73e6221f75c: function(arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); - }, - __wbg_get_b3ed3ad4be2bc8ac: function() { return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); - }, arguments); }, - __wbg_get_with_ref_key_1dc361bd10053bfe: function(arg0, arg1) { - const ret = getObject(arg0)[getObject(arg1)]; - return addHeapObject(ret); - }, - __wbg_instanceof_ArrayBuffer_c367199e2fa2aa04: function(arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }, - __wbg_instanceof_Map_53af74335dec57f4: function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Map; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }, - __wbg_instanceof_Uint8Array_9b9075935c74707c: function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch (_) { - result = false; - } - const ret = result; - return ret; - }, - __wbg_isArray_d314bb98fcf08331: function(arg0) { - const ret = Array.isArray(getObject(arg0)); - return ret; - }, - __wbg_isSafeInteger_bfbc7332a9768d2a: function(arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - return ret; - }, - __wbg_iterator_6ff6560ca1568e55: function() { - const ret = Symbol.iterator; - return addHeapObject(ret); - }, - __wbg_length_32ed9a279acd054c: function(arg0) { - const ret = getObject(arg0).length; - return ret; - }, - __wbg_length_35a7bace40f36eac: function(arg0) { - const ret = getObject(arg0).length; - return ret; - }, - __wbg_new_361308b2356cecd0: function() { - const ret = new Object(); - return addHeapObject(ret); - }, - __wbg_new_3eb36ae241fe6f44: function() { - const ret = new Array(); - return addHeapObject(ret); - }, - __wbg_new_8a6f238a6ece86ea: function() { - const ret = new Error(); - return addHeapObject(ret); - }, - __wbg_new_dd2b680c8bf6ae29: function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }, - __wbg_next_3482f54c49e8af19: function() { return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); - }, arguments); }, - __wbg_next_418f80d8f5303233: function(arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); - }, - __wbg_prototypesetcall_bdcdcc5842e4d77d: function(arg0, arg1, arg2) { - Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), getObject(arg2)); - }, - __wbg_set_3f1d0b984ed272ed: function(arg0, arg1, arg2) { - getObject(arg0)[takeObject(arg1)] = takeObject(arg2); - }, - __wbg_set_f43e577aea94465b: function(arg0, arg1, arg2) { - getObject(arg0)[arg1 >>> 0] = takeObject(arg2); - }, - __wbg_stack_0ed75d68575b0f3c: function(arg0, arg1) { - const ret = getObject(arg1).stack; - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export, wasm.__wbindgen_export2); - const len1 = WASM_VECTOR_LEN; - getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); - getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); - }, - __wbg_value_0546255b415e96c1: function(arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); - }, - __wbindgen_cast_0000000000000001: function(arg0) { - // Cast intrinsic for `F64 -> Externref`. - const ret = arg0; - return addHeapObject(ret); - }, - __wbindgen_cast_0000000000000002: function(arg0) { - // Cast intrinsic for `I64 -> Externref`. - const ret = arg0; - return addHeapObject(ret); - }, - __wbindgen_cast_0000000000000003: function(arg0, arg1) { - // Cast intrinsic for `Ref(String) -> Externref`. - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }, - __wbindgen_cast_0000000000000004: function(arg0) { - // Cast intrinsic for `U64 -> Externref`. - const ret = BigInt.asUintN(64, arg0); - return addHeapObject(ret); - }, - __wbindgen_object_clone_ref: function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); - }, - __wbindgen_object_drop_ref: function(arg0) { - takeObject(arg0); - }, - }; - return { - __proto__: null, - "./calab_solver_bg.js": import0, - }; -} - -const SolverFinalization = (typeof FinalizationRegistry === 'undefined') - ? { register: () => {}, unregister: () => {} } - : new FinalizationRegistry(ptr => wasm.__wbg_solver_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 debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches && builtInMatches.length > 1) { - className = builtInMatches[1]; - } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); - } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } - } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; - } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; -} - -function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; -} - -function getArrayF32FromWasm0(ptr, len) { - ptr = ptr >>> 0; - return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); -} - -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; -} - -let cachedFloat32ArrayMemory0 = null; -function getFloat32ArrayMemory0() { - if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) { - cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer); - } - return cachedFloat32ArrayMemory0; -} - -let cachedFloat64ArrayMemory0 = null; -function getFloat64ArrayMemory0() { - if (cachedFloat64ArrayMemory0 === null || cachedFloat64ArrayMemory0.byteLength === 0) { - cachedFloat64ArrayMemory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64ArrayMemory0; -} - -function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return decodeText(ptr, len); -} - -let cachedUint32ArrayMemory0 = null; -function getUint32ArrayMemory0() { - if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) { - cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer); - } - return cachedUint32ArrayMemory0; -} - -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_export3(addHeapObject(e)); - } -} - -let heap = new Array(128).fill(undefined); -heap.push(undefined, null, true, false); - -let heap_next = heap.length; - -function isLikeNone(x) { - return x === undefined || x === null; -} - -function passArray32ToWasm0(arg, malloc) { - const ptr = malloc(arg.length * 4, 4) >>> 0; - getUint32ArrayMemory0().set(arg, ptr / 4); - WASM_VECTOR_LEN = arg.length; - return ptr; -} - -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 passArrayF32ToWasm0(arg, malloc) { - const ptr = malloc(arg.length * 4, 4) >>> 0; - getFloat32ArrayMemory0().set(arg, ptr / 4); - WASM_VECTOR_LEN = arg.length; - return ptr; -} - -function passArrayF64ToWasm0(arg, malloc) { - const ptr = malloc(arg.length * 8, 8) >>> 0; - getFloat64ArrayMemory0().set(arg, ptr / 8); - 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; - cachedFloat32ArrayMemory0 = null; - cachedFloat64ArrayMemory0 = null; - cachedUint32ArrayMemory0 = 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('calab_solver_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/crates/solver/pkg/calab_solver_bg.wasm b/crates/solver/pkg/calab_solver_bg.wasm deleted file mode 100644 index fe782d727dac3ad739682269e6ee9f8cf75f44d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498514 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
&lD&J5I*$ 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 diff --git a/crates/solver/pkg/calab_solver_bg.wasm.d.ts b/crates/solver/pkg/calab_solver_bg.wasm.d.ts deleted file mode 100644 index 8033ef6a..00000000 --- a/crates/solver/pkg/calab_solver_bg.wasm.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* tslint:disable */ -/* eslint-disable */ -export const memory: WebAssembly.Memory; -export const __wbg_solver_free: (a: number, b: number) => void; -export const get_simulation_presets: () => number; -export const indeca_compute_upsample_factor: (a: number, b: number) => number; -export const indeca_estimate_kernel: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number, n: number, o: number, p: number, q: number) => void; -export const indeca_fit_biexponential: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number) => number; -export const indeca_solve_trace: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number) => number; -export const seed_trace: (a: number, b: number, c: number) => number; -export const simulate_traces: (a: number) => number; -export const solver_apply_filter: (a: number) => number; -export const solver_converged: (a: number) => number; -export const solver_export_state: (a: number, b: number) => void; -export const solver_filter_enabled: (a: number) => number; -export const solver_get_baseline: (a: number) => number; -export const solver_get_filter_cutoffs: (a: number, b: number) => void; -export const solver_get_kernel: (a: number, b: number) => void; -export const solver_get_power_spectrum: (a: number, b: number) => void; -export const solver_get_reconvolution: (a: number, b: number) => void; -export const solver_get_reconvolution_with_baseline: (a: number, b: number) => void; -export const solver_get_solution: (a: number, b: number) => void; -export const solver_get_spectrum_frequencies: (a: number, b: number) => void; -export const solver_get_trace: (a: number, b: number) => void; -export const solver_iteration_count: (a: number) => number; -export const solver_load_state: (a: number, b: number, c: number) => void; -export const solver_new: () => number; -export const solver_reset_momentum: (a: number) => void; -export const solver_set_constraint: (a: number, b: number) => void; -export const solver_set_conv_mode: (a: number, b: number) => void; -export const solver_set_filter_enabled: (a: number, b: number) => void; -export const solver_set_hp_filter_enabled: (a: number, b: number) => void; -export const solver_set_lp_filter_enabled: (a: number, b: number) => void; -export const solver_set_params: (a: number, b: number, c: number, d: number, e: number) => void; -export const solver_set_trace: (a: number, b: number, c: number) => void; -export const solver_step_batch: (a: number, b: number) => number; -export const solver_subtract_baseline: (a: number) => void; -export const __wbindgen_export: (a: number, b: number) => number; -export const __wbindgen_export2: (a: number, b: number, c: number, d: number) => number; -export const __wbindgen_export3: (a: number) => void; -export const __wbindgen_export4: (a: number, b: number, c: number) => void; -export const __wbindgen_add_to_stack_pointer: (a: number) => number; diff --git a/crates/solver/pkg/package.json b/crates/solver/pkg/package.json deleted file mode 100644 index b6d5fb85..00000000 --- a/crates/solver/pkg/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "calab-solver", - "type": "module", - "version": "0.1.0", - "files": [ - "calab_solver_bg.wasm", - "calab_solver.js", - "calab_solver.d.ts" - ], - "main": "calab_solver.js", - "types": "calab_solver.d.ts", - "sideEffects": [ - "./snippets/*" - ] -} \ No newline at end of file diff --git a/crates/solver/src/js_indeca.rs b/crates/solver/src/js_indeca.rs index 9f25bdd3..ff8fefe9 100644 --- a/crates/solver/src/js_indeca.rs +++ b/crates/solver/src/js_indeca.rs @@ -58,6 +58,11 @@ pub fn indeca_solve_trace( /// for cold-start. /// /// Returns the estimated kernel as Float32Array (via Vec). +/// +/// Throws a JS error (rather than aborting the WASM module) if the input array +/// lengths are inconsistent — `alphas`/`baselines` must have one entry per +/// trace, and `traces_flat`/`spikes_flat` must each be the sum of +/// `trace_lengths`. #[wasm_bindgen] pub fn indeca_estimate_kernel( traces_flat: &[f32], @@ -70,14 +75,25 @@ pub fn indeca_estimate_kernel( tol: f64, warm_kernel: &[f32], smooth_lambda: f64, -) -> Vec { +) -> Result, JsError> { let lengths: Vec = trace_lengths.iter().map(|&v| v as usize).collect(); + let total_len: usize = lengths.iter().sum(); + if alphas.len() != lengths.len() || baselines.len() != lengths.len() { + return Err(JsError::new( + "indeca_estimate_kernel: alphas and baselines must have one entry per trace", + )); + } + if traces_flat.len() != total_len || spikes_flat.len() != total_len { + return Err(JsError::new( + "indeca_estimate_kernel: traces_flat and spikes_flat length must equal sum(trace_lengths)", + )); + } let warm = if warm_kernel.is_empty() { None } else { Some(warm_kernel) }; - kernel_est::estimate_free_kernel( + Ok(kernel_est::estimate_free_kernel( traces_flat, spikes_flat, alphas, @@ -88,7 +104,7 @@ pub fn indeca_estimate_kernel( tol, warm, smooth_lambda, - ) + )) } /// Fit a bi-exponential model to a free-form kernel. diff --git a/crates/solver/src/kernel_est.rs b/crates/solver/src/kernel_est.rs index 6aa3a98e..00e796e3 100644 --- a/crates/solver/src/kernel_est.rs +++ b/crates/solver/src/kernel_est.rs @@ -122,14 +122,25 @@ pub fn estimate_free_kernel( smooth_lambda: f64, ) -> Vec { let n_traces = trace_lengths.len(); - assert_eq!(alphas.len(), n_traces); - assert_eq!(baselines.len(), n_traces); - let total_len: usize = trace_lengths.iter().sum(); - assert_eq!(traces.len(), total_len); - assert_eq!(spike_trains.len(), total_len); - if kernel_length == 0 || total_len == 0 { + // Length invariants. These are guaranteed by the FFI wrappers, which + // validate and return a typed error (see js_indeca / py_api). The + // debug_assert keeps the contract loud for internal callers and tests; + // the release-mode guard degrades to an empty kernel rather than panicking + // across the WASM/PyO3 boundary (a panic there aborts the module). + debug_assert_eq!(alphas.len(), n_traces); + debug_assert_eq!(baselines.len(), n_traces); + debug_assert_eq!(traces.len(), total_len); + debug_assert_eq!(spike_trains.len(), total_len); + + if alphas.len() != n_traces + || baselines.len() != n_traces + || traces.len() != total_len + || spike_trains.len() != total_len + || kernel_length == 0 + || total_len == 0 + { return vec![0.0; kernel_length]; } diff --git a/crates/solver/src/peak_seed.rs b/crates/solver/src/peak_seed.rs index 583911da..9ef39543 100644 --- a/crates/solver/src/peak_seed.rs +++ b/crates/solver/src/peak_seed.rs @@ -201,7 +201,6 @@ pub fn seed_kernel_estimate( fs: f64, ) -> SeedKernelResult { let total_len: usize = trace_lengths.iter().sum(); - assert_eq!(traces_flat.len(), total_len); let min_peak_distance_s = 5.0; @@ -209,6 +208,24 @@ pub fn seed_kernel_estimate( let kernel_length = (1.5 * fs).ceil() as usize; let kernel_length = kernel_length.clamp(10, 200); + // Length invariant guaranteed by the FFI wrapper (see py_api). Loud in + // debug/tests; in release degrade to an empty result rather than panicking + // across the PyO3 boundary. + debug_assert_eq!(traces_flat.len(), total_len); + if traces_flat.len() != total_len { + return SeedKernelResult { + free_kernel: vec![0.0; kernel_length], + tau_rise: 0.02, + tau_decay: 0.4, + beta: 0.0, + residual: f64::INFINITY, + tau_rise_fast: 0.0, + tau_decay_fast: 0.0, + beta_fast: 0.0, + n_seed_spikes: 0, + }; + } + let mut spike_trains = vec![0.0_f32; total_len]; let mut alphas = Vec::with_capacity(trace_lengths.len()); let mut baselines = Vec::with_capacity(trace_lengths.len()); diff --git a/crates/solver/src/py_api.rs b/crates/solver/src/py_api.rs index 57236348..1f77ae51 100644 --- a/crates/solver/src/py_api.rs +++ b/crates/solver/src/py_api.rs @@ -486,6 +486,20 @@ fn py_indeca_estimate_kernel<'py>( let warm = optional_to_f32_vec(warm_kernel)?; + // Validate array-length consistency before handing off, so a caller mistake + // surfaces as a clear ValueError instead of a Rust panic across the FFI. + let total_len: usize = lengths.iter().sum(); + if alphas_slice.len() != lengths.len() || baselines_slice.len() != lengths.len() { + return Err(pyo3::exceptions::PyValueError::new_err( + "alphas and baselines must have one entry per trace (len == trace_lengths.len())", + )); + } + if traces_f32.len() != total_len || spikes_f32.len() != total_len { + return Err(pyo3::exceptions::PyValueError::new_err( + "traces_flat and spikes_flat length must equal sum(trace_lengths)", + )); + } + let result = kernel_est::estimate_free_kernel( &traces_f32, &spikes_f32, diff --git a/crates/solver/src/simulate.rs b/crates/solver/src/simulate.rs index d91abb7b..79f496e9 100644 --- a/crates/solver/src/simulate.rs +++ b/crates/solver/src/simulate.rs @@ -436,7 +436,11 @@ pub fn simulate(config: &SimulationConfig) -> SimulationResult { let mut traces = Vec::with_capacity(n_cells * n_tp); let mut ground_truth = Vec::with_capacity(n_cells); - let bins_per_frame = (config.spike_sim_hz / config.fs_hz).round() as usize; + // Clamp to >= 1: `spike_sim_hz` and `fs_hz` come from a user-supplied + // config, and a spike rate below half the frame rate would otherwise round + // to 0, producing a zero-length high-resolution buffer and a degenerate + // (empty) simulation rather than a usable result. + let bins_per_frame = ((config.spike_sim_hz / config.fs_hz).round() as usize).max(1); let num_high_res = n_tp * bins_per_frame; let shared_kernel = if !has_kernel_variation { @@ -965,6 +969,27 @@ mod tests { } } + #[test] + fn low_spike_sim_hz_does_not_degenerate() { + // spike_sim_hz below fs_hz/2 rounds bins_per_frame to 0; the clamp + // keeps the high-resolution buffer non-empty so the simulation still + // produces full-length, finite traces instead of a degenerate result. + let cfg = SimulationConfig { + fs_hz: 30.0, + spike_sim_hz: 10.0, + num_timepoints: 300, + num_cells: 2, + alpha_cv: 0.0, + ..Default::default() + }; + let r = simulate(&cfg); + assert_eq!(r.traces.len(), 2 * 300); + assert!(r.traces.iter().all(|v| v.is_finite())); + for gt in &r.ground_truth { + assert_eq!(gt.spikes.len(), 300); + } + } + #[test] fn spikes_non_negative() { for gt in &simulate(&small_config()).ground_truth { diff --git a/package.json b/package.json index ca94ffb5..fb3903bd 100644 --- a/package.json +++ b/package.json @@ -8,16 +8,22 @@ "packages/*" ], "scripts": { + "ensure-wasm": "node scripts/ensure-wasm.mjs", + "predev": "npm run ensure-wasm", "dev": "npm run dev -w apps/catune", + "predev:carank": "npm run ensure-wasm", "dev:carank": "npm run dev -w apps/carank", "build": "npm run build:wasm && npm run build:apps", + "prebuild:apps": "npm run ensure-wasm", "build:apps": "node scripts/build-apps.mjs", "build:pages": "CALAB_PAGES=1 npm run build && node scripts/combine-dist.mjs", "build:wasm": "cd crates/solver && wasm-pack build --target web --release", + "pretest": "npm run ensure-wasm", "test": "npm run test --workspaces --if-present", "test:watch": "npm run test:watch -w apps/catune", "lint": "eslint apps/ packages/ scripts/", "lint:fix": "eslint --fix apps/ packages/ scripts/", + "pretypecheck": "npm run ensure-wasm", "typecheck": "tsc -b apps/catune apps/carank apps/admin apps/cadecon apps/_template", "format": "prettier --write .", "format:check": "prettier --check ." diff --git a/packages/community/src/submission-service.ts b/packages/community/src/submission-service.ts index a87a8960..84bf9771 100644 --- a/packages/community/src/submission-service.ts +++ b/packages/community/src/submission-service.ts @@ -22,9 +22,15 @@ async function requireClient(): Promise { /** * Create a typed CRUD service for a Supabase submission table. * Handles auth user injection, base filter application, and RLS-guarded delete. + * + * `readSource` is the relation used for `fetch` (community browsing). It + * defaults to the base table but should be a PII-free public view: base-table + * SELECT is restricted to owner+admin (migration 010), so anonymous browsing + * must go through the view. Writes and deletes always target `tableName`. */ export function createSubmissionService( tableName: string, + readSource: string = tableName, ): SubmissionService { return { async submit(payload) { @@ -48,7 +54,7 @@ export function createSubmissionService( async fetch(filters?) { const client = await requireClient(); - let query = client.from(tableName).select('*'); + let query = client.from(readSource).select('*'); if (filters?.indicator) { query = query.eq('indicator', filters.indicator); diff --git a/packages/compute/src/__tests__/worker-pool.test.ts b/packages/compute/src/__tests__/worker-pool.test.ts new file mode 100644 index 00000000..5ce35336 --- /dev/null +++ b/packages/compute/src/__tests__/worker-pool.test.ts @@ -0,0 +1,199 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { createWorkerPool, type BaseJob, type MessageRouter } from '@calab/compute'; + +// ── Test doubles ──────────────────────────────────────────────────────────── + +type TestMsg = { type: 'ready' } | { type: 'result'; jobId: number }; + +/** Minimal stand-in for the DOM Worker the pool drives. */ +class FakeWorker { + static instances: FakeWorker[] = []; + onmessage: ((e: { data: TestMsg }) => void) | null = null; + posted: unknown[] = []; + terminated = false; + + constructor() { + FakeWorker.instances.push(this); + } + + postMessage(payload: unknown): void { + this.posted.push(payload); + } + + terminate(): void { + this.terminated = true; + } + + /** Simulate the worker emitting a message back to the pool. */ + emit(msg: TestMsg): void { + this.onmessage?.({ data: msg }); + } +} + +class TestJob implements BaseJob { + cancelled = false; + errored: string | null = null; + done = false; + + constructor( + public jobId: number, + private priority?: number, + ) {} + + onCancelled(): void { + this.cancelled = true; + } + + onError(msg: string): void { + this.errored = msg; + } + + getPriority(): number { + return this.priority ?? 1; + } +} + +const router: MessageRouter = { + isReady: (msg) => msg.type === 'ready', + getJobId: (msg) => (msg.type === 'result' ? msg.jobId : undefined), + routeMessage: (job, _msg, finish) => { + job.done = true; + finish(); + }, + buildDispatch: (job) => [{ jobId: job.jobId }, []], +}; + +function makePool(poolSize: number) { + FakeWorker.instances = []; + const pool = createWorkerPool( + () => new FakeWorker() as unknown as Worker, + router, + poolSize, + ); + return { pool, workers: FakeWorker.instances }; +} + +// ── Tests ──────────────────────────────────────────────────────────────────── + +describe('createWorkerPool', () => { + beforeEach(() => { + FakeWorker.instances = []; + }); + + it('creates the requested number of workers', () => { + const { pool, workers } = makePool(3); + expect(pool.size).toBe(3); + expect(workers).toHaveLength(3); + }); + + it('queues jobs until a worker reports ready, then dispatches', () => { + const { pool, workers } = makePool(2); + const job = new TestJob(1); + + pool.dispatch(job); + // Workers start in `init`; nothing dispatched yet. + expect(workers.every((w) => w.posted.length === 0)).toBe(true); + + workers[0].emit({ type: 'ready' }); + expect(workers[0].posted).toEqual([{ jobId: 1 }]); + }); + + it('queues a second job while busy and drains it when the first finishes', () => { + const { pool, workers } = makePool(1); + const j1 = new TestJob(1); + const j2 = new TestJob(2); + + workers[0].emit({ type: 'ready' }); + pool.dispatch(j1); + pool.dispatch(j2); + expect(workers[0].posted).toEqual([{ jobId: 1 }]); + + workers[0].emit({ type: 'result', jobId: 1 }); + expect(j1.done).toBe(true); + expect(workers[0].posted).toEqual([{ jobId: 1 }, { jobId: 2 }]); + }); + + it('dispatches queued jobs in priority order (lower first)', () => { + const { pool, workers } = makePool(1); + const busy = new TestJob(1); + const low = new TestJob(2, 10); + const high = new TestJob(3, 1); + + workers[0].emit({ type: 'ready' }); + pool.dispatch(busy); // occupies the only worker + pool.dispatch(low); // queued + pool.dispatch(high); // queued + + workers[0].emit({ type: 'result', jobId: 1 }); // frees worker → drains by priority + expect(workers[0].posted).toEqual([{ jobId: 1 }, { jobId: 3 }]); + + workers[0].emit({ type: 'result', jobId: 3 }); + expect(workers[0].posted).toEqual([{ jobId: 1 }, { jobId: 3 }, { jobId: 2 }]); + }); + + it('cancel() removes a queued job and notifies it, without dispatching it', () => { + const { pool, workers } = makePool(1); + const busy = new TestJob(1); + const queued = new TestJob(2); + + workers[0].emit({ type: 'ready' }); + pool.dispatch(busy); + pool.dispatch(queued); + + pool.cancel(queued.jobId); + expect(queued.cancelled).toBe(true); + + // Finishing the busy job must not dispatch the cancelled one. + workers[0].emit({ type: 'result', jobId: 1 }); + expect(workers[0].posted).toEqual([{ jobId: 1 }]); + }); + + it('cancel() signals a cancel message to the worker for an in-flight job', () => { + const { pool, workers } = makePool(1); + const job = new TestJob(1); + + workers[0].emit({ type: 'ready' }); + pool.dispatch(job); + pool.cancel(job.jobId); + + expect(workers[0].posted).toContainEqual({ type: 'cancel' }); + expect(job.cancelled).toBe(false); // in-flight cancel is acknowledged by the worker, not here + }); + + it('cancelAll() cancels queued jobs and signals busy workers', () => { + const { pool, workers } = makePool(1); + const busy = new TestJob(1); + const queued = new TestJob(2); + + workers[0].emit({ type: 'ready' }); + pool.dispatch(busy); + pool.dispatch(queued); + + pool.cancelAll(); + expect(queued.cancelled).toBe(true); + expect(workers[0].posted).toContainEqual({ type: 'cancel' }); + }); + + it('ignores result messages for unknown / already-finished jobs', () => { + const { pool, workers } = makePool(1); + workers[0].emit({ type: 'ready' }); + + // No job in flight with id 999 — must not throw and must leave worker idle. + expect(() => workers[0].emit({ type: 'result', jobId: 999 })).not.toThrow(); + + const job = new TestJob(1); + pool.dispatch(job); + expect(workers[0].posted).toEqual([{ jobId: 1 }]); + }); + + it('dispose() terminates workers and blocks further dispatch', () => { + const { pool, workers } = makePool(2); + workers.forEach((w) => w.emit({ type: 'ready' })); + + pool.dispose(); + expect(workers.every((w) => w.terminated)).toBe(true); + + pool.dispatch(new TestJob(1)); + expect(workers.every((w) => w.posted.length === 0)).toBe(true); + }); +}); diff --git a/python/src/calab/_bridge/_apps.py b/python/src/calab/_bridge/_apps.py index 0bf60e54..11672837 100644 --- a/python/src/calab/_bridge/_apps.py +++ b/python/src/calab/_bridge/_apps.py @@ -20,6 +20,11 @@ HEARTBEAT_TIMEOUT = 10 # seconds without heartbeat = browser disconnected +# Kernel waveforms are truncated to this many decay time-constants +# (kernel_length = KERNEL_LENGTH_DECAY_MULTIPLES * tau_decay * fs). Five decay +# constants capture >99% of a bi-exponential's mass. +KERNEL_LENGTH_DECAY_MULTIPLES = 5.0 + # Default app URLs (GitHub Pages deployment) _DEFAULT_CATUNE_URL = "https://miniscope.github.io/CaLab/CaTune/" _DEFAULT_CADECON_URL = "https://miniscope.github.io/CaLab/CaDecon/" @@ -300,14 +305,14 @@ def decon( tau_rise = results.get("tau_rise", 0.2) tau_decay = results.get("tau_decay", 1.0) beta = results.get("beta", 1.0) - kernel_length = int(5.0 * tau_decay * result_fs) + kernel_length = int(KERNEL_LENGTH_DECAY_MULTIPLES * tau_decay * result_fs) kernel_slow = _build_biexp_waveform(tau_rise, tau_decay, beta, result_fs, kernel_length) tau_rise_fast = results.get("tau_rise_fast", 0.0) tau_decay_fast = results.get("tau_decay_fast", 0.0) beta_fast = results.get("beta_fast", 0.0) if tau_decay_fast > 0 and beta_fast != 0: - kernel_length_fast = int(5.0 * tau_decay_fast * result_fs) + kernel_length_fast = int(KERNEL_LENGTH_DECAY_MULTIPLES * tau_decay_fast * result_fs) kernel_fast = _build_biexp_waveform( tau_rise_fast, tau_decay_fast, beta_fast, result_fs, kernel_length_fast, ) diff --git a/scripts/ensure-wasm.mjs b/scripts/ensure-wasm.mjs new file mode 100644 index 00000000..740e2622 --- /dev/null +++ b/scripts/ensure-wasm.mjs @@ -0,0 +1,67 @@ +#!/usr/bin/env node +/** + * Ensure the wasm-pack output (crates/solver/pkg/) exists and is not stale. + * + * The pkg/ directory is build-only and gitignored — it is NOT committed (the + * binary previously was, and went silently stale because gitignored rebuilds + * never show up in `git status`). This guard runs as a pre-hook for the JS + * entry points (dev/typecheck/test/build:apps) so consumers always see a fresh + * binding surface and binary, without paying for a rebuild when nothing changed. + * + * Rebuilds only when: + * - pkg/calab_solver_bg.wasm is missing, OR + * - any tracked solver source (src/**, Cargo.toml) is newer than the binary. + */ +import { execFileSync } from 'node:child_process'; +import { existsSync, statSync, readdirSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; + +const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '..'); +const solverDir = join(repoRoot, 'crates', 'solver'); +const wasmFile = join(solverDir, 'pkg', 'calab_solver_bg.wasm'); + +/** Latest mtime (ms) across a directory tree, recursively. */ +function newestMtime(dir) { + let newest = 0; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const full = join(dir, entry.name); + if (entry.isDirectory()) { + newest = Math.max(newest, newestMtime(full)); + } else { + newest = Math.max(newest, statSync(full).mtimeMs); + } + } + return newest; +} + +function needsRebuild() { + if (!existsSync(wasmFile)) return 'pkg/ missing'; + const wasmMtime = statSync(wasmFile).mtimeMs; + const srcMtime = Math.max( + newestMtime(join(solverDir, 'src')), + statSync(join(solverDir, 'Cargo.toml')).mtimeMs, + ); + return srcMtime > wasmMtime ? 'solver source changed' : null; +} + +const reason = needsRebuild(); +if (!reason) { + console.log('[ensure-wasm] pkg/ is up to date — skipping rebuild.'); + process.exit(0); +} + +console.log(`[ensure-wasm] Rebuilding WASM (${reason})...`); +try { + // Invoke wasm-pack directly (no shell) — mirrors the `build:wasm` npm script. + execFileSync('wasm-pack', ['build', '--target', 'web', '--release'], { + cwd: solverDir, + stdio: 'inherit', + }); +} catch { + console.error( + '[ensure-wasm] WASM build failed. Install the Rust toolchain + wasm-pack ' + + '(see rust-toolchain.toml), or run `npm run build:wasm` manually.', + ); + process.exit(1); +} diff --git a/supabase/README.md b/supabase/README.md index cb86f65c..bf15565a 100644 --- a/supabase/README.md +++ b/supabase/README.md @@ -15,14 +15,21 @@ All tables share a common set of base columns defined in `000_base_template.sql` | `002_field_options.sql` | Shared canonical field options lookup table. | | `003_analytics.sql` | Analytics tables (`analytics_sessions`, `analytics_events`) for usage tracking. | | `004_admin_role.sql` | `is_admin()` helper function and admin moderation policies. | +| `005`–`009` | CaDecon table, bridge data source, analytics hardening, and tighter constraints.| +| `010_restrict_submission_pii.sql` | Locks submission reads to owner+admin; adds PII-free `*_public` browsing views. | ## Applying migrations 1. Open your Supabase project dashboard. 2. Navigate to **SQL Editor**. -3. Run each numbered file in order (001 through 004). +3. Run each numbered file in order (001 through the highest-numbered). Existing + projects only need to run migrations they have not applied yet. 4. Run `supabase/seed/field_options_seed.sql` to populate the indicator, species, and brain region lookup values. +> **Note:** migration `010` must be applied **before** deploying the app build +> that reads the `*_public` views, or community browsing will fail until the +> views exist. + ## Edge Functions CaLab uses one Edge Function for server-side GeoIP resolution during analytics session creation. diff --git a/supabase/migrations/010_restrict_submission_pii.sql b/supabase/migrations/010_restrict_submission_pii.sql new file mode 100644 index 00000000..9465360f --- /dev/null +++ b/supabase/migrations/010_restrict_submission_pii.sql @@ -0,0 +1,77 @@ +-- Restrict read access to submission tables and expose PII-free public views. +-- +-- Problem (audit H1): migrations 001/006 granted submission SELECT to +-- `anon, authenticated USING (true)`, so any unauthenticated visitor with the +-- public anon key could read every submission's free-text PII — `orcid` (a +-- globally unique researcher ID), `lab_name`, and `notes` — and deanonymize +-- who submitted what. This contradicts the project's "don't leak data between +-- users" goal. +-- +-- Fix: base-table SELECT is now owner-or-admin only. Community browsing reads +-- a dedicated view that exposes every column EXCEPT those three PII fields. +-- No app reads orcid/lab_name/notes (they are write-only submission metadata), +-- so this is non-breaking for the CaTune/CaDecon community browsers and the +-- admin dashboard. +-- +-- The *_public views intentionally run with the view owner's privileges +-- (security_invoker = false, the default) so community browsing still sees +-- every contributor's submission — only the PII columns are dropped, not the +-- rows. Writes and deletes continue against the base tables under the existing +-- owner-scoped policies. + +BEGIN; + +-- ── catune_submissions ────────────────────────────────────────────────────── + +DROP POLICY IF EXISTS "Public read access" ON catune_submissions; + +CREATE POLICY "Owner and admin read access" +ON catune_submissions FOR SELECT +TO anon, authenticated +USING ((select auth.uid()) = user_id OR public.is_admin()); + +CREATE VIEW catune_submissions_public +WITH (security_invoker = false) AS +SELECT + id, created_at, user_id, + tau_rise, tau_decay, t_peak, fwhm, lambda, sampling_rate, + ar2_g1, ar2_g2, + indicator, species, brain_region, + filter_enabled, + virus_construct, time_since_injection_days, + num_cells, recording_length_s, fps, + dataset_hash, quality_score, app_version, data_source, + microscope_type, imaging_depth_um, cell_type, + extra_metadata +FROM catune_submissions; + +GRANT SELECT ON catune_submissions_public TO anon, authenticated; + +-- ── cadecon_submissions ───────────────────────────────────────────────────── + +DROP POLICY IF EXISTS "Public read" ON cadecon_submissions; + +CREATE POLICY "Owner and admin read access" +ON cadecon_submissions FOR SELECT +TO anon, authenticated +USING ((select auth.uid()) = user_id OR public.is_admin()); + +CREATE VIEW cadecon_submissions_public +WITH (security_invoker = false) AS +SELECT + id, created_at, user_id, + tau_rise, tau_decay, t_peak, fwhm, beta, upsample_factor, sampling_rate, + num_subsets, target_coverage, max_iterations, convergence_tol, + weighting_enabled, hp_filter_enabled, lp_filter_enabled, + median_alpha, median_pve, mean_event_rate, num_iterations, converged, + indicator, species, brain_region, + virus_construct, time_since_injection_days, + microscope_type, imaging_depth_um, cell_type, + num_cells, recording_length_s, fps, + dataset_hash, app_version, data_source, + extra_metadata +FROM cadecon_submissions; + +GRANT SELECT ON cadecon_submissions_public TO anon, authenticated; + +COMMIT; diff --git a/supabase/tests/rls/test.sql b/supabase/tests/rls/test.sql index 14a4f477..896c1f34 100644 --- a/supabase/tests/rls/test.sql +++ b/supabase/tests/rls/test.sql @@ -152,6 +152,10 @@ SET LOCAL "request.jwt.claims" = '{"sub":"22222222-2222-2222-2222-222222222222", -- so RLS filters the candidate rows to zero → query succeeds with 0 rows -- affected. Assert no rows were deleted. DELETE FROM catune_submissions WHERE dataset_hash = 'hash-alice'; +-- Verify under a privileged identity: as of migration 010, bob can no longer +-- SELECT alice's row (reads are owner-or-admin only), so the existence check +-- must run with RLS bypassed or it would read 0 for the wrong reason. +RESET ROLE; SELECT assert_row_count( $sql$SELECT COUNT(*)::int FROM catune_submissions WHERE dataset_hash = 'hash-alice'$sql$, 1, @@ -191,6 +195,8 @@ BEGIN; SET LOCAL ROLE authenticated; SET LOCAL "request.jwt.claims" = '{"sub":"22222222-2222-2222-2222-222222222222","role":"authenticated"}'; DELETE FROM cadecon_submissions WHERE dataset_hash = 'hash-alice'; +-- See note above: bob cannot read alice's row post-010, so verify privileged. +RESET ROLE; SELECT assert_row_count( $sql$SELECT COUNT(*)::int FROM cadecon_submissions WHERE dataset_hash = 'hash-alice'$sql$, 1, @@ -198,6 +204,78 @@ SELECT assert_row_count( ); ROLLBACK; +-- ── submission PII lockdown (migration 010) ──────────────────────────────── + +-- anon cannot read the base submission tables at all (no rows leak). +BEGIN; +SET LOCAL ROLE anon; +SELECT assert_row_count( + $sql$SELECT COUNT(*)::int FROM catune_submissions$sql$, + 0, + 'catune base table: anon SELECT returns 0 rows' +); +SELECT assert_row_count( + $sql$SELECT COUNT(*)::int FROM cadecon_submissions$sql$, + 0, + 'cadecon base table: anon SELECT returns 0 rows' +); +ROLLBACK; + +-- A non-owner authenticated user cannot read another user's base-table rows. +BEGIN; +SET LOCAL ROLE authenticated; +SET LOCAL "request.jwt.claims" = '{"sub":"22222222-2222-2222-2222-222222222222","role":"authenticated"}'; +SELECT assert_row_count( + $sql$SELECT COUNT(*)::int FROM catune_submissions WHERE dataset_hash = 'hash-alice'$sql$, + 0, + 'catune base table: non-owner SELECT cannot see foreign row' +); +ROLLBACK; + +-- The owner can still read their own base-table row (needed for insert-return). +BEGIN; +SET LOCAL ROLE authenticated; +SET LOCAL "request.jwt.claims" = '{"sub":"11111111-1111-1111-1111-111111111111","role":"authenticated"}'; +SELECT assert_row_count( + $sql$SELECT COUNT(*)::int FROM catune_submissions WHERE dataset_hash = 'hash-alice'$sql$, + 1, + 'catune base table: owner SELECT sees own row' +); +ROLLBACK; + +-- Community browsing still works: anon reads all rows through the public view. +BEGIN; +SET LOCAL ROLE anon; +SELECT assert_row_count( + $sql$SELECT COUNT(*)::int FROM catune_submissions_public WHERE dataset_hash = 'hash-alice'$sql$, + 1, + 'catune public view: anon can browse submissions' +); +SELECT assert_row_count( + $sql$SELECT COUNT(*)::int FROM cadecon_submissions_public WHERE dataset_hash = 'hash-alice'$sql$, + 1, + 'cadecon public view: anon can browse submissions' +); +ROLLBACK; + +-- The public view must NOT expose the PII columns. Selecting them errors with +-- undefined_column (42703), which assert_denied accepts. +BEGIN; +SET LOCAL ROLE anon; +SELECT assert_denied( + $sql$SELECT orcid FROM catune_submissions_public LIMIT 1$sql$, + 'catune public view omits orcid' +); +SELECT assert_denied( + $sql$SELECT lab_name FROM catune_submissions_public LIMIT 1$sql$, + 'catune public view omits lab_name' +); +SELECT assert_denied( + $sql$SELECT notes FROM cadecon_submissions_public LIMIT 1$sql$, + 'cadecon public view omits notes' +); +ROLLBACK; + -- ── analytics_sessions: anon INSERT denied ───────────────────────────────── BEGIN; From 56fecdbda2dc2405cb9452431f7a2c5c23336b7d Mon Sep 17 00:00:00 2001 From: daharoni Date: Mon, 8 Jun 2026 13:32:53 -0700 Subject: [PATCH 2/2] style: prettier-format supabase README migration table Co-Authored-By: Claude Opus 4.8 (1M context) --- supabase/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/supabase/README.md b/supabase/README.md index bf15565a..a24d62d8 100644 --- a/supabase/README.md +++ b/supabase/README.md @@ -8,15 +8,15 @@ usage analytics, and admin moderation. Each CaLab app has its own submissions table (e.g., `catune_submissions`). All tables share a common set of base columns defined in `000_base_template.sql`. -| Migration | Purpose | -| ---------------------------- | ------------------------------------------------------------------------------- | -| `000_base_template.sql` | **Template only** (not executed). Copy and extend for new apps. | -| `001_catune_submissions.sql` | CaTune submissions table with deconvolution-specific columns. | -| `002_field_options.sql` | Shared canonical field options lookup table. | -| `003_analytics.sql` | Analytics tables (`analytics_sessions`, `analytics_events`) for usage tracking. | -| `004_admin_role.sql` | `is_admin()` helper function and admin moderation policies. | -| `005`–`009` | CaDecon table, bridge data source, analytics hardening, and tighter constraints.| -| `010_restrict_submission_pii.sql` | Locks submission reads to owner+admin; adds PII-free `*_public` browsing views. | +| Migration | Purpose | +| --------------------------------- | -------------------------------------------------------------------------------- | +| `000_base_template.sql` | **Template only** (not executed). Copy and extend for new apps. | +| `001_catune_submissions.sql` | CaTune submissions table with deconvolution-specific columns. | +| `002_field_options.sql` | Shared canonical field options lookup table. | +| `003_analytics.sql` | Analytics tables (`analytics_sessions`, `analytics_events`) for usage tracking. | +| `004_admin_role.sql` | `is_admin()` helper function and admin moderation policies. | +| `005`–`009` | CaDecon table, bridge data source, analytics hardening, and tighter constraints. | +| `010_restrict_submission_pii.sql` | Locks submission reads to owner+admin; adds PII-free `*_public` browsing views. | ## Applying migrations