Skip to content

Fix hda hull and GLOA benchmark paths#130

Open
bernalde wants to merge 1 commit into
mainfrom
fix/issue-67-hda-hull-gloa
Open

Fix hda hull and GLOA benchmark paths#130
bernalde wants to merge 1 commit into
mainfrom
fix/issue-67-hda-hull-gloa

Conversation

@bernalde

Copy link
Copy Markdown
Member

Summary

  • Clamp HDA warm-start values to declared Pyomo variable bounds to remove out-of-bounds construction warnings.
  • Add a positive unconverted auxiliary and domain-safe nonlinear algebra so HDA can be reformulated with gdp.hull and used by GDPopt GLOA without invalid inactive-disjunct domains.
  • Add focused HDA tests covering warning-free model construction and supported Big-M/Hull GDP transformations.

Tests run

  • /home/bernalde/.pixi/bin/pixi run pytest tests/test_hda.py -v --tb=short -> 3 passed.
  • /home/bernalde/.pixi/bin/pixi run pytest tests/test_module_imports.py -v --tb=short -> 68 passed.
  • /home/bernalde/.pixi/bin/pixi run test -> 287 passed, 1 skipped.
  • /home/bernalde/.pixi/bin/pixi run lint -> passed.
  • git diff --check -> passed.
  • /home/bernalde/.pixi/bin/pixi run gdplib-benchmark warnings --instances hda --strategies gdp.bigm gdp.hull --mode transform --run-id issue67_hda_transform_warnings_final -> 0 warning events, 0 errors.
  • /home/bernalde/.pixi/bin/pixi run gdplib-benchmark run --instances hda --strategies gdpopt.gloa --timelimit 60 --solver-profile gams-local --run-id issue67_hda_gloa_60s_unconverted -> result JSON reports GDPopt GLOA optimal with objective 1105.3441871686007; the CLI exited 1 after writing results because of an unrelated post-run summary import error: ModuleNotFoundError: No module named 'generate_benchmark_summary_all'.

Notes

  • I did not run a full long solver benchmark matrix or claim a direct Hull MINLP optimum. The default tests stay solver-free, and optional solver-backed benchmarking is kept separate from CI.
  • Issue Plan PyPI release workflow and Pixi platform support #104 was considered as a related follow-up, but it concerns release/Pixi policy and is outside this HDA model fix.

Closes #67

@bernalde

Copy link
Copy Markdown
Member Author

Direct gdp.hull + local DICOPT diagnostic

I dug into the concerning direct gdp.hull result where the gams-local profile reported infeasible with DICOPT.

What I found:

  • The original 5 minute direct gdp.hull + local DICOPT run is reproducible as a solver failure/infeasible local MINLP path, not as proof that the HDA GDP model is logically infeasible. The DICOPT log says the relaxed NLP is infeasible and recommends checking the RMINLP.
  • The same unfixed direct Hull model is numerically difficult for other solvers too:
    • gdp.hull + GAMS/Gurobi, 300s: reported infeasible (gdp.hull_gams_gurobi.json in run issue67_hda_hull_gurobi_5min_clean).
    • gdp.hull + GAMS/BARON, 300s default options: reported infeasible (gdp.hull_gams_baron.json in run issue67_hda_hull_baron_5min_clean).
  • However, the transformed Hull model does contain feasible integer points. Fixing the route found by GDPopt GLOA and then applying/solving Hull with BARON gives:
    • gdp.hull fixed route + BARON, 120s: optimal with lower bound 1105.3399183842237 and upper bound 1105.33991842781.
    • Transforming with Hull first and then fixing the same route also solves with BARON to the same objective range.
  • Local continuous solvers are the weak link here:
    • Fixed-route Hull + IPOPTH from the model's default start reports infeasible.
    • Passing warmstart=True through the GAMS interface did not change the fixed-route IPOPTH result.
    • Starting DICOPT from the GLOA route indicators, without fixing them, still reports infeasible.
  • A BARON IIS diagnostic did not support true infeasibility. With CompIIS 1, BARON did not return an IIS; it found incumbents and the kept log reported 0 INFEASIBLE. I am treating that run as diagnostic only, not as a replacement benchmark solve.

Conclusion:

The direct gdp.hull + local DICOPT result should be recorded as a local solver/numerical failure for the nonconvex Hull reformulation, not as evidence that the HDA model or the PR's Hull transformation support is wrong. PR #130 fixes construction, transformation, and GDPopt GLOA paths. A robust direct-Hull MINLP solve remains separate follow-up work, likely involving better formulation scaling/initialization and solver-profile-specific handling rather than another narrow deprecation/domain fix in this PR.

@bernalde

Copy link
Copy Markdown
Member Author

GDPopt LOA nonconvex bound reporting

Another benchmark caveat for this HDA instance: the local gdpopt.loa row reports:

termination: optimal
LB = UB = 1011.6577899409375

That should not be read as a rigorous global certificate. HDA is nonconvex, and LOA's OA/discrete bound is not guaranteed to be valid globally in that setting. Other methods found a better feasible/global solution around 1105.34, so the LOA-reported upper bound of 1011.6577899409375 is not a valid global upper bound for this maximization model.

I opened an upstream Pyomo issue for the result-semantics problem:

Pyomo/pyomo#3947

For this PR, I would record the LOA result as a local/non-rigorous LOA incumbent, not as a certified optimum.

@bernalde bernalde force-pushed the fix/issue-67-hda-hull-gloa branch from 07a5efd to 5f673ed Compare May 14, 2026 16:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Refactor hda to fix benchmark issues

1 participant