@@ -270,6 +270,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
270
270
is_feasibility:: Bool
271
271
is_objective_function_set:: Bool
272
272
is_objective_sense_set:: Bool
273
+ multi_objective:: Union{Nothing,MOI.VectorAffineFunction{Float64}}
273
274
274
275
# A flag to keep track of whether the objective is linear or quadratic.
275
276
hessian:: Union{Nothing,SparseArrays.SparseMatrixCSC{Float64,HighsInt}}
@@ -305,6 +306,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
305
306
false ,
306
307
false ,
307
308
nothing ,
309
+ nothing ,
308
310
Set {_VariableInfo} (),
309
311
_variable_info_dict (),
310
312
_constraint_info_dict (),
@@ -366,6 +368,7 @@ function MOI.empty!(model::Optimizer)
366
368
model. is_feasibility = true
367
369
model. is_objective_function_set = false
368
370
model. is_objective_sense_set = false
371
+ model. multi_objective = nothing
369
372
model. hessian = nothing
370
373
empty! (model. binaries)
371
374
empty! (model. variable_info)
@@ -1017,7 +1020,9 @@ function MOI.supports(
1017
1020
end
1018
1021
1019
1022
function MOI. get (model:: Optimizer , :: MOI.ObjectiveFunctionType )
1020
- if model. hessian === nothing
1023
+ if model. multi_objective != = nothing
1024
+ return MOI. VectorAffineFunction{Float64}
1025
+ elseif model. hessian === nothing
1021
1026
return MOI. ScalarAffineFunction{Float64}
1022
1027
else
1023
1028
return MOI. ScalarQuadraticFunction{Float64}
@@ -1029,6 +1034,11 @@ function MOI.set(
1029
1034
:: MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}} ,
1030
1035
f:: MOI.ScalarAffineFunction{Float64} ,
1031
1036
)
1037
+ if model. multi_objective != = nothing
1038
+ ret = Highs_clearLinearObjectives (model)
1039
+ _check_ret (ret)
1040
+ model. multi_objective = nothing
1041
+ end
1032
1042
num_vars = HighsInt (length (model. variable_info))
1033
1043
obj = zeros (Float64, num_vars)
1034
1044
for term in f. terms
@@ -1062,6 +1072,11 @@ function MOI.set(
1062
1072
:: MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}} ,
1063
1073
f:: MOI.ScalarQuadraticFunction{Float64} ,
1064
1074
)
1075
+ if model. multi_objective != = nothing
1076
+ ret = Highs_clearLinearObjectives (model)
1077
+ _check_ret (ret)
1078
+ model. multi_objective = nothing
1079
+ end
1065
1080
numcol = length (model. variable_info)
1066
1081
obj = zeros (Float64, numcol)
1067
1082
for term in f. affine_terms
@@ -1228,6 +1243,52 @@ function MOI.modify(
1228
1243
return
1229
1244
end
1230
1245
1246
+ function MOI. supports (
1247
+ :: Optimizer ,
1248
+ :: MOI.ObjectiveFunction{MOI.VectorAffineFunction{Float64}} ,
1249
+ )
1250
+ return true
1251
+ end
1252
+
1253
+ function MOI. get (
1254
+ model:: Optimizer ,
1255
+ :: MOI.ObjectiveFunction{MOI.VectorAffineFunction{Float64}} ,
1256
+ )
1257
+ return model. multi_objective
1258
+ end
1259
+
1260
+ function MOI. set (
1261
+ model:: Optimizer ,
1262
+ :: MOI.ObjectiveFunction{MOI.VectorAffineFunction{Float64}} ,
1263
+ f:: MOI.VectorAffineFunction{Float64} ,
1264
+ )
1265
+ num_vars = HighsInt (length (model. variable_info))
1266
+ O = MOI. output_dimension (f)
1267
+ obj_coefs = zeros (Float64, O * num_vars)
1268
+ for term in f. terms
1269
+ col = column (model, term. scalar_term. variable) + 1
1270
+ obj_coefs[O* (term. output_index- 1 )+ col] += term. scalar_term. coefficient
1271
+ end
1272
+ # senseP will be 1 if MIN and -1 if MAX
1273
+ senseP = Ref {HighsInt} ()
1274
+ ret = Highs_getObjectiveSense (model, senseP)
1275
+ _check_ret (ret)
1276
+ ret = Highs_passLinearObjectives (
1277
+ model,
1278
+ O, # num_linear_objective
1279
+ fill (Float64 (senseP[]), O), # weight: set to -1 if maximizing
1280
+ f. constants, # offset
1281
+ obj_coefs, # coefficients
1282
+ zeros (Float64, O), # abs_tolerance
1283
+ zeros (Float64, O), # rel_tolerance
1284
+ ones (Cint, O), # priority
1285
+ )
1286
+ _check_ret (ret)
1287
+ model. multi_objective = f
1288
+ model. is_objective_function_set = true
1289
+ return
1290
+ end
1291
+
1231
1292
# ##
1232
1293
# ## VariableIndex-in-Set constraints.
1233
1294
# ##
0 commit comments