pyomo icon indicating copy to clipboard operation
pyomo copied to clipboard

Model transformation for maximin or minimax models (min/max functions in Pyomo)

Open MLopez-Ibanez opened this issue 1 year ago • 3 comments

Summary

A very common model is the maximin (or minimax). The model transformation required to linearize such models are well-known. It would be very useful if Pyomo supported such model transformations out of the box.

Perhaps the first step would be for handle min() and max() in the same way as sum() and report a clear error (see the cryptic error currently reported below).

# example.py
from pyomo.environ import *
m = ConcreteModel()
m.x = Var(within=NonNegativeReals)
m.Ann=1+2*m.x
m.Bob=2+m.x
m.Carol=5-m.x/2
m.obj=Objective(expr=min((m.Ann,m.Bob,m.Carol)),sense=maximize)
m.pprint()
opt = SolverFactory('cbc') 
opt.solve(m, tee=True)

Error Message

---------------------------------------------------------------------------
PyomoException                            Traceback (most recent call last)
/tmp/ipykernel_11272/3773921463.py in <module>
      5 m.Bob=2+m.x
      6 m.Carol=abs(5-m.x/2)
----> 7 m.obj=Objective(expr=min((m.Ann,m.Bob,m.Carol)),sense=maximize)
      8 m.pprint()
      9 opt = SolverFactory('cbc')

~/.local/lib/python3.10/site-packages/pyomo/core/expr/relational_expr.py in __bool__(self)
     46         if self.is_constant():
     47             return bool(self())
---> 48         raise PyomoException(
     49             """
     50 Cannot convert non-constant Pyomo expression (%s) to bool.

PyomoException: Cannot convert non-constant Pyomo expression (2 + x  <  1 + 2*x) to bool.
This error is usually caused by using a Var, unit, or mutable Param in a
Boolean context such as an "if" statement, or when checking container
membership or equality. For example,
    >>> m.x = Var()
    >>> if m.x >= 1:
    ...     pass
and
    >>> m.y = Var()
    >>> if m.y in [m.x, m.y]:
    ...     pass
would both cause this exception.

Information on your system

Pyomo version: 6.6.1 Python version: 3.10.12 Operating system: Linux How Pyomo was installed (PyPI, conda, source): pip

Additional information

MLopez-Ibanez avatar Aug 09 '23 10:08 MLopez-Ibanez

Sorry, it should have been an feature request.

MLopez-Ibanez avatar Aug 09 '23 11:08 MLopez-Ibanez

@MLopez-Ibanez is this the same as a bilevel optimization problem? If so, there is an existing Pyomo extension that might already have some of the functionality that you're asking for. The package is called PAO and you can find an example here: https://pao.readthedocs.io/en/latest/examples.html

blnicho avatar Aug 09 '23 14:08 blnicho

@MLopez-Ibanez is this the same as a bilevel optimization problem? If so, there is an existing Pyomo extension that might already have some of the functionality that you're asking for. The package is called PAO and you can find an example here: https://pao.readthedocs.io/en/latest/examples.html

No, this is a much simpler transformation than bilevel optimization and similar to the transformations available in: https://github.com/Pyomo/pyomo/tree/main/pyomo/core/plugins/transform (perhaps @jsiirola knows what I am talking about).

MLopez-Ibanez avatar Aug 13 '23 07:08 MLopez-Ibanez