Skip to content

Commit 1f7a718

Browse files
authored
Add zero_basis (#377)
* Add zero_basis * Fix format
1 parent e4715c6 commit 1f7a718

File tree

17 files changed

+226
-106
lines changed

17 files changed

+226
-106
lines changed

docs/src/tutorials/Extension/certificate.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ model = SOSModel(solver)
9999
@variable(model, α)
100100
@objective(model, Max, α)
101101
basis = MB.FullBasis{MB.Monomial,typeof(x * y)}()
102-
ideal_certificate = SOSC.Newton(SOSCone(), basis, tuple())
102+
ideal_certificate = SOSC.Newton(SOSCone(), basis, basis, tuple())
103103
certificate = Schmüdgen(ideal_certificate, SOSCone(), basis, maxdegree(p))
104104
@constraint(model, c, p >= α, domain = S, certificate = certificate)
105105
optimize!(model)

src/Bridges/Constraint/sos_polynomial.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function MOI.Bridges.Constraint.bridge_constraint(
7575
gram_bases = [gram_basis]
7676
weights = [MB.constant_algebra_element(typeof(SA.basis(poly)), T)]
7777
flat_gram_bases, flat_weights, flat_indices = _flatten(gram_bases, weights)
78-
new_basis = SOS.Certificate.reduced_basis(
78+
new_basis = SOS.Certificate.zero_basis(
7979
set.certificate,
8080
MB.explicit_basis(poly),
8181
domain,
@@ -117,14 +117,14 @@ function MOI.Bridges.Constraint.concrete_bridge_type(
117117
M = SOS.matrix_cone_type(CT)
118118
W = SOS.Certificate._weight_type(T, BT)
119119
B = MA.promote_operation(
120-
SOS.Certificate.reduced_basis,
120+
SOS.Certificate.zero_basis,
121121
CT,
122122
BT,
123123
SemialgebraicSets.similar_type(DT, T),
124124
Vector{BT},
125125
Vector{W},
126126
)
127-
G = SOS.Certificate.gram_basis_type(CT)
127+
G = MA.promote_operation(SOS.Certificate.gram_basis, CT)
128128
return SOSPolynomialBridge{T,F,DT,M,BT,B,_eltype(G),CT,W}
129129
end
130130

src/Certificate/Certificate.jl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@ const Index = Union{PreorderIndex,IdealIndex}
2828

2929
abstract type Attribute end
3030

31-
# For get
3231
function cone end
32+
function zero_basis end
3333
function gram_basis end
34-
# FIXME currently, this returns `MB.MonomialBasis` instead of `MB.MonomialBasis{MT, MVT}`
35-
function gram_basis_type end
3634
function reduced_polynomial end
3735
function ideal_certificate end
3836
function preprocessed_domain end

src/Certificate/Sparsity/ideal.jl

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,52 @@ struct Ideal{S<:Pattern,C<:SumOfSquares.Certificate.AbstractIdealCertificate} <:
1414
certificate::C
1515
end
1616

17-
function Ideal(sp::Variable, basis, cone, maxdegree::Nothing, newton_polytope)
17+
function Ideal(
18+
sp::Variable,
19+
gram_basis,
20+
zero_basis,
21+
cone,
22+
maxdegree::Nothing,
23+
newton_polytope,
24+
)
1825
return error(
1926
"`maxdegree` cannot be `nothing` when `sparsity` is `Sparsity.Variable`.",
2027
)
2128
end
22-
function Ideal(sp::Variable, basis, cone, maxdegree::Integer, newton_polytope)
23-
return Ideal(sp, SumOfSquares.Certificate.MaxDegree(cone, basis, maxdegree))
29+
function Ideal(
30+
sp::Variable,
31+
gram_basis,
32+
zero_basis,
33+
cone,
34+
maxdegree::Integer,
35+
newton_polytope,
36+
)
37+
return Ideal(
38+
sp,
39+
SumOfSquares.Certificate.MaxDegree(
40+
cone,
41+
gram_basis,
42+
zero_basis,
43+
maxdegree,
44+
),
45+
)
2446
end
2547
function Ideal(
2648
sp::Union{Monomial,SignSymmetry},
27-
basis,
49+
gram_basis,
50+
zero_basis,
2851
cone,
2952
maxdegree,
3053
newton_polytope,
3154
)
3255
return Ideal(
3356
sp,
34-
SumOfSquares.Certificate.Newton(cone, basis, newton_polytope),
57+
SumOfSquares.Certificate.Newton(
58+
cone,
59+
gram_basis,
60+
zero_basis,
61+
newton_polytope,
62+
),
3563
)
3664
end
3765

@@ -44,7 +72,7 @@ function sparsity(
4472
H, cliques = chordal_csp_graph(basis, SemialgebraicSets.FullSpace())
4573
return map(cliques) do clique
4674
return SumOfSquares.Certificate.maxdegree_gram_basis(
47-
certificate.basis,
75+
certificate.gram_basis,
4876
clique,
4977
certificate.maxdegree,
5078
)
@@ -71,10 +99,11 @@ end
7199
function SumOfSquares.Certificate.gram_basis(certificate::Ideal, poly)
72100
return sparsity(poly, certificate.sparsity, certificate.certificate)
73101
end
74-
function SumOfSquares.Certificate.gram_basis_type(
102+
function MA.promote_operation(
103+
::typeof(SumOfSquares.Certificate.gram_basis),
75104
::Type{Ideal{S,C}},
76105
) where {S,C}
77-
return Vector{SumOfSquares.Certificate.gram_basis_type(C)}
106+
return Vector{MA.promote_operation(SumOfSquares.Certificate.gram_basis, C)}
78107
end
79108
function SumOfSquares.Certificate.reduced_polynomial(
80109
certificate::Ideal,
@@ -87,14 +116,14 @@ function SumOfSquares.Certificate.reduced_polynomial(
87116
domain,
88117
)
89118
end
90-
function SumOfSquares.Certificate.reduced_basis(
119+
function SumOfSquares.Certificate.zero_basis(
91120
certificate::Ideal,
92121
basis,
93122
domain,
94123
gram_bases,
95124
weights,
96125
)
97-
return SumOfSquares.Certificate.reduced_basis(
126+
return SumOfSquares.Certificate.zero_basis(
98127
certificate.certificate,
99128
basis,
100129
domain,
@@ -103,15 +132,15 @@ function SumOfSquares.Certificate.reduced_basis(
103132
)
104133
end
105134
function MA.promote_operation(
106-
::typeof(SumOfSquares.Certificate.reduced_basis),
135+
::typeof(SumOfSquares.Certificate.zero_basis),
107136
::Type{Ideal{S,C}},
108137
::Type{B},
109138
::Type{D},
110139
::Type{G},
111140
::Type{W},
112141
) where {S,C,B,D,G,W}
113142
return MA.promote_operation(
114-
SumOfSquares.Certificate.reduced_basis,
143+
SumOfSquares.Certificate.zero_basis,
115144
C,
116145
B,
117146
D,
@@ -129,8 +158,10 @@ end
129158
function SumOfSquares.Certificate.zero_basis(certificate::Ideal)
130159
return SumOfSquares.Certificate.zero_basis(certificate.certificate)
131160
end
132-
function SumOfSquares.Certificate.zero_basis_type(
161+
162+
function MA.promote_operation(
163+
b::typeof(SumOfSquares.Certificate.zero_basis),
133164
::Type{Ideal{S,C}},
134165
) where {S,C}
135-
return SumOfSquares.Certificate.zero_basis_type(C)
166+
return MA.promote_operation(b, C)
136167
end

src/Certificate/Sparsity/variable.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function sparsity(
5757
function bases(q)
5858
return [
5959
SumOfSquares.Certificate.maxdegree_gram_basis(
60-
certificate.multipliers_certificate.basis,
60+
certificate.multipliers_certificate.gram_basis,
6161
clique,
6262
SumOfSquares.Certificate.multiplier_maxdegree(
6363
certificate.maxdegree,

src/Certificate/Symmetry/wedderburn.jl

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,18 @@ end
7575
function SumOfSquares.matrix_cone_type(::Type{<:Ideal{C}}) where {C}
7676
return SumOfSquares.matrix_cone_type(C)
7777
end
78-
function SumOfSquares.Certificate.gram_basis_type(::Type{<:Ideal})
78+
function MA.promote_operation(
79+
::typeof(SumOfSquares.Certificate.gram_basis),
80+
::Type{<:Ideal},
81+
)
7982
return Vector{Vector{MB.FixedPolynomialBasis}}
8083
end
81-
SumOfSquares.Certificate.zero_basis_type(::Type{<:Ideal}) = MB.Monomial
84+
function MA.promote_operation(
85+
::typeof(SumOfSquares.Certificate.zero_basis),
86+
::Type{<:Ideal},
87+
)
88+
return MB.Monomial
89+
end
8290
SumOfSquares.Certificate.zero_basis(::Ideal) = MB.Monomial
8391
function SumOfSquares.Certificate.reduced_polynomial(
8492
certificate::Ideal,
@@ -91,14 +99,14 @@ function SumOfSquares.Certificate.reduced_polynomial(
9199
domain,
92100
)
93101
end
94-
function SumOfSquares.Certificate.reduced_basis(
102+
function SumOfSquares.Certificate.zero_basis(
95103
certificate::Ideal,
96104
basis,
97105
domain,
98106
gram_bases,
99107
weights,
100108
)
101-
return SumOfSquares.Certificate.reduced_basis(
109+
return SumOfSquares.Certificate.zero_basis(
102110
certificate.certificate,
103111
basis,
104112
domain,
@@ -107,15 +115,15 @@ function SumOfSquares.Certificate.reduced_basis(
107115
)
108116
end
109117
function MA.promote_operation(
110-
::typeof(SumOfSquares.Certificate.reduced_basis),
118+
::typeof(SumOfSquares.Certificate.zero_basis),
111119
::Type{Ideal{S,C}},
112120
::Type{B},
113121
::Type{D},
114122
::Type{G},
115123
::Type{W},
116124
) where {S,C,B,D,G,W}
117125
return MA.promote_operation(
118-
SumOfSquares.Certificate.reduced_basis,
126+
SumOfSquares.Certificate.zero_basis,
119127
C,
120128
B,
121129
D,

0 commit comments

Comments
 (0)