@@ -12,9 +12,6 @@ struct MonomialVector{V,M} <: AbstractVector{Monomial{V,M}}
12
12
@assert ! iscomm (V) || issorted (vars, rev = true )
13
13
@assert all (z -> length (z) == length (vars), Z)
14
14
15
- _isless = let M = M
16
- (a, b) -> MP. compare (a, b, M) < 0
17
- end
18
15
return new {V,M} (vars, Z)
19
16
end
20
17
end
@@ -125,68 +122,126 @@ function _error_for_negative_degree(deg)
125
122
end
126
123
end
127
124
128
- function fillZfordeg! (Z, n, deg, :: Type{Commutative} , filter:: Function , :: Int )
125
+ const _Lex = Union{MP. LexOrder,MP. InverseLexOrder}
126
+
127
+ _last_lex_index (n, :: Type{MP.LexOrder} ) = n
128
+ _prev_lex_index (i, :: Type{MP.LexOrder} ) = i - 1
129
+ _not_first_indices (n, :: Type{MP.LexOrder} ) = n: - 1 : 2
130
+ _last_lex_index (_, :: Type{MP.InverseLexOrder} ) = 1
131
+ _prev_lex_index (i, :: Type{MP.InverseLexOrder} ) = i + 1
132
+ _not_first_indices (n, :: Type{MP.InverseLexOrder} ) = 1 : (n- 1 )
133
+
134
+ function _fill_exponents! (Z, n, degs, :: Type{Commutative} , M:: Type{<:_Lex} , filter:: Function )
135
+ _error_for_negative_degree .(degs)
136
+ maxdeg = maximum (degs, init = 0 )
137
+ I = _not_first_indices (n, M)
138
+ z = zeros (Int, n)
139
+ while true
140
+ deg = sum (z)
141
+ if deg in degs && filter (z)
142
+ push! (Z, z)
143
+ z = copy (z)
144
+ end
145
+ if deg == maxdeg
146
+ i = findfirst (i -> ! iszero (z[i]), I)
147
+ if isnothing (i)
148
+ break
149
+ end
150
+ j = I[i]
151
+ z[j] = 0
152
+ z[_prev_lex_index (j, M)] += 1
153
+ else
154
+ z[_last_lex_index (n, M)] += 1
155
+ end
156
+ end
157
+ end
158
+
159
+ function _fill_exponents! (Z, n, deg, :: Type{Commutative} , M:: Type{<:_Lex} , filter:: Function , :: Int )
129
160
_error_for_negative_degree (deg)
161
+ I = _not_first_indices (n, M)
130
162
z = zeros (Int, n)
131
- z[end ] = deg
163
+ z[_last_lex_index (n, M) ] = deg
132
164
while true
133
165
if filter (z)
134
166
push! (Z, z)
135
167
z = copy (z)
136
168
end
137
- if z[1 ] == deg
169
+ i = findfirst (i -> ! iszero (z[i]), I)
170
+ if isnothing (i)
138
171
break
139
172
end
140
- i = findfirst (i -> ! iszero (z[i]), n: - 1 : 2 )
141
- j = (n: - 1 : 2 )[i]
173
+ j = I[i]
142
174
p = z[j]
143
175
z[j] = 0
144
- z[end ] = p - 1
145
- z[j - 1 ] += 1
176
+ z[_last_lex_index (n, M) ] = p - 1
177
+ z[_prev_lex_index (j, M) ] += 1
146
178
end
147
179
end
148
- function fillZrec! (Z, z, i, n, deg, filter:: Function )
180
+
181
+ function _fill_noncomm_exponents_rec! (Z, z, i, n, deg, :: Type{MP.LexOrder} , filter:: Function )
149
182
if deg == 0
150
183
if filter (z)
151
184
push! (Z, copy (z))
152
185
end
153
186
else
154
187
for i in i: i+ n- 1
155
188
z[i] += 1
156
- fillZrec ! (Z, z, i, n, deg - 1 , filter)
189
+ _fill_noncomm_exponents_rec ! (Z, z, i, n, deg - 1 , LexOrder , filter)
157
190
z[i] -= 1
158
191
end
159
192
end
160
193
end
161
- function fillZfordeg! (
194
+
195
+ function _fill_exponents! (
162
196
Z,
163
197
n,
164
198
deg,
165
199
:: Type{NonCommutative} ,
200
+ :: Type{MP.LexOrder} ,
166
201
filter:: Function ,
167
202
maxdeg:: Int ,
168
203
)
169
204
_error_for_negative_degree (deg)
170
205
_error_for_negative_degree (maxdeg)
171
206
z = zeros (Int, maxdeg * n - maxdeg + 1 )
172
207
start = length (Z) + 1
173
- fillZrec ! (Z, z, 1 , n, deg, filter)
208
+ _fill_noncomm_exponents_rec ! (Z, z, 1 , n, deg, MP . LexOrder , filter)
174
209
return reverse! (view (Z, start: length (Z)))
175
210
end
176
- # List exponents in decreasing Graded Lexicographic Order
177
- function getZfordegs (
211
+
212
+ function _fill_exponents! (Z, n, deg, :: Type{V} , :: Type{MP.Reverse{M}} , args... ) where {V,M}
213
+ prev = lastindex (Z)
214
+ _fill_exponents! (Z, n, deg, V, M, args... )
215
+ reverse! (view (Z, (prev + 1 ): lastindex (Z)))
216
+ return
217
+ end
218
+
219
+ function _fill_exponents! (
220
+ Z:: Vector{Vector{Int}} ,
178
221
n,
179
222
degs:: AbstractVector{Int} ,
180
223
:: Type{V} ,
181
- :: Type{M } ,
224
+ :: Type{MP.Graded{M} } ,
182
225
filter:: Function ,
183
226
) where {V,M}
184
- Z = Vector {Vector{Int}} ()
185
227
# For non-commutative, lower degree need to create a vector of exponent as large as for the highest degree
186
- maxdeg = isempty (degs) ? 0 : maximum (degs )
228
+ maxdeg = maximum (degs, init = 0 )
187
229
for deg in sort (degs)
188
- fillZfordeg ! (Z, n, deg, V, filter, maxdeg)
230
+ _fill_exponents ! (Z, n, deg, V, M , filter, maxdeg)
189
231
end
232
+ return
233
+ end
234
+
235
+ # List exponents in decreasing Graded Lexicographic Order
236
+ function _all_exponents (
237
+ n,
238
+ degs:: AbstractVector{Int} ,
239
+ :: Type{V} ,
240
+ :: Type{M} ,
241
+ filter:: Function ,
242
+ ) where {V,M}
243
+ Z = Vector {Vector{Int}} ()
244
+ _fill_exponents! (Z, n, degs, V, M, filter)
190
245
_isless = let M = M
191
246
(a, b) -> MP. compare (a, b, M) < 0
192
247
end
@@ -202,7 +257,7 @@ function MonomialVector(
202
257
vars = unique! (sort (vars, rev = true ))
203
258
return MonomialVector (
204
259
vars,
205
- getZfordegs (
260
+ _all_exponents (
206
261
length (vars),
207
262
degs,
208
263
Commutative,
@@ -222,7 +277,7 @@ function MonomialVector(
222
277
filter:: Function = x -> true ,
223
278
) where {M}
224
279
vars = unique! (sort (vars, rev = true ))
225
- Z = getZfordegs (
280
+ Z = _all_exponents (
226
281
length (vars),
227
282
degs,
228
283
NonCommutative,
@@ -248,11 +303,11 @@ function MP.monomials(vars::Tuple{Vararg{Variable}}, args...)
248
303
end
249
304
250
305
# function MP.monomials(vars::TupOrVec{Variable{true}}, degs::AbstractVector{Int}, filter::Function = x->true)
251
- # Z = getZfordegs (length(vars), degs, true, z -> filter(Monomial(vars, z)))
306
+ # Z = _all_exponents (length(vars), degs, true, z -> filter(Monomial(vars, z)))
252
307
# [Monomial{true}(vars, z) for z in Z]
253
308
# end
254
309
# function MP.monomials(vars::TupOrVec{<:Variable{<:NonCommutative}}, degs::AbstractVector{Int}, filter::Function = x->true)
255
- # Z = getZfordegs (length(vars), degs, false, z -> filter(Monomial(vars, z)))
310
+ # Z = _all_exponents (length(vars), degs, false, z -> filter(Monomial(vars, z)))
256
311
# v = isempty(Z) ? vars : getvarsforlength(vars, length(first(Z)))
257
312
# [Monomial(v, z) for z in Z]
258
313
# end
0 commit comments