@@ -219,6 +219,21 @@ function Base.convert(
219
219
return BasisDependence {StaircaseDependence} (d, d. basis)
220
220
end
221
221
222
+ _full_basis (basis:: MB.AbstractPolynomialBasis ) = basis, eachindex (basis)
223
+
224
+ function _full_basis (basis:: MB.AbstractMonomialBasis )
225
+ full = MB. maxdegree_basis (
226
+ typeof (basis),
227
+ MP. variables (basis),
228
+ MP. maxdegree (basis. monomials),
229
+ )
230
+ index_map = Int[
231
+ something (_index (basis, full[i]), 0 )
232
+ for i in eachindex (full)
233
+ ]
234
+ return full, index_map
235
+ end
236
+
222
237
"""
223
238
function BasisDependence{StaircaseDependence}(
224
239
is_dependent::Function,
@@ -236,40 +251,39 @@ Foundations of Computational Mathematics 8 (2008): 607-647.
236
251
"""
237
252
function BasisDependence {StaircaseDependence} (
238
253
r,
239
- basis:: MB.MonomialBasis{M} ,
240
- ) where {M}
241
- if isempty (basis. monomials )
254
+ basis:: MB.AbstractPolynomialBasis ,
255
+ )
256
+ if isempty (basis)
242
257
return BasisDependence (basis, StaircaseDependence[])
243
258
end
244
- function dependence (mono)
245
- i = _index (basis, mono)
259
+ vars = MP. variables (basis)
260
+ full_basis, index_map = _full_basis (basis)
261
+ function dependence (full_index)
262
+ i = index_map[full_index]
246
263
return if isnothing (i)
247
264
TRIVIAL
248
265
else
249
266
is_dependent! (r, i) ? DEPENDENT : INDEPENDENT
250
267
end
251
268
end
252
- vars = MP. variables (basis)
253
- full_basis =
254
- MB. maxdegree_basis (typeof (basis), vars, MP. maxdegree (basis. monomials))
255
269
d = StaircaseDependence[]
256
270
# This sieve of [LLR08, Algorithm 1] is a performance improvement but not only.
257
271
# It also ensures that the standard monomials have the "staircase structure".
258
272
function is_corner_multiple (mono, indices, dependence)
259
273
for i in eachindex (dependence)
260
274
if is_dependent (dependence[i]) &&
261
- MP. divides (full_basis. monomials[indices[i]], mono)
275
+ MP. divides (full_basis. monomials[indices[i]], mono) # TODO tol
262
276
return true
263
277
end
264
278
end
265
279
return false
266
280
end
267
281
keep = Int[]
268
282
# Compute standard monomials and corners
269
- for (i, mono) in enumerate (full_basis. monomials )
270
- if ! is_corner_multiple (mono , keep, d)
283
+ for i in eachindex (full_basis)
284
+ if ! is_corner_multiple (full_basis[i] , keep, d)
271
285
push! (keep, i)
272
- push! (d, StaircaseDependence (true , dependence (mono )))
286
+ push! (d, StaircaseDependence (true , dependence (i )))
273
287
end
274
288
end
275
289
full_basis = typeof (full_basis)(full_basis. monomials[keep])
0 commit comments