soft-remove "dim" from Mesh

This commit is contained in:
2020-01-28 21:34:58 -05:00
parent f78ace2aa5
commit 1acff9426b

View File

@@ -26,19 +26,15 @@ size_t num_gens_from_key(size_t key) {
return count;
}
struct Simplexes {
int dim;
struct Mesh {
// int dim;
std::vector<int> vals;
Simplexes() : dim(0), vals() {}
Mesh() : vals() {}
explicit Simplexes(int dim) : dim(dim), vals() {}
Simplexes(int dim, std::vector<int> &vals) : dim(dim), vals(vals) {}
explicit Simplexes(const std::vector<Simplexes> &parts) {
dim = parts[0].dim;
explicit Mesh(std::vector<int> &vals) : vals(vals) {}
explicit Mesh(const std::vector<Mesh> &parts) {
size_t count = 0;
for (const auto &part : parts) {
count += part.size();
@@ -55,17 +51,17 @@ struct Simplexes {
}
void flip() {
if (dim == 0)
return;
for (int i = 0; i < vals.size(); i += dim + 1) {
std::swap(vals[i], vals[i + 1]);
}
// if (dim == 0)
// return;
// for (int i = 0; i < vals.size(); i += dim + 1) {
// std::swap(vals[i], vals[i + 1]);
// }
}
};
struct GeomGen {
std::vector<std::vector<std::optional<tc::Cosets>>> coset_memo;
std::vector<std::optional<Simplexes>> triangulate_memo;
std::vector<std::optional<Mesh>> triangulate_memo;
tc::Group &context;
explicit GeomGen(tc::Group &g) : context(g) {
@@ -148,7 +144,7 @@ struct GeomGen {
return solve_sg(sg_gens);
}
Simplexes recontext(std::vector<int> &g_gens, std::vector<int> &sg_gens, const Simplexes &items) {
Mesh recontext(std::vector<int> &g_gens, std::vector<int> &sg_gens, const Mesh &items) {
auto s_sg_gens = prepare_gens(g_gens, sg_gens);
auto table = solve_g(g_gens);
auto path = solve_g(sg_gens).path;
@@ -157,7 +153,7 @@ struct GeomGen {
auto map = path.walk<int, int>(0, s_sg_gens, coset_map);
Simplexes ret(items.dim);
Mesh ret;
ret.vals.reserve(items.size());
for (const auto val : items.vals) {
ret.vals.push_back(map[val]);
@@ -167,13 +163,13 @@ struct GeomGen {
return ret;
}
Simplexes tile(std::vector<int> &g_gens, std::vector<int> &sg_gens, const Simplexes &items) {
Simplexes base = recontext(g_gens, sg_gens, items);
Mesh tile(std::vector<int> &g_gens, std::vector<int> &sg_gens, const Mesh &items) {
Mesh base = recontext(g_gens, sg_gens, items);
auto s_sg_gens = prepare_gens(g_gens, sg_gens);
auto table = solve_g(g_gens);
auto path = _solve(g_gens, sg_gens).path;
auto simplex_map = [table](Simplexes from, int gen) -> Simplexes {
auto simplex_map = [table](Mesh from, int gen) -> Mesh {
for (auto &coset : from.vals) {
coset = table.get(coset, gen);
}
@@ -181,15 +177,15 @@ struct GeomGen {
return from;
};
auto r = path.walk<Simplexes, int>(base, group_gens(), simplex_map);
auto r = path.walk<Mesh, int>(base, group_gens(), simplex_map);
return Simplexes(r);
return Mesh(r);
}
Simplexes triangulate(std::vector<int> &g_gens);
Mesh triangulate(std::vector<int> &g_gens);
Simplexes _triangulate(std::vector<int> &g_gens) {
Simplexes S(g_gens.size());
Mesh _triangulate(std::vector<int> &g_gens) {
Mesh S;
if (g_gens.empty()) {
S.vals.push_back(0);
return S;
@@ -198,8 +194,8 @@ struct GeomGen {
auto sub_simps = triangulate(sg_gens);
int start = sub_simps.size();
sub_simps = tile(g_gens, sg_gens, sub_simps);
for (int l = start; l < sub_simps.size(); l += S.dim) {
for (int m = l; m < l + S.dim; m++) {
for (int l = start; l < sub_simps.size(); l += g_gens.size()) {
for (int m = l; m < l + g_gens.size(); m++) {
S.vals.push_back(sub_simps.vals[m]);
}
S.vals.push_back(0);
@@ -210,7 +206,7 @@ struct GeomGen {
};
Simplexes GeomGen::triangulate(std::vector<int> &g_gens) {
Mesh GeomGen::triangulate(std::vector<int> &g_gens) {
int key = get_key_from_gens(g_gens);
if (!triangulate_memo[key]) {
triangulate_memo[key] = _triangulate(g_gens);