Skip to content

Commit 20a618c

Browse files
authored
Merge pull request #160 from JuliaOpt/bl/fixed_certificate
Add support for given polynomial basis
2 parents fe1669c + ea2b1f1 commit 20a618c

File tree

6 files changed

+78
-1
lines changed

6 files changed

+78
-1
lines changed

src/Certificate/Certificate.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,17 @@ function get(::Type{MaxDegree{CT, BT}}, ::GramBasisType) where {CT, BT}
127127
return BT
128128
end
129129

130+
struct FixedBasis{CT <: SumOfSquares.SOSLikeCone, BT <: MB.AbstractPolynomialBasis} <: SimpleIdealCertificate{CT, BT}
131+
cone::CT
132+
basis::BT
133+
end
134+
function get(certificate::FixedBasis, ::GramBasis, poly) where CT
135+
return certificate.basis
136+
end
137+
function get(::Type{FixedBasis{CT, BT}}, ::GramBasisType) where {CT, BT}
138+
return BT
139+
end
140+
130141
struct Newton{CT <: SumOfSquares.SOSLikeCone, BT <: MB.AbstractPolynomialBasis, NPT <: Tuple} <: SimpleIdealCertificate{CT, BT}
131142
cone::CT
132143
basis::Type{BT}

src/constraint.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ function default_ideal_certificate(
9898
error("Monomial sparsity not implemented yet")
9999
else
100100
@assert sparsity isa NoSparsity
101-
c = default_ideal_certificate(domain, cone, basis, newton_polytope, maxdegree)
101+
if basis isa AbstractPolynomialBasis
102+
c = Certificate.FixedBasis(cone, basis)
103+
else
104+
c = default_ideal_certificate(domain, cone, basis, newton_polytope, maxdegree)
105+
end
102106
end
103107
if newton_of_remainder && !(c isa SumOfSquares.Certificate.Remainder)
104108
return SumOfSquares.Certificate.Remainder(c)

test/Mock/mock_tests.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ end
99
@testset "Term fixed" begin
1010
include("term_fixed.jl")
1111
end
12+
@testset "Quartic constant" begin
13+
include("quartic_constant.jl")
14+
end
1215
@testset "Quadratic" begin
1316
include("quadratic.jl")
1417
end

test/Mock/quartic_constant.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
config = MOI.Test.TestConfig()
2+
_optimize!(mock) = MOIU.mock_optimize!(mock, [4.0, 1.0])
3+
for mock in mocks(_optimize!)
4+
Tests.dsos_quartic_constant_test(mock, config)
5+
Tests.sdsos_quartic_constant_test(mock, config)
6+
Tests.sos_quartic_constant_test(mock, config)
7+
end

test/Tests/Tests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const sd_tests = Dict{String, Function}()
88

99
include("term.jl")
1010
include("term_fixed.jl")
11+
include("quartic_constant.jl")
1112
include("quadratic.jl")
1213
include("quartic_ideal.jl")
1314
include("univariate_sum.jl")

test/Tests/quartic_constant.jl

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using Test
2+
using SumOfSquares
3+
using DynamicPolynomials
4+
5+
function quartic_constant_test(optimizer,
6+
config::MOIT.TestConfig,
7+
cone::SumOfSquares.PolyJuMP.PolynomialSet)
8+
atol = config.atol
9+
rtol = config.rtol
10+
11+
@polyvar x
12+
p = x^4 + 4
13+
14+
model = _model(optimizer)
15+
@variable(model, γ)
16+
17+
cref = @constraint(model, p - γ in cone, basis=FixedPolynomialBasis([x^2]))
18+
19+
@objective(model, Max, γ)
20+
21+
optimize!(model)
22+
23+
@test termination_status(model) == MOI.OPTIMAL
24+
25+
@test primal_status(model) == MOI.FEASIBLE_POINT
26+
27+
@test objective_value(model) 4 atol=atol rtol=rtol
28+
29+
p = gram_matrix(cref)
30+
@test p isa SumOfSquares.GramMatrix
31+
@test getmat(p) ones(1, 1) atol=atol rtol=rtol
32+
@test p.basis isa FixedPolynomialBasis
33+
@test p.basis.polynomials == [x^2]
34+
35+
S = SumOfSquares.SOSPolynomialSet{
36+
SumOfSquares.FullSpace, Monomial{true}, MonomialVector{true},
37+
SumOfSquares.Certificate.FixedBasis{typeof(cone),typeof(p.basis)}
38+
}
39+
@test list_of_constraint_types(model) == [(Vector{AffExpr}, S)]
40+
test_delete_bridge(
41+
model, cref, 1,
42+
((MOI.VectorOfVariables, MOI.Nonnegatives, 0),
43+
(MOI.VectorOfVariables, MOI.PositiveSemidefiniteConeTriangle, 0)
44+
))
45+
end
46+
sos_quartic_constant_test(optimizer, config) = quartic_constant_test(optimizer, config, SOSCone())
47+
sd_tests["sos_quartic_constant"] = sos_quartic_constant_test
48+
sdsos_quartic_constant_test(optimizer, config) = quartic_constant_test(optimizer, config, SDSOSCone())
49+
soc_tests["sdsos_quartic_constant"] = sdsos_quartic_constant_test
50+
dsos_quartic_constant_test(optimizer, config) = quartic_constant_test(optimizer, config, DSOSCone())
51+
linear_tests["dsos_quartic_constant"] = dsos_quartic_constant_test

0 commit comments

Comments
 (0)