@@ -126,7 +126,7 @@ function _change_constant(
126
126
model,
127
127
ci:: MOI.ConstraintIndex{<:MOI.ScalarAffineFunction,S} ,
128
128
constant,
129
- idx ,
129
+ :: Int ,
130
130
) where {S}
131
131
MOI. set (model, MOI. ConstraintSet (), ci, S (constant))
132
132
return
@@ -136,7 +136,7 @@ function _change_constant(
136
136
model,
137
137
ci:: MOI.ConstraintIndex{<:MOI.VectorAffineFunction} ,
138
138
constant,
139
- idx,
139
+ idx:: Int ,
140
140
)
141
141
func = MOI. get (model, MOI. ConstraintFunction (), ci)
142
142
constants = copy (func. constant)
@@ -159,23 +159,19 @@ function MOI.modify(
159
159
constant = - constant
160
160
end
161
161
vi = obj_change. variable
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]
166
- if ci_dual === NO_CONSTRAINT
167
- return
168
- end
162
+ data = get (primal_dual_map. primal_variable_data, vi, nothing )
163
+ if data === nothing
164
+ # error
165
+ elseif data. dual_constraint === nothing
166
+ return
167
+ elseif data. primal_constrained_variable_constraint != = nothing
169
168
constant = - constant
170
- else
171
- ci_dual = primal_dual_map. primal_var_to_dual_con[vi]
172
- index = 1
173
169
end
174
170
_change_constant (
175
171
optimizer. dual_problem. dual_model,
176
- ci_dual ,
172
+ data . dual_constraint ,
177
173
constant,
178
- index ,
174
+ data . primal_constrained_variable_index ,
179
175
)
180
176
return
181
177
end
@@ -246,32 +242,31 @@ function MOI.get(
246
242
optimizer:: DualOptimizer{T} ,
247
243
:: MOI.VariablePrimal ,
248
244
vi:: MOI.VariableIndex ,
249
- ) where {T}
245
+ ):: T where {T}
250
246
primal_dual_map = optimizer. dual_problem. primal_dual_map
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
270
- else
247
+ data = get (primal_dual_map. primal_variable_data, vi, nothing )
248
+ if data === nothing
249
+ # error
250
+ elseif data. dual_constraint === nothing
251
+ return zero (T)
252
+ elseif data. primal_constrained_variable_constraint === nothing
271
253
return - MOI. get (
272
254
optimizer. dual_problem. dual_model,
273
255
MOI. ConstraintDual (),
274
- primal_dual_map. primal_var_to_dual_con[vi],
256
+ data. dual_constraint,
257
+ )
258
+ elseif data. dual_constraint isa
259
+ MOI. ConstraintIndex{<: MOI.AbstractVectorFunction }
260
+ return MOI. get (
261
+ optimizer. dual_problem. dual_model,
262
+ MOI. ConstraintDual (),
263
+ data. dual_constraint,
264
+ )[data. primal_constrained_variable_index]
265
+ else
266
+ return MOI. get (
267
+ optimizer. dual_problem. dual_model,
268
+ MOI. ConstraintDual (),
269
+ data. dual_constraint,
275
270
)
276
271
end
277
272
end
@@ -282,16 +277,17 @@ function MOI.get(
282
277
ci:: MOI.ConstraintIndex{F,S} ,
283
278
) where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
284
279
primal_dual_map = optimizer. dual_problem. primal_dual_map
285
- if haskey (primal_dual_map. primal_convarcon_to_dual_con, ci)
286
- ci_dual = primal_dual_map. primal_convarcon_to_dual_con[ci]
287
- if ci_dual === NO_CONSTRAINT
280
+ if haskey (primal_dual_map. primal_constrained_variables, ci)
281
+ vi = primal_dual_map. primal_constrained_variables[ci][]
282
+ ci_dual = primal_dual_map. primal_variable_data[vi]. dual_constraint
283
+ if ci_dual === nothing
288
284
return MOI. Utilities. eval_variables (
289
- primal_dual_map. primal_convarcon_to_dual_function[ci] ,
290
- ) do vi
285
+ primal_dual_map. primal_variable_data[vi] . dual_function ,
286
+ ) do inner_vi
291
287
return MOI. get (
292
288
optimizer. dual_problem. dual_model,
293
289
MOI. VariablePrimal (),
294
- vi ,
290
+ inner_vi ,
295
291
)
296
292
end
297
293
end
@@ -309,7 +305,7 @@ function MOI.get(
309
305
return MOI. get (
310
306
optimizer. dual_problem. dual_model,
311
307
MOI. VariablePrimal (),
312
- primal_dual_map. primal_con_to_dual_var_vec [ci][],
308
+ primal_dual_map. primal_constraint_data [ci]. dual_variables [],
313
309
)
314
310
end
315
311
end
@@ -320,29 +316,32 @@ function MOI.get(
320
316
ci:: MOI.ConstraintIndex{F,S} ,
321
317
) where {F<: MOI.AbstractVectorFunction ,S<: MOI.AbstractVectorSet }
322
318
primal_dual_map = optimizer. dual_problem. primal_dual_map
323
- if haskey (primal_dual_map. primal_convarcon_to_dual_con, ci)
324
- ci_dual = primal_dual_map. primal_convarcon_to_dual_con[ci]
325
- if ci_dual === NO_CONSTRAINT
326
- return MOI. Utilities. eval_variables (
327
- primal_dual_map. primal_convarcon_to_dual_function[ci],
328
- ) do vi
329
- return MOI. get (
330
- optimizer. dual_problem. dual_model,
331
- MOI. VariablePrimal (),
332
- vi,
333
- )
334
- end
319
+ if ! haskey (primal_dual_map. primal_constraint_data, ci)
320
+ vis = primal_dual_map. primal_constrained_variables[ci]
321
+ ci_dual = primal_dual_map. primal_variable_data[vis[1 ]]. dual_constraint
322
+ if ci_dual === nothing
323
+ return [
324
+ MOI. Utilities. eval_variables (
325
+ primal_dual_map. primal_variable_data[vi]. dual_function,
326
+ ) do inner_vi
327
+ return MOI. get (
328
+ optimizer. dual_problem. dual_model,
329
+ MOI. VariablePrimal (),
330
+ inner_vi,
331
+ )
332
+ end for vi in vis
333
+ ]
335
334
end
336
335
return MOI. get (
337
336
optimizer. dual_problem. dual_model,
338
337
MOI. ConstraintPrimal (),
339
- primal_dual_map . primal_convarcon_to_dual_con[ci] ,
338
+ ci_dual ,
340
339
)
341
340
else
342
341
return MOI. get .(
343
342
optimizer. dual_problem. dual_model,
344
343
MOI. VariablePrimal (),
345
- primal_dual_map. primal_con_to_dual_var_vec [ci],
344
+ primal_dual_map. primal_constraint_data [ci]. dual_variables ,
346
345
)
347
346
end
348
347
end
@@ -353,9 +352,11 @@ function MOI.get(
353
352
ci:: MOI.ConstraintIndex{F,S} ,
354
353
) where {T,F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
355
354
primal_dual_map = optimizer. dual_problem. primal_dual_map
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
355
+ data = get (primal_dual_map. primal_constraint_data, ci, nothing )
356
+ if data === nothing
357
+ first_vi = primal_dual_map. primal_constrained_variables[ci][1 ]
358
+ ci_dual = primal_dual_map. primal_variable_data[first_vi]. dual_constraint
359
+ if ci_dual === nothing
359
360
return zero (T)
360
361
else
361
362
return MOI. get (
@@ -365,17 +366,16 @@ function MOI.get(
365
366
)
366
367
end
367
368
else
368
- primal_ci_constant =
369
- primal_dual_map. primal_con_to_primal_constants_vec[ci][1 ]
369
+ primal_ci_constant = data. primal_set_constants[1 ]
370
370
# If it has no key then there is no dual constraint
371
- if ! haskey (primal_dual_map. primal_con_to_dual_convarcon, ci)
371
+ ci_dual = data. dual_constrained_variable_constraint
372
+ if ci_dual === nothing
372
373
return - primal_ci_constant
373
374
end
374
- ci_dual_problem = primal_dual_map. primal_con_to_dual_convarcon[ci]
375
375
return MOI. get (
376
376
optimizer. dual_problem. dual_model,
377
377
MOI. ConstraintDual (),
378
- ci_dual_problem ,
378
+ ci_dual ,
379
379
) - primal_ci_constant
380
380
end
381
381
end
@@ -386,13 +386,12 @@ function MOI.get(
386
386
ci:: MOI.ConstraintIndex{F,S} ,
387
387
) where {T,F<: MOI.AbstractVectorFunction ,S<: MOI.AbstractVectorSet }
388
388
primal_dual_map = optimizer. dual_problem. primal_dual_map
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)
389
+ data = get (primal_dual_map. primal_constraint_data, ci, nothing )
390
+ if data === nothing
391
+ vis = primal_dual_map. primal_constrained_variables[ci]
392
+ ci_dual = primal_dual_map. primal_variable_data[vis[1 ]]. dual_constraint
393
+ if ci_dual === nothing
394
+ return zeros (T, length (vis))
396
395
else
397
396
return MOI. get (
398
397
optimizer. dual_problem. dual_model,
@@ -401,18 +400,17 @@ function MOI.get(
401
400
)
402
401
end
403
402
else
403
+ ci_dual = data. dual_constrained_variable_constraint
404
404
# If it has no key then there is no dual constraint
405
- if ! haskey (primal_dual_map . primal_con_to_dual_convarcon, ci)
405
+ if ci_dual === nothing
406
406
# The number of dual variable associated with the primal constraint is the ci dimension
407
- ci_dimension =
408
- length (primal_dual_map. primal_con_to_dual_var_vec[ci])
407
+ ci_dimension = length (data. dual_variables)
409
408
return zeros (T, ci_dimension)
410
409
end
411
- ci_dual_problem = primal_dual_map. primal_con_to_dual_convarcon[ci]
412
410
return MOI. get (
413
411
optimizer. dual_problem. dual_model,
414
412
MOI. ConstraintDual (),
415
- ci_dual_problem ,
413
+ ci_dual ,
416
414
)
417
415
end
418
416
end
0 commit comments