Conversation
Local solver campaign updateI ran bounded 5-minute solver campaigns for Commands: /home/bernalde/.pixi/bin/pixi run gdplib-benchmark preflight --instances gdp_col --strategies gdp.hull gdpopt.gloa gdpopt.lbb --timelimit 300 --solver-profile gams-local --build-models --check-solvers
/home/bernalde/.pixi/bin/pixi run gdplib-benchmark run --instances gdp_col --strategies gdp.hull gdpopt.gloa gdpopt.lbb --timelimit 300 --solver-profile gams-local --run-id issue66_local_5min_20260511
/home/bernalde/.pixi/bin/pixi run gdplib-benchmark preflight --instances gdp_col --strategies gdp.hull gdpopt.gloa gdpopt.lbb --timelimit 300 --solver-profile gams-baron --build-models --check-solvers
/home/bernalde/.pixi/bin/pixi run gdplib-benchmark run --instances gdp_col --strategies gdp.hull gdpopt.gloa gdpopt.lbb --timelimit 300 --solver-profile gams-baron --run-id issue66_global_5min_20260511Environment metadata:
Results:
Failure details:
Runner note:
Interpretation:
|
Follow-up: GDPopt LBB failure root causeI dug further into the Root cause:
Evidence:
What the monkeypatch shows for
Related upstream context:
Practical implication for this PR:
|
db9de24 to
e1018a6
Compare
bernalde
left a comment
There was a problem hiding this comment.
Maintainer review of head e1018a6.
Both changes are correct, verified line by line. The feed-enthalpy initializers now come from the existing feed_liq_enthalpy_expr/feed_vap_enthalpy_expr Expressions (well-defined at construction; hand-computed values ≈10.1 and ≈34 land inside bounds, eliminating the W1002 warnings). The Antoine/Wagner rewrite from log form to exp form is algebraically equivalent given Pvap in [1e-3, 5] > 0 and Pvap_X in [0.25, 0.5], and under hull disaggregation the exp form stays evaluable at the origin where the base log(Pvap) failed; the constraint is valid in both its disjunct and global-block contexts, and the involved disjunct variables are globally bounded as hull requires.
Findings:
Blocking: closes an unresolved tracker — the body says "Closes #66", but issue #66's checklist has three open items (Hull, GLOA, LBB) and this PR's own benchmark table shows gdpopt.lbb still failing on both profiles (upstream Pyomo/pyomo#3941) and BARON declaring the hull-transformed model infeasible. Merging as-is auto-closes a tracker that is not resolved. Fix: treat the link as Refs #66 (recorded in a PR comment since the body stands), or close #66 only alongside a follow-up owning LBB and the BARON discrepancy.
Nonblocking: stale body bullet — the body's "Add an optional Pixi gurobi environment" is stale: [feature.gurobi] already exists at the merge-base (via PR #144); this diff touches only two files. The corrected scope should be recorded so reviewers are not misled.
Nonblocking: test placement — test_gdp_col_reformulates_with_hull and its sibling are not deprecation tests; placing them in tests/test_pyomo_deprecations.py is mild scope creep. Move both to a new tests/test_gdp_col.py.
Question: BARON infeasibility — BARON declares the hull-transformed model infeasible in 0.42 s while Gurobi finds a 22355.24 incumbent on the same model. Is the exp rewrite triggering a BARON domain/presolve issue worth a tracked follow-up on #66?
Evidence note: the gams-local gdpopt.gloa optimal 20916.392216 row (LB = UB) is the strongest solver evidence and supports the GLOA fix; the hull rows prove hull transforms and is solvable in principle, not that it is robustly fixed.
Summary — Blocking: 1. Nonblocking: 2. Questions: 1. Tests: static line-by-line verification of both fixes, including bound/domain arithmetic; CI is green at this head (6/6 checks). I would not merge this until the blocking issue above is addressed (an issue-linkage record; the code itself is sound). Posting as COMMENT (author account); the main ruleset requires one approving review from another maintainer.
|
Addressed the review of head e1018a6 in commit a1c16ec:
Tests: |
|
Follow-up on the BARON-infeasibility question from the review: it does not reproduce at this head. Hull + GAMS/BARON (120 s, optcr=1e-6, threads=1) returns the 22355.24 incumbent with max constraint violation 4.1e-9, and Big-M + BARON returns a feasible 19449.85 — which, for this minimize model, is strictly better than the body's "GLOA optimal 20916.39", so that gams-local GLOA label is falsified as a global claim. Details and re-baselining follow-ups recorded on #66. |
Summary
gdp_colfeed liquid and vapor enthalpy variables from the existing feed enthalpy expressions so construction no longer emits out-of-bounds Pyomo W1002 warnings.gdp.hulltransformation no longer evaluateslog(0)in the hull perspective.gdp.hullreformulation.gurobienvironment for directgurobipy/Pyomo Gurobi checks without making licensed solver bindings part of the default environment.Tests run
/home/bernalde/.pixi/bin/pixi run pytest tests/test_pyomo_deprecations.py -v --tb=short-> 6 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-> 279 passed, 1 skipped./home/bernalde/.pixi/bin/pixi run lint-> passed with exit code 0. The configured non-fatal flake8 inventory still reports existing repository style findings under--exit-zero./home/bernalde/.pixi/bin/pixi run gdplib-benchmark warnings --instances gdp_col --strategies gdp.hull --mode transform --no-check-solvers --run-id issue66_hull_warning --metadata-dir /tmp/gdplib-issue66-warning-metadata-> 0 warning events, 0 unique warning rows, 0 deprecation candidate events, 0 capture errors./home/bernalde/.pixi/bin/pixi install -e gurobi-> installed the optional Gurobi Pixi environment./home/bernalde/.pixi/bin/pixi run -e gurobi python -c "import gurobipy as gp; from pyomo.environ import SolverFactory; print(gp.gurobi.version()); print(SolverFactory('gurobi_direct').available(False))"->(12, 0, 3),True./home/bernalde/.pixi/bin/pixi run -e gurobi pytest tests/test_release_workflow.py -v --tb=short-> 5 passed.gurobi_direct->ok,optimal, objective4.0.git diff --check-> passed.Solver-backed benchmark evidence
The benchmark comparisons now include GAMS/Gurobi cases for all direct GDP reformulations in this PR scope (
gdp.bigmandgdp.hull), in addition to the local DICOPT and global BARON profiles. The GAMS/Gurobi rows below were run through the benchmark CLI with--solver-profile gams-gurobi, so they use the same single-threaded GAMS options as the other campaign rows.Commands:
Additional Gurobi checks:
gdp.hull, GAMS/Gurobi finds a feasible incumbent at objective22355.24067954157within 300 seconds.gdp.bigm, Gurobi reaches the 300-second time limit with no incumbent (Solution count 0,Best objective -) and a lower bound of11014.509754975745. The GAMS wrapper reportsOBJVAL/upper bound as17000.0, but the Gurobi log does not support treating that as a valid incumbent, so the table leaves objective and upper bound blank.gurobirejects nonlinear LP-format output, whilegurobi_directandappsi_gurobireject expression degreeNone.gams-gurobiprofile for each direct reformulation alongsidegams-localandgams-baronwhen Gurobi is licensed locally.Notes
gdp.hullnow transforms cleanly, but direct DICOPT and BARON behavior remains solver/formulation sensitive: DICOPT stops withintermediateNonInteger, while BARON reports the transformed hull model infeasible despite GAMS/Gurobi finding a feasible incumbent.gdpopt.lbbremains blocked by Pyomo GDPopt runtime behavior:GDP_LBB_Solvercalls stale_get_final_results_object()in the time-limit path. I opened upstream Pyomo issue GDPopt LBB time-limit path calls stale _get_final_results_object Pyomo/pyomo#3941 with a minimal reproducer.Closes #66