Skip to content

Commit d8cf94f

Browse files
committed
Add AlgebraicSet and BasicSemialgebraicSet
1 parent 3ca468b commit d8cf94f

File tree

4 files changed

+62
-0
lines changed

4 files changed

+62
-0
lines changed

src/MultivariatePolynomials.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ include("comp.jl")
1414
include("alg.jl")
1515
include("diff.jl")
1616
include("subs.jl")
17+
include("algebraicset.jl")
18+
1719
include("show.jl")
1820

1921
end # module

src/algebraicset.jl

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
export AlgebraicSet, BasicSemialgebraicSet, addequality!, addinequality!
2+
# Semialgebraic set described by polynomials with coefficients in T
3+
abstract AbstractSemialgebraicSet{T}
4+
5+
addequality!{T}(S::AbstractSemialgebraicSet{T}, p) = addequality!(S, VecPolynomial{T}(p))
6+
addinequality!{T}(S::AbstractSemialgebraicSet{T}, p) = addinequality!(S, VecPolynomial{T}(p))
7+
8+
abstract AbstractBasicSemialgebraicSet{T} <: AbstractSemialgebraicSet{T}
9+
abstract AbstractAlgebraicSet{T} <: AbstractBasicSemialgebraicSet{T}
10+
11+
addinequality!{T}(S::AbstractAlgebraicSet{T}, p) = throw(ArgumentError("Cannot add inequality to an algebraic set"))
12+
13+
type AlgebraicSet{T} <: AbstractAlgebraicSet{T}
14+
p::Vector{VecPolynomial{T}}
15+
end
16+
function (::Type{AlgebraicSet{T}}){T}()
17+
AlgebraicSet{T}(VecPolynomial{T}[])
18+
end
19+
20+
21+
function Base.convert{T,U}(::Type{AlgebraicSet{T}}, V::AlgebraicSet{U})
22+
AlgebraicSet{T}(Vector{VecPolynomial{T}}(V.p))
23+
end
24+
25+
addequality!{T}(V::AlgebraicSet{T}, p::VecPolynomial{T}) = push!(V.p, p)
26+
27+
type BasicSemialgebraicSet{T} <: AbstractBasicSemialgebraicSet{T}
28+
V::AlgebraicSet{T}
29+
p::Vector{VecPolynomial{T}}
30+
end
31+
function (::Type{BasicSemialgebraicSet{T}}){T}()
32+
BasicSemialgebraicSet{T}(AlgebraicSet{T}(), VecPolynomial{T}[])
33+
end
34+
35+
36+
function Base.convert{T,U}(::Type{BasicSemialgebraicSet{T}}, S::BasicSemialgebraicSet{U})
37+
BasicSemialgebraicSet{T}(convert(AlgebraicSet{T}, S.V), Vector{VecPolynomial{T}}(S.p))
38+
end
39+
40+
addequality!{T}(S::BasicSemialgebraicSet{T}, p::VecPolynomial{T}) = addequality!(S.V, p)
41+
addinequality!{T}(S::BasicSemialgebraicSet{T}, p::VecPolynomial{T}) = push!(S.p, p)

test/algebraicset.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
facts("Algebraic set") do
2+
@polyvar x y
3+
V = AlgebraicSet{Int}()
4+
@fact_throws ArgumentError addinequality!(V, x*y)
5+
S = BasicSemialgebraicSet{Int}()
6+
addequality!(S, x)
7+
addinequality!(S, x^2*y)
8+
addequality!(S, 2*x^2*y)
9+
@fact typeof(Int32(2)*x^2*y) --> Term{Int32}
10+
addequality!(S, Int32(2)*x^2*y)
11+
addinequality!(S, 1.0x^2*y)
12+
addequality!(S, (6//3)*x^2*y+y)
13+
@fact_throws InexactError addinequality!(S, 1.5x^2*y)
14+
S = BasicSemialgebraicSet{Float64}(S)
15+
@fact typeof(S) --> BasicSemialgebraicSet{Float64}
16+
addinequality!(S, 1.5x+y)
17+
end

test/runtests.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ include("comp.jl")
99
include("alg.jl")
1010
include("diff.jl")
1111
include("subs.jl")
12+
include("algebraicset.jl")
13+
1214
#include("show.jl")
1315

1416
FactCheck.exitstatus()

0 commit comments

Comments
 (0)