From 3c3cd69be72f2e5bf20bad0a3a914ee77fab6c88 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Fri, 3 Jan 2020 22:37:11 -0500 Subject: [PATCH] Add spanning tree path to cosets. --- example/CMakeLists.txt | 3 +++ example/path.cpp | 17 +++++++++++++++++ include/cosets.h | 7 ++++++- src/cosets.cpp | 9 +++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 example/path.cpp diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index d140f0d..8d87503 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,2 +1,5 @@ add_executable(bench bench.cpp) target_link_libraries(bench PRIVATE tc) + +add_executable(path path.cpp) +target_link_libraries(path PRIVATE tc) diff --git a/example/path.cpp b/example/path.cpp new file mode 100644 index 0000000..3664a0f --- /dev/null +++ b/example/path.cpp @@ -0,0 +1,17 @@ +#include "solver.h" +#include "groups.h" + +#include +#include + +int main() { + auto cube = tc::group::B(3); + auto vars = tc::solve(cube, {}); + + for (int target = 1; target < vars.len; target++) { + auto &action = vars.path[target]; + std::cout << action.coset << " " << action.gen << " " << target << std::endl; + } + + return 0; +} diff --git a/include/cosets.h b/include/cosets.h index 94fe04e..ecb6b2e 100644 --- a/include/cosets.h +++ b/include/cosets.h @@ -4,9 +4,15 @@ #include namespace tc { + struct Action { + int coset = -1; + int gen = -1; + }; + struct Cosets { int ngens; std::vector data; + std::vector path; int len; explicit Cosets(int ngens); @@ -21,5 +27,4 @@ namespace tc { [[nodiscard]] int get(int idx) const; }; - } \ No newline at end of file diff --git a/src/cosets.cpp b/src/cosets.cpp index 7e3cd29..029a9b6 100644 --- a/src/cosets.cpp +++ b/src/cosets.cpp @@ -7,11 +7,16 @@ namespace tc { void Cosets::add_row() { len++; data.resize(data.size() + ngens, -1); + path.resize(path.size() + 1); } void Cosets::put(int coset, int gen, int target) { data[coset * ngens + gen] = target; data[target * ngens + gen] = coset; + + if (path[target].coset == -1) { + path[target] = {coset, gen}; + } } void Cosets::put(int idx, int target) { @@ -19,6 +24,10 @@ namespace tc { int gen = idx % ngens; data[idx] = target; data[target * ngens + gen] = coset; + + if (path[target].coset == -1) { + path[target] = {coset, gen}; + } } int Cosets::get(int coset, int gen) const {