From d36c949d36f8bc4c644cfc9cab72249cb0a962e8 Mon Sep 17 00:00:00 2001 From: kalmarek Date: Wed, 18 Dec 2019 00:33:01 +0100 Subject: [PATCH] add magma representations && parsing --- data/presentations_3_3_4.txt | 123 +++++++++++++++++++++++++++++++++++ data/presentations_3_4_4.txt | 84 ++++++++++++++++++++++++ data/presentations_4_4_4.txt | 27 ++++++++ src/groupparse.jl | 51 +++++++++++++++ 4 files changed, 285 insertions(+) create mode 100644 data/presentations_3_3_4.txt create mode 100644 data/presentations_3_4_4.txt create mode 100644 data/presentations_4_4_4.txt create mode 100644 src/groupparse.jl diff --git a/data/presentations_3_3_4.txt b/data/presentations_3_3_4.txt new file mode 100644 index 0000000..80e9e09 --- /dev/null +++ b/data/presentations_3_3_4.txt @@ -0,0 +1,123 @@ +// 14 14 40 0 4 +G_0 := Group; +G_4 := Group; +// 14 14 48 0 1 4 5 +G_0 := Group; +G_1 := Group; +G_4 := Group; +G_5 := Group; +// 14 14 54 0 4 +G_0 := Group; +G_4 := Group; +// 14 16 40 0 +G_0 := Group; +// 14 16 48 0 1 +G_0 := Group; +G_1 := Group; +// 14 16 54 0 2 +G_0 := Group; +G_2 := Group; +// 14 18 40 0 +G_0 := Group; +// 14 18 48 0 +G_0 := Group; +// 14 18 54 0 2 +G_0 := Group; +G_2 := Group; +// 14 24 40 0 +G_0 := Group; +// 14 24 48 0 1 +G_0 := Group; +G_1 := Group; +// 14 24 54 0 2 +G_0 := Group; +G_2 := Group; +// 14 26 40 0 4 +G_0 := Group; +G_4 := Group; +// 14 26 48 0 1 4 5 +G_0 := Group; +G_1 := Group; +G_4 := Group; +G_5 := Group; +// 14 26 54 0 2 4 6 +G_0 := Group; +G_2 := Group; +G_4 := Group; +G_6 := Group; +// 16 16 40 0 +G_0 := Group; +// 16 16 48 0 1 +G_0 := Group; +G_1 := Group; +// 16 16 54 0 +G_0 := Group; +// 16 18 40 0 +G_0 := Group; +// 16 18 48 0 +G_0 := Group; +// 16 18 54 0 2 +G_0 := Group; +G_2 := Group; +// 16 24 40 0 +G_0 := Group; +// 16 24 48 0 1 +G_0 := Group; +G_1 := Group; +// 16 24 54 0 2 +G_0 := Group; +G_2 := Group; +// 16 26 40 0 +G_0 := Group; +// 16 26 48 0 1 +G_0 := Group; +G_1 := Group; +// 16 26 54 0 2 +G_0 := Group; +G_2 := Group; +// 18 18 40 0 +G_0 := Group; +// 18 18 48 0 +G_0 := Group; +// 18 18 54 0 +G_0 := Group; +// 18 24 40 0 +G_0 := Group; +// 18 24 48 0 +G_0 := Group; +// 18 24 54 0 2 +G_0 := Group; +G_2 := Group; +// 18 26 40 0 +G_0 := Group; +// 18 26 48 0 +G_0 := Group; +// 18 26 54 0 2 +G_0 := Group; +G_2 := Group; +// 24 24 40 0 +G_0 := Group; +// 24 24 48 0 1 +G_0 := Group; +G_1 := Group; +// 24 24 54 0 +G_0 := Group; +// 24 26 40 0 +G_0 := Group; +// 24 26 48 0 1 +G_0 := Group; +G_1 := Group; +// 24 26 54 0 2 +G_0 := Group; +G_2 := Group; +// 26 26 40 0 4 +G_0 := Group; +G_4 := Group; +// 26 26 48 0 1 4 5 +G_0 := Group; +G_1 := Group; +G_4 := Group; +G_5 := Group; +// 26 26 54 0 4 +G_0 := Group; +G_4 := Group; diff --git a/data/presentations_3_4_4.txt b/data/presentations_3_4_4.txt new file mode 100644 index 0000000..4eb85ea --- /dev/null +++ b/data/presentations_3_4_4.txt @@ -0,0 +1,84 @@ +// 14 40 40 0 +G_0 := Group; +// 14 40 48 0 +G_0 := Group; +// 14 40 54 0 2 +G_0 := Group; +G_2 := Group; +// 14 48 48 0 1 +G_0 := Group; +G_1 := Group; +// 14 48 54 0 2 +G_0 := Group; +G_2 := Group; +// 14 54 54 0 2 8 +G_0 := Group; +G_2 := Group; +G_8 := Group; +// 16 40 40 0 +G_0 := Group; +// 16 40 48 0 +G_0 := Group; +// 16 40 54 0 2 +G_0 := Group; +G_2 := Group; +// 16 48 48 0 1 +G_0 := Group; +G_1 := Group; +// 16 48 54 0 2 +G_0 := Group; +G_2 := Group; +// 16 54 54 0 2 8 +G_0 := Group; +G_2 := Group; +G_8 := Group; +// 18 40 40 0 +G_0 := Group; +// 18 40 48 0 +G_0 := Group; +// 18 40 54 0 2 +G_0 := Group; +G_2 := Group; +// 18 48 48 0 +G_0 := Group; +// 18 48 54 0 2 +G_0 := Group; +G_2 := Group; +// 18 54 54 0 2 8 +G_0 := Group; +G_2 := Group; +G_8 := Group; +// 24 40 40 0 +G_0 := Group; +// 24 40 48 0 +G_0 := Group; +// 24 40 54 0 2 +G_0 := Group; +G_2 := Group; +// 24 48 48 0 1 +G_0 := Group; +G_1 := Group; +// 24 48 54 0 2 +G_0 := Group; +G_2 := Group; +// 24 54 54 0 2 8 +G_0 := Group; +G_2 := Group; +G_8 := Group; +// 26 40 40 0 +G_0 := Group; +// 26 40 48 0 +G_0 := Group; +// 26 40 54 0 2 +G_0 := Group; +G_2 := Group; +// 26 48 48 0 1 +G_0 := Group; +G_1 := Group; +// 26 48 54 0 2 +G_0 := Group; +G_2 := Group; +// 26 54 54 0 2 8 +G_0 := Group; +G_2 := Group; +G_8 := Group; diff --git a/data/presentations_4_4_4.txt b/data/presentations_4_4_4.txt new file mode 100644 index 0000000..df68da2 --- /dev/null +++ b/data/presentations_4_4_4.txt @@ -0,0 +1,27 @@ +// 40 40 40 0 +G_0 := Group; +// 40 40 48 0 +G_0 := Group; +// 40 40 54 0 +G_0 := Group; +// 40 48 48 0 +G_0 := Group; +// 40 48 54 0 2 +G_0 := Group; +G_2 := Group; +// 40 54 54 0 2 8 +G_0 := Group; +G_2 := Group; +G_8 := Group; +// 48 48 48 0 1 +G_0 := Group; +G_1 := Group; +// 48 48 54 0 +G_0 := Group; +// 48 54 54 0 2 8 +G_0 := Group; +G_2 := Group; +G_8 := Group; +// 54 54 54 0 2 +G_0 := Group; +G_2 := Group; diff --git a/src/groupparse.jl b/src/groupparse.jl new file mode 100644 index 0000000..1790678 --- /dev/null +++ b/src/groupparse.jl @@ -0,0 +1,51 @@ +function parse_magma_grouppresentation(str::AbstractString) + m = match(r".*Group<(.*)\|(.*)>", str) + gens_str = strip.(split(m.captures[1], ", ")) + rels_str = strip.(split(m.captures[2], ", ")) + return parse_magma_grouppresentation(gens_str, rels_str) +end + +parse_magma_grouppresentation(gens_str::AbstractString, rels_str::AbstractString) = + parse_magma_grouppresentation( + strip.(split(gens_str, ", ")), + strip.(split(rels_str, ", ")) + ) + +function parse_magma_grouppresentation(gens_str::AbstractVector{<:AbstractString}, rels_str::AbstractVector{<:AbstractString}) + rels_expr = Meta.parse.(rels_str) + expr = :([$(rels_expr...)]) + + F = FreeGroup(String.(gens_str)) + relations = @eval begin + a,b,c = AbstractAlgebra.gens($F) + $expr + end + + return F/relations +end + +function parse_grouppresentations(filename::AbstractString) + groups_strs = readlines(filename) + groups = Dict{String, FPGroup}() + + names_idcs = findall(x->startswith(x, "//"), groups_strs) + push!(names_idcs, names_idcs[end]+1) + + for (first_idx, next_idx) in zip(names_idcs, Iterators.rest(names_idcs, 2)) + + m = match(r"//\s?((\d{2}\s){2}\d\d).*", groups_strs[first_idx]) + + name = replace(m.captures[1], " "=>"_") + for idx in first_idx+1:next_idx-1 + m = match(r"(.*)\s:=\sGroup<(.*)\|(.*)>", groups_strs[idx]) + if isnothing(m) + @warn "Can't parse presentation at line $idx:\n $(str[idx])" + else + group_name = "$(name)_$(m.captures[1])" + G = parse_magma_grouppresentation(m.captures[2], m.captures[3]) + groups[group_name] = G + end + end + end + return groups +end