Skip to content

Commit aeeb58e

Browse files
authored
Merge pull request #40 from JuliaOpt/bl/basis
Update for polynomial basis
2 parents bc61aa2 + d97e175 commit aeeb58e

8 files changed

+25
-35
lines changed

src/SumOfSquares.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ include("variable.jl")
2121
include("constraint.jl")
2222

2323
function setdefaults!(data::PolyJuMP.Data)
24-
PolyJuMP.setdefault!(data, PolyJuMP.Poly{true}, SOSPoly)
2524
PolyJuMP.setdefault!(data, PolyJuMP.NonNegPoly, SOSCone)
2625
PolyJuMP.setdefault!(data, PolyJuMP.NonNegPolyMatrix, SOSMatrixCone)
2726
end

src/constraint.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ certificate_monomials(c::SOSConstraint) = c.slack.x
3535
PolyJuMP.getslack(c::SOSConstraint) = getvalue(c.slack)
3636
JuMP.getdual(c::SOSConstraint) = getdual(c.zero_constraint)
3737

38-
function PolyJuMP.addpolyconstraint!(m::JuMP.Model, P::Matrix{PT}, ::SOSMatrixCone, domain::AbstractBasicSemialgebraicSet) where PT <: APL
38+
function PolyJuMP.addpolyconstraint!(m::JuMP.Model, P::Matrix{PT}, ::SOSMatrixCone, domain::AbstractBasicSemialgebraicSet, basis) where PT <: APL
3939
n = Base.LinAlg.checksquare(P)
4040
if !issymmetric(P)
4141
throw(ArgumentError("The polynomial matrix constrained to be SOS must be symmetric"))
4242
end
4343
y = [similarvariable(PT, gensym()) for i in 1:n]
4444
p = dot(y, P * y)
45-
PolyJuMP.addpolyconstraint!(m, p, SOSCone(), domain)
45+
PolyJuMP.addpolyconstraint!(m, p, SOSCone(), domain, basis)
4646
end
4747

4848
function _createslack(m, x, set::SOSLikeCones)
@@ -57,16 +57,16 @@ function _createslack(m, x, set::CoSOSLikeCones)
5757
_matplus(_createslack(m, x, _nococone(set)), _matposynomial(m, x))
5858
end
5959

60-
function PolyJuMP.addpolyconstraint!(m::JuMP.Model, p, set::SOSSubCones, domain::AbstractAlgebraicSet)
60+
function PolyJuMP.addpolyconstraint!(m::JuMP.Model, p, set::SOSSubCones, domain::AbstractAlgebraicSet, basis)
6161
r = rem(p, ideal(domain))
6262
X = getmonomialsforcertificate(monomials(r))
6363
slack = _createslack(m, X, set)
6464
q = r - slack
65-
zero_constraint = PolyJuMP.addpolyconstraint!(m, q, ZeroPoly(), domain)
65+
zero_constraint = PolyJuMP.addpolyconstraint!(m, q, ZeroPoly(), domain, basis)
6666
SOSConstraint(slack, zero_constraint)
6767
end
6868

