mirror of
https://github.com/allemangD/toddcox-visualize.git
synced 2025-11-10 12:02:47 -05:00
Add RelTable generator lookup to prevent scanning unnecessary RelTables
This commit is contained in:
41
solver.cpp
41
solver.cpp
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user