All notable changes to SIROM are documented here. The format follows Keep a Changelog, and this project adheres to Semantic Versioning.
0.4.4 — 2026-06-07
Documentation patch. No library code or API change.
- A "Release history" table in
README.mdlinking each version to its GitHub release, its milestone (with PR count), andCHANGELOG.md.
0.4.3 — 2026-06-07
Tooling / process patch. No library code or API change.
scripts/refresh_release_index.py— regenerates the cross-release "Changelog index" footer on every GitHub release (versions fromgh release list, blurbs from this file); idempotent, with a--dry-runpreview.- A "Cutting a release" section in
CONTRIBUTING.mddocumenting the release flow end to end.
0.4.2 — 2026-06-07
Tooling / process patch. No library code or API change.
- This
CHANGELOG.md, documenting every release. - A three-layer guard ensuring a version bump always ships its changelog entry:
a CI
changelog-guardjob (the un-bypassable merge gate), a gitpre-commithook (.githooks/, enabled per clone withgit config core.hooksPath .githooks), and a Claude CodePreToolUsehook (.claude/). SeeCONTRIBUTING.md.
0.4.1 — 2026-06-07
Documentation patch over 0.4.0. No code or API change.
- The robust-CVRP demo README records that it runs on SIROM v0.4.0 and clarifies
that the v0.4.0 refactors don't change the
POST /solve→GET /jobs/{id}contract the demo consumes. CONTEXT.mdgains the rest of the v0.4.0 vocabulary — the cluster tree (Cluster tree,build,replicate) and validation status (Status,has_errors).
0.4.0 — 2026-06-06
Architecture-deepening release: make modules honest and concentrate scattered logic. No behavioural change to the solver or the HTTP API contract.
- Honest two-stage
Solutioncontract — the solver produces anUnscoredSolution(decision vector only on optimal solves); the scoring stage addsfeasibility_probabilityvia an explicitscore()transform, yielding aScoredSolution.is_optimal()/feasibility()accessors replace the hand-rolled key-presence guards, andsolve_statusis typedint. ClusterTree.build()now owns the KMeans / WCSS / selection / subdivision algorithm that previously lived in the orchestrator; thereplicategate no longer leaks.batch_solvershrinks ~70 lines.- One core-level
has_errorsgate (sirom/status_checks.py) replaces theany("[ERROR]" in s …)prose-match repeated at eight sites. - The API drops a brittle
resultsslice and counts cluster nodes from the tree.
CONTEXT.md— domain glossary (including thefeasibility probabilityvs robustness naming split).docs/adr/— first Architecture Decision Records, capturing the decisions not to make: keepOptimizationProblem+Coefficient(0001), keep the portfolio and CVRP request builders separate (0002), and count cluster nodes from the tree rather than add a stage-tag seam (0003).
0.3.0 — 2026-06-05
- Robust CVRP demo over VRP-REP (
demo/vrp/) — pick a real CVRP instance from VRP-REP and get a Pareto frontier of candidate routings trading distance against the probability the plan stays feasible. A "SIROM-as-a-service" demo: the backend builds aSolveRequest, POSTs it to the SIROM HTTP API, and polls the job — it never imports SIROM.- Two uncertainty modes (demand → capacity; travel time → a synthesized shift limit), toggled in the UI with α / customers / scenarios / shift sliders.
- Every coordinate-based CVRP dataset on VRP-REP (Augerat A/B/P, Fisher F, Christofides CMT/Set M, Uchoa 2014 X-instances, Golden, Li, VeRoLog); instances listed lazily from each zip; large instances subsampled to the depot + K nearest customers.
- Route-based robustness (Monte-Carlo over decoded routes), an SVG route map, and a recharts distance-vs-robustness frontier, all in Docker Compose.
0.2.0 — 2026-06-01
First substantial release of SIROM as a deployable, documented service.
- HTTP API — async job API (
POST /solve→ pollGET /jobs/{id}) with a self-documenting Swagger/docsand a ready-to-run/example. - Docker — multi-stage image +
docker compose up, with a Redis-backed job store for multi-worker scale-out. - MILP support — integer variables, with solver auto-selection (GLOP for LPs, SCIP for MILPs) and overrides for CLP, PDLP, and commercial GUROBI/CPLEX/XPRESS.
- A polished robust investment-portfolio web demo (
demo/).
- ~9–29× faster — GLOP auto-selection, vectorized quality measure and
scenario generation, and threaded scenario solves (see
benchmarks/).
- Corrected the constraint-slack used as a clustering feature (it previously
computed
A_i·x - b_i·sum(x)instead ofA_i·x - b_i).
Initial implementation of the Simulation-based Robust Optimization Method (unreleased; superseded by 0.2.0). Implements the method from Butkeraites, de Salles Neto & Gendreau, Expert Systems with Applications 203:117337 (2022).