Skip to content

Commit be30333

Browse files
authored
Code cleanup and removal of intermediary calls (#179)
* Better names * rm hashtags * apply rename * format * format * more info * cleanup dual cone * con variables * fix names * more cleanup * extra minor cleaning
1 parent 680428b commit be30333

27 files changed

+700
-844
lines changed

src/MOI_wrapper.jl

Lines changed: 77 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ function MOI.supports(
8888
else
8989
MOI.ObjectiveFunction{MOI.ScalarAffineFunction{T}}()
9090
end
91-
return supported_obj(F) &&
91+
return supported_objective(F) &&
9292
MOI.supports(optimizer.dual_problem.dual_model, attr)
9393
end
9494

@@ -159,15 +159,16 @@ function MOI.modify(
159159
constant = -constant
160160
end
161161
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]
165166
if ci_dual === NO_CONSTRAINT
166167
return
167168
end
168169
constant = -constant
169170
else
170-
ci_dual = primal_dual_map.primal_var_dual_con[vi]
171+
ci_dual = primal_dual_map.primal_var_to_dual_con[vi]
171172
index = 1
172173
end
173174
_change_constant(
@@ -188,7 +189,8 @@ function MOI.supports_add_constrained_variables(
188189
MOI.ScalarAffineFunction{T},
189190
MOI.EqualTo{T},
190191
)
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
192194
end
193195

194196
function MOI.supports_add_constrained_variables(
@@ -235,129 +237,56 @@ function MOI.empty!(optimizer::DualOptimizer)
235237
return
236238
end
237239

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-
269240
function MOI.get(optimizer::DualOptimizer, ::MOI.SolverName)
270241
name = MOI.get(optimizer.dual_problem.dual_model, MOI.SolverName())
271242
return "Dual model with $name attached"
272243
end
273244

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-
325245
function MOI.get(
326-
optimizer::DualOptimizer,
246+
optimizer::DualOptimizer{T},
327247
::MOI.VariablePrimal,
328248
vi::MOI.VariableIndex,
329-
)
249+
) where {T}
330250
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
341270
else
342271
return -MOI.get(
343272
optimizer.dual_problem.dual_model,
344273
MOI.ConstraintDual(),
345-
get_ci_dual_problem(optimizer, vi),
274+
primal_dual_map.primal_var_to_dual_con[vi],
346275
)
347276
end
348277
end
349278

350279
function MOI.get(
351280
optimizer::DualOptimizer,
352-
attr::MOI.ConstraintDual,
281+
::MOI.ConstraintDual,
353282
ci::MOI.ConstraintIndex{F,S},
354283
) where {F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet}
355284
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]
358287
if ci_dual === NO_CONSTRAINT
359288
return MOI.Utilities.eval_variables(
360-
primal_dual_map.constrained_var_zero[ci],
289+
primal_dual_map.primal_convarcon_to_dual_function[ci],
361290
) do vi
362291
return MOI.get(
363292
optimizer.dual_problem.dual_model,
@@ -380,7 +309,7 @@ function MOI.get(
380309
return MOI.get(
381310
optimizer.dual_problem.dual_model,
382311
MOI.VariablePrimal(),
383-
get_vi_dual_problem(optimizer, ci),
312+
primal_dual_map.primal_con_to_dual_var_vec[ci][],
384313
)
385314
end
386315
end
@@ -391,11 +320,11 @@ function MOI.get(
391320
ci::MOI.ConstraintIndex{F,S},
392321
) where {F<:MOI.AbstractVectorFunction,S<:MOI.AbstractVectorSet}
393322
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]
396325
if ci_dual === NO_CONSTRAINT
397326
return MOI.Utilities.eval_variables(
398-
primal_dual_map.constrained_var_zero[ci],
327+
primal_dual_map.primal_convarcon_to_dual_function[ci],
399328
) do vi
400329
return MOI.get(
401330
optimizer.dual_problem.dual_model,
@@ -407,37 +336,42 @@ function MOI.get(
407336
return MOI.get(
408337
optimizer.dual_problem.dual_model,
409338
MOI.ConstraintPrimal(),
410-
primal_dual_map.constrained_var_dual[ci],
339+
primal_dual_map.primal_convarcon_to_dual_con[ci],
411340
)
412341
else
413342
return MOI.get.(
414343
optimizer.dual_problem.dual_model,
415344
MOI.VariablePrimal(),
416-
get_vis_dual_problem(optimizer, ci),
345+
primal_dual_map.primal_con_to_dual_var_vec[ci],
417346
)
418347
end
419348
end
420349

421350
function MOI.get(
422-
optimizer::DualOptimizer,
351+
optimizer::DualOptimizer{T},
423352
::MOI.ConstraintPrimal,
424353
ci::MOI.ConstraintIndex{F,S},
425-
) where {F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet}
354+
) where {T,F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet}
426355
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
434367
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]
436370
# 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)
438372
return -primal_ci_constant
439373
end
440-
ci_dual_problem = get_ci_dual_problem(optimizer, ci)
374+
ci_dual_problem = primal_dual_map.primal_con_to_dual_convarcon[ci]
441375
return MOI.get(
442376
optimizer.dual_problem.dual_model,
443377
MOI.ConstraintDual(),
@@ -452,21 +386,29 @@ function MOI.get(
452386
ci::MOI.ConstraintIndex{F,S},
453387
) where {T,F<:MOI.AbstractVectorFunction,S<:MOI.AbstractVectorSet}
454388
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
462403
else
463404
# 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)
465406
# 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])
467409
return zeros(T, ci_dimension)
468410
end
469-
ci_dual_problem = get_ci_dual_problem(optimizer, ci)
411+
ci_dual_problem = primal_dual_map.primal_con_to_dual_convarcon[ci]
470412
return MOI.get(
471413
optimizer.dual_problem.dual_model,
472414
MOI.ConstraintDual(),
@@ -476,12 +418,12 @@ function MOI.get(
476418
end
477419

478420
function MOI.get(optimizer::DualOptimizer, ::MOI.TerminationStatus)
479-
return dual_status(
421+
return _dual_status(
480422
MOI.get(optimizer.dual_problem.dual_model, MOI.TerminationStatus()),
481423
)
482424
end
483425

484-
function dual_status(term::MOI.TerminationStatusCode)
426+
function _dual_status(term::MOI.TerminationStatusCode)
485427
if term == MOI.INFEASIBLE
486428
return MOI.DUAL_INFEASIBLE
487429
elseif term == MOI.DUAL_INFEASIBLE

0 commit comments

Comments
 (0)