Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/oedm-performance-figures.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Build OEDM performance figures

on:
push:
branches:
- codex/oedm-v023-manuscript
paths:
- manuscript/oedm2026/scripts/make_manuscript_figures.py
- manuscript/oedm2026/tables/performance_tables_2026-08-06/**
- benchmarks/datasets.py
- src/stratascan/synthetic.py
- topology_noise_benchmark/generators.py
- .github/workflows/oedm-performance-figures.yml

permissions:
contents: write

jobs:
render:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: codex/oedm-v023-manuscript
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: pip
- name: Install package and plotting dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -e .
python -m pip install matplotlib pandas scikit-learn
- name: Generate figures and tables
env:
PYTHONPATH: src:.
run: python manuscript/oedm2026/scripts/make_manuscript_figures.py
- name: Commit rendered artifacts
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git add manuscript/oedm2026/figures/performance_2026-08-06
git diff --cached --quiet && exit 0
git commit -m "Render reproducible OEDM performance figures"
git push
69 changes: 69 additions & 0 deletions benchmarks/protocol.v0.2.3-biological.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{
"schema_version": 1,
"protocol_version": "0.2.3-biological",
"purpose": "released_stratascan_0_2_3_biological_revalidation_against_frozen_baselines",
"parameter_mode": "released_defaults_fixed",
"resources": {
"threads": 1,
"timeout_seconds": 1800,
"memory_limit_mb": 8192
},
"methods": ["StrataSCAN"],
"stochastic_methods": [],
"method_parameters": {
"version": "0.2.3",
"k": 32,
"shell_ranks": [4, 8, 16, 32],
"criterion": "semantic_icl",
"initial_component_bound": 8,
"hard_component_bound": 24,
"background_distribution": "gamma_components",
"component_roles": "largest_rate_gap",
"core_rank": 4,
"connectivity_rank": 4,
"border_rule": "strict_local_core_radius"
},
"comparison": {
"baseline_status": "frozen_reused",
"baseline_implementation_commit": "5071f3237a76cfd5c7c6c8179df446c0335127b7",
"baseline_results": [
"results/runs/publication_full_7synthetic_20260722/results.csv",
"results/runs/samusik_01/results.csv",
"results/runs/samusik_all_samples_02_10/results.csv"
],
"quality_tolerance": 0.002,
"severe_regression": 0.02,
"runtime_ratio_limit": 1.25
},
"synthetic": {
"quality_seeds": [],
"scaling_seeds": [],
"quality_sizes": [],
"scaling_sizes": [],
"cases": []
},
"cytometry": {
"seeds": [42],
"datasets": [
{"id": "levine", "features": "data/processed/levine/features.csv", "feature_metadata": "data/processed/levine/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/levine/event_metadata.csv", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "mosmann", "features": "data/processed/mosmann/features.csv", "feature_metadata": "data/processed/mosmann/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 150.0}, "metadata": "data/processed/mosmann/event_metadata.csv", "label_column": "population_id", "background_labels": ["other"]},
{"id": "nilsson", "features": "data/processed/nilsson/features.csv", "feature_metadata": "data/processed/nilsson/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 150.0}, "metadata": "data/processed/nilsson/event_metadata.csv", "label_column": "population_id", "background_labels": ["other"]},
{"id": "samusik_01", "features": "data/processed/samusik_01/features.csv.gz", "feature_metadata": "data/processed/samusik_01/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_01/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_02", "features": "data/processed/samusik_02/features.csv.gz", "feature_metadata": "data/processed/samusik_02/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_02/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_03", "features": "data/processed/samusik_03/features.csv.gz", "feature_metadata": "data/processed/samusik_03/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_03/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_04", "features": "data/processed/samusik_04/features.csv.gz", "feature_metadata": "data/processed/samusik_04/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_04/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_05", "features": "data/processed/samusik_05/features.csv.gz", "feature_metadata": "data/processed/samusik_05/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_05/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_06", "features": "data/processed/samusik_06/features.csv.gz", "feature_metadata": "data/processed/samusik_06/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_06/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_07", "features": "data/processed/samusik_07/features.csv.gz", "feature_metadata": "data/processed/samusik_07/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_07/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_08", "features": "data/processed/samusik_08/features.csv.gz", "feature_metadata": "data/processed/samusik_08/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_08/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_09", "features": "data/processed/samusik_09/features.csv.gz", "feature_metadata": "data/processed/samusik_09/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_09/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]},
{"id": "samusik_10", "features": "data/processed/samusik_10/features.csv.gz", "feature_metadata": "data/processed/samusik_10/feature_metadata.csv", "feature_classes": ["type"], "transform": {"name": "arcsinh", "cofactor": 5.0}, "metadata": "data/processed/samusik_10/event_metadata.csv.gz", "label_column": "population_id", "background_labels": ["unassigned"]}
]
},
"gaia": {
"seeds": [42],
"data_root": "data/raw/mctnc/MCTNC_open_data_release/MCTNC_open_data_release/data",
"profiles": ["unsupervised_field"],
"ruwe_max": 1.6
}
}
4 changes: 4 additions & 0 deletions intended_regime_benchmark/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
"""Standalone synthetic benchmark for compact targets in diffuse background."""

SCHEMA_VERSION = 1

34 changes: 34 additions & 0 deletions intended_regime_benchmark/metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from __future__ import annotations

from typing import Any

import numpy as np

from redesigned_benchmark_pilot.metrics import evaluate as pilot_evaluate


def evaluate(y_true: np.ndarray, y_pred: np.ndarray) -> dict[str, Any]:
metrics = pilot_evaluate(y_true, y_pred)
true_labels = np.unique(y_true[y_true >= 0])
pred_labels = np.unique(y_pred[y_pred >= 0])
substantial = np.zeros((true_labels.size, pred_labels.size), dtype=bool)
for row, true_label in enumerate(true_labels):
truth = y_true == true_label
threshold = max(1, int(np.ceil(np.sum(truth) * 0.05)))
for column, pred_label in enumerate(pred_labels):
substantial[row, column] = np.sum(truth & (y_pred == pred_label)) >= threshold
fragments = np.sum(substantial, axis=1) if substantial.size else np.zeros(true_labels.size)
metrics["extra_signal_fragments"] = int(np.sum(np.maximum(fragments - 1, 0)))
metrics["mean_target_fragments"] = float(np.mean(fragments)) if fragments.size else 0.0
metrics["merged_predicted_clusters"] = (
int(np.sum(np.sum(substantial, axis=0) >= 2)) if substantial.size else 0
)
metrics["spurious_background_majority_clusters"] = int(
sum(
np.sum((y_pred == label) & (y_true < 0))
> np.sum((y_pred == label) & (y_true >= 0))
for label in pred_labels
)
)
return metrics

Binary file modified manuscript/oedm2026/MDL-StrataSCAN_OEDM2026_draft.pdf
Binary file not shown.
18 changes: 13 additions & 5 deletions manuscript/oedm2026/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ renders.

The evidence is deliberately separated by evaluation stage:

- the new 0.2.3 release robustness grid: seven families, five sizes, and five
seeds (175 StrataSCAN jobs), with all jobs completed, a 22.6x median paired
speedup against the conservative solver, and retained negative cells;
- completed serial 0.2.3 multidensity scaling measurements through 2,000,000
points; the remaining five-million-point campaign cells are explicitly
incomplete and are not reported as endpoints;
- the original 315-job synthetic reference matrix: seven families, five
pre-freeze seeds, nine methods, `n = 5,000`, with quality, segmentation,
runtime, and process-memory measurements;
Expand All @@ -44,11 +50,13 @@ The evidence is deliberately separated by evaluation stage:
- the prespecified 24-field Gaia DR3 pilot;
- conventional graph/density baselines where protocol coverage permits.

The scalability evidence is deliberately separated by algorithm generation.
The evaluated fixed-range snapshot has direct monitored runs through the
The scalability evidence is deliberately separated by algorithm generation and
protocol. The 0.2.3 release has completed direct serial multidensity runs
through 2,000,000 points; its other scaling cells remain in progress. The
historical fixed-range snapshot has direct monitored runs through the
396,460-cell Mosmann dataset. The one-million-point dev9 smoke test and the
five-million-point 0.1.2 matrix are retained as lineage evidence, not attributed
to the submitted solver. `tables/scalability_evidence_boundaries.csv` records
to the submitted solver. The historical scalability evidence table records
this distinction explicitly.

The incomplete 359-field Gaia sweep is not included in any result, table, test,
Expand Down Expand Up @@ -82,5 +90,5 @@ artifact. The manuscript distinguishes strong biological recovery evidence from
segmentation/background limitations and the mixed Gaia pilot rather than making
a universal-superiority claim.

The checked PDF is nine US-Letter pages including references. Its SHA-256
digest is `fa85c74693abfe82b92f1bacf73ff81d983e0449c3da5a898d382a3bf4e7c19f`.
The checked 0.2.3 PDF is ten US-Letter pages including references. Its SHA-256
digest is `95fd4970b9925677081403ceecd0e26cea4fbcb5afed9077bb7c68b370322a15`.
36 changes: 36 additions & 0 deletions manuscript/oedm2026/REVIEW_AND_REVISION.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 +158,39 @@ the locked revision still has only two unseen seeds per family.
- Offline source and wheel builds completed for version 0.2.2.
- The exact final PDF is nine US-Letter pages with result floats before the
discussion and references.

## Round 5 - 0.2.3 release update and review

The workshop manuscript was updated for the compiled constrained-Gamma solver
and guarded local confirmation introduced in 0.2.3. The review found that the
earlier draft would have materially overstated provenance if its fixed 1--8
component description and historical real-data outputs were silently treated as
the released 0.2.3 method.

Corrections in this round:

- The method and protocol sections now describe the released adaptive 8--24
component search, one split-warm ordinary fit, and the stricter local
confirmation conditions.
- A new results subsection reports the completed 175-cell seven-family
robustness grid, including all recovered conservative timeouts, paired speed
and pairwise-F1 summaries, and the four retained material regressions.
- A new serial scaling table reports only the completed 0.5M, 1M, and 2M
multidensity jobs. The unfinished 5M and remaining-family cells, and all
unfinished campaign phases, are explicitly excluded from conclusions.
- The biological, Gaia, and older locked-synthetic analyses are now labelled
historical rather than evidence for 0.2.3, because they were not rerun under
the release profile.

Remaining release-specific limitations are visible in the paper: quality can
still change because local optima differ from the conservative solver; four
non-imbalanced cells lose more than 0.05 pairwise F1; and the completed scaling
evidence currently covers a single family and seed. The review recommendation
therefore remains scoped: the new data support a speed-and-robustness release,
not universal quality or real-data superiority.

### Round 5 verification

- Tectonic compilation completed with no unresolved references.
- The final ten-page PDF was rasterized at 150 dpi and every page was visually
inspected; no clipping, overlap, or broken table/figure layout was found.
19 changes: 11 additions & 8 deletions manuscript/oedm2026/artifact_manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@
"evaluated_method": {
"display_name": "MDL-StrataSCAN",
"historical_result_id": "StrataSCAN-Optimization",
"snapshot": "0.2.0-dev10",
"gamma_component_range": [1, 8],
"adaptive_component_search": false,
"snapshot": "0.2.3",
"gamma_component_range": [1, 24],
"adaptive_component_search": true,
"shell_ranks": [4, 8, 16, 32],
"core_rank": 4,
"connectivity_rank": 4
},
"release_context": {
"public_version": "0.2.2",
"public_version": "0.2.3",
"public_component_range": [1, 24],
"public_adaptive_component_search": true,
"relationship": "The public release preserves the 0.2.1 algorithm defaults; manuscript results use the frozen fixed-range snapshot above."
"relationship": "The manuscript reports the 0.2.3 release robustness and completed serial scaling evidence separately from historical fixed-range synthetic, biological, and Gaia results."
},
"declared_endpoints": {
"synthetic": "macro_target_f1",
Expand All @@ -30,7 +30,7 @@
"biological_study_leave_one_out"
],
"sha256": {
"manuscript/oedm2026/MDL-StrataSCAN_OEDM2026_draft.pdf": "fa85c74693abfe82b92f1bacf73ff81d983e0449c3da5a898d382a3bf4e7c19f",
"manuscript/oedm2026/MDL-StrataSCAN_OEDM2026_draft.pdf": "95fd4970b9925677081403ceecd0e26cea4fbcb5afed9077bb7c68b370322a15",
"results/runs/publication_full_7synthetic_20260722/results.csv": "8c4ebadc9c1bde8f2e0b0ce69dd68d0daa62c5d5a3432b76fefd3fe317e3fa68",
"results/runs/samusik_01/results.csv": "463931d1250ce4eb0e4505f231473d285288882cac4aa2bef6206365e9ac545e",
"results/runs/samusik_all_samples_02_10/results.csv": "28839ba4921b63318a45fcce3033cbe478475b0c2851a0f5e5d00546bc4e1bf7",
Expand All @@ -44,12 +44,15 @@
"benchmarks/protocol.optimization-v0.2.0-dev10.json": "8d81d8c76c6936dd84a1c54153251304da53d60d9914430cd9ea77f1096614cc",
"benchmarks/protocol.optimization-v0.2.0-dev10-real-pilot.json": "8d975776ada0bda94a5a22ad4c26a45423fb71be957af067763802853362e622",
"benchmarks/protocol.v0.2.1-release.json": "bee41c84b8d609ca3d8cbaf6a7dd0bfb68d785948203fbadb3258a0f2148c0ee",
"benchmarks/protocol.v0.2.2-release.json": "d4a16647fafea23c11e384fea241d861558c5981687ac6df3e2998c3c7eae279"
"benchmarks/protocol.v0.2.2-release.json": "d4a16647fafea23c11e384fea241d861558c5981687ac6df3e2998c3c7eae279",
"benchmarks/protocol.v0.2.3-release.json": "0a26b3a0a8bd0248864dc560d27aaf9dec4582d102ff2489f40ba67132585c4c",
"benchmarks/protocol.v0.2.3-seven-family-robustness.json": "f10d1488dcfd5930e7df810d7ecfcc3a3ef293c0a2c2daff7b1a6d0f434e0f8a",
"benchmarks/protocol.v0.2.3-seven-family-stratascan-scalability-5m.json": "1f7dbd5df7b4a2134d5fbb7f820778b08335821e5831b3be77900bd7cd8c7a77"
},
"notes": [
"Frozen result files retain their historical method identifiers.",
"Current replay protocols use explicit versioned identifiers so the mutable public StrataSCAN alias cannot select the wrong estimator.",
"The target-background and target-background-structure harmonic F1, Pareto counts, and study sensitivity summaries were computed after the frozen predictions and are not predeclared endpoints.",
"Scalability records are attributed to their exact algorithm generation; only fixed-range MDL rows characterize the submitted snapshot."
"Scalability records are attributed to their exact algorithm generation and protocol; the completed 0.2.3 serial multidensity records through two million points are separated from historical rows and incomplete campaign cells."
]
}
Binary file modified manuscript/oedm2026/figures/fig0_method_pipeline.pdf
Binary file not shown.
Loading