69-
function PolyJuMP.addpolyconstraint!(m::JuMP.Model, p, set::SOSSubCones, domain::BasicSemialgebraicSet;
69+
function PolyJuMP.addpolyconstraint!(m::JuMP.Model, p, set::SOSSubCones, domain::BasicSemialgebraicSet, basis;
7070
mindegree=MultivariatePolynomials.mindegree(p),
7171
maxdegree=MultivariatePolynomials.maxdegree(p))
7272
for q in domain.p
@@ -85,5 +85,5 @@ function PolyJuMP.addpolyconstraint!(m::JuMP.Model, p, set::SOSSubCones, domain:
8585
s2 = createpoly(m, _varconetype(set)(monomials(variables(p), mindegree_s:maxdegree_s)), :Cont)
8686
p -= s2 * q
8787
end
88-
PolyJuMP.addpolyconstraint!(m, p, set, domain.V)
88+
PolyJuMP.addpolyconstraint!(m, p, set, domain.V, basis)
8989
end

src/variable.jl

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,22 @@ end
66

77
for poly in (:DSOSPoly, :SDSOSPoly, :SOSPoly)
88
@eval begin
9-
struct $poly{MS, MT<:MultivariatePolynomials.AbstractMonomial, MV<:AbstractVector{MT}} <: PolyJuMP.AbstractPoly
10-
x::MV
9+
struct $poly{PB<:PolyJuMP.AbstractPolynomialBasis} <: PolyJuMP.AbstractPoly
10+
polynomial_basis::PB
1111
end
12-
$poly{MS}(x::AbstractVector{MT}) where {MS, MT} = $poly{MS, MT, typeof(x)}(x)
13-
$poly{MS}(x) where MS = $poly{MS}(monovec(x))
14-
$poly(x) = $poly{:Default}(x)
12+
$poly(x::AbstractVector{<:MultivariatePolynomials.AbstractPolynomialLike}) = $poly(MonomialBasis(x))
1513
end
1614
end
1715

18-
const PosPoly{MT, MV} = Union{DSOSPoly{MT, MV}, SDSOSPoly{MT, MV}, SOSPoly{MT, MV}}
16+
const PosPoly{PB} = Union{DSOSPoly{PB}, SDSOSPoly{PB}, SOSPoly{PB}}
1917

20-
JuMP.variabletype(m::JuMP.Model, p::PosPoly) = PolyJuMP.polytype(m, p, p.x)
21-
PolyJuMP.polytype(m::JuMP.Model, ::PosPoly, x::MVT) where {MT<:AbstractMonomial, MVT<:AbstractVector{MT}} = MatPolynomial{JuMP.Variable, MT, MVT}
18+
JuMP.variabletype(m::JuMP.Model, p::PosPoly) = PolyJuMP.polytype(m, p, p.polynomial_basis)
19+
PolyJuMP.polytype(m::JuMP.Model, ::PosPoly, basis::PolyJuMP.MonomialBasis{MT, MV}) where {MT<:AbstractMonomial, MV<:AbstractVector{MT}} = MatPolynomial{JuMP.Variable, MT, MV}
2220

23-
function _constraintmatpoly!(m, p, ::Union{SOSPoly, Poly{true}})
21+
function _constraintmatpoly!(m, p::MatPolynomial, ::SOSPoly)
2422
push!(m.varCones, (:SDP, [p.Q[i, j].col for i in 1:size(p.Q, 1) for j in i:size(p.Q, 2)]))
2523
end
26-
function _constraintmatpoly!(m, p, ::DSOSPoly)
24+
function _constraintmatpoly!(m, p::MatPolynomial, ::DSOSPoly)
2725
n = length(p.x)
2826
Q = Matrix{JuMP.Variable}(n, n)
2927
for i in 1:n
@@ -58,21 +56,15 @@ function _matpolynomial(m, x::AbstractVector{<:AbstractMonomial}, category::Symb
5856
MatPolynomial{JuMP.Variable}((i, j) -> Variable(m, lb, Inf, category), x)
5957
end
6058
end
61-
function _createpoly(m::JuMP.Model, set::PosPoly, x::AbstractVector{<:AbstractMonomial}, category::Symbol)
62-
p = _matpolynomial(m, x, category)
63-
if length(x) > 1
59+
function _createpoly(m::JuMP.Model, set::PosPoly, basis::PolyJuMP.MonomialBasis, category::Symbol)
60+
p = _matpolynomial(m, basis.monomials, category)
61+
if length(basis.monomials) > 1
6462
_constraintmatpoly!(m, p, set)
6563
end
6664
p
6765
end
68-
function PolyJuMP.createpoly(m::JuMP.Model, p::Union{PosPoly{:Default}, PosPoly{:Gram}}, category::Symbol)
69-
_createpoly(m, p, monovec(p.x), category)
70-
end
71-
function PolyJuMP.createpoly(m::JuMP.Model, pp::PosPoly{:Classic}, category::Symbol)
72-
p = _createpoly(m, pp, getmonomialsforcertificate(pp.x), category)
73-
# The coefficients of a monomial not in Z do not all have to be zero, only their sum
74-
addpolyconstraint!(m, removemonomials(Polynomial(p), p.x), ZeroPoly(), FullSpace())
75-
p
66+
function PolyJuMP.createpoly(m::JuMP.Model, p::PosPoly, category::Symbol)
67+
_createpoly(m, p, p.polynomial_basis, category)
7668
end
7769

7870
# Defer other methods to defaults in PolyJuMP

test/constraint.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
@polyvar x
33
m = SOSModel()
44
# Throws an Argument Error because it should be symmetric to be an SOS matrix
5-
@test_throws ArgumentError PolyJuMP.addpolyconstraint!(m, [1 x; -x 0], SOSMatrixCone(), BasicSemialgebraicSet{Int, polynomialtype(x, Int)}())
5+
@test_throws ArgumentError PolyJuMP.addpolyconstraint!(m, [1 x; -x 0], SOSMatrixCone(), BasicSemialgebraicSet{Int, polynomialtype(x, Int)}(), PolyJuMP.MonomialBasis)
66
end

test/sosdemo5.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
# -- Q(x)'s -- : sums of squares
3434
# Monomial vector: [x1; ... x8]
3535
Q = Vector{MatPolynomial{JuMP.Variable, monomialtype(x[1]), monovectype(x[1])}}(4)
36-
@variable m Q[1:4] >= 0 Poly{true}(Z)
36+
@variable m Q[1:4] SOSPoly(Z)
3737

3838
# -- r's -- : constant sum of squares
3939
Z = monomials(x, 0)

test/sosdemo6.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
m = SOSModel(solver = solver)
1717

1818
Z = monomials(x, 0:1)
19-
@variable m p1 >= 0 SOSPoly(Z)
19+
@variable m p1 SOSPoly(Z)
2020

2121
Z = monomials(x, 0:2)
2222
@variable m p[1:5] Poly(Z)

test/switchedsystems.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
expected_ub = [2, 1]
1919
function testlyap(d, γ, expected_status)
2020
m = SOSModel(solver = solver)
21-
X = monomials(x, d)
22-
@variable m p Poly{false, :Gram}(X)
21+
@variable m p Poly(monomials(x, 2d))
2322
# p strictly positive
2423
q = sum(x.^(2*d))
2524
@constraint m p >= q

test/variable.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
@polyvar x
33
X = emptymonovec(typeof(x^2))
44
m = SOSModel()
5-
@inferred PolyJuMP.createpoly(m, SOSPoly{:Gram}(X), :Cont)
6-
@test PolyJuMP.createpoly(m, SOSPoly{:Gram}(X), :Cont) == 0
5+
@inferred PolyJuMP.createpoly(m, SOSPoly(X), :Cont)
6+
@test PolyJuMP.createpoly(m, SOSPoly(X), :Cont) == 0
77
end
88
@testset "MatPolynomial getvalue" begin
99
m = JuMP.Model()

0 commit comments

Comments
 (0)