Add hypercube, smol modifications
This commit is contained in:
@@ -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<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
|
||||
*/
|
||||
@@ -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;
|
||||
|
||||
@@ -10,6 +10,8 @@ using Table=std::vector<Gens>;
|
||||
|
||||
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<Mult>& ms) {
|
||||
@@ -55,13 +57,21 @@ std::vector<Mult> ezmults(int ngens, const std::vector<Mult> &ms) {
|
||||
* Order 4*res*res
|
||||
*/
|
||||
std::pair<Table, int> torus(int res) {
|
||||
|
||||
return std::make_pair(mults(ezmults(4, {
|
||||
{0, 1, res},
|
||||
{2, 3, res},
|
||||
})), 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
|
||||
*/
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user