Skip to content

Commit b240299

Browse files
committed
Refactor
1 parent 62a6a0f commit b240299

File tree

1 file changed

+12
-28
lines changed

1 file changed

+12
-28
lines changed

src/types.jl

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -76,42 +76,26 @@ function _error_for_negative_degree(deg)
7676
end
7777
end
7878

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-
10179
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))]
80+
return MP.monomials(vars, [degree], filter)
10481
end
10582

10683
function MP.monomials(vars::Tuple{Vararg{Variable}}, degrees::AbstractArray, filter::Function=m->true)
10784
checksorted(vars, >) || throw(ArgumentError("Variables must be in order"))
10885
if isempty(degrees)
10986
# 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))]
87+
return Monomial{vars, length(vars)}[]
88+
end
89+
d = sort(degrees)
90+
it = Iterators.Filter(MP.ExponentsIterator{MP.Graded{MP.LexOrder}}(
91+
zeros(Int, length(vars));
92+
mindegree = minimum(degrees),
93+
maxdegree = maximum(degrees),
94+
)) do p
95+
mono = Monomial{vars}(p)
96+
MP.degree(mono) in degs && filter(mono)
11497
end
98+
return Monomial{vars, length(vars)}[Monomial{vars}(p) for p in it]
11599
end
116100

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

0 commit comments

Comments
 (0)