Changelog¶
All notable changes to equilibria are documented in this file.
The format follows Keep a Changelog and the project adheres to Semantic Versioning. Entries are curated milestones (user-visible capability), not an exhaustive commit log.
[Unreleased]¶
Fixed¶
GTAP7 pure 5x5 ifSUB=1 MCP shock parity closed: 92.35% → 100% (MCP gate 18/18 rows green, floor restored 92 → 99). The “multi-root pet/pe export block” was a spurious complementarity corner FABRICATED by Python: GAMS declares every quantity as a free variable (its MCP rows must hold with F=0 exactly), while Python’s
NonNegativeRealsbox let PATH parkxw=xet=0and read the violatedpet==psrow as bound slack.xw/xetare now free (Reals); the June 15x10 “autarky corner / crash jumps basins” episode was the same class. PATH options now default per mode to the options each reference family was actually solved with (pure bundles carry nopath.opt→ PATH defaults; altertax bundles → the tight inlined set), which also keeps 15x10 pure ifSUB=0 at 100%.
Added¶
F-docs: restructured documentation site (six sections), architecture overview, templates overview, artifact-style parity matrices (NLP vs NLP / MCP vs MCP for GTAP and PEP), expanded API reference, this changelog, and a
docs-buildCI job.
Fixed¶
GTAP7 15x10 altertax shock parity closed: 94.5/95.8% → 99.5/99.5% @1% (gate floors 94/93 → 99/99), no regression on any other dataset. Three stacked causes: (1) the June Armington-shares fix was orphaned on an unmerged branch — recovered by cherry-pick; (2) the reference GDX violated its own
xfeq(negative factor demands) — regenerated one-shot on NEOS with tight PATH options (convergence_tolerance 1e-10, inlinedpath.opt); (3) under altertax-CD the GAMSpxeq/pvaeq/pndeqrows are tautologies (proved under-determined GAMS-vs-GAMS: three runs, three parkings), while Python added its own CD-dualpxeqdeterminant — the full degenerate triple (pva/pnd/px) is now pinned at the reference’s shock slice, replicatinggtap.holdfixed=1.Removed the unfaithful
1e-8lower-bound floor on quantity variables (GAMS bounds prices only): microscopic cells below the floor made the GAMS point infeasible in Python and blew up their paired CES prices.Multi-period gate solves now default to the same PATH options the GAMS reference bundles solve with (
crash_method none,nms_searchtype line,convergence_tolerance 1e-10;PATH_CAPI_OPTIONSoverrides win). With default options PATH’s crash phase jumps basins even from an exact solution — this closed the long-open 15x10 pure “wrong-branch” debt (shock 89.8 → 100.0% @1%).ytax[ft]/[fs]variable inits aligned with the liveeq_ytax(Σftrv/−Σfbep;fswas hardcoded 0).
[0.5.1] — 2026-07-18¶
Added¶
PEP-1-1 v2.1 ported to Pyomo (
equilibria.templates.pep_pyomo): NLP (IPOPT) and MCP (PATH) forms at 100% cell parity vs the GAMS CNS and GAMS-native MCP references, base + SIM1 export-tax shock (PR #25).PEP parity coverage matrix (
scripts/pep/pep_coverage_matrix.py) with its generated docs page and CI sync gate.GTAP7 NLP-vs-NLP and MCP-vs-MCP per-stage fidelity gates (
test_gtap7_nlp_parity.py,test_gtap7_mcp_parity.py) with NEOS-regenerated references (PR #24).GTAP altertax multi-period pipeline (base → check → shock) with the CI
.nlparity gate extended to the check phase (PR #20).GTAP7 parity coverage matrix as single source of truth — declarative ROWS driving the pytest gates and the generated docs page (PR #21).
GTAPAgg datasets registered (
gtap7_3x3…gtap7_15x10, incl. the 10r×15c consolidated GDX).equilibria-1.0 roadmap reconciled with real state (PR #27).
Fixed¶
Closed the GTAP7 shock-parity gap (PR #19) and reached 9x10 full NEOS parity (sluggish factors + NEOS compile fixes).
Reverted the unfaithful WCO/RCO→1.0 normalization in the PEP calibration; closed xmodel phase-2/3 (PR #26).
[0.5.0] — 2026-05-20¶
Added¶
RunGTAP welfare-parity engineering: shadow demand integrator + babel HAR writer wired into the GTAP welfare pipeline (PR #10).
[0.4.0] — 2026-05-20¶
Added¶
Clean-room HAR writer (
babel.har):HarWriterbuilder with L3/L5/L7 record validation (PR #11).GTAP welfare decomposition + per-OS benchmarks page (PR #6).
CGEBox altertax + welfare-decomposition port plans (PR #7).
[0.3.0] — 2026-05-12¶
Added¶
GTAP Standard 7 template at 100% parity (base + shock) vs the GAMS NEOS references for the 9x10 and NUS333 datasets.
Native pure-Python HAR reader in
babel.har(drops theharpy3dependency); bundled 9x10/NUS333 HAR datasets behindload_bundled.Public shock API:
apply_shockparent +apply_tariff_shock.Sphinx + MyST + sphinx-gallery documentation site for Read the Docs, with MIP→SAM, PEP and GTAP quickstarts and a benchmarks page rendered from committed parity CSVs (dual NEOS/local reference + wall-time).
ytax(r,gy)emitted with the 10 canonical GAMS tax streams (PR #3); postsimpdp/pmprecalc for alpha=0 cells.MIP→SAM pipeline closure in
sam_tools(balancedsimple_mipwithout xfail).
[0.2.0] — 2026-03-08¶
Added¶
simulationsruntime contract: mapping adapters, ieem/gtap/icio model adapters, multi-model wrappers, and CLI parity-runner coverage.