Skip to content

Commit

Permalink
Fix final_touch if no higher-order polynomials are present (#109)
Browse files Browse the repository at this point in the history
* Fix final_touch if no higher-order polynomials are present

* Add test
  • Loading branch information
odow authored Mar 4, 2024
1 parent 36c4aa2 commit 68939f2
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 18 deletions.
38 changes: 20 additions & 18 deletions src/QCQP/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -318,25 +318,27 @@ function MOI.Utilities.final_touch(model::Optimizer{T}, _) where {T}
end
end
end
div = decompose(monos)
for mono in sort(collect(keys(div)))
if haskey(vars, mono)
continue
if !isnothing(monos)
div = decompose(monos)
for mono in sort(collect(keys(div)))
if haskey(vars, mono)
continue
end
a = div[mono]
monomial_variable_index(model, vars, div, a)
b = MP.div_multiple(mono, a)
monomial_variable_index(model, vars, div, b)
end
if !isnothing(model.objective)
func, index_to_var = _subs!(model.objective, index_to_var)
obj = _quad_convert(func.polynomial, vars, div)
MOI.set(model.model, MOI.ObjectiveFunction{typeof(obj)}(), obj)
end
for S in keys(model.constraints)
F = PolyJuMP.ScalarPolynomialFunction{T,model.constraints[S][1]}
cis = MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
_add_constraints(model, cis, index_to_var, vars, div)
end
a = div[mono]
monomial_variable_index(model, vars, div, a)
b = MP.div_multiple(mono, a)
monomial_variable_index(model, vars, div, b)
end
if !isnothing(model.objective)
func, index_to_var = _subs!(model.objective, index_to_var)
obj = _quad_convert(func.polynomial, vars, div)
MOI.set(model.model, MOI.ObjectiveFunction{typeof(obj)}(), obj)
end
for S in keys(model.constraints)
F = PolyJuMP.ScalarPolynomialFunction{T,model.constraints[S][1]}
cis = MOI.get(model, MOI.ListOfConstraintIndices{F,S}())
_add_constraints(model, cis, index_to_var, vars, div)
end
return
end
Expand Down
13 changes: 13 additions & 0 deletions test/qcqp.jl
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,19 @@ function test_objective_and_constraint(x, y, T)
o * a3 * b3 + o * a6
end

function test_no_monomials(x, y, T)
inner = Model{T}()
model = PolyJuMP.JuMP.GenericModel{T}() do
return PolyJuMP.QCQP.Optimizer{T}(MOI.Utilities.MockOptimizer(inner))
end
PolyJuMP.@variable(model, 0 <= x[1:2] <= 1)
PolyJuMP.@constraint(model, x[1] * x[2] == 0.5)
PolyJuMP.@objective(model, Min, sum(x))
PolyJuMP.optimize!(model)
@test MOI.get(inner, MOI.NumberOfVariables()) == 2
return
end

function runtests(x, y)
for name in names(@__MODULE__; all = true)
if startswith("$name", "test_")
Expand Down

0 comments on commit 68939f2

Please sign in to comment.