Skip to content

Commit b9a03eb

Browse files
authored
Use WeightedSOSCone by default (#355)
* Use Variable.KernelBridge by default * Fixes * Fixes * Update to StarAlgebras * Fixes * Use basis, not monomials in SOSPolynomialSet * Fixes * Fix format * Fixes * Fix format * Fixes * Fix format * up * up * Fixes * Fixes * Fix * GLPK tests working * Fix format * Fixes * Fix format * Fixes * Fixes * Fixes * Fix format * Fix * Fixes * WIP * WIP * WIP * up * Fixes * Missing canonical * Fixes * up * up * Fixes * Fixes * up * Fixes * Fixes * Fixes * Fixes * Remove debug * Remove debug * Fixes * up * Fxies * Fixes * Fixes * SCS tests passing * Simplifty * Fixes * Fix format * Fixes * up ci * Fix format * Fixes * Fix * Fixes * Update .github/workflows/ci.yml * Fix @kwdef for Julia v1.6 * fix format * Fixes * Fixes * Update ci * Fix format * Fixes * Fix format * Fix * Disable symmetry * Update script of examples * Fixes * Fixes * Fixes * Fix * Fixes * Fix * Fixes * Fixes * Update ci script * Fixes * Fix * Fix doc
1 parent 463e85f commit b9a03eb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+2676
-1731
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
# arch: x64
2828
steps:
2929
- uses: actions/checkout@v4
30-
- uses: julia-actions/setup-julia@v1
30+
- uses: julia-actions/setup-julia@v2
3131
with:
3232
version: ${{ matrix.version }}
3333
arch: ${{ matrix.arch }}
@@ -37,8 +37,12 @@ jobs:
3737
run: |
3838
using Pkg
3939
Pkg.add([
40+
PackageSpec(name="StarAlgebras", rev="main"),
41+
PackageSpec(name="SymbolicWedderburn", rev="mk/StarAlgebras_0_3"),
4042
PackageSpec(name="MultivariateBases", rev="master"),
41-
PackageSpec(name="MathOptInterface", rev="master"),
43+
PackageSpec(name="SemialgebraicSets", rev="master"),
44+
PackageSpec(name="MultivariateMoments", rev="master"),
45+
PackageSpec(name="PolyJuMP", rev="master"),
4246
])
4347
- uses: julia-actions/julia-buildpkg@v1
4448
- uses: julia-actions/julia-runtest@v1

.github/workflows/documentation.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ jobs:
2222
run: |
2323
using Pkg
2424
Pkg.add([
25+
PackageSpec(url="https://github.com/blegat/HomotopyContinuation.jl", rev="dynamicpolynomials_v0.6"),
26+
PackageSpec(name="StarAlgebras", rev="main"),
27+
PackageSpec(name="SymbolicWedderburn", rev="mk/StarAlgebras_0_3"),
28+
PackageSpec(name="MultivariateBases", rev="master"),
29+
PackageSpec(name="SemialgebraicSets", rev="master"),
30+
PackageSpec(name="MultivariateMoments", rev="master"),
31+
PackageSpec(name="PolyJuMP", rev="master"),
2532
PackageSpec(path=pwd()),
2633
])
2734
Pkg.instantiate()

.github/workflows/examples.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ jobs:
1717
run: |
1818
using Pkg
1919
Pkg.add([
20+
PackageSpec(url="https://github.com/blegat/HomotopyContinuation.jl", rev="dynamicpolynomials_v0.6"),
21+
PackageSpec(name="StarAlgebras", rev="main"),
22+
PackageSpec(name="SymbolicWedderburn", rev="mk/StarAlgebras_0_3"),
23+
PackageSpec(name="MultivariateBases", rev="master"),
24+
PackageSpec(name="SemialgebraicSets", rev="master"),
25+
PackageSpec(name="MultivariateMoments", rev="master"),
26+
PackageSpec(name="PolyJuMP", rev="master"),
2027
PackageSpec(path=pwd()),
2128
])
2229
Pkg.instantiate()

Project.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ PolyJuMP = "ddf597a6-d67e-5340-b84c-e37d84115374"
1616
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
1717
SemialgebraicSets = "8e049039-38e8-557d-ae3a-bc521ccf6204"
1818
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
19+
StarAlgebras = "0c0c59c1-dc5f-42e9-9a8b-b5dc384a6cd1"
1920
SymbolicWedderburn = "858aa9a9-4c7c-4c62-b466-2421203962a2"
2021

2122
[compat]
@@ -29,5 +30,5 @@ MutableArithmetics = "1"
2930
PolyJuMP = "0.7"
3031
Reexport = "0.2, 1.0"
3132
SemialgebraicSets = "0.3"
32-
SymbolicWedderburn = "0.3"
33+
SymbolicWedderburn = "0.4"
3334
julia = "1.6"

bench/sos_polynomial.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function sos_polynomial(n)
55
@polyvar x
66
monos = monomials(x, 0:2n)
77
set = SumOfSquares.SOSPolynomialSet(
8-
SumOfSquares.FullSpace(), monos,
8+
SumOfSquares.FullSpace(), MB.SubBasis{MB.Monomial}(monos),
99
SumOfSquares.Certificate.Remainder(
1010
SumOfSquares.SOSCone(),
1111
SumOfSquares.MonomialBasis,

docs/Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ PolyJuMP = "ddf597a6-d67e-5340-b84c-e37d84115374"
2929
RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
3030
SCS = "c946c3f1-0d1f-5ce8-9dea-7daa1f7e2d13"
3131
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
32+
StarAlgebras = "0c0c59c1-dc5f-42e9-9a8b-b5dc384a6cd1"
3233
SumOfSquares = "4b9e565b-77fc-50a5-a571-1244f986bda1"
3334
SymbolicWedderburn = "858aa9a9-4c7c-4c62-b466-2421203962a2"
3435
TypedPolynomials = "afbbf031-7a57-5f58-a1b9-b774a0fad08d"
3536

3637
[compat]
3738
Documenter = "1"
39+
DynamicPolynomials = "0.6"

docs/make.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const _TUTORIAL_SUBDIR = [
1313
"Other Applications",
1414
"Noncommutative and Hermitian",
1515
"Sparsity",
16-
"Symmetry",
16+
#"Symmetry",
1717
"Extension",
1818
]
1919

docs/src/constraints.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@ CachingOptimizer state: NO_OPTIMIZER
4141
Solver name: No optimizer attached.
4242
4343
julia> @variable(model, p, Poly(X))
44-
(_[1]) + (_[2])x₃ + (_[3])x₂ + (_[4])x₁ + (_[5])x₃² + (_[6])x₂x₃ + (_[7])x₂² + (_[8])x₁x₃ + (_[9])x₁x₂ + (_[10])x₁²
44+
(_[1])·1 + (_[2])·x₃ + (_[3])·x₂ + (_[4])·x₁ + (_[5])·x₃² + (_[6])·x₂x₃ + (_[7])·x₂² + (_[8])·x₁x₃ + (_[9])·x₁x₂ + (_[10])·x₁²
4545
4646
julia> @variable(model, q, Poly(X))
47-
(_[11]) + (_[12])x₃ + (_[13])x₂ + (_[14])x₁ + (_[15])x₃² + (_[16])x₂x₃ + (_[17])x₂² + (_[18])x₁x₃ + (_[19])x₁x₂ + (_[20])x₁²
47+
(_[11])·1 + (_[12])·x₃ + (_[13])·x₂ + (_[14])·x₁ + (_[15])·x₃² + (_[16])·x₂x₃ + (_[17])·x₂² + (_[18])·x₁x₃ + (_[19])·x₁x₂ + (_[20])·x₁²
4848
4949
julia> @constraint(model, p + q == 1)
50-
(_[1] + _[11] - 1) + (_[2] + _[12])x₃ + (_[3] + _[13])x₂ + (_[4] + _[14])x₁ + (_[5] + _[15])x₃² + (_[6] + _[16])x₂x₃ + (_[7] + _[17])x₂² + (_[8] + _[18])x₁x₃ + (_[9] + _[19])x₁x₂ + (_[10] + _[20])x₁² ∈ PolyJuMP.ZeroPoly()
50+
(_[1] + _[11] - 1)·1 + (_[2] + _[12])·x₃ + (_[3] + _[13])·x₂ + (_[4] + _[14])·x₁ + (_[5] + _[15])·x₃² + (_[6] + _[16])·x₂x₃ + (_[7] + _[17])·x₂² + (_[8] + _[18])·x₁x₃ + (_[9] + _[19])·x₁x₂ + (_[10] + _[20])·x₁² ∈ PolyJuMP.ZeroPoly()
5151
```
5252

5353
Vectorized constraints can also be used as well as vector of constraints,
@@ -66,7 +66,7 @@ Polynomials can be constrained to be sum-of-squares with the `in` syntax.
6666
For instance, to constrain a polynomial `p` to be sum-of-squares, do
6767
```jldoctest constraint-pq
6868
julia> @constraint(model, p in SOSCone())
69-
(_[1]) + (_[2])x₃ + (_[3])x₂ + (_[4])x₁ + (_[5])x₃² + (_[6])x₂x₃ + (_[7])x₂² + (_[8])x₁x₃ + (_[9])x₁x₂ + (_[10])x₁² is SOS
69+
(_[1])·1 + (_[2])·x₃ + (_[3])·x₂ + (_[4])·x₁ + (_[5])·x₃² + (_[6])·x₂x₃ + (_[7])·x₂² + (_[8])·x₁x₃ + (_[9])·x₁x₂ + (_[10])·x₁² is SOS
7070
```
7171

7272
### Automatically interpreting polynomial nonnegativity as a sum-of-squares constraint
@@ -147,13 +147,13 @@ julia> @variable(model, β)
147147
β
148148
149149
julia> @constraint(model, α * x^2 + β * y^2 ≥ (α - β) * x * y)
150-
(β)y² + (-α + β)xy + (α)x² is SOS
150+
(β)·y² + (-α + β)·xy + (α)·x² is SOS
151151
```
152152
where `α` and `β` are JuMP decision variables and `x` and `y` are polynomial
153153
variables. Since the polynomial is a quadratic form, the sum-of-squares
154154
certificate is also a quadratic form (see [Blekherman2012; Section~3.3.4](@cite)). Hence the
155155
default polynomial basis used for the [Nonnegative polynomial variables]
156-
certificate is `MonomialBasis([x, y])`, that is, we search for a positive
156+
certificate is `MultivariateBases.SubBasis{MultivariateBases.Monomial}([x, y])`, that is, we search for a positive
157157
semidefinite matrix `Q` such that
158158
```math
159159
\alpha x^2 + \beta y^2 - (\alpha - \beta) x y = X^\top Q X
@@ -164,16 +164,16 @@ As the polynomial space is determined by the polynomial being constrained,
164164
only the basis *type* needs to be given. For instance, to use the scaled monomial
165165
basis in the example above, use
166166
```jldoctest constraint-xy
167-
julia> @constraint(model, α * x^2 + β * y^2 ≥ (α - β) * x * y, basis = ScaledMonomialBasis)
168-
(β) + (-α + β)xy + (α) is SOS
167+
julia> @constraint(model, α * x^2 + β * y^2 ≥ (α - β) * x * y, basis = ScaledMonomial)
168+
(β)·ScaledMonomial(y²) + (-0.7071067811865475 α + 0.7071067811865475 β)·ScaledMonomial(xy) + (α)·ScaledMonomial(x²) is SOS
169169
```
170170

171171
## Polynomial nonnegativity on a subset of the space
172172

173173
By default, the constraint
174174
```jldoctest constraint-xy
175175
julia> @constraint(model, x^3 - x^2 + 2x*y -y^2 + y^3 >= α)
176-
(-α) + (-1)y² + (2)xy + (-1)x² + (1)y³ + (1)x³ is SOS
176+
(-α)·1 + (-1)·y² + (2)·xy + (-1)·x² + (1)·y³ + (1)·x³ is SOS
177177
```
178178
constrains the polynomial to be nonnegative for every real numbers `x` and `y`.
179179
However, the set of points `(x, y)` for which the polynomial is constrained
@@ -182,7 +182,7 @@ to be nonnegative can be specified by the `domain` keyword:
182182
julia> S = @set x >= 0 && y >= 0 && x + y >= 1;
183183
184184
julia> @constraint(model, x^3 - x^2 + 2x*y -y^2 + y^3 >= α, domain = S)
185-
(-α) + (-1)y² + (2)xy + (-1)x² + (1)y³ + (1)x³ is SOS
185+
(-α)·1 + (-1)·y² + (2)·xy + (-1)·x² + (1)·y³ + (1)·x³ is SOS
186186
```
187187
See [this notebook](https://github.com/jump-dev/SumOfSquares.jl/blob/master/examples/Polynomial_Optimization.ipynb)
188188
for a detailed example.

docs/src/reference/constraints.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ SOSDecomposition
2020
SOSDecompositionWithDomain
2121
SumOfSquares.SOSDecompositionAttribute
2222
sos_decomposition
23+
SumOfSquares.MultiplierIndexBoundsError
2324
```
2425

2526
SAGE decomposition attribute:

docs/src/tutorials/Extension/certificate.jl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,14 @@ solution_summary(model)
5050

5151
# We now define the Schmüdgen's certificate:
5252

53+
import StarAlgebras as SA
5354
import MultivariateBases as MB
5455
const SOS = SumOfSquares
5556
const SOSC = SOS.Certificate
56-
struct Schmüdgen{IC <: SOSC.AbstractIdealCertificate, CT <: SOS.SOSLikeCone, BT <: SOS.AbstractPolynomialBasis} <: SOSC.AbstractPreorderCertificate
57+
struct Schmüdgen{IC<:SOSC.AbstractIdealCertificate,CT<:SOS.SOSLikeCone,B<:SA.AbstractBasis} <: SOSC.AbstractPreorderCertificate
5758
ideal_certificate::IC
5859
cone::CT
59-
basis::Type{BT}
60+
basis::B
6061
maxdegree::Int
6162
end
6263

@@ -78,8 +79,8 @@ function SOSC.multiplier_basis(certificate::Schmüdgen, index::SOSC.PreorderInde
7879
q = SOSC.generator(certificate, index, domain)
7980
return SOSC.maxdegree_gram_basis(certificate.basis, variables(domain), SOSC.multiplier_maxdegree(certificate.maxdegree, q))
8081
end
81-
function SOSC.multiplier_basis_type(::Type{Schmüdgen{IC, CT, BT}}) where {IC, CT, BT}
82-
return BT
82+
function SOSC.multiplier_basis_type(::Type{Schmüdgen{IC, CT, BT}}, ::Type{M}) where {IC,CT,BT,M}
83+
return MB.explicit_basis_type(BT)
8384
end
8485

8586
function SOSC.generator(::Schmüdgen, index::SOSC.PreorderIndex, domain::SOSC.WithVariables)
@@ -97,8 +98,9 @@ SOS.matrix_cone_type(::Type{<:Schmüdgen{IC, CT}}) where {IC, CT} = SOS.matrix_c
9798
model = SOSModel(solver)
9899
@variable(model, α)
99100
@objective(model, Max, α)
100-
ideal_certificate = SOSC.Newton(SOSCone(), MB.MonomialBasis, tuple())
101-
certificate = Schmüdgen(ideal_certificate, SOSCone(), MB.MonomialBasis, maxdegree(p))
101+
basis = MB.FullBasis{MB.Monomial,typeof(x * y)}()
102+
ideal_certificate = SOSC.Newton(SOSCone(), basis, tuple())
103+
certificate = Schmüdgen(ideal_certificate, SOSCone(), basis, maxdegree(p))
102104
@constraint(model, c, p >= α, domain = S, certificate = certificate)
103105
optimize!(model)
104106
@test termination_status(model) == MOI.OPTIMAL #src

0 commit comments

Comments
 (0)