Skip to content

Releases: NicholasEhsanRoy/NUDGE

v0.4.2 — dynamic model ingestion (model_path / model_code)

Choose a tag to compare

@NicholasEhsanRoy NicholasEhsanRoy released this 13 Jul 22:51

Added

  • Dynamic model ingestion for the identifiability and oed MCP tools (NUDGE-LIM-030). Both tools now accept model_path (an absolute path to a user model file) or model_code (inline Python source) in addition to a registry model name — precedence model_code > model_path > model — loading a user's OWN differentiable model via the new nudge.inference.model_loader. The file exposes nudge_identifiability / nudge_oed builders and needs no nudge import; the loaded model reproduces the equivalent registered model to machine precision (verified: ×259 OED, the NUDGE-LIM-029 rank-deficiency guard, and the NLME arrowhead all reproduce through model_path). This makes the with-vs-without-NUDGE demo symmetric — both arms analyze the same user model file. Ships standalone JAX model files scripts/demo_ab/ad_qsp_model.py + ad_qsp_nlme_model.py.
  • Security (NUDGE-LIM-030): dynamic ingestion executes arbitrary user Python in the server process — a local, trusted-input convenience, not for untrusted / multi-tenant use.

Changed

  • GitHub README PyPI-version badge pinned to the released version (static) — the live shields.io/pypi/v badge chronically lagged several releases behind through shields' own cache and GitHub's Camo image cache.

Full detail in CHANGELOG.md.

v0.4.1 — OED rank-deficient-naive guard

Choose a tag to compare

@NicholasEhsanRoy NicholasEhsanRoy released this 13 Jul 21:36

