@@ -88,7 +88,7 @@ function MOI.supports(
88
88
else
89
89
MOI. ObjectiveFunction {MOI.ScalarAffineFunction{T}} ()
90
90
end
91
- return supported_obj (F) &&
91
+ return supported_objective (F) &&
92
92
MOI. supports (optimizer. dual_problem. dual_model, attr)
93
93
end
94
94
@@ -159,15 +159,16 @@ function MOI.modify(
159
159
constant = - constant
160
160
end
161
161
vi = obj_change. variable
162
- if haskey (primal_dual_map. constrained_var_idx, vi)
163
- ci_primal, index = primal_dual_map. constrained_var_idx[vi]
164
- ci_dual = primal_dual_map. constrained_var_dual[ci_primal]
162
+ if haskey (primal_dual_map. primal_convar_to_primal_convarcon_and_index, vi)
163
+ ci_primal, index =
164
+ primal_dual_map. primal_convar_to_primal_convarcon_and_index[vi]
165
+ ci_dual = primal_dual_map. primal_convarcon_to_dual_con[ci_primal]
165
166
if ci_dual === NO_CONSTRAINT
166
167
return
167
168
end
168
169
constant = - constant
169
170
else
170
- ci_dual = primal_dual_map. primal_var_dual_con [vi]
171
+ ci_dual = primal_dual_map. primal_var_to_dual_con [vi]
171
172
index = 1
172
173
end
173
174
_change_constant (
@@ -188,7 +189,8 @@ function MOI.supports_add_constrained_variables(
188
189
MOI. ScalarAffineFunction{T},
189
190
MOI. EqualTo{T},
190
191
)
191
- # If `_dual_set_type(MOI.Reals)` was `MOI.Zeros`, we would not need this method as special case of the one below
192
+ # If `_dual_set_type(MOI.Reals)` was `MOI.Zeros`,
193
+ # we would not need this method as special case of the one below
192
194
end
193
195
194
196
function MOI. supports_add_constrained_variables (
@@ -235,129 +237,56 @@ function MOI.empty!(optimizer::DualOptimizer)
235
237
return
236
238
end
237
239
238
- # MOI.get auxiliary functions
239
- function get_ci_dual_problem (optimizer:: DualOptimizer , vi:: MOI.VariableIndex )
240
- return optimizer. dual_problem. primal_dual_map. primal_var_dual_con[vi]
241
- end
242
-
243
- function get_ci_dual_problem (optimizer:: DualOptimizer , ci:: MOI.ConstraintIndex )
244
- return optimizer. dual_problem. primal_dual_map. primal_con_dual_con[ci]
245
- end
246
-
247
- function get_primal_ci_constant (
248
- optimizer:: DualOptimizer ,
249
- ci:: MOI.ConstraintIndex ,
250
- )
251
- return first (get_primal_ci_constants (optimizer, ci))
252
- end
253
-
254
- function get_primal_ci_constants (
255
- optimizer:: DualOptimizer ,
256
- ci:: MOI.ConstraintIndex ,
257
- )
258
- return optimizer. dual_problem. primal_dual_map. primal_con_constants[ci]
259
- end
260
-
261
- function get_vi_dual_problem (optimizer:: DualOptimizer , ci:: MOI.ConstraintIndex )
262
- return first (get_vis_dual_problem (optimizer, ci))
263
- end
264
-
265
- function get_vis_dual_problem (optimizer:: DualOptimizer , ci:: MOI.ConstraintIndex )
266
- return optimizer. dual_problem. primal_dual_map. primal_con_dual_var[ci]
267
- end
268
-
269
240
function MOI. get (optimizer:: DualOptimizer , :: MOI.SolverName )
270
241
name = MOI. get (optimizer. dual_problem. dual_model, MOI. SolverName ())
271
242
return " Dual model with $name attached"
272
243
end
273
244
274
- function _get (
275
- :: DualOptimizer{T} ,
276
- :: MOI.AbstractConstraintAttribute ,
277
- :: MOI.ConstraintIndex{MOI.VariableIndex,MOI.EqualTo{T}} ,
278
- :: MOI.ConstraintIndex{Nothing,Nothing} ,
279
- ) where {T}
280
- return zero (T)
281
- end
282
-
283
- function _get (
284
- optimizer:: DualOptimizer ,
285
- attr:: MOI.AbstractConstraintAttribute ,
286
- :: MOI.ConstraintIndex ,
287
- ci:: MOI.ConstraintIndex ,
288
- )
289
- return MOI. get (optimizer. dual_problem. dual_model, attr, ci)
290
- end
291
-
292
- function _get (
293
- optimizer:: DualOptimizer{T} ,
294
- :: MOI.AbstractConstraintAttribute ,
295
- ci_primal:: MOI.ConstraintIndex{MOI.VectorOfVariables,MOI.Zeros} ,
296
- :: MOI.ConstraintIndex{Nothing,Nothing} ,
297
- ) where {T}
298
- n = MOI. output_dimension (
299
- optimizer. dual_problem. primal_dual_map. constrained_var_zero[ci_primal],
300
- )
301
- return zeros (T, n)
302
- end
303
-
304
- function _get_at_index (
305
- optimizer:: DualOptimizer ,
306
- attr:: MOI.AbstractConstraintAttribute ,
307
- ci_primal:: MOI.ConstraintIndex{MOI.VariableIndex} ,
308
- ci_dual:: MOI.ConstraintIndex ,
309
- idx,
310
- )
311
- @assert isone (idx)
312
- return _get (optimizer, attr, ci_primal, ci_dual)
313
- end
314
-
315
- function _get_at_index (
316
- optimizer:: DualOptimizer ,
317
- attr:: MOI.AbstractConstraintAttribute ,
318
- ci_primal:: MOI.ConstraintIndex{MOI.VectorOfVariables} ,
319
- ci_dual:: MOI.ConstraintIndex ,
320
- idx,
321
- )
322
- return _get (optimizer, attr, ci_primal, ci_dual)[idx]
323
- end
324
-
325
245
function MOI. get (
326
- optimizer:: DualOptimizer ,
246
+ optimizer:: DualOptimizer{T} ,
327
247
:: MOI.VariablePrimal ,
328
248
vi:: MOI.VariableIndex ,
329
- )
249
+ ) where {T}
330
250
primal_dual_map = optimizer. dual_problem. primal_dual_map
331
- if haskey (primal_dual_map. constrained_var_idx, vi)
332
- ci_primal, idx = primal_dual_map. constrained_var_idx[vi]
333
- ci_dual = primal_dual_map. constrained_var_dual[ci_primal]
334
- return _get_at_index (
335
- optimizer,
336
- MOI. ConstraintDual (),
337
- ci_primal,
338
- ci_dual,
339
- idx,
340
- )
251
+ if haskey (primal_dual_map. primal_convar_to_primal_convarcon_and_index, vi)
252
+ ci_primal, idx =
253
+ primal_dual_map. primal_convar_to_primal_convarcon_and_index[vi]
254
+ ci_dual = primal_dual_map. primal_convarcon_to_dual_con[ci_primal]
255
+ if ci_dual === NO_CONSTRAINT
256
+ return zero (T)
257
+ elseif ci_dual isa MOI. ConstraintIndex{<: MOI.AbstractVectorFunction }
258
+ return MOI. get (
259
+ optimizer. dual_problem. dual_model,
260
+ MOI. ConstraintDual (),
261
+ ci_dual,
262
+ )[idx]
263
+ else
264
+ return MOI. get (
265
+ optimizer. dual_problem. dual_model,
266
+ MOI. ConstraintDual (),
267
+ ci_dual,
268
+ )
269
+ end
341
270
else
342
271
return - MOI. get (
343
272
optimizer. dual_problem. dual_model,
344
273
MOI. ConstraintDual (),
345
- get_ci_dual_problem (optimizer, vi) ,
274
+ primal_dual_map . primal_var_to_dual_con[vi] ,
346
275
)
347
276
end
348
277
end
349
278
350
279
function MOI. get (
351
280
optimizer:: DualOptimizer ,
352
- attr :: MOI.ConstraintDual ,
281
+ :: MOI.ConstraintDual ,
353
282
ci:: MOI.ConstraintIndex{F,S} ,
354
283
) where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
355
284
primal_dual_map = optimizer. dual_problem. primal_dual_map
356
- if haskey (primal_dual_map. constrained_var_dual , ci)
357
- ci_dual = primal_dual_map. constrained_var_dual [ci]
285
+ if haskey (primal_dual_map. primal_convarcon_to_dual_con , ci)
286
+ ci_dual = primal_dual_map. primal_convarcon_to_dual_con [ci]
358
287
if ci_dual === NO_CONSTRAINT
359
288
return MOI. Utilities. eval_variables (
360
- primal_dual_map. constrained_var_zero [ci],
289
+ primal_dual_map. primal_convarcon_to_dual_function [ci],
361
290
) do vi
362
291
return MOI. get (
363
292
optimizer. dual_problem. dual_model,
@@ -380,7 +309,7 @@ function MOI.get(
380
309
return MOI. get (
381
310
optimizer. dual_problem. dual_model,
382
311
MOI. VariablePrimal (),
383
- get_vi_dual_problem (optimizer, ci) ,
312
+ primal_dual_map . primal_con_to_dual_var_vec[ci][] ,
384
313
)
385
314
end
386
315
end
@@ -391,11 +320,11 @@ function MOI.get(
391
320
ci:: MOI.ConstraintIndex{F,S} ,
392
321
) where {F<: MOI.AbstractVectorFunction ,S<: MOI.AbstractVectorSet }
393
322
primal_dual_map = optimizer. dual_problem. primal_dual_map
394
- if haskey (primal_dual_map. constrained_var_dual , ci)
395
- ci_dual = primal_dual_map. constrained_var_dual [ci]
323
+ if haskey (primal_dual_map. primal_convarcon_to_dual_con , ci)
324
+ ci_dual = primal_dual_map. primal_convarcon_to_dual_con [ci]
396
325
if ci_dual === NO_CONSTRAINT
397
326
return MOI. Utilities. eval_variables (
398
- primal_dual_map. constrained_var_zero [ci],
327
+ primal_dual_map. primal_convarcon_to_dual_function [ci],
399
328
) do vi
400
329
return MOI. get (
401
330
optimizer. dual_problem. dual_model,
@@ -407,37 +336,42 @@ function MOI.get(
407
336
return MOI. get (
408
337
optimizer. dual_problem. dual_model,
409
338
MOI. ConstraintPrimal (),
410
- primal_dual_map. constrained_var_dual [ci],
339
+ primal_dual_map. primal_convarcon_to_dual_con [ci],
411
340
)
412
341
else
413
342
return MOI. get .(
414
343
optimizer. dual_problem. dual_model,
415
344
MOI. VariablePrimal (),
416
- get_vis_dual_problem (optimizer, ci) ,
345
+ primal_dual_map . primal_con_to_dual_var_vec[ci] ,
417
346
)
418
347
end
419
348
end
420
349
421
350
function MOI. get (
422
- optimizer:: DualOptimizer ,
351
+ optimizer:: DualOptimizer{T} ,
423
352
:: MOI.ConstraintPrimal ,
424
353
ci:: MOI.ConstraintIndex{F,S} ,
425
- ) where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
354
+ ) where {T, F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
426
355
primal_dual_map = optimizer. dual_problem. primal_dual_map
427
- if haskey (primal_dual_map. constrained_var_dual, ci)
428
- return _get (
429
- optimizer,
430
- MOI. ConstraintDual (),
431
- ci,
432
- primal_dual_map. constrained_var_dual[ci],
433
- )
356
+ if haskey (primal_dual_map. primal_convarcon_to_dual_con, ci)
357
+ ci_dual = primal_dual_map. primal_convarcon_to_dual_con[ci]
358
+ if ci_dual === NO_CONSTRAINT
359
+ return zero (T)
360
+ else
361
+ return MOI. get (
362
+ optimizer. dual_problem. dual_model,
363
+ MOI. ConstraintDual (),
364
+ ci_dual,
365
+ )
366
+ end
434
367
else
435
- primal_ci_constant = get_primal_ci_constant (optimizer, ci)
368
+ primal_ci_constant =
369
+ primal_dual_map. primal_con_to_primal_constants_vec[ci][1 ]
436
370
# If it has no key then there is no dual constraint
437
- if ! haskey (primal_dual_map. primal_con_dual_con , ci)
371
+ if ! haskey (primal_dual_map. primal_con_to_dual_convarcon , ci)
438
372
return - primal_ci_constant
439
373
end
440
- ci_dual_problem = get_ci_dual_problem (optimizer, ci)
374
+ ci_dual_problem = primal_dual_map . primal_con_to_dual_convarcon[ci]
441
375
return MOI. get (
442
376
optimizer. dual_problem. dual_model,
443
377
MOI. ConstraintDual (),
@@ -452,21 +386,29 @@ function MOI.get(
452
386
ci:: MOI.ConstraintIndex{F,S} ,
453
387
) where {T,F<: MOI.AbstractVectorFunction ,S<: MOI.AbstractVectorSet }
454
388
primal_dual_map = optimizer. dual_problem. primal_dual_map
455
- if haskey (primal_dual_map. constrained_var_dual, ci)
456
- return _get (
457
- optimizer,
458
- MOI. ConstraintDual (),
459
- ci,
460
- primal_dual_map. constrained_var_dual[ci],
461
- )
389
+ if haskey (primal_dual_map. primal_convarcon_to_dual_con, ci)
390
+ ci_dual = primal_dual_map. primal_convarcon_to_dual_con[ci]
391
+ if ci_dual === NO_CONSTRAINT
392
+ n = MOI. output_dimension (
393
+ primal_dual_map. primal_convarcon_to_dual_function[ci],
394
+ )
395
+ return zeros (T, n)
396
+ else
397
+ return MOI. get (
398
+ optimizer. dual_problem. dual_model,
399
+ MOI. ConstraintDual (),
400
+ ci_dual,
401
+ )
402
+ end
462
403
else
463
404
# If it has no key then there is no dual constraint
464
- if ! haskey (primal_dual_map. primal_con_dual_con , ci)
405
+ if ! haskey (primal_dual_map. primal_con_to_dual_convarcon , ci)
465
406
# The number of dual variable associated with the primal constraint is the ci dimension
466
- ci_dimension = length (get_vis_dual_problem (optimizer, ci))
407
+ ci_dimension =
408
+ length (primal_dual_map. primal_con_to_dual_var_vec[ci])
467
409
return zeros (T, ci_dimension)
468
410
end
469
- ci_dual_problem = get_ci_dual_problem (optimizer, ci)
411
+ ci_dual_problem = primal_dual_map . primal_con_to_dual_convarcon[ci]
470
412
return MOI. get (
471
413
optimizer. dual_problem. dual_model,
472
414
MOI. ConstraintDual (),
@@ -476,12 +418,12 @@ function MOI.get(
476
418
end
477
419
478
420
function MOI. get (optimizer:: DualOptimizer , :: MOI.TerminationStatus )
479
- return dual_status (
421
+ return _dual_status (
480
422
MOI. get (optimizer. dual_problem. dual_model, MOI. TerminationStatus ()),
481
423
)
482
424
end
483
425
484
- function dual_status (term:: MOI.TerminationStatusCode )
426
+ function _dual_status (term:: MOI.TerminationStatusCode )
485
427
if term == MOI. INFEASIBLE
486
428
return MOI. DUAL_INFEASIBLE
487
429
elseif term == MOI. DUAL_INFEASIBLE
0 commit comments