Skip to content

Commit ecdecaf

Browse files
committed
Add support for monomial ordering
1 parent 7869250 commit ecdecaf

File tree

2 files changed

+20
-46
lines changed

2 files changed

+20
-46
lines changed

src/operators.jl

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,20 @@
11
# Graded Lexicographic order
2-
# First compare total degree, then lexicographic order
3-
function Base.isless(m1::Monomial{V}, m2::Monomial{V}) where {V}
4-
d1 = degree(m1)
5-
d2 = degree(m2)
6-
if d1 < d2
7-
return true
8-
elseif d1 > d2
9-
return false
10-
else
11-
return exponents(m1) < exponents(m2)
12-
end
2+
function MP.compare(m1::Monomial{V}, m2::Monomial{V}, ::Type{O}) where {V,O<:MP.AbstractMonomialOrder}
3+
return MP.compare(MP.exponents(m1), MP.exponents(m2), O)
134
end
145

15-
function _compare(a::Tuple, b::Tuple, ::Type{MP.LexOrder})
16-
if a == b
17-
return 0
18-
elseif a < b
19-
return -1
20-
else
21-
return 1
22-
end
23-
end
24-
function _compare(a::Tuple, b::Tuple, ::Type{MP.InverseLexOrder})
25-
return _compare(reverse(a), reverse(b), MP.LexOrder)
26-
end
27-
28-
function MP.compare(m1::Monomial{V}, m2::Monomial{V}, ::Type{O}) where {V,O<:Union{MP.LexOrder,MP.InverseLexOrder}}
29-
return _compare(MP.exponents(m1), MP.exponents(m2), O)
30-
end
31-
32-
function MP.compare(m1::Monomial, m2::Monomial, ::Type{O}) where {O<:Union{MP.LexOrder,MP.InverseLexOrder}}
6+
function MP.compare(m1::Monomial, m2::Monomial, ::Type{O}) where {O<:MP.AbstractMonomialOrder}
337
return MP.compare(promote(m1, m2)..., O)
348
end
359

36-
function MP.compare(m1::Monomial, m2::Monomial)
37-
return MP.compare(m1, m2, MP.Graded{MP.LexOrder})
38-
end
39-
40-
4110
(==)(::Variable{N}, ::Variable{N}) where {N} = true
4211
(==)(::Variable, ::Variable) = false
4312
(==)(m1::Monomial{V}, m2::Monomial{V}) where {V} = exponents(m1) == exponents(m2)
4413

4514
# Multiplication is handled as a special case so that we can write these
4615
# definitions without resorting to promotion:
4716

48-
(*)(v1::V, v2::V) where {V <: Variable} = Monomial{(V(),), 1}((2,))
17+
(*)(::V, ::V) where {V <: Variable} = Monomial{(V(),), 1}((2,))
4918
(*)(v1::Variable, v2::Variable) = (*)(promote(v1, v2)...)
5019

5120
function MP.divides(m1::Monomial{V, N}, m2::Monomial{V, N}) where {V, N}
@@ -68,7 +37,7 @@ end
6837
# We could remove these methods since it is the default.
6938
MA.mutability(::Type{<:Monomial}) = MA.IsNotMutable()
7039

71-
^(v::V, x::Integer) where {V <: Variable} = Monomial{(V(),), 1}((x,))
40+
^(::V, x::Integer) where {V <: Variable} = Monomial{(V(),), 1}((x,))
7241

7342
# dot(v1::AbstractVector{<:TermLike}, v2::AbstractVector) = dot(v1, v2)
7443
# dot(v1::AbstractVector, v2::AbstractVector{<:TermLike}) = dot(v1, v2)

src/types.jl

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1-
struct Variable{Name} <: AbstractVariable
1+
"""
2+
Variable{Name,M} <: AbstractVariable
3+
4+
Variable of name `Name` and monomial order `M`.
5+
"""
6+
struct Variable{Name,M} <: AbstractVariable
27
end
38

4-
MP.name(::Type{Variable{N}}) where {N} = N
9+
MP.name(::Type{<:Variable{N}}) where {N} = N
510
MP.name(v::Variable) = name(typeof(v))
611
MP.name_base_indices(v::Variable) = name_base_indices(typeof(v))
7-
function MP.name_base_indices(v::Type{Variable{N}}) where N
12+
function MP.name_base_indices(::Type{<:Variable{N}}) where N
813
name = string(N)
914
splits = split(string(N), r"[\[,\]]\s*", keepempty=false)
1015
if length(splits) == 1
@@ -23,15 +28,15 @@ checksorted(x::Tuple{Any}, cmp) = true
2328
checksorted(x::Tuple{}, cmp) = true
2429
checksorted(x::Tuple, cmp) = cmp(x[1], x[2]) && checksorted(Base.tail(x), cmp)
2530

26-
struct Monomial{V, N} <: AbstractMonomial
31+
struct Monomial{V, M, N} <: AbstractMonomial
2732
exponents::NTuple{N, Int}
2833

29-
function Monomial{V, N}(exponents::NTuple{N, Int}=ntuple(_ -> 0, Val{N}())) where {V, N}
34+
function Monomial{V, M, N}(exponents::NTuple{N, Int}=ntuple(_ -> 0, Val{N}())) where {V, M, N}
3035
@assert checksorted(V, >)
31-
new{V, N}(exponents)
36+
new{V, M, N}(exponents)
3237
end
33-
Monomial{V}(exponents::NTuple{N, Integer}=()) where {V, N} = Monomial{V, N}(exponents)
34-
Monomial{V}(exponents::AbstractVector{<:Integer}) where {V} = Monomial{V}(NTuple{length(V), Int}(exponents))
38+
Monomial{V, M}(exponents::NTuple{N, Integer}=()) where {V, N} = Monomial{V, M, N}(exponents)
39+
Monomial{V, M}(exponents::AbstractVector{<:Integer}) where {V} = Monomial{V, M}(NTuple{length(V), Int}(exponents))
3540
end
3641

3742
Monomial(v::Variable) = monomial_type(v)((1,))
@@ -46,8 +51,8 @@ MP.monomial_type(v::Variable) = Monomial{(v,), 1}
4651

4752
MP.exponents(m::Monomial) = m.exponents
4853
MP.exponent(m::Monomial, i::Integer) = m.exponents[i]
49-
_exponent(v::V, p1::Tuple{V, Integer}, p2...) where {V <: Variable} = p1[2]
50-
_exponent(v::Variable, p1::Tuple{Variable, Integer}, p2...) = _exponent(v, p2...)
54+
_exponent(::V, p1::Tuple{V, Integer}, p2...) where {V <: Variable} = p1[2]
55+
_exponent(v::Variable, ::Tuple{Variable, Integer}, p2...) = _exponent(v, p2...)
5156
_exponent(v::Variable) = 0
5257
MP.degree(m::Monomial, v::Variable) = _exponent(v, powers(m)...)
5358

0 commit comments

Comments
 (0)