From 0963c445d3c521a25de21df62f4bf574a1eac9ad Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 12 Sep 2019 19:30:26 -0400 Subject: [PATCH 1/6] rows working correctly --- cosets/CMakeLists.txt | 2 ++ cosets/src/main.cpp | 18 ++++++------- cosets/src/tc.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 cosets/src/tc.cpp diff --git a/cosets/CMakeLists.txt b/cosets/CMakeLists.txt index dfa29e2..c8cf75b 100644 --- a/cosets/CMakeLists.txt +++ b/cosets/CMakeLists.txt @@ -15,3 +15,5 @@ add_custom_command( ${CMAKE_CURRENT_SOURCE_DIR}/src/shaders ${CMAKE_CURRENT_BINARY_DIR}/shaders ) + +add_executable(coxeter src/tc.cpp) diff --git a/cosets/src/main.cpp b/cosets/src/main.cpp index 8531459..de0e007 100644 --- a/cosets/src/main.cpp +++ b/cosets/src/main.cpp @@ -29,16 +29,16 @@ public: program = build_program("main", vs, fs); - float verts_data[4 * VERTS_N]{ - +.5f, +.5f, 0.f, 0.f, - +.5f, -.5f, 0.f, 0.f, - -.5f, -.5f, 0.f, -.1f, - -.5f, +.5f, 0.f, -.1f, + glm::vec4 verts_data[VERTS_N]{ + {+0.5, +0.5, +0.5, +0.0}, + {+0.5, -0.5, +0.5, +0.0}, + {-0.5, -0.5, +0.5, +0.0}, + {-0.5, +0.5, +0.5, +0.0}, - +.5f, +.5f, 0.f, .1f, - +.5f, -.5f, 0.f, .1f, - -.5f, -.5f, 0.2f, .0f, - -.5f, +.5f, 0.2f, .0f, + {+0.5, +0.5, +0.5, -0.5}, + {+0.5, -0.5, +0.5, -0.5}, + {-0.5, -0.5, +0.5, +0.5}, + {-0.5, +0.5, +0.5, +0.5}, }; glGenBuffers(1, &verts); diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp new file mode 100644 index 0000000..fa2b5b7 --- /dev/null +++ b/cosets/src/tc.cpp @@ -0,0 +1,62 @@ +#include +#include + +struct Row { + std::vector::const_iterator l; + std::vector::const_iterator r; + + int from; + int to; + + Row(const std::vector &vec, int from, int to) { + this->l = vec.begin(); + this->r = vec.end(); + this->from = from; + this->to = to; + } +}; + +std::ostream &operator<<(std::ostream &out, const Row &row) { + out << "[ " << row.from << " | "; + auto it = row.l; + while (it != row.r) { + out << *it << " "; + it++; + } + out << "| " << row.to << " ]"; + return out; +} + +int main(int argc, char *argv[]) { + int gens = 2; + std::vector> ids{ + {0, 0}, + {1, 1}, + {0, 1, 0, 1, 0, 1} + }; + + std::vector &id = ids[2]; + Row row(id, 8, 9); + + std::cout << row << std::endl; + + row.l++; + row.from = 6; + + std::cout << row << std::endl; + +// std::vector> vecs{ +// {'a', 'o', 'e', 'u'}, +// {'p'}, +// {'q', 'j', 'k'}, +// }; +// +// for (const auto& vec : vecs) { +// for (const auto& ch : vec) { +// std::cout << ch; +// } +// std::cout << std::endl; +// } + + return 0; +} \ No newline at end of file From c9a50d540d01645f2bd27f3abf60341e287d7dca Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 12 Sep 2019 20:31:16 -0400 Subject: [PATCH 2/6] created table class --- cosets/src/tc.cpp | 65 +++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp index fa2b5b7..63d0262 100644 --- a/cosets/src/tc.cpp +++ b/cosets/src/tc.cpp @@ -1,6 +1,11 @@ #include #include +struct Row; + +template +struct Table; + struct Row { std::vector::const_iterator l; std::vector::const_iterator r; @@ -16,6 +21,16 @@ struct Row { } }; +template +struct Table { + std::vector> fwd; + std::vector> rev; + + void add_row() { + fwd.push_back(std::vector(N)); + } +}; + std::ostream &operator<<(std::ostream &out, const Row &row) { out << "[ " << row.from << " | "; auto it = row.l; @@ -27,6 +42,28 @@ std::ostream &operator<<(std::ostream &out, const Row &row) { return out; } +template +std::ostream &operator<<(std::ostream &out, const Table &table) { + out << "["; + for (int j = 0; j < table.fwd.size(); ++j) { + auto arr = table.fwd[j]; + out << "["; + for (int i = 0; i < N; ++i) { + out << arr[i]; + + if (i < N - 1) + out << " "; + } + + out << "]"; + if (j < table.fwd.size() - 1) + out << "\n "; + } + out << "]\n"; + + return out; +} + int main(int argc, char *argv[]) { int gens = 2; std::vector> ids{ @@ -35,28 +72,12 @@ int main(int argc, char *argv[]) { {0, 1, 0, 1, 0, 1} }; - std::vector &id = ids[2]; - Row row(id, 8, 9); - - std::cout << row << std::endl; - - row.l++; - row.from = 6; - - std::cout << row << std::endl; - -// std::vector> vecs{ -// {'a', 'o', 'e', 'u'}, -// {'p'}, -// {'q', 'j', 'k'}, -// }; -// -// for (const auto& vec : vecs) { -// for (const auto& ch : vec) { -// std::cout << ch; -// } -// std::cout << std::endl; -// } + Table<3> table; + table.add_row(); + table.add_row(); + table.add_row(); + table.add_row(); + std::cout << table; return 0; } \ No newline at end of file From f494025f6a740387c97ed47db1c775ba832ee5f7 Mon Sep 17 00:00:00 2001 From: allem Date: Thu, 12 Sep 2019 21:37:56 -0400 Subject: [PATCH 3/6] row learns from table --- .idea/cosets.iml | 2 - .idea/misc.xml | 15 -------- .idea/modules.xml | 8 ---- .idea/vcs.xml | 6 --- cosets/src/tc.cpp | 98 ++++++++++++++++++++++++++++++++++++++++++----- 5 files changed, 89 insertions(+), 40 deletions(-) delete mode 100644 .idea/cosets.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/cosets.iml b/.idea/cosets.iml deleted file mode 100644 index f08604b..0000000 --- a/.idea/cosets.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 9bb8048..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 44442b6..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp index 63d0262..63f83e1 100644 --- a/cosets/src/tc.cpp +++ b/cosets/src/tc.cpp @@ -1,11 +1,13 @@ #include #include +template struct Row; template struct Table; +template struct Row { std::vector::const_iterator l; std::vector::const_iterator r; @@ -15,10 +17,37 @@ struct Row { Row(const std::vector &vec, int from, int to) { this->l = vec.begin(); - this->r = vec.end(); + this->r = vec.end() - 1; this->from = from; this->to = to; } + + bool learn(Table &table) { + if (r - l == 0) { + return false; + } + + while (r - l > 0) { + int next = table.get(from, *l); + if (next < 0) break; + l++; + from = next; + } + + while (r - l > 0) { + int next = table.rget(*r, to); + if (next < 0) break; + r--; + to = next; + } + + if (r - l == 0) { + table.set(from, *l, to); + return true; + } + + return false; + } }; template @@ -26,15 +55,52 @@ struct Table { std::vector> fwd; std::vector> rev; + Table() { + add_row(); + } + void add_row() { - fwd.push_back(std::vector(N)); + fwd.push_back(std::vector(N, -1)); + rev.push_back(std::vector(N, -1)); + } + + int add_coset() { + for (int from = 0; from < size(); ++from) { + for (int gen = 0; gen < N; ++gen) { + if (get(from, gen) < 0) { + int to = size(); + add_row(); + set(from, gen, to); + return to; + } + } + } + return 0; + } + + [[nodiscard]] unsigned size() const { + return fwd.size(); + } + + void set(int from, int gen, int to) { + fwd[from][gen] = to; + rev[to][gen] = from; + } + + [[nodiscard]] int get(int from, int gen) const { + return fwd[from][gen]; + } + + [[nodiscard]] int rget(int gen, int to) const { + return rev[to][gen]; } }; -std::ostream &operator<<(std::ostream &out, const Row &row) { +template +std::ostream &operator<<(std::ostream &out, const Row &row) { out << "[ " << row.from << " | "; auto it = row.l; - while (it != row.r) { + while (row.r - it > 0) { out << *it << " "; it++; } @@ -45,7 +111,7 @@ std::ostream &operator<<(std::ostream &out, const Row &row) { template std::ostream &operator<<(std::ostream &out, const Table &table) { out << "["; - for (int j = 0; j < table.fwd.size(); ++j) { + for (unsigned j = 0; j < table.size(); ++j) { auto arr = table.fwd[j]; out << "["; for (int i = 0; i < N; ++i) { @@ -65,19 +131,33 @@ std::ostream &operator<<(std::ostream &out, const Table &table) { } int main(int argc, char *argv[]) { - int gens = 2; std::vector> ids{ {0, 0}, {1, 1}, {0, 1, 0, 1, 0, 1} }; + Row<3> row(ids[2], 0, 0); Table<3> table; + table.add_row(); table.add_row(); table.add_row(); - table.add_row(); - std::cout << table; + + table.set(0, 0, 1); + table.set(1, 1, 2); + + std::cout << table << std::endl; + std::cout << row << std::endl; + + row.learn(table); + std::cout << row << std::endl; + +// std::cout << table << std::endl; +// table.add_coset(); +// std::cout << table << std::endl; +// +// row.learn(table); return 0; -} \ No newline at end of file +} From 30f77738773d531bb012dd0c9c657dd6e8ef468b Mon Sep 17 00:00:00 2001 From: allem Date: Thu, 12 Sep 2019 22:36:59 -0400 Subject: [PATCH 4/6] seems to be working --- cosets/src/tc.cpp | 179 +++++++++++++++++++++++++--------------------- 1 file changed, 99 insertions(+), 80 deletions(-) diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp index 63f83e1..2de4e7c 100644 --- a/cosets/src/tc.cpp +++ b/cosets/src/tc.cpp @@ -1,67 +1,22 @@ #include #include +#include +#include -template -struct Row; -template -struct Table; - -template -struct Row { - std::vector::const_iterator l; - std::vector::const_iterator r; - - int from; - int to; - - Row(const std::vector &vec, int from, int to) { - this->l = vec.begin(); - this->r = vec.end() - 1; - this->from = from; - this->to = to; - } - - bool learn(Table &table) { - if (r - l == 0) { - return false; - } - - while (r - l > 0) { - int next = table.get(from, *l); - if (next < 0) break; - l++; - from = next; - } - - while (r - l > 0) { - int next = table.rget(*r, to); - if (next < 0) break; - r--; - to = next; - } - - if (r - l == 0) { - table.set(from, *l, to); - return true; - } - - return false; - } -}; - -template struct Table { + int N; std::vector> fwd; std::vector> rev; - Table() { + explicit Table(int N) { add_row(); + this->N = N; } void add_row() { - fwd.push_back(std::vector(N, -1)); - rev.push_back(std::vector(N, -1)); + fwd.emplace_back(N, -1); + rev.emplace_back(N, -1); } int add_coset() { @@ -96,8 +51,49 @@ struct Table { } }; -template -std::ostream &operator<<(std::ostream &out, const Row &row) { +struct Row { + std::vector::const_iterator l; + std::vector::const_iterator r; + + int from; + int to; + + Row(const std::vector &vec, int cos) { + this->l = vec.begin(); + this->r = vec.end() - 1; + this->from = cos; + this->to = cos; + } + + bool learn(Table *table) { + if (r - l == 0) { + return false; + } + + while (r - l > 0) { + int next = table->get(from, *l); + if (next < 0) break; + l++; + from = next; + } + + while (r - l > 0) { + int next = table->rget(*r, to); + if (next < 0) break; + r--; + to = next; + } + + if (r - l == 0) { + table->set(from, *l, to); + return true; + } + + return false; + } +}; + +std::ostream &operator<<(std::ostream &out, const Row &row) { out << "[ " << row.from << " | "; auto it = row.l; while (row.r - it > 0) { @@ -108,16 +104,17 @@ std::ostream &operator<<(std::ostream &out, const Row &row) { return out; } -template -std::ostream &operator<<(std::ostream &out, const Table &table) { +std::ostream &operator<<(std::ostream &out, const Table &table) { + int k = ceil(log10(table.size())); + out << "["; for (unsigned j = 0; j < table.size(); ++j) { auto arr = table.fwd[j]; - out << "["; - for (int i = 0; i < N; ++i) { + out << " " << std::setw(k) << j << " ["; + for (int i = 0; i < table.N; ++i) { out << arr[i]; - if (i < N - 1) + if (i < table.N - 1) out << " "; } @@ -130,34 +127,56 @@ std::ostream &operator<<(std::ostream &out, const Table &table) { return out; } +Table *solve(int gens, const std::vector &subgens, const std::vector> &rels) { + auto *table = new Table(gens); + + for (int gen : subgens) + table->set(0, gen, 0); + + std::vector rows; + rows.reserve(rels.size()); + for (const auto &rel : rels) + rows.emplace_back(rel, 0); + + while (!rows.empty()) { + while (true) { + bool learned = false; + for (int i = (int) rows.size() - 1; i >= 0; i--) { + if (rows[i].learn(table)) { + learned = true; + rows.erase(rows.begin() + i); + } + } + if (!learned) + break; + } + + int i = (int) table->size(); + if (table->add_coset() > 0) { + for (const auto &rel : rels) + rows.emplace_back(rel, i); + } else { + break; + } + } + + return table; +} + int main(int argc, char *argv[]) { std::vector> ids{ {0, 0}, {1, 1}, - {0, 1, 0, 1, 0, 1} + {2, 2}, + {0, 1, 0, 1, 0, 1, 0, 1}, + {1, 2, 1, 2, 1, 2}, + {0, 2, 0, 2} }; - Row<3> row(ids[2], 0, 0); - Table<3> table; + Table *table = solve(3, {}, ids); - table.add_row(); - table.add_row(); - table.add_row(); - - table.set(0, 0, 1); - table.set(1, 1, 2); - - std::cout << table << std::endl; - std::cout << row << std::endl; - - row.learn(table); - std::cout << row << std::endl; - -// std::cout << table << std::endl; -// table.add_coset(); -// std::cout << table << std::endl; -// -// row.learn(table); + std::cout << table->size() << std::endl; + std::cout << *table << std::endl; return 0; } From 0543907571e6c40eaef3ba0bc3e0ee91772b7fc7 Mon Sep 17 00:00:00 2001 From: allem Date: Thu, 12 Sep 2019 22:37:26 -0400 Subject: [PATCH 5/6] fix unsigned to signed cast --- cosets/src/tc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp index 2de4e7c..7b2bb83 100644 --- a/cosets/src/tc.cpp +++ b/cosets/src/tc.cpp @@ -20,10 +20,10 @@ struct Table { } int add_coset() { - for (int from = 0; from < size(); ++from) { + for (int from = 0; from < (int) size(); ++from) { for (int gen = 0; gen < N; ++gen) { if (get(from, gen) < 0) { - int to = size(); + int to = (int) size(); add_row(); set(from, gen, to); return to; From 163f4f7a82ceda6a0e9075245bee67a4cc714029 Mon Sep 17 00:00:00 2001 From: allem Date: Thu, 12 Sep 2019 23:00:29 -0400 Subject: [PATCH 6/6] word enumeration --- cosets/src/tc.cpp | 88 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 64 insertions(+), 24 deletions(-) diff --git a/cosets/src/tc.cpp b/cosets/src/tc.cpp index 7b2bb83..12ca511 100644 --- a/cosets/src/tc.cpp +++ b/cosets/src/tc.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include @@ -49,6 +50,37 @@ struct Table { [[nodiscard]] int rget(int gen, int to) const { return rev[to][gen]; } + + std::vector> words() { + std::vector *> vecs(size()); + vecs[0] = new std::vector(); + + while (std::find(vecs.begin(), vecs.end(), nullptr) != vecs.end()) { + for (int from = 0; from < (int) vecs.size(); ++from) { + std::vector *word = vecs[from]; + if (word == nullptr) { + continue; + } + + for (int gen = 0; gen < (int) N; ++gen) { + int to = get(from, gen); + if (vecs[to] != nullptr) { + continue; + } + + vecs[to] = new std::vector(*word); + vecs[to]->push_back(gen); + } + } + } + + std::vector> res(size()); + for (int i = 0; i < (int) size(); ++i) { + res[i] = *vecs[i]; + } + + return res; + } }; struct Row { @@ -104,29 +136,6 @@ std::ostream &operator<<(std::ostream &out, const Row &row) { return out; } -std::ostream &operator<<(std::ostream &out, const Table &table) { - int k = ceil(log10(table.size())); - - out << "["; - for (unsigned j = 0; j < table.size(); ++j) { - auto arr = table.fwd[j]; - out << " " << std::setw(k) << j << " ["; - for (int i = 0; i < table.N; ++i) { - out << arr[i]; - - if (i < table.N - 1) - out << " "; - } - - out << "]"; - if (j < table.fwd.size() - 1) - out << "\n "; - } - out << "]\n"; - - return out; -} - Table *solve(int gens, const std::vector &subgens, const std::vector> &rels) { auto *table = new Table(gens); @@ -163,6 +172,29 @@ Table *solve(int gens, const std::vector &subgens, const std::vector> ids{ {0, 0}, @@ -173,10 +205,18 @@ int main(int argc, char *argv[]) { {0, 2, 0, 2} }; - Table *table = solve(3, {}, ids); + Table *table = solve(3, {0, 1}, ids); std::cout << table->size() << std::endl; std::cout << *table << std::endl; + for (const auto &v : table->words()) { + std::cout << "[ "; + for (auto e : v) { + std::cout << e << " "; + } + std::cout << "]\n"; + } + return 0; }