Skip to content

Commit 5dfd17c

Browse files
authored
Refactor with StarAlgebras (#123)
* Refactor with StarAlgebras * Fixes * Fix format * Fixes
1 parent ac336a1 commit 5dfd17c

19 files changed

+253
-230
lines changed

.github/workflows/ci.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ jobs:
3535
${{ runner.os }}-test-${{ env.cache-name }}-
3636
${{ runner.os }}-test-
3737
${{ runner.os }}-
38+
- name: dev
39+
shell: julia --project=@. {0}
40+
run: |
41+
using Pkg
42+
Pkg.add([
43+
PackageSpec(name="StarAlgebras", rev="mk/non_monomial_basis"),
44+
PackageSpec(name="MultivariateBases", rev="master"),
45+
PackageSpec(name="MultivariateMoments", rev="master"),
46+
])
3847
- uses: julia-actions/julia-buildpkg@v1
3948
- uses: julia-actions/julia-runtest@v1
4049
- uses: julia-actions/julia-processcoverage@v1

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ MultivariateMoments = "f4abf1af-0426-5881-a0da-e2f168889b5e"
1515
MultivariatePolynomials = "102ac46a-7ee4-5c85-9060-abc95bfdeaa3"
1616
MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0"
1717
SemialgebraicSets = "8e049039-38e8-557d-ae3a-bc521ccf6204"
18+
StarAlgebras = "0c0c59c1-dc5f-42e9-9a8b-b5dc384a6cd1"
1819

1920
[compat]
2021
DataStructures = "0.18"

src/Bridges/Constraint/Constraint.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module Constraint
22

3+
import StarAlgebras as SA
34
import MultivariatePolynomials as MP
45
import MultivariateBases as MB
56
import SemialgebraicSets as SS

src/Bridges/Constraint/zero_polynomial.jl

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
struct ZeroPolynomialBridge{
22
T,
33
F<:MOI.AbstractVectorFunction,
4-
MT<:MP.AbstractMonomial,
5-
MVT<:AbstractVector{MT},
4+
B<:SA.ExplicitBasis,
65
} <: MOI.Bridges.Constraint.AbstractBridge
76
zero_constraint::MOI.ConstraintIndex{F,MOI.Zeros}
8-
monomials::MVT
7+
basis::B
98
end
109

1110
function MOI.Bridges.Constraint.bridge_constraint(
12-
::Type{ZeroPolynomialBridge{T,F,MT,MVT}},
11+
::Type{ZeroPolynomialBridge{T,F,B}},
1312
model::MOI.ModelLike,
1413
f::MOI.AbstractVectorFunction,
15-
s::PolyJuMP.ZeroPolynomialSet{SS.FullSpace,<:MB.MonomialBasis},
16-
) where {T,F,MT,MVT}
17-
@assert MOI.output_dimension(f) == length(s.monomials)
18-
zero_constraint =
19-
MOI.add_constraint(model, f, MOI.Zeros(length(s.monomials)))
20-
return ZeroPolynomialBridge{T,F,MT,MVT}(zero_constraint, s.monomials)
14+
s::PolyJuMP.ZeroPolynomialSet{SS.FullSpace,<:MB.FullBasis{MB.Monomial},B},
15+
) where {T,F,B}
16+
@assert MOI.output_dimension(f) == length(s.basis)
17+
zero_constraint = MOI.add_constraint(model, f, MOI.Zeros(length(s.basis)))
18+
return ZeroPolynomialBridge{T,F,typeof(s.basis)}(zero_constraint, s.basis)
2119
end
2220

2321
function MOI.supports_constraint(
@@ -41,10 +39,14 @@ function MOI.Bridges.Constraint.concrete_bridge_type(
4139
::Type{<:ZeroPolynomialBridge{T}},
4240
F::Type{<:MOI.AbstractVectorFunction},
4341
::Type{
44-
<:PolyJuMP.ZeroPolynomialSet{SS.FullSpace,<:MB.MonomialBasis,MT,MVT},
42+
<:PolyJuMP.ZeroPolynomialSet{
43+
SS.FullSpace,
44+
<:MB.FullBasis{MB.Monomial},
45+
B,
46+
},
4547
},
46-
) where {T,MT,MVT}
47-
return ZeroPolynomialBridge{T,F,MT,MVT}
48+
) where {T,B<:MB.SubBasis{MB.Monomial}}
49+
return ZeroPolynomialBridge{T,F,B}
4850
end
4951

