Add hypercube, smol modifications

This commit is contained in:
JCRaymond
2019-12-03 20:47:30 -05:00
parent e83ed8793d
commit 85fa3fb292
2 changed files with 38 additions and 4 deletions

View File

@@ -49,6 +49,8 @@ struct Coxeter {
struct Mult { struct Mult {
int from, to, multiplicity; 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<Mult> &ms) { Coxeter make_coxeter(int ngens, const std::vector<Mult> &ms) {
@@ -91,6 +93,15 @@ Coxeter torus(int res) {
}); });
} }
Coxeter hypercube(int dim) {
std::vector<Mult> 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 * Order 14,400
*/ */
@@ -265,9 +276,6 @@ void learn(Table &coset, const Coxeter &cox,
for (unsigned int c = 0; c < table.num_rows; c++) { for (unsigned int c = 0; c < table.num_rows; c++) {
auto s_i = table.start_inds[c]; auto s_i = table.start_inds[c];
auto e_i = table.end_inds[c]; auto e_i = table.end_inds[c];
if (s_i == e_i) continue;
auto s_c = table.start_cosets[c]; auto s_c = table.start_cosets[c];
auto e_c = table.end_cosets[c]; auto e_c = table.end_cosets[c];
auto i_c = table.init_cosets[c]; auto i_c = table.init_cosets[c];
@@ -382,6 +390,14 @@ Coxeter proc_args(int argc, const char* argv[]) {
case 4: case 4:
std::cout << -1 << ','; std::cout << -1 << ',';
return E8(); 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; std::cerr << "Not a valid type!" << std::endl;

View File

@@ -10,6 +10,8 @@ using Table=std::vector<Gens>;
struct Mult { struct Mult {
int from, to, multiplicity; int from, to, multiplicity;
Mult() {}
Mult(int from, int to, int multiplicity): from(from), to(to), multiplicity(multiplicity) {}
}; };
Table mults(const std::vector<Mult>& ms) { Table mults(const std::vector<Mult>& ms) {
@@ -55,13 +57,21 @@ std::vector<Mult> ezmults(int ngens, const std::vector<Mult> &ms) {
* Order 4*res*res * Order 4*res*res
*/ */
std::pair<Table, int> torus(int res) { std::pair<Table, int> torus(int res) {
return std::make_pair(mults(ezmults(4, { return std::make_pair(mults(ezmults(4, {
{0, 1, res}, {0, 1, res},
{2, 3, res}, {2, 3, res},
})), 4); })), 4);
} }
std::pair<Table, int> hypercube(int dim) {
std::vector<Mult> 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 * Order 14,400
*/ */
@@ -286,6 +296,14 @@ int main(int argc, const char *argv[]) {
case 4: case 4:
res = E8(); res = E8();
break; 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: default:
std::cerr << "Not a valid type!" << std::endl; std::cerr << "Not a valid type!" << std::endl;
return 3; return 3;