From fcb57c3b4ebb7bbf25d50f9080766fce0f39f404 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Wed, 20 Nov 2019 12:29:01 -0500 Subject: [PATCH] working implementation --- CMakeLists.txt | 4 +++ main.cpp | 75 ++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21cba0a..8910e1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,5 +2,9 @@ cmake_minimum_required(VERSION 3.14) project(hpc) set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_FLAGS_RELEASE "-O2") + +find_package(OpenMP) add_executable(hpc main.cpp) +target_link_libraries(hpc PUBLIC OpenMP::OpenMP_CXX) diff --git a/main.cpp b/main.cpp index 08c777d..fa0419e 100644 --- a/main.cpp +++ b/main.cpp @@ -1,21 +1,25 @@ #include #include +#include +#include using Gens=std::vector; using Table=std::vector; -void pp(const Gens &g) { +void pp(const Gens &g, int w) { for (const auto &e : g) { - std::cout << e << " "; + std::cout << std::setw(w) << e << " "; } std::cout << std::endl; } void pp(const Table &t) { std::cout << "| table:" << std::endl; - for (const auto &g : t) { - std::cout << "| "; - pp(g); + int w = 3; + + for (size_t i = 0; i < t.size(); ++i) { + std::cout << std::setw(w) << i << " | "; + pp(t[i], w); } } @@ -41,8 +45,31 @@ void add_row(const int ngens, const std::vector &rels, } } +int add_coset(const int ngens, const std::vector &rels, + Table &cosets, std::vector &reltables, + Table &starts, Table &ends, + int coset_scan_hint) { + + int C = cosets.size(); + + for (int c = coset_scan_hint; c < C; ++c) { + std::vector &row = cosets[c]; + for (int g = 0; g < ngens; ++g) { + if (row[g] == -1) { + row[g] = C; + add_row(ngens, rels, cosets, reltables, starts, ends); + cosets[C][g] = c; + return c; + } + } + } + + return -1; +} + + /** - * @return true if anything was learned + * learn until it can't */ void learn(Table &coset, const std::vector &rels, std::vector
&reltables, Table &starts, Table &ends) { @@ -63,27 +90,28 @@ void learn(Table &coset, const std::vector &rels, if (s == e - 1) continue; - while (row[s] == -1) { - int &lookup = coset[row[s]][rel[s]]; + while (row[s + 1] == -1) { + const int &lookup = coset[row[s]][rel[s]]; if (lookup < 0) break; - row[s] = lookup; s++; + row[s] = lookup; } - while (row[e] == -1) { - int &lookup = coset[row[e]][rel[e - 1]]; + while (row[e - 1] == -1) { + const int &lookup = coset[row[e]][rel[e - 1]]; if (lookup < 0) break; - row[e] = lookup; e--; + row[e] = lookup; } if (s == e - 1) { complete = false; - coset[row[s]][rel[s]] = rel[row[e]]; - coset[row[e]][rel[s]] = rel[row[s]]; + const int &gen = rel[s]; + coset[row[s]][gen] = row[e]; + coset[row[e]][gen] = row[s]; } starts[r][c] = s; @@ -109,17 +137,30 @@ Table solve_tc(int ngens, const Gens &subgens, const std::vector &rels) { cosets[0][gen] = 0; } + int coset_scan_hint = 0; + while (coset_scan_hint >= 0) { + learn(cosets, rels, reltables, starts, ends); + coset_scan_hint = add_coset(ngens, rels, cosets, reltables, starts, ends, coset_scan_hint); + } + return cosets; } int main() { - auto cosets = solve_tc(3, {0, 1}, { - {0, 1, 0, 1, 0, 1, 0, 1}, + auto s = std::chrono::system_clock::now(); + auto cosets = solve_tc(4, {}, { + {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}, {1, 2, 1, 2, 1, 2}, + {2, 3, 2, 3, 2, 3}, {0, 2, 0, 2}, + {0, 3, 0, 3}, + {1, 3, 1, 3}, }); + auto e = std::chrono::system_clock::now(); + std::chrono::duration diff = e - s; + std::cout << diff.count() << "s" << std::endl; - pp(cosets); +// pp(cosets); return 0; }