Analysis Exports
How dispatchatlas.analytica turns campaign results into statistical summaries, deterministic tables, accessible SVG figures, evidence bundles, and portal datasets.
dispatchatlas.analytica turns completed campaign repositories into statistical
summaries, deterministic figures, evidence bundles, and portal-ready datasets.
The package consumes stable JSON manifests and does not import the campaign
runtime.
Runnable example: examples/analyze_results.py summarizes a result set with non-parametric statistics, effect sizes, confidence intervals, deterministic tables, and dual-format figures.
📥 Inputs
The analysis loader expects one campaign directory containing:
checkpoint.jsonwith completed, failed, and pending run ids.plan.jsonwith run order and disclosure labels.environment.jsonwith non-secret environment facts.results/*.jsoncompleted run rows.failures/*.jsonfailed attempt rows when present.
Missing checkpoints, content hashes, objective values, or disclosure labels fail ingestion before analysis starts.
📊 Statistical Methods
A named-method registry declares every analysis method with its data assumptions, minimum-sample rule, failure mode, and lowest evidence tier. Each inferential method and quality indicator requires at least 30 independent runs per stochastic solver-instance cell; a sub-floor sample routes to the limitations surface rather than producing an invalid result.
For each objective, the summary layer reports solver counts, feasible counts, mean, median, standard deviation, bias-corrected and accelerated (BCa) bootstrap confidence intervals, the Wilcoxon signed-rank test with the Vargha-Delaney A12 and Cliff's delta effect sizes for pairwise comparison, the Friedman omnibus test with a Nemenyi critical-difference post-hoc over the multi-solver field, Holm or Hochberg correction over the pairwise family, and average ranks by benchmark problem. Multi-objective fronts additionally report the hypervolume (primary), IGD+, additive epsilon-indicator, and spread quality indicators.
The default objective is makespan with minimization semantics. The Wilcoxon
test uses the exact null distribution for small tie-free samples and the
tie-corrected normal approximation otherwise. Confidence intervals use
deterministic bootstrap resampling with a recorded seed; they describe the
observed campaign sample and are not full-campaign claims by themselves.
Beside the closed-form Bayesian sign test, bayesian_signed_rank_test draws a
seeded Dirichlet-process posterior over the Walsh averages of the paired
differences, so continuous metrics get the magnitude-aware Bayesian comparison
of Benavoli, Corani, Demšar and Zaffalon (2017); the sign test stays the
closed-form default. The multiple-comparison family adds Shaffer's static
step-down procedure, which exploits the logical constraints of a complete
all-pairs comparison family and fails closed on a partial one (Shaffer 1986),
and Finner's step-down adjustment, a simpler power gain that accepts any
family (Finner 1993); Holm remains the configured default. Relative
percentage deviation joins the optimality-gap methods: arpd_rows scores
every feasible run against a caller-supplied best-known reference value with
explicit provenance, and ensure_equal_budgets verifies the size-scaled
equal-budget protocol behind it — one identical budget per problem across
solvers, budgets free to grow with instance size (Vallada, Ruiz and Framiñan
2015). Multi-objective hypervolume comparisons archive their shared reference
point: multiobjective_indicator_report derives the point under a named rule
— the margin-fraction default or the ishibuchi-h scaling — records the
ideal, nadir, rule, parameter, and a fail-closed provenance vocabulary in a
ReferencePointRecord, and ensure_shared_reference_points refuses to
compare artifacts whose archived points differ (Ishibuchi, Imada, Setoguchi
and Nojima 2018; the exact published offset stays marked APPROXIMATE pending
the operator-reviewed full text). One hard rule guards every exported table:
a p-value never ships without an effect size and an interval beside it.
ensure_effect_sizes_beside_p_values checks the headers inside the table
builders and again at bundle-write time, failing closed on any bare
significance column (Carrasco, García, Rueda, Das and Herrera 2020).
🖼️ Figures And Tables
Evidence bundles include Markdown tables for solver summaries, pairwise
comparisons, rankings, benchmark coverage, and infeasible rows. SVG figures
carry accessible title and desc metadata for ranking bars, performance
profiles, run-order objective trends, the Nemenyi critical-difference diagram,
runtime-quality trade-offs, convergence trajectories and the
convergence-variability band, the exploration-exploitation balance, the
diversity-objective phase portrait, the
global-versus-population-best (gbest/lbest) curve, runtime scalability by
instance size, seed stability (coefficient of variation), reliability
(feasible-run fraction), adaptability (cross-instance consistency), robustness
(CVaR tail risk), the objective-distribution box-and-whisker, multi-objective
quality indicators, the two-objective frontier, the search-space scatter, the
oblique 3D search-space scatter, centroid trajectory, and animated population
flipbook, and benchmark
characterization. A figure manifest records each figure's role, provenance, and
accessibility note. Figures that depend on diagnostics a campaign did not record
(runtime, convergence trace, population diversity, the optional per-iteration
population snapshot, instance scale) or on multiple seeds (seed stability)
render a limitations notice. A
supplement/limitations.md collects every method routed to limitations.
Re-running the same export against the same inputs produces the same JSON, table, and figure payloads.
The Dolan-Moré performance profile travels with its Moré-Wild companion:
data_profile_svg and data_profile_tex plot the share of (solver, problem)
cells solved to a target accuracy within a budget of evaluation groups — the
evaluation-group adaptation of the simplex-gradient unit — from the same
convergence traces the convergence figures consume, and a dataset without
traces routes to the limitations figure. Performance profiles that
compare more than two solvers carry an interpretation caveat in both output
forms: a profile ranks each solver only against the per-problem best, so the
relative order of non-best solvers is not implied (Gould and Scott 2016).
⚖️ Platform Comparison
The platform-comparison exports render rival-framework capability rows, a
feature-richness coverage matrix, a distribution-distance bridge assessment, and
artifact-inspection rows. Every row carries an evidence-source label
(documented, measured, artifact-inspected, vendor-claim, or
unsupported), and any unsupported row routes to a limitations-and-future-work
surface. The export carries a standing guard line: the tables compare platform
capabilities, features, and artifacts, and are not direct performance claims —
performance evidence lives in the statistical analysis exports.
🥊 Head-To-Head Comparison Lane
The head-to-head lane compares one focal solver against a named baseline cohort using the same named non-parametric tests, orients every row toward the focal solver, and gates a beats-cohort claim on the focal solver holding the best average rank and winning every pairwise comparison at the corrected significance level with the effect size favouring it. Algorithmic-complexity and construct/internal/external threats-to-validity table builders accompany the lane for report consumption.
🔒 Disclosure Policy
Exports are filtered through executable disclosure policies:
corepermits core/public evidence only.speedpermits core, speed, and public evidence.qualitypermits core, speed, quality, and public evidence.platformpermits platform evidence while still blocking redacted source and stale-narrative terms.
Forbidden rows are excluded from evidence and portal datasets and written to a supplementary exclusions manifest with the reason.
🗂️ Bundle Layout
evidence-bundle/
bundle.json
tables/
solver-summary.md
pairwise-comparisons.md
rankings.md
benchmarks.md
infeasible-rows.md
figures/
performance-profile.svg
solver-rankings.svg
run-order-trend.svg
critical-difference.svg
runtime-quality.svg
convergence.svg
convergence-band.svg
characterization.svg
exploration-exploitation.svg
diversity-fitness-portrait.svg
gbest-lbest.svg
scalability.svg
stability.svg
reliability.svg
adaptability.svg
robustness.svg
distribution.svg
multiobjective-indicators.svg
frontier.svg
search-space-scatter.svg
search-space-3d-scatter.svg
search-space-trajectory.svg
search-space-animation.svg
figure-manifest.json
supplement/
exclusions.json
limitations.mdbundle.json lists every generated file and hashes the canonical manifest
payload, so every table, figure, and supplement stays inside one tracked,
content-addressed manifest.
⌨️ Command
uv run dispatchatlas export `
--campaign-dir .\experiments\results\smoke-pilot `
--target-dir .\exports\smoke-pilot `
--authorized-output-root .\exports `
--tier core `
--objective makespan `
--portalThe command writes an evidence bundle plus an optional portal dataset. The
evidence bundle includes tables, figures, and supplementary exclusions. The
portal JSON includes searchable tags, disclosure labels,
objective values, run ids, and hash-linked campaign metadata.
--target-dir must resolve inside --authorized-output-root; the default
authorized root is the current working directory.
Run uv run dispatchatlas export --help for option descriptions and examples.
Runtime input errors print a recovery message by default; pass --debug before
the subcommand when a Python traceback is needed for development.
📝 Report scaffolds
The analysis layer also turns a disclosure-filtered evidence bundle into a
deterministic report scaffold keyed by evidence tier. A
ReportScaffoldSpec declares the contribution claim, design rationale, and
the claim gates; write_report_scaffold writes the evidence bundle plus a
comprehensive section plan, a contribution claim, a claim-gate
ledger, and a redaction report under
report/. Every section anchors to a filtered evidence artifact, and the
generated scaffold is scanned so a later-tier mechanism or a restricted internal
marker fails the write closed.
Claim gates are fail-closed: a design-level claim opens unconditionally, while a
comparative claim stays closed until a head-to-head comparison beats the cohort
with every paired count at or above the statistical-power floor. A
contribution_partition over the evidence tiers proves a zero-overlap
contribution per tier, and redaction_report accepts a caller-supplied register
so a non-public draft can be checked without that register ever entering shipped
source.
uv run dispatchatlas report `
--campaign-dir .\experiments\results\smoke-pilot `
--target-dir .\scaffolds\smoke-pilot `
--authorized-output-root .\scaffolds `
--tier core