5052
# Attributes, Bridge acting as an model
@@ -68,14 +70,14 @@ end
6870

6971
# Attributes, Bridge acting as a constraint
7072
function MOI.get(
71-
model::MOI.ModelLike,
73+
::MOI.ModelLike,
7274
::MOI.ConstraintSet,
73-
bridge::ZeroPolynomialBridge{T,F,MT,MVT},
74-
) where {T,F,MT,MVT}
75+
bridge::ZeroPolynomialBridge{T,F,MB.SubBasis{MB.Monomial,M,V}},
76+
) where {T,F,M,V}
7577
return PolyJuMP.ZeroPolynomialSet(
7678
SS.FullSpace(),
77-
MB.MonomialBasis{MT,MVT},
78-
bridge.monomials,
79+
MB.FullBasis{MB.Monomial,M}(),
80+
bridge.basis,
7981
)
8082
end
8183
function MOI.get(
@@ -91,5 +93,5 @@ function MOI.get(
9193
bridge::ZeroPolynomialBridge,
9294
)
9395
values = MOI.get(model, MOI.ConstraintDual(attr.result_index), bridge)
94-
return MM.measure(values, bridge.monomials)
96+
return MM.measure(values, bridge.basis)
9597
end

src/Bridges/Constraint/zero_polynomial_in_algebraic_set.jl

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,34 @@ using LinearAlgebra
33
struct ZeroPolynomialInAlgebraicSetBridge{
44
T,
55
F<:MOI.AbstractVectorFunction,
6-
BT<:MB.AbstractPolynomialBasis,
6+
Z<:SA.AbstractBasis,
77
DT<:SS.AbstractAlgebraicSet,
88
MT<:MP.AbstractMonomial,
99
MVT<:AbstractVector{MT},
1010
} <: MOI.Bridges.Constraint.AbstractBridge
1111
zero_constraint::MOI.ConstraintIndex{
1212
F,
13-
PolyJuMP.ZeroPolynomialSet{SS.FullSpace,BT,MT,MVT},
13+
PolyJuMP.ZeroPolynomialSet{
14+
SS.FullSpace,
15+
Z,
16+
MB.SubBasis{MB.Monomial,MT,MVT},
17+
},
1418
}
1519
domain::DT
16-
monomials::MVT
20+
basis::MB.SubBasis{MB.Monomial,MT,MVT}
1721
end
1822

1923
function MOI.Bridges.Constraint.bridge_constraint(
20-
::Type{ZeroPolynomialInAlgebraicSetBridge{T,F,BT,DT,MT,MVT}},
24+
::Type{ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT}},
2125
model::MOI.ModelLike,
2226
f::MOI.AbstractVectorFunction,
23-
s::PolyJuMP.ZeroPolynomialSet{<:SS.AbstractAlgebraicSet},
24-
) where {T,F,BT,DT,MT,MVT}
25-
p = MP.polynomial(MOI.Utilities.scalarize(f), s.monomials)
27+
s::PolyJuMP.ZeroPolynomialSet{
28+
<:SS.AbstractAlgebraicSet,
29+
Z,
30+
MB.SubBasis{MB.Monomial,MT,MVT},
31+
},
32+
) where {T,F,Z,DT,MT,MVT}
33+
p = MP.polynomial(MOI.Utilities.scalarize(f), s.basis)
2634
# As `*(::MOI.ScalarAffineFunction{T}, ::S)` is only defined if `S == T`, we
2735
# need to call `similar`. This is critical since `T` is
2836
# `Float64` when used with JuMP and the coefficient type is often `Int` with
@@ -32,12 +40,16 @@ function MOI.Bridges.Constraint.bridge_constraint(
3240
zero_constraint = MOI.add_constraint(
3341
model,
3442
MOI.Utilities.vectorize(MP.coefficients(r)),
35-
PolyJuMP.ZeroPolynomialSet(SS.FullSpace(), s.basis, MP.monomials(r)),
43+
PolyJuMP.ZeroPolynomialSet(
44+
SS.FullSpace(),
45+
s.zero_basis,
46+
MB.SubBasis{MB.Monomial}(MP.monomials(r)),
47+
),
3648
)
37-
return ZeroPolynomialInAlgebraicSetBridge{T,F,BT,DT,MT,MVT}(
49+
return ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT}(
3850
zero_constraint,
3951
s.domain,
40-
s.monomials,
52+
s.basis,
4153
)
4254
end
4355

@@ -48,42 +60,60 @@ function MOI.supports_constraint(
4860
) where {T}
4961
return true
5062
end
63+
5164
function MOI.Bridges.added_constrained_variable_types(
5265
::Type{<:ZeroPolynomialInAlgebraicSetBridge},
5366
)
5467
return Tuple{Type}[]
5568
end
69+
5670
function MOI.Bridges.added_constraint_types(
57-
::Type{<:ZeroPolynomialInAlgebraicSetBridge{T,F,BT,DT,MT,MVT}},
58-
) where {T,F,BT,DT,MT,MVT}
59-
return [(F, PolyJuMP.ZeroPolynomialSet{SS.FullSpace,BT,MT,MVT})]
71+
::Type{<:ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT}},
72+
) where {T,F,Z,DT,MT,MVT}
73+
return [(
74+
F,
75+
PolyJuMP.ZeroPolynomialSet{
76+
SS.FullSpace,
77+
Z,
78+
MB.SubBasis{MB.Monomial,MT,MVT},
79+
},
80+
)]
6081
end
82+
6183
function MOI.Bridges.Constraint.concrete_bridge_type(
6284
::Type{<:ZeroPolynomialInAlgebraicSetBridge{T}},
6385
F::Type{<:MOI.AbstractVectorFunction},
64-
::Type{<:PolyJuMP.ZeroPolynomialSet{DT,BT,MT,MVT}},
65-
) where {T,BT,DT<:SS.AbstractAlgebraicSet,MT,MVT}
86+
::Type{<:PolyJuMP.ZeroPolynomialSet{DT,Z,MB.SubBasis{MB.Monomial,MT,MVT}}},
87+
) where {T,Z,DT<:SS.AbstractAlgebraicSet,MT,MVT}
6688
G = MOI.Utilities.promote_operation(-, T, F, F)
67-
return ZeroPolynomialInAlgebraicSetBridge{T,G,BT,DT,MT,MVT}
89+
return ZeroPolynomialInAlgebraicSetBridge{T,G,Z,DT,MT,MVT}
6890
end
6991

