@@ -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