PEP-1-1 Parity Coverage Matrix¶
Coverage for the pep2 dataset — the PEP-1-1 v2.1 CGE model ported to Pyomo (equilibria.templates.pep_pyomo). Every row compares the Pyomo solve against a GAMS reference solved by the same engine (IPOPT vs IPOPT, or PATH vs PATH), so the solver’s equality tolerance cancels and the cell-by-cell match reflects model fidelity, not solver noise.
NLP vs NLP¶
The Pyomo model solved as an NLP (IPOPT on the raw model, nlp_scaling_method=none, faithful to GAMS’s raw solve) against the GAMS CNS reference Results.gdx. The benchmark BASE reproduces the SAM, so the seeded point is the calibration answer. Run: phase1_nlp.py --model pep --dataset pep2 --period BASE.
| Scenario · form | Cells | Match | Gate | Reference |
|---|---|---|---|---|
| basenlp | 317 | 100%local | phase1_nlp.py --form nlp / test_faithful_at_benchmark | Results.gdx (GAMS CNS, val*) |
MCP vs MCP¶
The Pyomo model solved as a complementarity problem via PATH against the GAMS-native MCP reference (PEP-1-1_v2_1_mcp_solve.gms: MODEL /ALL/ + SOLVE USING MCP, so GAMS infers the equation↔variable pairing). The sim1 row is the reference counterfactual — a 25% export-tax cut (ttix.fx=ttixO*0.75) — applied faithfully in Python by scaling the ttixO benchmark before build. Run: phase1_nlp.py --model pep --dataset pep2 --form mcp.
| Scenario · form | Cells | Match | Gate | Reference |
|---|---|---|---|---|
| basemcp | 367 | 100%local | test_mcp_matches_gams_native_mcp | Results_mcp.gdx (GAMS /ALL/ MCP) |
| sim1mcp | 314 | 100% (GDP_BP 46707→46748.2)local | test_mcp_sim1_shock_matches_gams | Results_mcp_sim1.gdx (GAMS MCP, ttix·0.75) |
NLP↔MCP mirror¶
The two Pyomo forms, solved from the same feasible benchmark seed, land on the identical point (LEON, the form-defining Walras slack, is excluded). The one historical gap — PD['othind'], filled from its *O benchmark (1.132) rather than a blind 1.0 — closed the mirror to a clean 100%.
| Scenario · form | Cells | Match | Gate | Reference |
|---|---|---|---|---|
| baseboth | 466 | 100%local | test_nlp_mcp_mirror | self (NLP vs MCP, LEON excl) |
objdef variant¶
The objdef variant adds a dummy objective (OBJDEF: OBJ==0, minimize OBJ) — the SOLVE NLP MINIMIZING OBJ lineage. A constant objective cannot move the equilibrium, so objdef-NLP lands on the exact base-NLP point; in the MCP form OBJ is not declared, keeping the system square.
| Scenario · form | Cells | Match | Gate | Reference |
|---|---|---|---|---|
| basenlp | 467 | 100% (== base-NLP)local | test_objdef_variant_equals_base_nlp | self (objdef vs base) |
| basemcp | 358 | square, code=1local | test_objdef_mcp_is_square_and_solves | self (objdef+MCP squareness) |