Skip to content
This repository was archived by the owner on Jun 14, 2020. It is now read-only.

Commit 7a160dc

Browse files
authored
Update LQOI to reflect refactoring of modifications in MOI (#29)
* Update LQOI to reflect refactoring of modifications in MOI * Add multirowchange and get Travis to checkout MOI PR * Update .travis.yml * Bump MOI version
1 parent 11fb079 commit 7a160dc

File tree

6 files changed

+46
-28
lines changed

6 files changed

+46
-28
lines changed

REQUIRE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
julia 0.6
2-
MathOptInterface 0.3 0.4
2+
MathOptInterface 0.4 0.5

src/constraints/scalaraffine.jl

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,8 @@ end
163163
Scalar Coefficient Change of Linear Constraint
164164
=#
165165

166-
MOI.canmodifyconstraint(m::LinQuadOptimizer, c::LCI{<: LinSets}, ::Type{MOI.ScalarCoefficientChange{Float64}}) = true
167-
function MOI.modifyconstraint!(m::LinQuadOptimizer, c::LCI{<: LinSets}, chg::MOI.ScalarCoefficientChange{Float64})
166+
MOI.canmodify(m::LinQuadOptimizer, ::Type{LCI{S}}, ::Type{MOI.ScalarCoefficientChange{Float64}}) where S <: LinSets = true
167+
function MOI.modify!(m::LinQuadOptimizer, c::LCI{S}, chg::MOI.ScalarCoefficientChange{Float64}) where S <: LinSets
168168
col = m.variable_mapping[chg.variable]
169169
change_matrix_coefficient!(m, m[c], col, chg.new_coefficient)
170170
end
@@ -173,13 +173,13 @@ end
173173
Change RHS of linear constraint without modifying sense
174174
=#
175175

176-
MOI.canmodifyconstraint(m::LinQuadOptimizer, c::LCI{S}, ::Type{S}) where S <: Union{LE, GE, EQ} = true
177-
function MOI.modifyconstraint!(m::LinQuadOptimizer, c::LCI{S}, newset::S) where S <: Union{LE, GE, EQ}
176+
MOI.canset(m::LinQuadOptimizer, ::MOI.ConstraintSet, ::Type{LCI{S}}) where S <: Union{LE, GE, EQ} = true
177+
function MOI.set!(m::LinQuadOptimizer, ::MOI.ConstraintSet, c::LCI{S}, newset::S) where S <: Union{LE, GE, EQ}
178178
change_rhs_coefficient!(m, m[c], _getrhs(newset))
179179
end
180180

181-
MOI.canmodifyconstraint(m::LinQuadOptimizer, c::LCI{IV}, ::Type{IV}) = true
182-
function MOI.modifyconstraint!(m::LinQuadOptimizer, c::LCI{IV}, set::IV)
181+
MOI.canset(m::LinQuadOptimizer, ::MOI.ConstraintSet, ::Type{LCI{IV}}) = true
182+
function MOI.set!(m::LinQuadOptimizer, ::MOI.ConstraintSet, c::LCI{IV}, set::IV)
183183
modify_ranged_constraints!(m, [m[c]], [set.lower], [set.upper])
184184
end
185185

@@ -205,17 +205,17 @@ end
205205
Transform scalar constraint
206206
=#
207207

208-
function MOI.cantransformconstraint(m::LinQuadOptimizer, ref::LCI{S}, newset::S) where S
208+
function MOI.cantransform(m::LinQuadOptimizer, ref::LCI{S}, newset::S) where S
209209
false
210210
end
211-
function MOI.transformconstraint!(m::LinQuadOptimizer, ref::LCI{S}, newset::S) where S
212-
error("Cannot transform constraint of same set. use `modifyconstraint!` instead.")
211+
function MOI.transform!(m::LinQuadOptimizer, ::LCI{S}, newset::S) where S
212+
error("Cannot transform constraint of same set. use `set!` instead.")
213213
end
214214

215-
function MOI.cantransformconstraint(m::LinQuadOptimizer, ref::LCI{S1}, newset::S2) where S1 where S2 <: Union{LE, GE, EQ}
215+
function MOI.cantransform(m::LinQuadOptimizer, ref::LCI{S1}, newset::S2) where S1 where S2 <: Union{LE, GE, EQ}
216216
true
217217
end
218-
function MOI.transformconstraint!(m::LinQuadOptimizer, ref::LCI{S1}, newset::S2) where S1 where S2 <: Union{LE, GE, EQ}
218+
function MOI.transform!(m::LinQuadOptimizer, ref::LCI{S1}, newset::S2) where S1 where S2 <: Union{LE, GE, EQ}
219219
dict = constrdict(m, ref)
220220
row = dict[ref]
221221
change_linear_constraint_sense!(m, [row], [backend_type(m,newset)])

src/constraints/singlevariable.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ function MOI.get(m::LinQuadOptimizer, ::MOI.ConstraintFunction, c::SVCI{<: LinSe
9090
end
9191

9292
# modify
93-
MOI.canmodifyconstraint(::LinQuadOptimizer, ::SVCI{S}, ::Type{S}) where S <: LinSets = true
94-
function MOI.modifyconstraint!(m::LinQuadOptimizer, c::SVCI{S}, newset::S) where S <: LinSets
93+
MOI.canset(::LinQuadOptimizer, ::MOI.ConstraintSet, ::Type{SVCI{S}}) where S <: LinSets = true
94+
function MOI.set!(m::LinQuadOptimizer, ::MOI.ConstraintSet, c::SVCI{S}, newset::S) where S <: LinSets
9595
setvariablebound!(m, SinVar(m[c]), newset)
9696
end
9797

src/constraints/vectoraffine.jl

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,23 @@ function addlinearconstraint!(m::LinQuadOptimizer, func::VecLin, sense::Cchar)
5050
add_linear_constraints!(m, A, fill(sense, length(func.constants)), -func.constants)
5151
end
5252

53-
MOI.canmodifyconstraint(m::LinQuadOptimizer, ::VLCI{<: VecLinSets}, ::Type{MOI.VectorConstantChange{Float64}}) = true
54-
function MOI.modifyconstraint!(m::LinQuadOptimizer, ref::VLCI{<: VecLinSets}, chg::MOI.VectorConstantChange{Float64})
53+
MOI.canmodify(m::LinQuadOptimizer, ::Type{VLCI{S}}, ::Type{MOI.VectorConstantChange{Float64}}) where S <: VecLinSets = true
54+
function MOI.modify!(m::LinQuadOptimizer, ref::VLCI{<: VecLinSets}, chg::MOI.VectorConstantChange{Float64})
5555
@assert length(chg.new_constant) == length(m[ref])
5656
for (r, v) in zip(m[ref], chg.new_constant)
5757
change_rhs_coefficient!(m, r, -v)
5858
m.constraint_constant[r] = v
5959
end
6060
end
6161

62+
MOI.canmodify(m::LinQuadOptimizer, ::Type{VLCI{S}}, ::Type{MOI.MultirowChange{Float64}}) where S <: VecLinSets = true
63+
function MOI.modify!(m::LinQuadOptimizer, ref::VLCI{<: VecLinSets}, chg::MOI.MultirowChange{Float64})
64+
col = m.variable_mapping[chg.variable]
65+
for (row, coef) in chg.new_coefficients
66+
change_matrix_coefficient!(m, row, col, coef)
67+
end
68+
end
69+
6270
MOI.candelete(m::LinQuadOptimizer, c::VLCI{<:VecLinSets}) = MOI.isvalid(m, c)
6371
function MOI.delete!(m::LinQuadOptimizer, c::VLCI{<:VecLinSets})
6472
deleteconstraintname!(m, c)

src/objective.jl

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,13 +141,26 @@ end
141141
Modify objective function
142142
=#
143143

144-
MOI.canmodifyobjective(m::LinQuadOptimizer, ::Type{MOI.ScalarCoefficientChange{Float64}}) = true
145-
function MOI.modifyobjective!(m::LinQuadOptimizer, chg::MOI.ScalarCoefficientChange{Float64})
144+
function MOI.canmodify(m::LinQuadOptimizer, ::MOI.ObjectiveFunction{F}, ::Type{MOI.ScalarCoefficientChange{Float64}}) where F
145+
if F <: MOI.ScalarQuadraticFunction
146+
return m.obj_type == QuadraticObjective
147+
elseif F <: MOI.ScalarAffineFunction
148+
return m.obj_type == AffineObjective
149+
end
150+
return false
151+
end
152+
function MOI.modify!(m::LinQuadOptimizer, ::MOI.ObjectiveFunction{F}, chg::MOI.ScalarCoefficientChange{Float64}) where F
146153
if m.obj_type == SingleVariableObjective
147154
m.obj_type = AffineObjective
148155
m.single_obj_var = nothing
149156
end
150157
col = m.variable_mapping[chg.variable]
151-
# 0 row is the objective
152158
change_objective_coefficient!(m, col, chg.new_coefficient)
153159
end
160+
161+
function MOI.canmodify(m::LinQuadOptimizer, ::MOI.ObjectiveFunction{F}, ::Type{MOI.ScalarConstantChange{Float64}}) where F
162+
return !(F == MOI.SingleVariable)
163+
end
164+
function MOI.modify!(m::LinQuadOptimizer, ::MOI.ObjectiveFunction{F}, chg::MOI.ScalarConstantChange{Float64}) where F
165+
m.objective_constant = chg.new_constant
166+
end

test/runtests.jl

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
1-
#push!(Base.LOAD_PATH,joinpath(dirname(@__FILE__),"..",".."))
2-
31
using Base.Test, MathOptInterface
42
using LinQuadOptInterface
53

64
const MOIT = MathOptInterface.Test
75
const LQOI = LinQuadOptInterface
86

9-
107
@testset "LinQuadOptInterface" begin
118
@testset "Unit Tests" begin
129
config = MOIT.TestConfig(solve = false)
1310
solver = LQOI.MockLinQuadOptimizer()
14-
MOIT.basic_constraint_tests(solver, config;
15-
exclude = [
16-
]
17-
)
11+
MOIT.basic_constraint_tests(solver, config)
1812
MOIT.unittest(solver, config, [
19-
"solve_affine_interval"
13+
"solve_affine_interval",
14+
"solve_qp_edge_cases",
15+
"solve_qcp_edge_cases",
16+
"solve_affine_deletion_edge_cases"
2017
])
2118
end
19+
2220
@testset "Linear tests" begin
2321
linconfig = MOIT.TestConfig(solve = false)
2422
solver = LQOI.MockLinQuadOptimizer()
@@ -65,4 +63,3 @@ const LQOI = LinQuadOptInterface
6563
end
6664
end
6765
end
68-
;

0 commit comments

Comments
 (0)