Fixed

  • oed no longer emits a false-precise improvement factor on a rank-deficient naive design (NUDGE-LIM-029). When the naive baseline's Fisher information is singular in the target direction (smallest eigenvalue at the guarded-ridge floor — e.g. a literal baseline+end [0, 12] plaque schedule where plaque ≈ 0 at t=0 zeroes both sensitivities), the true CRLB is infinite, so a finite crlb_improvement was a Tikhonov-ridge artifact (~10⁷). The tool now flags naive_rank_deficient / naive_target_identifiable=False and reports the improvement as a LOWER BOUND — the honest abstention a careful analyst makes by hand. The finite gain on informative designs is unchanged: the default ad_qsp schedule still reports crlb_improvement ≈ 259 byte-for-byte (curvature-grounded ridge-floor test, not a magic threshold — so it does not over-abstain).
  • Removed the redundant PyPI-version badge from PYPI_README.md (it permanently lagged one release on the PyPI project page; PyPI's header shows the true version; the GitHub README keeps the live badge).

Full detail in CHANGELOG.md.

v0.4.0 — NLME coupled scale-wall + demo honesty fixes

Choose a tag to compare

@NicholasEhsanRoy NicholasEhsanRoy released this 13 Jul 20:36

Added

  • ad_qsp_nlme — a hierarchical / nonlinear-mixed-effects AD QSP population model with a genuinely COUPLED (arrowhead) joint Fisher-Information Matrix (NUDGE-LIM-028). Shared population hyperparameters (μ, φ, optional ω) couple every subject, so the joint FIM is not block-decomposable like the independent-subjects cohort. MEASURED (scripts/demo_nlme_scale.py): dense jacfwd OOM-kills at N≥300 under a 2.5 GB cap while the matrix-free jvp∘vjp path stays ~0.56→0.89 GB across N=100→2500 (≈linear in cohort state, not flat) with the same unidentifiable verdict; the NUDGE-LIM-023 fail-safe is preserved. Arrowhead is in-principle Schur-decomposable, so the claim is the measured dense-vs-matrix-free contrast, not impossibility.
  • A self-contained NumPy WITHOUT-arm for the coupled model (scripts/demo_ab/ad_qsp_nlme_forward.py + cohort_nlme.npz).
  • The 3-minute demo/pitch video shooting script (design/DEMO_VIDEO_SCRIPT.md).

Changed

  • Corrected the AD QSP confound attribution to be design-dependent (honesty, caught by a Claude Science reviewer): the 2-biomarker/8-visit cohort confounds the microglial pair k_glk_ga (k_on is well-identified there); the k_onk_gl confound belongs to the single-biomarker (amyloid-PET, baseline+end) OED design.

Full detail in CHANGELOG.md.

nudge-bio 0.3.0 — identifiability + oed MCP tools

Choose a tag to compare

@NicholasEhsanRoy NicholasEhsanRoy released this 13 Jul 18:26

NUDGE 0.3.0 — exposes two of NUDGE's core capabilities as general-purpose MCP tools, so an agent (e.g. Claude Science) can run rigorous identifiability + experimental-design analysis on any differentiable ODE model — in plain language, with the results returned as provenance-carrying artifacts.

Highlights

  • identifiability MCP tool — "which parameters of this ODE model are identifiable vs sloppy vs unidentifiable, from data?" Matrix-free Fisher-information analysis that scales past the dense-Jacobian OOM wall; returns the calibrated verdict, the named null directions, and the honest smallest-eigenvalue fail-safe (NUDGE-LIM-023).
  • oed MCP tool — "design the experiment that best resolves a confounded parameter." Gradient-optimal measurement design; returns the schedule, the measured CRLB improvement, and the local-OED caveat (NUDGE-LIM-024).
  • General, not a demo cheat — both tools operate over a model registry (nudge.inference.model_registry) shipping ≥3 models per tool across domains (ecology, kinetics, clinical pharmacology, population dynamics, canonical toys), with register_model for extension. Each takes a model reference, runs the real analysis, and returns whatever it measures — including abstentions. A standing decoy battery locks it (a well-constrained model must not be flagged sloppy; a rank-deficient one must abstain). NUDGE-LIM-027 documents the registry scope.
  • Artifacts + provenance — figures/GIFs come back inline (NUDGE_ENV=cloud) with their regenerating fig.py + data sidecar, so a client can display them and preserve the exact reproduction code. Both tools run through the async job_submit / job_status pattern.

Frozen core (fit.py / core/) untouched. Full gate green: ruff, pyright (0 errors), 5 doc checkers, 396 tests passed.

Install

pip install "nudge-bio[mcp,viz]"

Python ≥ 3.10; jax==0.5.1 pinned. See the CHANGELOG for the full [0.3.0] notes.

nudge-bio 0.2.0 — Claude integration hardening + the animation battery

Choose a tag to compare

@NicholasEhsanRoy NicholasEhsanRoy released this 13 Jul 15:15
060da15

NUDGE 0.2.0 — hardens the Claude integration and grows the honest figure layer, on top of the 0.1.0 first release. Mechanism attribution for perturbation screens that abstains when it can't tell — a confident-wrong is the only hard failure.

Highlights

  • Claude Science connector, hardened (MCP). render_figure returns figures as inline base64 (NUDGE_ENV=cloud) with the provenance sidecar inline — the only transport that survives the connector's read-only sandbox — and heavy fits run through an async job_submit / job_status pattern so real compute isn't killed by the ~60 s per-call cap. Verified end-to-end against the live harness; see docs/user_guide/claude_science.md.
  • The animation battery — the nudge.viz figure layer gains 10 honesty-preserving GIFs (OED ellipse-collapse, robustness fold-approach, the amyloid gauge orbit, temporal/gLV, multi-reporter, identifiability, design, dose-response, constitutive-flip, …), each frame stamping its own abstention overlay — a figure can never draw a confident call the fit didn't make.
  • Red-team round P7 — a confident-wrong found and closed (NUDGE-LIM-025). The multi-operating-point gain⇄threshold breaker could confidently mis-call a large-gain perturbation as threshold; a measured identifiability gate (runner-up contamination, calibrated separator) now abstains instead, and a monostable circuit degrades gracefully to unresolved rather than crashing. Found → reproduced → fixed → independently audited (PASS).
  • New front page — an instructional README (logo, badges, quickstart, capability map) that complements the guided JUDGES_GUIDE.md.

Frozen core (fit.py / core/) untouched. Full gate green: ruff, pyright, 5 doc checkers, 379 tests passed.

Install

pip install nudge-bio        # or: pip install "nudge-bio[viz,mcp]"

Python ≥ 3.10; jax==0.5.1 pinned. See the CHANGELOG for the full [0.2.0] notes.

nudge-bio 0.1.0 — first release

Choose a tag to compare

@NicholasEhsanRoy NicholasEhsanRoy released this 12 Jul 20:45
849f7c4

NUDGE (nudge-bio) — Node/edge Ultrasensitivity Diagnostic for Gene-regulatory Effects — the first public release.

NUDGE is a mechanism-attribution tool for perturbation (Perturb-seq) screens: it fits a compositional, differentiable circuit model to single-cell count data and calls whether a knockdown moves a switch's threshold (K), gain (n), or ceiling (v_max) — and abstains when the data can't identify the mechanism rather than emit a confident guess. A confident-wrong call is the only hard failure.

Gene circuits were the initial target; the same core (a differentiable ODE + a calibrated abstention gate) already reaches microbial community dynamics, protein aggregation kinetics, and differentiable experimental design.

Highlights

  • 14 mechanism/attribution capabilities (NUDGE-METHOD-001..014): dose-response, cross-modality, synergy/epistasis, robustness dial, inverse design, multi-reporter, hidden-node abstention, differential, constitutive control, temporal/Lotka–Volterra, fibrillization kinetics, and gradient-based optimal experimental design.
  • Honesty is measured, not asserted — 0% misclassification across hundreds of synthetic datasets, adversarially red-teamed across seven rounds; every found hole was reproduced then closed or locked as a regression decoy, with a final full re-scan finding 0 holes.
  • nudge.viz — an opt-in, provenance-carrying figure layer with a renderer per result type; abstentions render as abstentions.
  • nudge CLI + a Claude MCP server — drivable from a terminal and by Claude in plain language.

Built for the Built with Claude: Life Sciences hackathon (July 2026), and itself an experiment in Claude-assisted development.

Install

pip install nudge-bio

Python ≥ 3.10; pulls maddening[ift]>=0.3.1, jax==0.5.1 (pinned). Optional extras: [bio] (real-data loaders), [viz] (figures), [mcp] (Claude server).

See the CHANGELOG for the full [0.1.0] notes.