7092
# Attributes, Bridge acting as an model
7193
function MOI.get(
72-
::ZeroPolynomialInAlgebraicSetBridge{T,F,BT,DT,MT,MVT},
94+
::ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT},
7395
::MOI.NumberOfConstraints{
7496
F,
75-
PolyJuMP.ZeroPolynomialSet{SS.FullSpace,BT,MT,MVT},
97+
PolyJuMP.ZeroPolynomialSet{
98+
SS.FullSpace,
99+
Z,
100+
MB.SubBasis{MB.Monomial,MT,MVT},
101+
},
76102
},
77-
) where {T,F,BT,DT,MT,MVT}
103+
) where {T,F,Z,DT,MT,MVT}
78104
return 1
79105
end
80106
function MOI.get(
81-
b::ZeroPolynomialInAlgebraicSetBridge{T,F,BT,DT,MT,MVT},
107+
b::ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT},
82108
::MOI.ListOfConstraintIndices{
83109
F,
84-
PolyJuMP.ZeroPolynomialSet{SS.FullSpace,BT,MT,MVT},
110+
PolyJuMP.ZeroPolynomialSet{
111+
SS.FullSpace,
112+
Z,
113+
MB.SubBasis{MB.Monomial,MT,MVT},
114+
},
85115
},
86-
) where {T,F,BT,DT,MT,MVT}
116+
) where {T,F,Z,DT,MT,MVT}
87117
return [b.zero_constraint]
88118
end
89119

