Skip to content

Commit 70960ac

Browse files
authored
Update to the new StarAlgebra (#133)
* Update to MultivariateBases refactoring * update * up * Fix format * bump * Fixes * fix sage
1 parent 7ea4118 commit 70960ac

16 files changed

Lines changed: 82 additions & 109 deletions

Project.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ SemialgebraicSets = "8e049039-38e8-557d-ae3a-bc521ccf6204"
1818
StarAlgebras = "0c0c59c1-dc5f-42e9-9a8b-b5dc384a6cd1"
1919

2020
[compat]
21-
DataStructures = "0.18"
22-
DynamicPolynomials = "0.5,0.6"
23-
IntervalArithmetic = "0.20, 0.21, 0.22" # Needs v0.20 for Julia v1.6 support
21+
DataStructures = "0.19"
22+
DynamicPolynomials = "0.5, 0.6"
23+
IntervalArithmetic = "0.20, 0.21, 0.22, 1" # Needs v0.20 for Julia v1.6 support
2424
JuMP = "1"
2525
MathOptInterface = "1"
2626
MultivariateBases = "0.2"

src/Bridges/Constraint/zero_polynomial.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ end
7272
function MOI.get(
7373
::MOI.ModelLike,
7474
::MOI.ConstraintSet,
75-
bridge::ZeroPolynomialBridge{T,F,MB.SubBasis{MB.Monomial,M,V}},
76-
) where {T,F,M,V}
75+
bridge::ZeroPolynomialBridge,
76+
)
7777
return PolyJuMP.ZeroPolynomialSet(
7878
SS.FullSpace(),
79-
MB.FullBasis{MB.Monomial,M}(),
79+
parent(bridge.basis),
8080
bridge.basis,
8181
)
8282
end

src/Bridges/Constraint/zero_polynomial_in_algebraic_set.jl

Lines changed: 20 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,22 @@ struct ZeroPolynomialInAlgebraicSetBridge{
55
F<:MOI.AbstractVectorFunction,
66
Z<:SA.AbstractBasis,
77
DT<:SS.AbstractAlgebraicSet,
8-
MT<:MP.AbstractMonomial,
9-
MVT<:AbstractVector{MT},
8+
B<:MB.SubBasis,
109
} <: MOI.Bridges.Constraint.AbstractBridge
1110
zero_constraint::MOI.ConstraintIndex{
1211
F,
13-
PolyJuMP.ZeroPolynomialSet{
14-
SS.FullSpace,
15-
Z,
16-
MB.SubBasis{MB.Monomial,MT,MVT},
17-
},
12+
PolyJuMP.ZeroPolynomialSet{SS.FullSpace,Z,B},
1813
}
1914
domain::DT
20-
basis::MB.SubBasis{MB.Monomial,MT,MVT}
15+
basis::B
2116
end
2217

2318
function MOI.Bridges.Constraint.bridge_constraint(
24-
::Type{ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT}},
19+
::Type{ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,B}},
2520
model::MOI.ModelLike,
2621
f::MOI.AbstractVectorFunction,
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}
22+
s::PolyJuMP.ZeroPolynomialSet{<:SS.AbstractAlgebraicSet,Z,B},
23+
) where {T,F,Z,DT,B}
3324
p = MP.polynomial(MB.algebra_element(MOI.Utilities.scalarize(f), s.basis))
3425
# As `*(::MOI.ScalarAffineFunction{T}, ::S)` is only defined if `S == T`, we
3526
# need to call `similar`. This is critical since `T` is
@@ -46,7 +37,7 @@ function MOI.Bridges.Constraint.bridge_constraint(
4637
MB.SubBasis{MB.Monomial}(MP.monomials(r)),
4738
),
4839
)
49-
return ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT}(
40+
return ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,B}(
5041
zero_constraint,
5142
s.domain,
5243
s.basis,
@@ -68,52 +59,34 @@ function MOI.Bridges.added_constrained_variable_types(
6859
end
6960

7061
function MOI.Bridges.added_constraint_types(
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-
)]
62+
::Type{<:ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,B}},
63+
) where {T,F,Z,DT,B}
64+
return [(F, PolyJuMP.ZeroPolynomialSet{SS.FullSpace,Z,B})]
8165
end
8266

