Skip to content

Commit b11251c

Browse files
committed
Add support for ObjectiveFunction{VectorAffineFunction}
1 parent fbf94b5 commit b11251c

File tree

1 file changed

+62
-1
lines changed

1 file changed

+62
-1
lines changed

src/MOI_wrapper.jl

+62-1
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
270270
is_feasibility::Bool
271271
is_objective_function_set::Bool
272272
is_objective_sense_set::Bool
273+
multi_objective::Union{Nothing,MOI.VectorAffineFunction{Float64}}
273274

274275
# A flag to keep track of whether the objective is linear or quadratic.
275276
hessian::Union{Nothing,SparseArrays.SparseMatrixCSC{Float64,HighsInt}}
@@ -305,6 +306,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
305306
false,
306307
false,
307308
nothing,
309+
nothing,
308310
Set{_VariableInfo}(),
309311
_variable_info_dict(),
310312
_constraint_info_dict(),
@@ -366,6 +368,7 @@ function MOI.empty!(model::Optimizer)
366368
model.is_feasibility = true
367369
model.is_objective_function_set = false
368370
model.is_objective_sense_set = false
371+
model.multi_objective = nothing
369372
model.hessian = nothing
370373
empty!(model.binaries)
371374
empty!(model.variable_info)
@@ -1017,7 +1020,9 @@ function MOI.supports(
10171020
end
10181021

10191022
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
10211026
return MOI.ScalarAffineFunction{Float64}
10221027
else
10231028
return MOI.ScalarQuadraticFunction{Float64}
@@ -1029,6 +1034,11 @@ function MOI.set(
10291034
::MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float64}},
10301035
f::MOI.ScalarAffineFunction{Float64},
10311036
)
1037+
if model.multi_objective !== nothing
1038+
ret = Highs_clearLinearObjectives(model)
1039+
_check_ret(ret)
1040+
model.multi_objective = nothing
1041+
end
10321042
num_vars = HighsInt(length(model.variable_info))
10331043
obj = zeros(Float64, num_vars)
10341044
for term in f.terms
@@ -1062,6 +1072,11 @@ function MOI.set(
10621072
::MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{Float64}},
10631073
f::MOI.ScalarQuadraticFunction{Float64},
10641074
)
1075+
if model.multi_objective !== nothing
1076+
ret = Highs_clearLinearObjectives(model)
1077+
_check_ret(ret)
1078+
model.multi_objective = nothing
1079+
end
10651080
numcol = length(model.variable_info)
10661081
obj = zeros(Float64, numcol)
10671082
for term in f.affine_terms
@@ -1228,6 +1243,52 @@ function MOI.modify(
12281243
return
12291244
end
12301245

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+
12311292
###
12321293
### VariableIndex-in-Set constraints.
12331294
###

0 commit comments

Comments
 (0)