Skip to content

Commit 1b6d09f

Browse files
committed
Fixed variable bounds for dualisation of max problems (primal) --> reverse sign.
1 parent 883d858 commit 1b6d09f

1 file changed

Lines changed: 18 additions & 6 deletions

File tree

linopy/dual.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ def _add_dual_variables(m: Model, m2: Model) -> dict:
227227
Mapping from constraint name (str) to the corresponding dual
228228
variable (linopy.Variable) in m2.
229229
"""
230+
primal_is_min = m.objective.sense == "min"
231+
230232
dual_vars = {}
231233
for name, con in m.constraints.items():
232234
sign_vals = con.sign.values.flatten()
@@ -244,19 +246,29 @@ def _add_dual_variables(m: Model, m2: Model) -> dict:
244246
lower, upper = -np.inf, np.inf
245247
var_type = "free"
246248
elif sign_vals[0] == "<=":
247-
lower, upper = -np.inf, 0
248-
var_type = "non-positive"
249-
else: # >=
250-
lower, upper = 0, np.inf
251-
var_type = "non-negative"
249+
lower, upper = (-np.inf, 0) if primal_is_min else (0, np.inf)
250+
var_type = "non-positive" if primal_is_min else "non-negative"
251+
elif sign_vals[0] == ">=":
252+
lower, upper = (0, np.inf) if primal_is_min else (-np.inf, 0)
253+
var_type = "non-negative" if primal_is_min else "non-positive"
254+
else:
255+
logger.warning(
256+
f"Constraint '{name}' has unrecognized sign '{sign_vals[0]}', skipping."
257+
)
258+
continue
252259

253260
logger.debug(
254261
f"Adding {var_type} dual variable for constraint '{name}' with shape {con.shape} and dims {con.labels.dims}."
255262
)
263+
coords = (
264+
[con.labels.coords[dim] for dim in con.labels.dims]
265+
if con.labels.dims
266+
else None
267+
)
256268
dual_vars[name] = m2.add_variables(
257269
lower=lower,
258270
upper=upper,
259-
coords=list(con.coords.values()),
271+
coords=coords,
260272
name=name,
261273
mask=mask,
262274
)

0 commit comments

Comments
 (0)