Implement normal and forwards deletion

This commit is contained in:
JCRaymond
2019-12-03 20:07:56 -05:00
parent 809e66c7f4
commit e83ed8793d

View File

@@ -149,6 +149,8 @@ Coxeter E8() {
*/ */
struct RelTable { struct RelTable {
std::vector<int> coset_poss;
std::vector<Cos> init_cosets;
std::vector<Cos> start_cosets; std::vector<Cos> start_cosets;
std::vector<Cos> end_cosets; std::vector<Cos> end_cosets;
std::vector<Ind> start_inds; std::vector<Ind> start_inds;
@@ -160,13 +162,36 @@ struct RelTable {
gen[0] = gen0; gen[0] = gen0;
gen[1] = gen1; gen[1] = gen1;
} }
void add_row() { void add_row(Cos new_coset) {
start_cosets.push_back(num_rows); coset_poss.push_back(num_rows);
end_cosets.push_back(num_rows); init_cosets.push_back(new_coset);
start_cosets.push_back(new_coset);
end_cosets.push_back(new_coset);
start_inds.push_back(0); start_inds.push_back(0);
end_inds.push_back(end_ind); end_inds.push_back(end_ind);
num_rows++; num_rows++;
} }
void rem_row(int idx) {
num_rows--;
coset_poss[init_cosets[num_rows]] = idx;
coset_poss[init_cosets[idx]] = -1;
init_cosets[idx] = init_cosets[num_rows];
init_cosets.pop_back();
start_cosets[idx] = start_cosets[num_rows];
start_cosets.pop_back();
end_cosets[idx] = end_cosets[num_rows];
end_cosets.pop_back();
start_inds[idx] = start_inds[num_rows];
start_inds.pop_back();
end_inds[idx] = end_inds[num_rows];
end_inds.pop_back();
}
}; };
void pp(const Gens &g, int w) { void pp(const Gens &g, int w) {
@@ -194,7 +219,7 @@ void add_row(const int ngens, const Coxeter &cox,
cosets.emplace_back(ngens, -1); cosets.emplace_back(ngens, -1);
for (RelTable &rt : reltables) for (RelTable &rt : reltables)
rt.add_row(); rt.add_row(C);
} }
int add_coset(const int ngens, const Coxeter &cox, int add_coset(const int ngens, const Coxeter &cox,
@@ -245,6 +270,7 @@ void learn(Table &coset, const Coxeter &cox,
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];
while (s_i < e_i) { while (s_i < e_i) {
const int &lookup = coset[s_c][gens[s_i&1]]; const int &lookup = coset[s_c][gens[s_i&1]];
@@ -253,8 +279,11 @@ void learn(Table &coset, const Coxeter &cox,
s_i++; s_i++;
s_c = lookup; s_c = lookup;
if (s_c > c) if (s_c > i_c) {
table.start_inds[s_c] = table.end_inds[s_c]; int idx = table.coset_poss[s_c];
if (idx >= 0)
table.rem_row(idx);
}
} }
table.start_inds[c] = s_i; table.start_inds[c] = s_i;
@@ -267,8 +296,11 @@ void learn(Table &coset, const Coxeter &cox,
e_i--; e_i--;
e_c = lookup; e_c = lookup;
if (e_c > c) if (e_c > i_c) {
table.start_inds[e_c] = table.end_inds[e_c]; int idx = table.coset_poss[e_c];
if (idx >= 0)
table.rem_row(idx);
}
} }
table.end_inds[c] = e_i; table.end_inds[c] = e_i;
@@ -280,6 +312,9 @@ void learn(Table &coset, const Coxeter &cox,
const int &gen = gens[s_i&1]; const int &gen = gens[s_i&1];
coset[s_c][gen] = e_c; coset[s_c][gen] = e_c;
coset[e_c][gen] = s_c; coset[e_c][gen] = s_c;
table.rem_row(c);
c--;
} }
} }
} }