The pooling problem and the pq-formulation (discopt.pooling)

Contents

The pooling problem and the pq-formulation (discopt.pooling)#

The pooling problem blends raw inputs of known quality through intermediate pools into products with quality specifications, maximizing profit. Because the blended quality at a pool is a bilinear function of the inflows, the problem is a nonconvex NLP — even tiny instances are hard for global solvers when modeled naively. The classic benchmark is Haverly’s Pooling Problem 1, whose global optimum is a profit of 400.

The pq-formulation builder (Tawarmalani & Sahinidis) — which replaces raw pool inflows with proportion variables and adds the redundant-but-tightening Reformulation–Linearization (RLT) cuts that make the McCormick relaxation provably at least as tight as the textbook p-formulation — now lives in the standalone discopt-apps plugin (#431), mirroring the course extraction (#430). It is no longer bundled with the core discopt package. The builder is pure modeling code over discopt.modeling.core; no core changes are required.

Installation#

pip install discopt-apps

Usage#

from discopt.pooling import (
    Input,
    Output,
    Pool,
    PoolingProblem,
    build_pq_formulation,
    haverly_hpp1,
)

problem = haverly_hpp1()
model = build_pq_formulation(problem)
result = model.solve()

See the discopt-apps documentation for the full pq-formulation and examples.