Skip to content

Commit 919ded6

Browse files
authored
Certificate API: get -> function (#229)
* Certificate API: get -> function * Update certificate example
1 parent 98fc3af commit 919ded6

File tree

12 files changed

+97
-102
lines changed

12 files changed

+97
-102
lines changed

docs/src/tutorials/Extension/certificate.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,37 +51,37 @@ struct Schmüdgen{IC <: SOSC.AbstractIdealCertificate, CT <: SOS.SOSLikeCone, BT
5151
maxdegree::Int
5252
end
5353

54-
SOSC.get(certificate::Schmüdgen, ::SOSC.Cone) = certificate.cone
54+
SOSC.cone(certificate::Schmüdgen) = certificate.cone
5555

56-
function SOSC.get(::Schmüdgen, ::SOSC.PreprocessedDomain, domain::BasicSemialgebraicSet, p)
56+
function SOSC.preprocessed_domain(::Schmüdgen, domain::BasicSemialgebraicSet, p)
5757
return SOSC.DomainWithVariables(domain, variables(p))
5858
end
5959

60-
function SOSC.get(::Schmüdgen, ::SOSC.PreorderIndices, domain::SOSC.DomainWithVariables)
60+
function SOSC.preorder_indices(::Schmüdgen, domain::SOSC.DomainWithVariables)
6161
n = length(domain.domain.p)
6262
if n >= Sys.WORD_SIZE
6363
error("There are $(2^n - 1) products in Schmüdgen's certificate, they cannot even be indexed with `$Int`.")
6464
end
6565
return map(SOSC.PreorderIndex, 1:(2^n-1))
6666
end
6767

68-
function SOSC.get(certificate::Schmüdgen, ::SOSC.MultiplierBasis, index::SOSC.PreorderIndex, domain::SOSC.DomainWithVariables)
69-
q = SOSC.get(certificate, SOSC.Generator(), index, domain)
68+
function SOSC.multiplier_basis(certificate::Schmüdgen, index::SOSC.PreorderIndex, domain::SOSC.DomainWithVariables)
69+
q = SOSC.generator(certificate, index, domain)
7070
vars = sort!([domain.variables..., variables(q)...], rev = true)
7171
unique!(vars)
7272
return SOSC.maxdegree_gram_basis(certificate.basis, vars, SOSC.multiplier_maxdegree(certificate.maxdegree, q))
7373
end
74-
function SOSC.get(::Type{Schmüdgen{IC, CT, BT}}, ::SOSC.MultiplierBasisType) where {IC, CT, BT}
74+
function SOSC.multiplier_basis_type(::Type{Schmüdgen{IC, CT, BT}}) where {IC, CT, BT}
7575
return BT
7676
end
7777

78-
function SOSC.get(::Schmüdgen, ::SOSC.Generator, index::SOSC.PreorderIndex, domain::SOSC.DomainWithVariables)
78+
function SOSC.generator(::Schmüdgen, index::SOSC.PreorderIndex, domain::SOSC.DomainWithVariables)
7979
I = [i for i in eachindex(domain.domain.p) if !iszero(index.value & (1 << (i - 1)))]
8080
return prod([domain.domain.p[i] for i in eachindex(domain.domain.p) if !iszero(index.value & (1 << (i - 1)))])
8181
end
8282

83-
SOSC.get(certificate::Schmüdgen, ::SOSC.IdealCertificate) = certificate.ideal_certificate
84-
SOSC.get(::Type{<:Schmüdgen{IC}}, ::SOSC.IdealCertificate) where {IC} = IC
83+
SOSC.ideal_certificate(certificate::Schmüdgen) = certificate.ideal_certificate
84+
SOSC.ideal_certificate(::Type{<:Schmüdgen{IC}}) where {IC} = IC
8585

8686
SOS.matrix_cone_type(::Type{<:Schmüdgen{IC, CT}}) where {IC, CT} = SOS.matrix_cone_type(CT)
8787

src/Bridges/Constraint/sos_polynomial.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ function MOI.Bridges.Constraint.bridge_constraint(
3939
# `Float64` when used with JuMP and the coefficient type is often `Int` if
4040
# `set.domain.V` is `FullSpace` or `FixedPolynomialsSet`.
4141
# FIXME convert needed because the coefficient type of `r` is `Any` otherwise if `domain` is `AlgebraicSet`
42-
r = SOS.Certificate.get(s.certificate, SOS.Certificate.ReducedPolynomial(), p, MP.changecoefficienttype(s.domain, T))
43-
gram_basis = SOS.Certificate.get(s.certificate, SOS.Certificate.GramBasis(), r)
42+
r = SOS.Certificate.reduced_polynomial(s.certificate, p, MP.changecoefficienttype(s.domain, T))
43+
gram_basis = SOS.Certificate.gram_basis(s.certificate, r)
4444
g, Q, cQ = SOS.add_gram_matrix(model, MCT, gram_basis, T)
4545
# MOI does not modify the coefficients of the functions so we can modify `r`.
4646
# without altering `f`.
@@ -73,7 +73,7 @@ function MOIB.Constraint.concrete_bridge_type(
7373
MCT = SOS.matrix_cone_type(CT)
7474
UMCT = union_constraint_types(MCT)
7575
UMST = union_set_types(MCT)
76-
GB = SOS.Certificate.get(CT, SOS.Certificate.GramBasisType())
76+
GB = SOS.Certificate.gram_basis_type(CT)
7777
ZB = SOS.Certificate.zero_basis_type(CT)
7878
return SOSPolynomialBridge{T, G, DT, UMCT, UMST, MCT, GB, ZB, CT, MT, MVT}
7979
end
@@ -150,8 +150,7 @@ function MOI.get(model::MOI.ModelLike, attr::MOI.ConstraintDual,
150150
function reduced(mono)
151151
p = MP.polynomial(mono, T)
152152
domain = MP.changecoefficienttype(bridge.domain, T)
153-
return SOS.Certificate.get(
154-
bridge.certificate, SOS.Certificate.ReducedPolynomial(), p, domain)
153+
return SOS.Certificate.reduced_polynomial(bridge.certificate, p, domain)
155154
end
156155
return [dot(reduced(mono), μ) for mono in bridge.monomials]
157156
end

src/Bridges/Constraint/sos_polynomial_in_semialgebraic_set.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
function lagrangian_multiplier(model::MOI.ModelLike, certificate, index, preprocessed, T::Type)
2-
basis = Certificate.get(certificate, Certificate.MultiplierBasis(), index, preprocessed)
2+
basis = Certificate.multiplier_basis(certificate, index, preprocessed)
33
MCT = SOS.matrix_cone_type(typeof(certificate))
44
return SOS.add_gram_matrix(model, MCT, basis, T)..., basis
55
end
@@ -33,8 +33,8 @@ function MOI.Bridges.Constraint.bridge_constraint(
3333
λ_bases = B[]
3434
λ_variables = Union{Vector{MOI.VariableIndex}, Vector{Vector{MOI.VariableIndex}}}[]
3535
λ_constraints = UMCT[]
36-
preprocessed = Certificate.get(set.certificate, Certificate.PreprocessedDomain(), set.domain, p)
37-
for index in Certificate.get(set.certificate, Certificate.PreorderIndices(), preprocessed)
36+
preprocessed = Certificate.preprocessed_domain(set.certificate, set.domain, p)
37+
for index in Certificate.preorder_indices(set.certificate, preprocessed)
3838
λ, λ_variable, λ_constraint, λ_basis = lagrangian_multiplier(
3939
model, set.certificate, index, preprocessed, T)
4040
push!(λ_variables, λ_variable)
@@ -44,13 +44,13 @@ function MOI.Bridges.Constraint.bridge_constraint(
4444
# need to call `changecoefficienttype`. This is critical since `T` is
4545
# `Float64` when used with JuMP and the coefficient type is often `Int` if
4646
# `set.domain.V` is `FullSpace` or `FixedPolynomialsSet`.
47-
g = Certificate.get(set.certificate, Certificate.Generator(), index, preprocessed)
47+
g = Certificate.generator(set.certificate, index, preprocessed)
4848
# TODO replace with `MA.sub_mul` when it works.
4949
p = MA.operate!!(MA.add_mul, p, -one(T), λ, MP.changecoefficienttype(g, T))
5050
end
5151
new_set = SOS.SOSPolynomialSet(
5252
set.domain.V, MP.monomials(p),
53-
Certificate.get(set.certificate, Certificate.IdealCertificate()))
53+
Certificate.ideal_certificate(set.certificate))
5454
constraint = MOI.add_constraint(model, MOIU.vectorize(MP.coefficients(p)),
5555
new_set)
5656

@@ -79,10 +79,10 @@ function MOIB.Constraint.concrete_bridge_type(
7979
# for most use cases
8080
G = MOIU.promote_operation(-, T, F, MOI.VectorOfVariables)
8181
MCT = SOS.matrix_cone_type(CT)
82-
B = Certificate.get(CT, Certificate.MultiplierBasisType())
82+
B = Certificate.multiplier_basis_type(CT)
8383
UMCT = union_constraint_types(MCT)
8484
UMST = union_set_types(MCT)
85-
IC = Certificate.get(CT, Certificate.IdealCertificate())
85+
IC = Certificate.ideal_certificate(CT)
8686
return SOSPolynomialInSemialgebraicSetBridge{T, G, AT, IC, B, UMCT, UMST, MCT, MT, MVT}
8787
end
8888

src/Certificate/Certificate.jl

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,19 @@ const Index = Union{PreorderIndex, IdealIndex}
3131
abstract type Attribute end
3232

3333
# For get
34-
struct Cone <: Attribute end
35-
struct GramBasis <: Attribute end
34+
function cone end
35+
function gram_basis end
3636
# FIXME currently, this returns `MB.MonomialBasis` instead of `MB.MonomialBasis{MT, MVT}`
37-
struct GramBasisType <: Attribute end
38-
struct ReducedPolynomial <: Attribute end
39-
struct IdealCertificate <: Attribute end
40-
struct PreprocessedDomain <: Attribute end
37+
function gram_basis_type end
38+
function reduced_polynomial end
39+
function ideal_certificate end
40+
function preprocessed_domain end
4141

4242
# Only for PreorderIndex
43-
struct PreorderIndices <: Attribute end
44-
struct Generator <: Attribute end
45-
struct MultiplierBasis <: Attribute end
46-
struct MultiplierBasisType <: Attribute end
47-
48-
# For set
49-
#struct Monomials <: Attribute end
50-
43+
function preorder_indices end
44+
function generator end
45+
function multiplier_basis end
46+
function multiplier_basis_type end
5147

5248
# PreorderCertificate
5349
# IdealCertificate
@@ -80,40 +76,40 @@ struct Putinar{IC <: AbstractIdealCertificate, CT <: SumOfSquares.SOSLikeCone, B
8076
maxdegree::Int
8177
end
8278

83-
get(certificate::Putinar, ::Cone) = certificate.cone
79+
cone(certificate::Putinar) = certificate.cone
8480

8581
struct DomainWithVariables{S, V}
8682
domain::S
8783
variables::V
8884
end
89-
function get(::Putinar, ::PreprocessedDomain, domain::BasicSemialgebraicSet, p)
85+
function preprocessed_domain(::Putinar, domain::BasicSemialgebraicSet, p)
9086
return DomainWithVariables(domain, MP.variables(p))
9187
end
9288

93-
function get(::Putinar, ::PreorderIndices, domain::DomainWithVariables)
89+
function preorder_indices(::Putinar, domain::DomainWithVariables)
9490
return map(PreorderIndex, eachindex(domain.domain.p))
9591
end
9692

9793
function maxdegree_gram_basis(B::Type, variables, maxdegree::Int)
9894
return MB.maxdegree_basis(B, variables, div(maxdegree, 2))
9995
end
10096
multiplier_maxdegree(maxdegree, q) = maxdegree - MP.maxdegree(q)
101-
function get(certificate::Putinar, ::MultiplierBasis, index::PreorderIndex, domain::DomainWithVariables)
97+
function multiplier_basis(certificate::Putinar, index::PreorderIndex, domain::DomainWithVariables)
10298
q = domain.domain.p[index.value]
10399
vars = sort!([domain.variables..., MP.variables(q)...], rev = true)
104100
unique!(vars)
105101
return maxdegree_gram_basis(certificate.basis, vars, multiplier_maxdegree(certificate.maxdegree, q))
106102
end
107-
function get(::Type{Putinar{IC, CT, BT}}, ::MultiplierBasisType) where {IC, CT, BT}
103+
function multiplier_basis_type(::Type{Putinar{IC, CT, BT}}) where {IC, CT, BT}
108104
return BT
109105
end
110106

111-
function get(::Putinar, ::Generator, index::PreorderIndex, domain::DomainWithVariables)
107+
function generator(::Putinar, index::PreorderIndex, domain::DomainWithVariables)
112108
return domain.domain.p[index.value]
113109
end
114110

115-
get(certificate::Putinar, ::IdealCertificate) = certificate.ideal_certificate
116-
get(::Type{<:Putinar{IC}}, ::IdealCertificate) where {IC} = IC
111+
ideal_certificate(certificate::Putinar) = certificate.ideal_certificate
112+
ideal_certificate(::Type{<:Putinar{IC}}) where {IC} = IC
117113

118114
SumOfSquares.matrix_cone_type(::Type{<:Putinar{IC, CT}}) where {IC, CT} = SumOfSquares.matrix_cone_type(CT)
119115

@@ -122,9 +118,9 @@ SumOfSquares.matrix_cone_type(::Type{<:Putinar{IC, CT}}) where {IC, CT} = SumOfS
122118
######################
123119

124120
abstract type SimpleIdealCertificate{CT, BT} <: AbstractIdealCertificate end
125-
get(::SimpleIdealCertificate, ::ReducedPolynomial, poly, domain) = poly
121+
reduced_polynomial(::SimpleIdealCertificate, poly, domain) = poly
126122

127-
get(certificate::SimpleIdealCertificate, ::Cone) = certificate.cone
123+
cone(certificate::SimpleIdealCertificate) = certificate.cone
128124
SumOfSquares.matrix_cone_type(::Type{<:SimpleIdealCertificate{CT}}) where {CT} = SumOfSquares.matrix_cone_type(CT)
129125

130126
# TODO return something else when `PolyJuMP` support other bases.
@@ -150,10 +146,10 @@ struct MaxDegree{CT <: SumOfSquares.SOSLikeCone, BT <: MB.AbstractPolynomialBasi
150146
basis::Type{BT}
151147
maxdegree::Int
152148
end
153-
function get(certificate::MaxDegree, ::GramBasis, poly) where CT
149+
function gram_basis(certificate::MaxDegree, poly) where CT
154150
return maxdegree_gram_basis(certificate.basis, MP.variables(poly), certificate.maxdegree)
155151
end
156-
function get(::Type{MaxDegree{CT, BT}}, ::GramBasisType) where {CT, BT}
152+
function gram_basis_type(::Type{MaxDegree{CT, BT}}) where {CT, BT}
157153
return BT
158154
end
159155

@@ -173,10 +169,10 @@ struct FixedBasis{CT <: SumOfSquares.SOSLikeCone, BT <: MB.AbstractPolynomialBas
173169
cone::CT
174170
basis::BT
175171
end
176-
function get(certificate::FixedBasis, ::GramBasis, poly) where CT
172+
function gram_basis(certificate::FixedBasis, poly) where CT
177173
return certificate.basis
178174
end
179-
function get(::Type{FixedBasis{CT, BT}}, ::GramBasisType) where {CT, BT}
175+
function gram_basis_type(::Type{FixedBasis{CT, BT}}) where {CT, BT}
180176
return BT
181177
end
182178

@@ -201,10 +197,10 @@ struct Newton{CT <: SumOfSquares.SOSLikeCone, BT <: MB.AbstractPolynomialBasis,
201197
basis::Type{BT}
202198
variable_groups::NPT
203199
end
204-
function get(certificate::Newton{CT, B}, ::GramBasis, poly) where {CT, B}
200+
function gram_basis(certificate::Newton{CT, B}, poly) where {CT, B}
205201
return MB.basis_covering_monomials(B, monomials_half_newton_polytope(MP.monomials(poly), certificate.variable_groups))
206202
end
207-
function get(::Type{<:Newton{CT, BT}}, ::GramBasisType) where {CT, BT}
203+
function gram_basis_type(::Type{<:Newton{CT, BT}}) where {CT, BT}
208204
return BT
209205
end
210206

@@ -228,18 +224,18 @@ struct Remainder{GCT<:AbstractIdealCertificate} <: AbstractIdealCertificate
228224
gram_certificate::GCT
229225
end
230226

231-
function get(::Remainder, ::ReducedPolynomial, poly, domain)
227+
function reduced_polynomial(::Remainder, poly, domain)
232228
return convert(typeof(poly), rem(poly, ideal(domain)))
233229
end
234230

235-
function get(certificate::Remainder, attr::GramBasis, poly)
236-
return get(certificate.gram_certificate, attr, poly)
231+
function gram_basis(certificate::Remainder, poly)
232+
return gram_basis(certificate.gram_certificate, poly)
237233
end
238-
function get(::Type{Remainder{GCT}}, attr::GramBasisType) where GCT
239-
return get(GCT, attr)
234+
function gram_basis_type(::Type{Remainder{GCT}}) where GCT
235+
return gram_basis_type(GCT)
240236
end
241237

242-
get(certificate::Remainder, attr::Cone) = get(certificate.gram_certificate, attr)
238+
cone(certificate::Remainder) = cone(certificate.gram_certificate)
243239
SumOfSquares.matrix_cone_type(::Type{Remainder{GCT}}) where {GCT} = SumOfSquares.matrix_cone_type(GCT)
244240
zero_basis(certificate::Remainder) = zero_basis(certificate.gram_certificate)
245241
zero_basis_type(::Type{Remainder{GCT}}) where {GCT} = zero_basis_type(GCT)

src/Certificate/Sparsity/ideal.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ function sparsity(monos, sp::Union{SignSymmetry, Monomial}, gram_basis::MB.Monom
3333
return MB.MonomialBasis.(sparsity(monos, sp, gram_basis.monomials))
3434
end
3535
function sparsity(poly::MP.AbstractPolynomial, sp::Union{SignSymmetry, Monomial}, certificate::SumOfSquares.Certificate.AbstractIdealCertificate)
36-
return sparsity(MP.monomials(poly), sp, SumOfSquares.Certificate.get(certificate, SumOfSquares.Certificate.GramBasis(), poly))
36+
return sparsity(MP.monomials(poly), sp, SumOfSquares.Certificate.gram_basis(certificate, poly))
3737
end
38-
function SumOfSquares.Certificate.get(certificate::Ideal, ::SumOfSquares.Certificate.GramBasis, poly)
38+
function SumOfSquares.Certificate.gram_basis(certificate::Ideal, poly)
3939
return sparsity(poly, certificate.sparsity, certificate.certificate)
4040
end
41-
function SumOfSquares.Certificate.get(::Type{Ideal{S, C}}, attr::SumOfSquares.Certificate.GramBasisType) where {S, C}
42-
return Vector{<:SumOfSquares.Certificate.get(C, attr)}
41+
function SumOfSquares.Certificate.gram_basis_type(::Type{Ideal{S, C}}) where {S, C}
42+
return Vector{<:SumOfSquares.Certificate.gram_basis_type(C)}
4343
end
44-
function SumOfSquares.Certificate.get(certificate::Ideal, attr::SumOfSquares.Certificate.ReducedPolynomial, poly, domain)
45-
return SumOfSquares.Certificate.get(certificate.certificate, attr, poly, domain)
44+
function SumOfSquares.Certificate.reduced_polynomial(certificate::Ideal, poly, domain)
45+
return SumOfSquares.Certificate.reduced_polynomial(certificate.certificate, poly, domain)
4646
end
47-
function SumOfSquares.Certificate.get(certificate::Ideal, attr::SumOfSquares.Certificate.Cone)
48-
return SumOfSquares.Certificate.get(certificate.certificate, attr)
47+
function SumOfSquares.Certificate.cone(certificate::Ideal)
48+
return SumOfSquares.Certificate.cone(certificate.certificate)
4949
end
5050
SumOfSquares.matrix_cone_type(::Type{Ideal{S, C}}) where {S, C} = SumOfSquares.matrix_cone_type(C)
5151

src/Certificate/Sparsity/monomial.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,13 @@ function sparsity(poly::MP.AbstractPolynomial, domain::SemialgebraicSets.BasicSe
156156
gram_monos = _gram_monos(
157157
reduce((v, q) -> unique!(sort!([v..., MP.variables(q)...], rev=true)),
158158
domain.p, init = MP.variables(poly)),
159-
SumOfSquares.Certificate.get(certificate, SumOfSquares.Certificate.IdealCertificate())
159+
SumOfSquares.Certificate.ideal_certificate(certificate)
160160
)
161-
processed = SumOfSquares.Certificate.get(certificate, SumOfSquares.Certificate.PreprocessedDomain(), domain, poly)
161+
processed = SumOfSquares.Certificate.preprocessed_domain(certificate, domain, poly)
162162
multiplier_generator_monos = [
163-
(_monos(SumOfSquares.Certificate.get(certificate, SumOfSquares.Certificate.MultiplierBasis(), index, processed)),
164-
MP.monomials(SumOfSquares.Certificate.get(certificate, SumOfSquares.Certificate.Generator(), index, processed)))
165-
for index in SumOfSquares.Certificate.get(certificate, SumOfSquares.Certificate.PreorderIndices(), processed)
163+
(_monos(SumOfSquares.Certificate.multiplier_basis(certificate, index, processed)),
164+
MP.monomials(SumOfSquares.Certificate.generator(certificate, index, processed)))
165+
for index in SumOfSquares.Certificate.preorder_indices(certificate, processed)
166166
]
167167
cliques, multiplier_cliques = sparsity(MP.monomials(poly), sp, gram_monos, multiplier_generator_monos)
168168
return MB.MonomialBasis.(cliques), [MB.MonomialBasis.(clique) for clique in multiplier_cliques]

0 commit comments

Comments
 (0)