8367
function MOI.Bridges.Constraint.concrete_bridge_type(
8468
::Type{<:ZeroPolynomialInAlgebraicSetBridge{T}},
8569
F::Type{<:MOI.AbstractVectorFunction},
86-
::Type{<:PolyJuMP.ZeroPolynomialSet{DT,Z,MB.SubBasis{MB.Monomial,MT,MVT}}},
87-
) where {T,Z,DT<:SS.AbstractAlgebraicSet,MT,MVT}
70+
::Type{<:PolyJuMP.ZeroPolynomialSet{DT,Z,B}},
71+
) where {T,Z,DT<:SS.AbstractAlgebraicSet,B}
8872
G = MOI.Utilities.promote_operation(-, T, F, F)
89-
return ZeroPolynomialInAlgebraicSetBridge{T,G,Z,DT,MT,MVT}
73+
return ZeroPolynomialInAlgebraicSetBridge{T,G,Z,DT,B}
9074
end
9175

9276
# Attributes, Bridge acting as an model
9377
function MOI.get(
94-
::ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT},
95-
::MOI.NumberOfConstraints{
96-
F,
97-
PolyJuMP.ZeroPolynomialSet{
98-
SS.FullSpace,
99-
Z,
100-
MB.SubBasis{MB.Monomial,MT,MVT},
101-
},
102-
},
103-
) where {T,F,Z,DT,MT,MVT}
78+
::ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,B},
79+
::MOI.NumberOfConstraints{F,PolyJuMP.ZeroPolynomialSet{SS.FullSpace,Z,B}},
80+
) where {T,F,Z,DT,B}
10481
return 1
10582
end
10683
function MOI.get(
107-
b::ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,MT,MVT},
84+
b::ZeroPolynomialInAlgebraicSetBridge{T,F,Z,DT,B},
10885
::MOI.ListOfConstraintIndices{
10986
F,
110-
PolyJuMP.ZeroPolynomialSet{
111-
SS.FullSpace,
112-
Z,
113-
MB.SubBasis{MB.Monomial,MT,MVT},
114-
},
87+
PolyJuMP.ZeroPolynomialSet{SS.FullSpace,Z,B},
11588
},
116-
) where {T,F,Z,DT,MT,MVT}
89+
) where {T,F,Z,DT,B}
11790
return [b.zero_constraint]
11891
end
11992

