Skip to content

Commit 68939f2

Browse files
authored
Fix final_touch if no higher-order polynomials are present (#109)
* Fix final_touch if no higher-order polynomials are present * Add test
1 parent 36c4aa2 commit 68939f2

File tree

2 files changed

+33
-18
lines changed

2 files changed

+33
-18
lines changed

src/QCQP/MOI_wrapper.jl

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -318,25 +318,27 @@ function MOI.Utilities.final_touch(model::Optimizer{T}, _) where {T}
318318
end
319319
end
320320
end
321-
div = decompose(monos)
322-
for mono in sort(collect(keys(div)))
323-
if haskey(vars, mono)
324-
continue
321+
if !isnothing(monos)
322+
div = decompose(monos)
323+
for mono in sort(collect(keys(div)))
324+
if haskey(vars, mono)
325+
continue
326+
end
327+
a = div[mono]
328+
monomial_variable_index(model, vars, div, a)
329+
b = MP.div_multiple(mono, a)
330+
monomial_variable_index(model, vars, div, b)
331+
end
332+
if !isnothing(model.objective)
333+
func, index_to_var = _subs!(model.objective, index_to_var)
334+
obj = _quad_convert(func.polynomial, vars, div)
335+
MOI.set(model.model, MOI.ObjectiveFunction{typeof(obj)}(), obj)
336+
end
337+
for S in keys(model.constraints)
338+
F = PolyJuMP.ScalarPolynomialFunction{T,model.constraints[S][1]}
339+
cis = MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
340+
_add_constraints(model, cis, index_to_var, vars, div)
325341
end
326-
a = div[mono]
327-
monomial_variable_index(model, vars, div, a)
328-
b = MP.div_multiple(mono, a)
329-
monomial_variable_index(model, vars, div, b)
330-
end
331-
if !isnothing(model.objective)
332-
func, index_to_var = _subs!(model.objective, index_to_var)
333-
obj = _quad_convert(func.polynomial, vars, div)
334-
MOI.set(model.model, MOI.ObjectiveFunction{typeof(obj)}(), obj)
335-
end
336-
for S in keys(model.constraints)
337-
F = PolyJuMP.ScalarPolynomialFunction{T,model.constraints[S][1]}
338-
cis = MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
339-
_add_constraints(model, cis, index_to_var, vars, div)
340342
end
341343
return
342344
end

test/qcqp.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,19 @@ function test_objective_and_constraint(x, y, T)
144144
o * a3 * b3 + o * a6
145145
end
146146

147+
function test_no_monomials(x, y, T)
148+
inner = Model{T}()
149+
model = PolyJuMP.JuMP.GenericModel{T}() do
150+
return PolyJuMP.QCQP.Optimizer{T}(MOI.Utilities.MockOptimizer(inner))
151+
end
152+
PolyJuMP.@variable(model, 0 <= x[1:2] <= 1)
153+
PolyJuMP.@constraint(model, x[1] * x[2] == 0.5)
154+
PolyJuMP.@objective(model, Min, sum(x))
155+
PolyJuMP.optimize!(model)
156+
@test MOI.get(inner, MOI.NumberOfVariables()) == 2
157+
return
158+
end
159+
147160
function runtests(x, y)
148161
for name in names(@__MODULE__; all = true)
149162
if startswith("$name", "test_")

0 commit comments

Comments
 (0)