Skip to content

Commit 45b4681

Browse files
authored
Refactor (#91)
* Refactor * Fixes * Remove unused function
1 parent 62a6a0f commit 45b4681

File tree

2 files changed

+12
-47
lines changed

2 files changed

+12
-47
lines changed

src/types.jl

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -69,49 +69,26 @@ MP.nvariables(::Union{Term{C,M},Type{Term{C,M}},Polynomial{C,Term{C,M}},Type{<:P
6969
MP.variables(::Union{AbstractVector{PT},Type{<:AbstractVector{PT}}}) where {C,M<:Monomial,PT<:Union{MonomialLike,Term{C,M},Polynomial{C,Term{C,M}}}} = variables(PT)
7070
MP.nvariables(::Union{AbstractVector{PT},Type{<:AbstractVector{PT}}}) where {C,M<:Monomial,PT<:Union{MonomialLike,Term{C,M},Polynomial{C,Term{C,M}}}} = nvariables(PT)
7171

72-
# TODO replace by MP function
73-
function _error_for_negative_degree(deg)
74-
if deg < 0
75-
throw(ArgumentError("The degree should be a nonnegative number but the provided degree `$deg` is negative."))
76-
end
77-
end
78-
79-
# Based on fillZfordeg!() from MultivariatePolynomials.jl by Benoit Legat
80-
# https://github.com/blegat/MultivariatePolynomials.jl/blob/d85ad85de413afa20fc8f5354c980387218ced2c/src/mono.jl#L186-L259
81-
function monomial_powers(::Val{N}, degree) where N
82-
_error_for_negative_degree(degree)
83-
result = Vector{NTuple{N, Int}}()
84-
powers = zeros(Int, N)
85-
powers[end] = degree
86-
while true
87-
push!(result, NTuple{N, Int}(powers))
88-
if powers[1] == degree
89-
break
90-
end
91-
i = findfirst(i -> !iszero(powers[i]), N:-1:2)
92-
j = (N:-1:2)[i]
93-
p = powers[j]
94-
powers[j] = 0
95-
powers[end] = p - 1
96-
powers[j-1] += 1
97-
end
98-
result
99-
end
100-
10172
function MP.monomials(vars::Tuple{Vararg{Variable}}, degree::Integer, filter::Function=m->true)
102-
checksorted(vars, >) || throw(ArgumentError("Variables must be in order"))
103-
Monomial{vars, length(vars)}[Monomial{vars}(p) for p in monomial_powers(Val{length(vars)}(), degree) if filter(Monomial{vars}(p))]
73+
return MP.monomials(vars, [degree], filter)
10474
end
10575

10676
function MP.monomials(vars::Tuple{Vararg{Variable}}, degrees::AbstractArray, filter::Function=m->true)
10777
checksorted(vars, >) || throw(ArgumentError("Variables must be in order"))
10878
if isempty(degrees)
10979
# Otherwise, the following error is thrown: "ArgumentError: argument to Flatten must contain at least one iterator"
110-
Monomial{vars, length(vars)}[]
111-
else
112-
Monomial{vars, length(vars)}[Monomial{vars}(p) for d in sort(degrees)
113-
for p in monomial_powers(Val{length(vars)}(), d) if filter(Monomial{vars}(p))]
80+
return Monomial{vars, length(vars)}[]
81+
end
82+
degs = sort(degrees)
83+
it = Iterators.Filter(MP.ExponentsIterator{MP.Graded{MP.LexOrder}}(
84+
zeros(Int, length(vars));
85+
mindegree = minimum(degrees),
86+
maxdegree = maximum(degrees),
87+
)) do p
88+
mono = Monomial{vars}(p)
89+
MP.degree(mono) in degs && filter(mono)
11490
end
91+
return Monomial{vars, length(vars)}[Monomial{vars}(p) for p in it]
11592
end
11693

11794
MP.promote_variables(a::MonomialLike, b::MonomialLike) = promote(a, b)

test/generators.jl

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
11
@testset "monomial generation" begin
22
@polyvar x y z
33

4-
@test TypedPolynomials.monomial_powers(Val{3}(), 3) == reverse([
5-
(3, 0, 0),
6-
(2, 1, 0),
7-
(2, 0, 1),
8-
(1, 2, 0),
9-
(1, 1, 1),
10-
(1, 0, 2),
11-
(0, 3, 0),
12-
(0, 2, 1),
13-
(0, 1, 2),
14-
(0, 0, 3),
15-
])
164
@test @inferred(monomials((x, y), 2)) == reverse([x^2, x * y, y^2])
175
@test @inferred(monomials((x, y), 0:2)) == reverse([x^2, x * y, y^2, x, y, 1])
186
@test @inferred(monomials((x, y), [1, 0, 2])) == reverse([x^2, x * y, y^2, x, y, 1])

0 commit comments

Comments
 (0)