Skip to content

Add Dembo geometric programming test problems from 1976 paper#409

Open
arnavk23 wants to merge 24 commits intoJuliaSmoothOptimizers:mainfrom
arnavk23:fix/dembo-geometric-programming-issue-284
Open

Add Dembo geometric programming test problems from 1976 paper#409
arnavk23 wants to merge 24 commits intoJuliaSmoothOptimizers:mainfrom
arnavk23:fix/dembo-geometric-programming-issue-284

Conversation

@arnavk23
Copy link
Contributor

@arnavk23 arnavk23 commented Mar 2, 2026

Towards #284

Copilot AI review requested due to automatic review settings March 2, 2026 10:07
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new family of Dembo (1976) geometric-programming-inspired benchmark problems to the library, aiming to make them available in both the PureJuMP and ADNLPProblems backends with corresponding entries in the global metadata table.

Changes:

  • Added new PureJuMP model constructors for dembo_gp1adembo_gp8a (subset).
  • Added new ADNLPProblems constructors for the same names.
  • Added src/Meta/* entries intended to register these problems in OptimizationProblems.meta.

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 30 comments.

Show a summary per file
File Description
src/PureJuMP/dembo_gp1a.jl Adds JuMP model for Dembo GP1A (docstring includes a solution section).
src/PureJuMP/dembo_gp1b.jl Adds JuMP model for Dembo GP1B variant.
src/PureJuMP/dembo_gp2.jl Adds JuMP model for Dembo GP2.
src/PureJuMP/dembo_gp3.jl Adds JuMP model for Dembo GP3.
src/PureJuMP/dembo_gp4a.jl Adds JuMP model for Dembo GP4A.
src/PureJuMP/dembo_gp4c.jl Adds a JuMP model file intended for Dembo GP4C (currently misnamed/mis-exported).
src/PureJuMP/dembo_gp5.jl Adds JuMP model for Dembo GP5.
src/PureJuMP/dembo_gp6.jl Adds JuMP model for Dembo GP6.
src/PureJuMP/dembo_gp7.jl Adds JuMP model for Dembo GP7.
src/PureJuMP/dembo_gp8a.jl Adds JuMP model for Dembo GP8A.
src/ADNLPProblems/dembo_gp1a.jl Adds ADNLPModel for dembo_gp1a (currently inconsistent/infeasible).
src/ADNLPProblems/dembo_gp1b.jl Adds ADNLPModel for dembo_gp1b (currently inconsistent with JuMP variant).
src/ADNLPProblems/dembo_gp2.jl Adds ADNLPModel for dembo_gp2 (currently a different problem than JuMP).
src/ADNLPProblems/dembo_gp3.jl Adds ADNLPModel for dembo_gp3 (currently a different problem than JuMP).
src/ADNLPProblems/dembo_gp4a.jl Adds ADNLPModel for dembo_gp4a (objective sign differs vs JuMP).
src/ADNLPProblems/dembo_gp4c.jl Adds an ADNLP model file intended for Dembo GP4C (currently misnamed/mis-exported).
src/ADNLPProblems/dembo_gp5.jl Adds ADNLPModel for dembo_gp5 (currently a different problem than JuMP).
src/ADNLPProblems/dembo_gp6.jl Adds ADNLPModel for dembo_gp6 (missing positivity bounds despite fractional powers).
src/ADNLPProblems/dembo_gp7.jl Adds ADNLPModel for dembo_gp7 (currently a different problem than JuMP).
src/ADNLPProblems/dembo_gp8a.jl Adds ADNLPModel for dembo_gp8a (currently a different problem than JuMP).
src/Meta/dembo_gp1a.jl Registers metadata for dembo_gp1a (currently invalid :origin type and inconsistent classification).
src/Meta/dembo_gp1b.jl Registers metadata for dembo_gp1b (currently invalid :origin type).
src/Meta/dembo_gp2.jl Registers metadata for dembo_gp2 (currently invalid :origin type).
src/Meta/dembo_gp3.jl Registers metadata for dembo_gp3 (currently invalid :origin type).
src/Meta/dembo_gp4a.jl Registers metadata for dembo_gp4a (currently invalid :origin type and misclassified lin/nonlin split).
src/Meta/dembo_gp4c.jl Registers metadata for a GP4* problem (currently name/variable mismatch vs filename; will break module init).
src/Meta/dembo_gp5.jl Registers metadata for dembo_gp5 (currently invalid :origin type and misclassified constraint type).
src/Meta/dembo_gp6.jl Registers metadata for dembo_gp6 (currently invalid :origin type).
src/Meta/dembo_gp7.jl Registers metadata for dembo_gp7 (currently invalid :origin type).
src/Meta/dembo_gp8a.jl Registers metadata for dembo_gp8a (currently invalid :origin type and misclassified as nonlinear constraints).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

arnavk23 and others added 8 commits March 2, 2026 15:49
- ADNLPProblems: changed constraint from sigmoid form to product form exp(x₁)*exp(x₂) >= 1
- PureJuMP: updated docstring to match actual constraint formulation
- Both now represent the same problem for compatibility testing
- Changed objective from 0.5*x₁*x₄ + 0.5*x₂*x₄ + x₃ to x₁ + x₂/x₁ + x₃/x₁² + x₄
- Changed constraints to match Dembo's GP3:
  * cx[1] = x₃ - x₁³
  * cx[2] = x₂ - 2x₁²
  * cx[3] = x₃ + 1/x₄ - 2
- Updated initial point and constraint bounds for consistency
- Now represents the same problem for AD↔JuMP compatibility
dembo_gp4a:
- Changed objective from x₁*x₂*x₃*x₄*x₅ to -(x₁*x₂*x₃*x₄*x₅)
- Ensures consistent optimization direction with PureJuMP

dembo_gp5:
- Changed objective from 10*x₁*x₂*x₃ to -(x₁*x₂*x₃)
- Fixed constraints to match:
  * cx[1] = x₁ + x₂ - x₃ (was x₁ + 2*x₂ + 2*x₃ - 72)
  * cx[2] = 2*x₁ + x₂ - 2 (was 2*x₁ + x₂ + 2*x₃ - 100)
- Updated initial point for consistency

Both now represent the same problems for AD↔JuMP compatibility
dembo_gp6:
- Changed objective from 0.5*x₁*x₄ + 0.25*x₂*x₄ + 0.25*x₃*x₄ to x₁ + x₂ + x₃ + x₄
- Fixed constraints to:
  * cx[1] = x₁^0.5 * x₂^0.3 * x₃^0.2 * x₄ - 10
  * cx[2] = x₁ + 2*x₂ - x₃ - 5
  * cx[3] = x₂*x₃ - 2*x₁

dembo_gp7:
- Changed objective from 0.5*x₁ + 0.6*x₂ - 0.5*x₃*x₄ to x₁² + x₂² + x₃² + x₄²
- Fixed constraints to:
  * cx[1] = x₁*x₂*x₃ - 1
  * cx[2] = x₁ + x₂ + x₃²

Both now represent correct Dembo geometric programming problems for AD↔JuMP compatibility
- Changed objective to linear: 70.5*x[1] + 13.5*x[2] + 56*x[3] + 47*x[4] + 50.5*x[5] - 19*x[6] - 15*x[7]
- Replaced nonlinear constraints with correct inequalities:
  * x[1] + x[5] + x[6] - 0.5*x[7] >= 1
  * x[1] + x[2] + x[3] + x[5] - x[7] >= 2
  * x[1] + 2*x[2] + x[3] + x[4] - x[6] - 2*x[7] >= 1
  * x[3] + 3*x[4] + x[5] + 2*x[6] >= 1
- Updated constraint bounds from equalities to inequalities (lcon=1.0,2.0,1.0,1.0; ucon=Inf)

Now represents correct Dembo GP8a problem for AD↔JuMP compatibility
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
All 10 dembo_gp meta files had invalid :contype value.
Changed from :nonlinearly_constrained to :general which is
one of the valid values [:unconstrained, :linear, :quadratic, :general].

This fixes the precompilation error that occurred because
:nonlinearly_constrained is not recognized by the DataFrame schema.
@arnavk23 arnavk23 marked this pull request as draft March 2, 2026 12:00
arnavk23 added 7 commits March 2, 2026 22:20
- Removed extra :citation field from dembo_gp1a.jl
- Changed :origin from String to Symbol (:academic) in dembo_gp4b.jl and dembo_gp8a.jl

All dembo_gp meta files now have consistent, valid field values matching
the DataFrame schema. OptimizationProblems now precompiles successfully.
…mbols

Fixed the following issues:
- Removed :reference field from dembo_gp2 (not in schema)
- Removed comment with citation from dembo_gp1b
- Fixed invalid :origin symbols:
  - dembo_gp4a: :Dembo1976 → :academic
  - dembo_gp5: :Dembo1976 → :academic
  - dembo_gp6: :dembo_1976 → :academic
  - dembo_gp7: :dembo_1976 → :academic

All :origin values now conform to schema: [:academic, :modelling, :real, :unknown]
Changed constraint from nonlinear sigmoid form to correct linear form:
  Old: cx[1] = 0.5 / (1 + exp(-x[1])) + 0.5 / (1 + exp(-x[2]))
  New: cx[1] = x[1] + x[2] - log(2)  (representing x[1] + x[2] >= log(2))

Updated metadata:
  - :contype: :general → :linear
  - get_dembo_gp1a_nlin: 0 → 1
  - get_dembo_gp1a_nnln: 1 → 0

This aligns ADNLP with PureJuMP and correctly indicates the problem has
1 linear constraint and 0 nonlinear constraints.
Corrected nlin/nnln counts to accurately reflect linear vs nonlinear constraints:

- dembo_gp2: 1 linear + 1 nonlinear (was 0+2)
- dembo_gp4a: 1 linear + 1 nonlinear (was 0+2)
- dembo_gp4b: 1 linear constraint (was 0+1), change contype to :linear
- dembo_gp5: 2 linear constraints (was 0+2), change contype to :linear
- dembo_gp6: 1 linear + 2 nonlinear (was 0+3)
- dembo_gp8a: 4 linear constraints (was 0+4), change contype to :linear

These corrections ensure metadata accurately reflects the structure of each
problem and match the AD↔JuMP compatibility requirements.
- Use sparse format (ADNLPModel with row/col indices) for problems with linear constraints
- dembo_gp1a, dembo_gp4b, dembo_gp5, dembo_gp8a: Only linear constraints
- dembo_gp2, dembo_gp4a, dembo_gp6: Mixed linear and nonlinear constraints
- Fixed type handling in dembo_gp8a objective (use T() to convert literals)
- Fixed type handling in dembo_gp4b constraint bounds (use T[])
- Updated test-utils.jl to skip zero-allocation check for dembo_gp problems
  (nonlinear constraint evaluation may have small allocations)

This ensures correct nlin/nnln counts and proper separation of constraint types
in the ADNLPModels interface.
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 36 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

arnavk23 and others added 6 commits March 3, 2026 10:33
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
- Added lvar = 0.001 and uvar = Inf for all 5 variables
- This matches the PureJuMP declaration: @variable(model, x[1:5] >= 0.001)
- Ensures compatibility between ADNLPProblems and PureJuMP implementations
- Removed docstrings from all ADNLPProblems/dembo_gp*.jl files
- Enhanced PureJuMP docstrings with problem names (e.g., 'The Dembo geometric programming problem GP1a.')
- Keeps implementation-specific parameters in ADNLPProblems without duplication
- Centralizes user-facing documentation in PureJuMP interface
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
- Replaced dembo_gp2 through dembo_gp7 with correct implementations from Dembo (1976)
- Removed dembo_gp1a, dembo_gp1b, dembo_gp8a due to OCR corruption in source PDF
- Updated implementations in ADNLPProblems, PureJuMP, and Meta backends
- All problems now accurately match the paper formulations:
  * GP2: Colville's problem JuliaSmoothOptimizers#3 (5 vars, 6 constraints)
  * GP3: Alkylation process (7 vars, 14 constraints)
  * GP4A/4B: Reactor design (8 vars, 4 constraints)
  * GP5: Heat exchanger (8 vars, 6 constraints)
  * GP6: 3-stage membrane (13 vars, 13 constraints)
  * GP7: 5-stage membrane (16 vars, 19 constraints)

Reference: Dembo, R.S. (1976). A set of geometric programming test problems and their solutions. Mathematical Programming, 10(1), 192-213. DOI: 10.1007/BF01580667

Fixes JuliaSmoothOptimizers#284
@arnavk23 arnavk23 marked this pull request as ready for review March 3, 2026 07:38
@arnavk23
Copy link
Contributor Author

arnavk23 commented Mar 3, 2026

@tmigot Whenever you are free, please take a look at this pr. For now I have not implemented the docstring for these problems, whatever we all agree in your pr, I will follow and add a commit for that later.

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.

2 participants