diff --git a/cpu-opt/main.cpp b/cpu-opt/main.cpp index 233d046..2b386eb 100644 --- a/cpu-opt/main.cpp +++ b/cpu-opt/main.cpp @@ -49,6 +49,8 @@ struct Coxeter { struct Mult { int from, to, multiplicity; + Mult() {} + Mult(int from, int to, int multiplicity): from(from), to(to), multiplicity(multiplicity) {} }; Coxeter make_coxeter(int ngens, const std::vector &ms) { @@ -91,6 +93,15 @@ Coxeter torus(int res) { }); } +Coxeter hypercube(int dim) { + std::vector mults; + mults.emplace_back(0,1,4); + for (int i = 2; i < dim; i++) { + mults.emplace_back(i-1, i, 3); + } + return make_coxeter(dim, mults); +} + /* * Order 14,400 */ @@ -265,9 +276,6 @@ void learn(Table &coset, const Coxeter &cox, for (unsigned int c = 0; c < table.num_rows; c++) { auto s_i = table.start_inds[c]; auto e_i = table.end_inds[c]; - - if (s_i == e_i) continue; - auto s_c = table.start_cosets[c]; auto e_c = table.end_cosets[c]; auto i_c = table.init_cosets[c]; @@ -382,6 +390,14 @@ Coxeter proc_args(int argc, const char* argv[]) { case 4: std::cout << -1 << ','; return E8(); + case 5: + if (argc < 3) { + std::cerr << "Must provide a dimension for hypercube!" << std::endl; + exit(EXIT_FAILURE); + } + arg = std::strtol(argv[2], nullptr, 10); + std::cout << arg << ','; + return hypercube(arg); } std::cerr << "Not a valid type!" << std::endl; diff --git a/cpu-slo/main.cpp b/cpu-slo/main.cpp index 98201e8..c221553 100644 --- a/cpu-slo/main.cpp +++ b/cpu-slo/main.cpp @@ -10,6 +10,8 @@ using Table=std::vector; struct Mult { int from, to, multiplicity; + Mult() {} + Mult(int from, int to, int multiplicity): from(from), to(to), multiplicity(multiplicity) {} }; Table mults(const std::vector& ms) { @@ -55,13 +57,21 @@ std::vector ezmults(int ngens, const std::vector &ms) { * Order 4*res*res */ std::pair torus(int res) { - return std::make_pair(mults(ezmults(4, { {0, 1, res}, {2, 3, res}, })), 4); } +std::pair hypercube(int dim) { + std::vector hc_mults; + hc_mults.emplace_back(0,1,4); + for (int i = 2; i < dim; i++) { + hc_mults.emplace_back(i-1, i, 3); + } + return std::make_pair(mults(ezmults(dim,hc_mults)), dim); +} + /* * Order 14,400 */ @@ -286,6 +296,14 @@ int main(int argc, const char *argv[]) { case 4: res = E8(); break; + case 5: + if (argc < 3) { + std::cerr << "Must provide a dimension for hypercube!" << std::endl; + return 3; + } + arg = std::strtol(argv[2], nullptr, 10); + res = hypercube(arg); + break; default: std::cerr << "Not a valid type!" << std::endl; return 3;