From 96b27cd64261694c83eda62606f6627117ce1e11 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Fri, 27 Dec 2019 17:06:25 -0500 Subject: [PATCH] split "cosets" and "solver" data. "solver.cpp" now only for solution logic. --- CMakeLists.txt | 2 +- include/cosets.h | 33 +++++++++++++++++++++++++++++++++ include/solver.h | 34 ++-------------------------------- src/cosets.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/solver.cpp | 41 ----------------------------------------- 5 files changed, 78 insertions(+), 74 deletions(-) create mode 100644 include/cosets.h create mode 100644 src/cosets.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 2960c18..1a3a77e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ project(tc) set(CMAKE_CXX_STANDARD 17) -add_library(tc STATIC src/groups.cpp src/solver.cpp) +add_library(tc STATIC src/groups.cpp src/solver.cpp src/cosets.cpp) target_include_directories(tc PUBLIC include) add_subdirectory(example) diff --git a/include/cosets.h b/include/cosets.h new file mode 100644 index 0000000..d6e5efe --- /dev/null +++ b/include/cosets.h @@ -0,0 +1,33 @@ +#pragma once + +#include "groups.h" +#include + +struct Cosets { + int ngens; + std::vector data; + int len; + + Cosets(int ngens, const std::vector &data); + + void add_row(); + + void put(int coset, int gen, int target); + + void put(int idx, int target); + + [[nodiscard]] int get(int coset, int gen) const; + + [[nodiscard]] int get(int idx) const; +}; + +struct RelTable { + int gens[2]{}; + int mult; + std::vector lst_ptr; + std::vector gen; + + explicit RelTable(tc::Mult m); + + int add_row(); +}; diff --git a/include/solver.h b/include/solver.h index af19a3c..d4f8424 100644 --- a/include/solver.h +++ b/include/solver.h @@ -1,37 +1,7 @@ #pragma once -#include "groups.h" -#include +#include "cosets.h" namespace tc { - struct Cosets { - int ngens; - std::vector data; - int len; - - Cosets(int ngens, const std::vector &data); - - void add_row(); - - void put(int coset, int gen, int target); - - void put(int idx, int target); - - [[nodiscard]] int get(int coset, int gen) const; - - [[nodiscard]] int get(int idx) const; - }; - - struct RelTable { - int gens[2]{}; - int mult; - std::vector lst_ptr; - std::vector gen; - - explicit RelTable(Mult m); - - int add_row(); - }; - Cosets solve(const Group &g, const std::vector &sub_gens = {}); -} \ No newline at end of file +} diff --git a/src/cosets.cpp b/src/cosets.cpp new file mode 100644 index 0000000..5f5db61 --- /dev/null +++ b/src/cosets.cpp @@ -0,0 +1,42 @@ +#include "cosets.h" + +Cosets::Cosets(int ngens, const std::vector &data) : ngens(ngens), data(data) { + len = data.size() / ngens; +} + +void Cosets::add_row() { + len++; + data.resize(data.size() + ngens, -1); +} + +void Cosets::put(int coset, int gen, int target) { + data[coset * ngens + gen] = target; + data[target * ngens + gen] = coset; +} + +void Cosets::put(int idx, int target) { + int coset = idx / ngens; + int gen = idx % ngens; + data[idx] = target; + data[target * ngens + gen] = coset; +} + +int Cosets::get(int coset, int gen) const { + return data[coset * ngens + gen]; +} + +int Cosets::get(int idx) const { + return data[idx]; +} + +RelTable::RelTable(tc::Mult m) : mult(m.mult) { + gens[0] = m.gen0; + gens[1] = m.gen1; +} + +int RelTable::add_row() { + int idx = lst_ptr.size(); + lst_ptr.push_back(nullptr); + gen.push_back(-1); + return idx; +} \ No newline at end of file diff --git a/src/solver.cpp b/src/solver.cpp index 09a71cd..1cc41b3 100644 --- a/src/solver.cpp +++ b/src/solver.cpp @@ -4,47 +4,6 @@ #include namespace tc { - Cosets::Cosets(int ngens, const std::vector &data) : ngens(ngens), data(data) { - len = data.size() / ngens; - } - - void Cosets::add_row() { - len++; - data.resize(data.size() + ngens, -1); - } - - void Cosets::put(int coset, int gen, int target) { - data[coset * ngens + gen] = target; - data[target * ngens + gen] = coset; - } - - void Cosets::put(int idx, int target) { - int coset = idx / ngens; - int gen = idx % ngens; - data[idx] = target; - data[target * ngens + gen] = coset; - } - - int Cosets::get(int coset, int gen) const { - return data[coset * ngens + gen]; - } - - int Cosets::get(int idx) const { - return data[idx]; - } - - RelTable::RelTable(Mult m) : mult(m.mult) { - gens[0] = m.gen0; - gens[1] = m.gen1; - } - - int RelTable::add_row() { - int idx = lst_ptr.size(); - lst_ptr.push_back(nullptr); - gen.push_back(-1); - return idx; - } - Cosets solve(const Group &group, const std::vector &sub_gens) { std::vector init_row(group.ngens, -1); for (int i : sub_gens) {