Order spheres before points within each coordinate block

In the cases I've tried so far, this leads to substantially smaller
Gröbner bases.
This commit is contained in:
Aaron Fenyes 2024-02-01 16:13:22 -05:00
parent 65d23fb667
commit a3f3f6a31b
1 changed files with 18 additions and 7 deletions

View File

@ -118,28 +118,39 @@ equation(rel::AlignsWithBy) = mprod(rel.elements[1].vec, rel.elements[2].vec) -
# --- constructions --- # --- constructions ---
mutable struct Construction{T} mutable struct Construction{T}
elements::Set{Element{T}} points::Set{Point{T}}
spheres::Set{Sphere{T}}
relations::Set{Relation{T}} relations::Set{Relation{T}}
function Construction{T}(; elements = Set{Element{T}}(), relations = Set{Relation{T}}()) where T function Construction{T}(; elements = Set{Element{T}}(), relations = Set{Relation{T}}()) where T
allelements = union(elements, (rel.elements for rel in relations)...) allelements = union(elements, (rel.elements for rel in relations)...)
new{T}(allelements, relations) new{T}(
filter(elt -> isa(elt, Point), allelements),
filter(elt -> isa(elt, Sphere), allelements),
relations
)
end end
end end
function Base.push!(ctx::Construction{T}, elem::Element{T}) where T function Base.push!(ctx::Construction{T}, elem::Point{T}) where T
push!(ctx.elements, elem) push!(ctx.points, elem)
end
function Base.push!(ctx::Construction{T}, elem::Sphere{T}) where T
push!(ctx.spheres, elem)
end end
function Base.push!(ctx::Construction{T}, rel::Relation{T}) where T function Base.push!(ctx::Construction{T}, rel::Relation{T}) where T
push!(ctx.relations, rel) push!(ctx.relations, rel)
union!(ctx.elements, rel.elements) for elt in rel.elements
push!(ctx, elt)
end
end end
function realize(ctx::Construction{T}) where T function realize(ctx::Construction{T}) where T
# collect coordinate names # collect coordinate names
coordnamelist = Symbol[] coordnamelist = Symbol[]
elemenum = enumerate(ctx.elements) elemenum = enumerate(Iterators.flatten((ctx.spheres, ctx.points)))
for coordindex in 1:5 for coordindex in 1:5
for indexed_elem in elemenum for indexed_elem in elemenum
pushcoordname!(coordnamelist, indexed_elem, coordindex) pushcoordname!(coordnamelist, indexed_elem, coordindex)
@ -167,7 +178,7 @@ function realize(ctx::Construction{T}) where T
# turn relations into equations # turn relations into equations
eqns = vcat( eqns = vcat(
equation.(ctx.relations), equation.(ctx.relations),
[elem.rel for elem in ctx.elements if !isnothing(elem.rel)] [elem.rel for (_, elem) in elemenum if !isnothing(elem.rel)]
) )
Generic.Ideal(coordring, eqns) Generic.Ideal(coordring, eqns)
end end