Skip to content

Commit 41ce1bf

Browse files
committed
Merge branch 'main' into finalize-release-6.9.5
2 parents de932ab + 590ecfd commit 41ce1bf

File tree

13 files changed

+2253
-120
lines changed

13 files changed

+2253
-120
lines changed

pyomo/contrib/solver/plugins.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from .solvers.ipopt import Ipopt, LegacyIpoptSolver
1515
from .solvers.gurobi_persistent import GurobiPersistent
1616
from .solvers.gurobi_direct import GurobiDirect
17+
from .solvers.gurobi_direct_minlp import GurobiDirectMINLP
1718
from .solvers.highs import Highs
1819
from .solvers.knitro.direct import KnitroDirectSolver
1920

@@ -32,6 +33,11 @@ def load():
3233
legacy_name="gurobi_direct_v2",
3334
doc="Direct (scipy-based) interface to Gurobi",
3435
)(GurobiDirect)
36+
SolverFactory.register(
37+
name='gurobi_direct_minlp',
38+
legacy_name='gurobi_direct_minlp',
39+
doc='Direct interface to Gurobi accommodating general MINLP',
40+
)(GurobiDirectMINLP)
3541
SolverFactory.register(
3642
name="highs", legacy_name="highs", doc="Persistent interface to HiGHS"
3743
)(Highs)

pyomo/contrib/solver/solvers/gurobi_direct.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def load_vars(self, vars_to_load=None, solution_number=0):
117117
if self._grb_model.SolCount == 0:
118118
raise NoSolutionError()
119119

120-
iterator = zip(self._pyo_vars, self._grb_vars.x.tolist())
120+
iterator = zip(self._pyo_vars, map(operator.attrgetter('x'), self._grb_vars))
121121
if vars_to_load:
122122
vars_to_load = ComponentSet(vars_to_load)
123123
iterator = filter(lambda var_val: var_val[0] in vars_to_load, iterator)
@@ -130,7 +130,7 @@ def get_primals(self, vars_to_load=None, solution_number=0):
130130
if self._grb_model.SolCount == 0:
131131
raise NoSolutionError()
132132

133-
iterator = zip(self._pyo_vars, self._grb_vars.x.tolist())
133+
iterator = zip(self._pyo_vars, map(operator.attrgetter('x'), self._grb_vars))
134134
if vars_to_load:
135135
vars_to_load = ComponentSet(vars_to_load)
136136
iterator = filter(lambda var_val: var_val[0] in vars_to_load, iterator)
@@ -143,24 +143,26 @@ def get_duals(self, cons_to_load=None):
143143
def dedup(_iter):
144144
last = None
145145
for con_info_dual in _iter:
146-
if not con_info_dual[1] and con_info_dual[0][0] is last:
146+
if not con_info_dual[1] and con_info_dual[0] is last:
147147
continue
148-
last = con_info_dual[0][0]
148+
last = con_info_dual[0]
149149
yield con_info_dual
150150

151-
iterator = dedup(zip(self._pyo_cons, self._grb_cons.getAttr('Pi').tolist()))
151+
iterator = dedup(
152+
zip(self._pyo_cons, map(operator.attrgetter('Pi'), self._grb_cons))
153+
)
152154
if cons_to_load:
153155
cons_to_load = set(cons_to_load)
154156
iterator = filter(
155-
lambda con_info_dual: con_info_dual[0][0] in cons_to_load, iterator
157+
lambda con_info_dual: con_info_dual[0] in cons_to_load, iterator
156158
)
157-
return {con_info[0]: dual for con_info, dual in iterator}
159+
return {con_info: dual for con_info, dual in iterator}
158160

159161
def get_reduced_costs(self, vars_to_load=None):
160162
if self._grb_model.Status != gurobipy.GRB.OPTIMAL:
161163
raise NoReducedCostsError()
162164

163-
iterator = zip(self._pyo_vars, self._grb_vars.getAttr('Rc').tolist())
165+
iterator = zip(self._pyo_vars, map(operator.attrgetter('Rc'), self._grb_vars))
164166
if vars_to_load:
165167
vars_to_load = ComponentSet(vars_to_load)
166168
iterator = filter(lambda var_rc: var_rc[0] in vars_to_load, iterator)
@@ -374,7 +376,12 @@ def solve(self, model, **kwds) -> Results:
374376
timer,
375377
config,
376378
GurobiDirectSolutionLoader(
377-
gurobi_model, A, x, repn.rows, repn.columns, repn.objectives
379+
gurobi_model,
380+
A,
381+
x.tolist(),
382+
list(map(operator.itemgetter(0), repn.rows)),
383+
repn.columns,
384+
repn.objectives,
378385
),
379386
)
380387

0 commit comments

Comments
 (0)