Add RelTable generator lookup to prevent scanning unnecessary RelTables

This commit is contained in:
JCRaymond
2019-12-25 00:04:35 -05:00
parent 55520fd50a
commit 8f82531a72
2 changed files with 26 additions and 17 deletions

View File

@@ -1,4 +1,5 @@
#include <vector> #include <vector>
#include <algorithm>
#include <queue> #include <queue>
#include <utility> #include <utility>
#include <functional> #include <functional>
@@ -138,7 +139,12 @@ struct Group {
Cosets cosets(ngens, init_row); Cosets cosets(ngens, init_row);
std::vector<RelTable> rel_tables; std::vector<RelTable> rel_tables;
std::vector<std::vector<int>> gen_map(ngens);
int rel_idx;
for (Mult m : get_mults()) { for (Mult m : get_mults()) {
rel_idx = rel_tables.size();
gen_map[m.gen0].push_back(rel_idx);
gen_map[m.gen1].push_back(rel_idx);
rel_tables.emplace_back(m); rel_tables.emplace_back(m);
} }
@@ -155,6 +161,7 @@ struct Group {
} }
int idx = 0; int idx = 0;
int coset, gen, target, fact_idx, lst, gen_;
while (true) { while (true) {
while (idx < cosets.data.size() and cosets.get(idx) >= 0) while (idx < cosets.data.size() and cosets.get(idx) >= 0)
idx++; idx++;
@@ -162,22 +169,22 @@ struct Group {
if (idx == cosets.data.size()) if (idx == cosets.data.size())
break; break;
int coset = idx / ngens; target = cosets.len;
int gen = idx % ngens;
int target = cosets.len;
cosets.add_row(); cosets.add_row();
for (RelTable &rel : rel_tables) { for (RelTable &rel : rel_tables) {
rel.add_row(); rel.add_row();
} }
std::priority_queue<int, std::vector<int>, std::greater<int>> facts; std::vector<int> facts;
facts.push(coset*ngens + gen); facts.push_back(idx);
coset = idx / ngens;
gen = idx % ngens;
while (!facts.empty()) { while (!facts.empty()) {
int fact_idx = facts.top(); fact_idx = facts.back();
facts.pop(); facts.pop_back();
if (cosets.get(fact_idx) != -1) if (cosets.get(fact_idx) != -1)
continue; continue;
@@ -187,9 +194,9 @@ struct Group {
coset = fact_idx / ngens; coset = fact_idx / ngens;
gen = fact_idx % ngens; gen = fact_idx % ngens;
for (int rel_idx : gen_map[gen]) {
for (RelTable &rel : rel_tables) { RelTable &rel = rel_tables[rel_idx];
if ( (gen == rel.gens[0] or gen == rel.gens[1]) and (rel.fam[target] == -1) ) { if ( rel.fam[target] == -1 ) {
rel.fam[target] = rel.fam[coset]; rel.fam[target] = rel.fam[coset];
rel.gen[target] = rel.gen[coset] + 1; rel.gen[target] = rel.gen[coset] + 1;
@@ -197,19 +204,21 @@ struct Group {
rel.gen[target] -= 2; rel.gen[target] -= 2;
if (rel.gen[target] == rel.mult) { if (rel.gen[target] == rel.mult) {
int lst = rel.lst[rel.fam[target]]; lst = rel.lst[rel.fam[target]];
int gen_ = rel.gens[(int)(rel.gens[0] == gen)]; gen_ = rel.gens[(int)(rel.gens[0] == gen)];
facts.push(lst*ngens + gen_); facts.push_back(lst*ngens + gen_);
} }
else if (rel.gen[target] == -rel.mult) { else if (rel.gen[target] == -rel.mult) {
int gen_ = rel.gens[rel.gens[0] == gen]; gen_ = rel.gens[rel.gens[0] == gen];
facts.push(target*ngens + gen_); facts.push_back(target*ngens + gen_);
} }
else if (rel.gen[target] == rel.mult - 1) { else if (rel.gen[target] == rel.mult - 1) {
rel.lst[rel.fam[target]] = target; rel.lst[rel.fam[target]] = target;
} }
} }
} }
std::sort(facts.begin(), facts.end(), std::greater<int>());
} }
for (RelTable &rel : rel_tables) { for (RelTable &rel : rel_tables) {

View File

@@ -3,7 +3,7 @@
#include <iostream> #include <iostream>
int main() { int main() {
Group g = E(7); Group g = B(9);
auto s = std::chrono::system_clock::now(); auto s = std::chrono::system_clock::now();
auto cosets = g.solve(); auto cosets = g.solve();