From 1f1e51917a392feba759efb1b7227da148f332e4 Mon Sep 17 00:00:00 2001 From: Marek Kaluba Date: Wed, 22 Mar 2023 21:41:37 +0100 Subject: [PATCH] remove threaded wlmetric_ball * the threaded version was hardly faster * there was a memory leak (?) that was gone with -t 1 * simplifies the whole thing --- Project.toml | 5 ++-- src/Groups.jl | 5 +--- src/iteration.jl | 2 ++ src/wl_ball.jl | 72 ++++++++++++++---------------------------------- 4 files changed, 26 insertions(+), 58 deletions(-) diff --git a/Project.toml b/Project.toml index 6b177eb..6e57613 100644 --- a/Project.toml +++ b/Project.toml @@ -1,20 +1,19 @@ name = "Groups" uuid = "5d8bd718-bd84-11e8-3b40-ad14f4a32557" authors = ["Marek Kaluba "] -version = "0.7.5" +version = "0.7.6" [deps] -Folds = "41a02a25-b8f0-4f67-bc48-60067656b558" GroupsCore = "d5909c97-4eac-4ecc-a3dc-fdd0858a4120" KnuthBendix = "c2604015-7b3d-4a30-8a26-9074551ec60a" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" PermutationGroups = "8bc5a954-2dfc-11e9-10e6-cd969bffa420" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" [compat] -Folds = "0.2.7" GroupsCore = "0.4" KnuthBendix = "0.4" OrderedCollections = "1" diff --git a/src/Groups.jl b/src/Groups.jl index 96c7d09..9237429 100644 --- a/src/Groups.jl +++ b/src/Groups.jl @@ -1,12 +1,9 @@ module Groups -import Folds import Logging using GroupsCore -import GroupsCore.Random - -import OrderedCollections: OrderedSet +import Random import KnuthBendix import KnuthBendix: AbstractWord, Alphabet, Word diff --git a/src/iteration.jl b/src/iteration.jl index 210289b..e3028fb 100644 --- a/src/iteration.jl +++ b/src/iteration.jl @@ -1,3 +1,5 @@ +import OrderedCollections: OrderedSet + mutable struct FPGroupIter{S,T,GEl} seen::S seen_iter_state::T diff --git a/src/wl_ball.jl b/src/wl_ball.jl index ae8db7d..96b5984 100644 --- a/src/wl_ball.jl +++ b/src/wl_ball.jl @@ -1,6 +1,6 @@ """ wlmetric_ball(S::AbstractVector{<:GroupElem} - [, center=one(first(S)); radius=2, op=*, threading=true]) + [, center=one(first(S)); radius=2, op=*]) Compute metric ball as a list of elements of non-decreasing length, given the word-length metric on the group generated by `S`. The ball is centered at `center` (by default: the identity element). `radius` and `op` keywords specify the @@ -11,57 +11,27 @@ function wlmetric_ball( center::T = one(first(S)); radius = 2, op = *, - threading = true, ) where {T} - threading && return wlmetric_ball_thr(S, center; radius = radius, op = op) - return wlmetric_ball_serial(S, center; radius = radius, op = op) -end - -function wlmetric_ball_serial( - S::AbstractVector{T}, - center::T = one(first(S)); - radius = 2, - op = *, -) where {T} - @assert radius >= 1 - old = union!(OrderedSet([center]), [center * s for s in S]) - sizes = [1, length(old)] - for _ in 2:radius - new = collect( - op(o, s) for o in @view(old.dict.keys[sizes[end-1]:end]) for s in S - ) - union!(old, new) - push!(sizes, length(old)) - end - return old.dict.keys, sizes[2:end] -end - -function wlmetric_ball_thr( - S::AbstractVector{T}, - center::T = one(first(S)); - radius = 2, - op = *, -) where {T} - @assert radius >= 1 - old = union!([center], [center * s for s in S]) - return _wlmetric_ball(S, old, radius, op, Folds.collect, Folds.unique) -end - -function _wlmetric_ball(S, old, radius, op, collect, unique) - sizes = [1, length(old)] - for _ in 2:radius - old = let old = old, S = S - new = collect( - (g = op(o, s); - normalform!(g); - hash(g); - g) for o in @view(old[sizes[end-1]:end]) for s in S - ) - - append!(old, new) - unique(old) + ball = [center] + sizes = [1] + if radius ≤ 0 + return ball, sizes[2:end] + else + ball = union!(ball, [center * s for s in S]) + push!(sizes, length(ball)) + if radius == 1 + return ball, sizes[2:end] + else + for _ in 2:radius + new = collect( + op(o, s) for o in @view(ball[sizes[end-1]:end]) for s in S + ) + append!(ball, new) + unique!(ball) + push!(sizes, length(ball)) + end end - push!(sizes, length(old)) + return ball, sizes[2:end] end - return old, sizes[2:end] + # return wlmetric_ball_serial(S, center; radius = radius, op = op) end