diff --git a/cosets/src/main.cpp b/cosets/src/main.cpp index 37e45ee..041b78a 100644 --- a/cosets/src/main.cpp +++ b/cosets/src/main.cpp @@ -44,9 +44,9 @@ public: u_view = glGetUniformLocation(program, "view"); u_color = glGetUniformLocation(program, "color"); - const int N = 3; - const Mults &mults = schlafli({5, 3}); - vert_data = vertices(mults, {10, 1, 1}); + const int N = 4; + const Mults &mults = schlafli({5, 3, 3}); + vert_data = vertices(mults, {10, }); edge_data = edges(mults); face_data = faces(mults); diff --git a/cosets/src/util/coxeter.hpp b/cosets/src/util/coxeter.hpp index f385992..6122f3f 100644 --- a/cosets/src/util/coxeter.hpp +++ b/cosets/src/util/coxeter.hpp @@ -62,19 +62,26 @@ Mults schlafli(const int (&symbol)[N - 1]) { struct Table { const std::vector gens; + std::vector gen_inds; std::vector> fwd{}; std::vector> rev{}; explicit Table(const std::vector gens) : gens(gens) { add_row(); + + gen_inds = std::vector(gens[gens.size() - 1] + 1, -1); + for (int i = 0; i < gens.size(); i++) { + gen_inds[gens[i]] = i; + } } [[nodiscard]] int gen_index(int gen) const { - for (unsigned i = 0; i < gens.size(); ++i) - if (gens[i] == gen) - return i; - - throw std::logic_error("Referencing nonexistant generator"); + if (gen >= gen_inds.size()) + throw std::logic_error("Referencing nonexistant generator (too large)"); + int i = gen_inds[gen]; + if (i < 0) + throw std::logic_error("Referencing nonexistant generator (not present)"); + return i; } void add_row() {