From 78881e1d794ee9cab388f4818e3373193d9ed928 Mon Sep 17 00:00:00 2001 From: kalmarek Date: Sun, 5 Nov 2017 14:58:58 +0100 Subject: [PATCH] more economical generate_balls using Base.product --- src/Groups.jl | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/Groups.jl b/src/Groups.jl index 1983a3d..ca7e544 100644 --- a/src/Groups.jl +++ b/src/Groups.jl @@ -378,28 +378,12 @@ end # ############################################################################### -function products{T<:GroupElem}(X::AbstractVector{T}, Y::AbstractVector{T}, op=*) - result = Vector{T}() - seen = Set{T}() - for x in X - for y in Y - z = op(x,y) - if !in(z, seen) - push!(seen, z) - push!(result, z) - end - end - end - return result -end - -function generate_balls{T<:GroupElem}(S::Vector{T}, Id::T; radius=2, op=*) - sizes = Vector{Int}() - S = deepcopy(S) - S = unshift!(S, Id) +function generate_balls{T<:GroupElem}(S::Vector{T}, Id::T=parent(first(S))(); radius=2, op=*) + sizes = Int[] B = [Id] for i in 1:radius - B = products(B, S, op); + BB = [op(i,j) for (i,j) in Base.product(B,S)] + B = unique([B; vec(BB)]) push!(sizes, length(B)) end return B, sizes