@@ -153,7 +126,7 @@ function MOI.get(
153126
set = MOI.get(model, MOI.ConstraintSet(), bridge.zero_constraint)
154127
μ = MM.measure(dual, set.basis)
155128
I = SS.ideal(bridge.domain)
156-
return [dot(rem(mono, I), μ) for mono in bridge.basis.monomials]
129+
return [dot(rem(mono, I), μ) for mono in MB.keys_as_monomials(bridge.basis)]
157130
end
158131

159132
function MOI.get(

src/KKT/KKT.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,7 @@ function _optimize!(model::Optimizer{T}) where {T}
215215
try # We could check `SS.is_zero_dimensional(system)` but that would only work for Gröbner basis based
216216
solutions = collect(system)
217217
catch err
218-
model.extrema = Vector{T}[]
219-
model.objective_values = zeros(T, 0)
218+
model.solutions = PolyJuMP.Solution{T}[]
220219
model.termination_status = MOI.OTHER_ERROR
221220
model.raw_status = "KKT system solver failed with : $(sprint(showerror, err))."
222221
return

src/SAGE/SAGE.jl

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

33
import MutableArithmetics as MA
4+
import StarAlgebras as SA
45
import MultivariateBases as MB
56
import MultivariatePolynomials as MP
67
import MathOptInterface as MOI
@@ -41,9 +42,11 @@ struct Signomials{M<:Union{Nothing,Int,MP.AbstractMonomial}} <:
4142
end
4243
Signomials() = Signomials(nothing)
4344
_index(_, ::Nothing) = nothing
44-
_index(basis, mono::MP.AbstractMonomial) = MB.monomial_index(basis, mono)::Int
45+
function _index(basis, mono::MP.AbstractMonomial)
46+
return SA.key_index(basis, MP.exponents(mono))::Int
47+
end
4548
function JuMP.moi_set(c::Signomials, basis::MB.SubBasis{MB.Monomial})
46-
monos = basis.monomials
49+
monos = MB.keys_as_monomials(basis)
4750
return Cone(Signomials(_index(basis, c.monomial)), _exponents_matrix(monos))
4851
end
4952

@@ -58,7 +61,7 @@ struct Polynomials{M<:Union{Nothing,Int,MP.AbstractMonomial}} <:
5861
end
5962
Polynomials() = Polynomials(nothing)
6063
function JuMP.moi_set(c::Polynomials, basis::MB.SubBasis{MB.Monomial})
61-
monos = basis.monomials
64+
monos = MB.keys_as_monomials(basis)
6265
return Cone(
6366
Polynomials(_index(basis, c.monomial)),
6467
_exponents_matrix(monos),
@@ -139,7 +142,7 @@ function decomposition(
139142
tol::Real,
140143
result_index::Int = 1,
141144
)
142-
monos = con_ref.shape.basis.monomials
145+
monos = MB.keys_as_monomials(con_ref.shape.basis)
143146
attr = DecompositionAttribute(tol, result_index)
144147
return Decomposition([
145148
MP.polynomial(a, monos) for

src/constraint.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ function JuMP.moi_set(
4545
::ZeroPoly,
4646
b::MB.SubBasis{MB.Monomial,M};
4747
domain::SS.AbstractSemialgebraicSet = SS.FullSpace(),
48-
basis = MB.FullBasis{MB.Monomial,M}(),
48+
basis = parent(b),
4949
) where {M}
5050
return ZeroPolynomialSet(domain, basis, b)
5151
end

src/variable.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ end
1717

1818
function JuMP.value(
1919
f::Function,
20-
p::SA.AlgebraElement{A,<:JuMP.AbstractJuMPScalar},
21-
) where {A}
20+
p::SA.AlgebraElement{<:JuMP.AbstractJuMPScalar},
21+
)
2222
return SA.AlgebraElement(JuMP.value.(f, SA.coeffs(p)), parent(p))
2323
end
2424

2525
function JuMP.value(p::MP.AbstractPolynomialLike{<:JuMP.AbstractJuMPScalar})
2626
return JuMP.value(JuMP.value, p)
2727
end
2828

29-
function JuMP.value(p::SA.AlgebraElement{A,<:JuMP.AbstractJuMPScalar}) where {A}
29+
function JuMP.value(p::SA.AlgebraElement{<:JuMP.AbstractJuMPScalar})
3030
return JuMP.value(JuMP.value, p)
3131
end
3232

test/Mock/plus_minus.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ using DynamicPolynomials
77

88
using SemialgebraicSets
99
using PolyJuMP
10+
const _full_basis_type = typeof(MB.FullBasis{MB.Monomial}(x))
11+
const _sub_basis_type = MB.explicit_basis_type(_full_basis_type)
1012
const NonNeg = DummyPolyModule.NonNeg{
11-
MB.FullBasis{MB.Monomial,monomial_type(x)},
13+
_full_basis_type,
1214
typeof(@set x^2 0),
13-
MB.SubBasis{MB.Monomial,monomial_type(x),monomial_vector_type(x)},
15+
_sub_basis_type,
1416
}
1517

1618
MOI.Utilities.@model(

test/Mock/zero_polynomial.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ end
2929
function optimize!(mock)
3030
return MOI.Utilities.mock_optimize!(
3131
mock,
32-
[1.0, 0.0, 1.0, 0.0, 0.0, 0.0],
32+
[1.0, 0.0, 0.0, 0.0, 0.0],
3333
(MOI.ScalarAffineFunction{Float64}, MOI.LessThan{Float64}) =>
3434
[-1.0],
3535
(MOI.VectorAffineFunction{Float64}, MOI.Zeros) => [[-1.0], [-1.0]],

test/Tests/zero_polynomial.jl

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,10 @@ function _zero_polynomial_test(
5151
end
5252

5353
F = MOI.VectorAffineFunction{Float64}
54-
ST = PolyJuMP.ZeroPolynomialSet{
55-
FullSpace,
56-
MB.FullBasis{MB.Monomial,monomial_type(x)},
57-
MB.SubBasis{MB.Monomial,monomial_type(x),monomial_vector_type(x)},
58-
}
59-
SP = PolyJuMP.ZeroPolynomialSet{
60-
FullSpace,
61-
MB.FullBasis{MB.Monomial,monomial_type(x)},
62-
MB.SubBasis{MB.Monomial,monomial_type(x),monomial_vector_type(x)},
63-
}
54+
full_basis_type = typeof(MB.FullBasis{MB.Monomial}(x))
55+
sub_basis_type = MB.explicit_basis_type(full_basis_type)
56+
ST = PolyJuMP.ZeroPolynomialSet{FullSpace,full_basis_type,sub_basis_type}
57+
SP = PolyJuMP.ZeroPolynomialSet{FullSpace,full_basis_type,sub_basis_type}
6458
@test Set(MOI.get(model, MOI.ListOfConstraintTypesPresent())) == Set([
6559
(MOI.VariableIndex, MOI.LessThan{Float64}),
6660
(F, SP),

0 commit comments

Comments
 (0)