diff --git a/CMakeLists.txt b/CMakeLists.txt index 8910e1e..f373893 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 2.8) project(hpc) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_FLAGS_RELEASE "-O2") +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_FLAGS_RELEASE "-O3") find_package(OpenMP) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e1f3c72 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +main: main.cpp + g++ -std=c++11 -O3 -fopenmp main.cpp -o main + +qsub: main + qsub -q mamba -l walltime=08:00:00 -l nodes=1:ppn=16 -d `pwd` run.sh diff --git a/main.cpp b/main.cpp index fa0419e..4be5f60 100644 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,8 @@ #include #include +#include + using Gens=std::vector; using Table=std::vector; @@ -79,6 +81,7 @@ void learn(Table &coset, const std::vector &rels, while (true) { bool complete = true; +#pragma omp parallel for schedule(static, 1) reduction(&:complete) for (unsigned int r = 0; r < nrels; ++r) { auto &table = reltables[r]; const auto &rel = rels[r]; @@ -146,21 +149,64 @@ Table solve_tc(int ngens, const Gens &subgens, const std::vector &rels) { return cosets; } -int main() { - 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; +struct Mult { + int from, to, multiplicity; +}; -// pp(cosets); +Table mults(std::vector ms) { + Table res; + for (const auto &m : ms) { + int N = res.size(); + res.emplace_back(m.multiplicity * 2, m.to); + for (int i = 0; i < m.multiplicity * 2; i += 2) { + res[N][i] = m.from; + } + } + return res; +} + +Table torus(int res) { + return mults({ + {0, 1, res}, + {1, 2, 2}, + {2, 3, res}, + {0, 2, 2}, + {0, 3, 2}, + {1, 3, 2}, + }); +} + +/* + * duododeca + * mults({ + * {0, 1, 5}, + * {1, 2, 3}, + * {2, 3, 3}, + * {0, 2, 2}, + * {0, 3, 2}, + * {1, 3, 2}, + * }) + */ + +int main(int argc, char *argv[]) { + if (argc < 2) { + std::cerr << "REEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" << std::endl; + std::cerr << "gimme more ~~tendies~~ arguments" << std::endl; + return 1; + } + + int N = std::strtol(argv[1], nullptr, 10); + + const Table &rels = torus(N); + + auto s = std::chrono::system_clock::now(); + auto cosets = solve_tc(4, {}, rels); + auto e = std::chrono::system_clock::now(); + + std::chrono::duration diff = e - s; + size_t order = cosets.size(); + + std::cout << N << "," << diff.count() << "," << order << std::endl; return 0; }