@@ -102,8 +132,8 @@ function MOI.get(
102132
set = MOI.get(model, attr, bridge.zero_constraint)
103133
return PolyJuMP.ZeroPolynomialSet(
104134
bridge.domain,
105-
set.basis,
106-
bridge.monomials,
135+
set.zero_basis,
136+
bridge.basis,
107137
)
108138
end
109139
# TODO ConstraintPrimal
@@ -121,10 +151,11 @@ function MOI.get(
121151
)
122152
dual = MOI.get(model, attr, bridge.zero_constraint)
123153
set = MOI.get(model, MOI.ConstraintSet(), bridge.zero_constraint)
124-
μ = MM.measure(dual, set.monomials)
154+
μ = MM.measure(dual, set.basis)
125155
I = SS.ideal(bridge.domain)
126-
return [dot(rem(mono, I), μ) for mono in bridge.monomials]
156+
return [dot(rem(mono, I), μ) for mono in bridge.basis.monomials]
127157
end
158+
128159
function MOI.get(
129160
model::MOI.ModelLike,
130161
attr::PolyJuMP.MomentsAttribute,

src/PolyJuMP.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module PolyJuMP
22

33
import MutableArithmetics as MA
4+
import StarAlgebras as SA
45

56
# MultivariatePolynomials extension
67

src/SAGE/SAGE.jl

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module SAGE
22

33
import MutableArithmetics as MA
4+
import MultivariateBases as MB
45
import MultivariatePolynomials as MP
56
import MathOptInterface as MOI
67
import JuMP
@@ -40,9 +41,10 @@ struct Signomials{M<:Union{Nothing,Int,MP.AbstractMonomial}} <:
4041
end
4142
Signomials() = Signomials(nothing)
4243
_index(_, ::Nothing) = nothing
43-
_index(monos, mono::MP.AbstractMonomial) = findfirst(isequal(mono), monos)::Int
44-
function JuMP.moi_set(c::Signomials, monos)
45-
return Cone(Signomials(_index(monos, c.monomial)), _exponents_matrix(monos))
44+
_index(basis, mono::MP.AbstractMonomial) = MB.monomial_index(basis, mono)::Int
45+
function JuMP.moi_set(c::Signomials, basis::MB.SubBasis{MB.Monomial})
46+
monos = basis.monomials
47+
return Cone(Signomials(_index(basis, c.monomial)), _exponents_matrix(monos))
4648
end
4749

4850
"""
@@ -55,9 +57,10 @@ struct Polynomials{M<:Union{Nothing,Int,MP.AbstractMonomial}} <:
5557
monomial::M
5658
end
5759
Polynomials() = Polynomials(nothing)
58-
function JuMP.moi_set(c::Polynomials, monos)
60+
function JuMP.moi_set(c::Polynomials, basis::MB.SubBasis{MB.Monomial})
61+
monos = basis.monomials
5962
return Cone(
60-
Polynomials(_index(monos, c.monomial)),
63+
Polynomials(_index(basis, c.monomial)),
6164
_exponents_matrix(monos),
6265
)
6366
end
@@ -77,9 +80,9 @@ function JuMP.build_constraint(
7780
_error("unsupported keyword argument `$key`.")
7881
end
7982
coefs = PolyJuMP.non_constant_coefficients(p)
80-
monos = MP.monomials(p)
81-
cone = JuMP.moi_set(set, monos)
82-
shape = PolyJuMP.PolynomialShape(monos)
83+
basis = MB.SubBasis{MB.Monomial}(MP.monomials(p))
84+
cone = JuMP.moi_set(set, basis)
85+
shape = PolyJuMP.PolynomialShape(basis)
8386
return PolyJuMP.bridgeable(
8487
JuMP.VectorConstraint(coefs, cone, shape),
8588
JuMP.moi_function_type(typeof(coefs)),
@@ -136,7 +139,7 @@ function decomposition(
136139
tol::Real,
137140
result_index::Int = 1,
138141
)
139-
monos = con_ref.shape.monomials
142+
monos = con_ref.shape.basis.monomials
140143
attr = DecompositionAttribute(tol, result_index)
141144
return Decomposition([
142145
MP.polynomial(a, monos) for

src/attributes.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
MomentsAttribute(N)
2+
MomentsAttribute(result_index)
33
MomentsAttribute()
44
55
A constraint attribute for the vector of moments corresponding to the

0 commit comments

Comments
 (0)