From 8f82531a72f3cba437f170d485338bef72524e49 Mon Sep 17 00:00:00 2001 From: JCRaymond Date: Wed, 25 Dec 2019 00:04:35 -0500 Subject: [PATCH] Add RelTable generator lookup to prevent scanning unnecessary RelTables --- solver.cpp | 41 +++++++++++++++++++++++++---------------- test.cpp | 2 +- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/solver.cpp b/solver.cpp index 00ffc38..522ca80 100644 --- a/solver.cpp +++ b/solver.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -138,7 +139,12 @@ struct Group { Cosets cosets(ngens, init_row); std::vector rel_tables; + std::vector> gen_map(ngens); + int rel_idx; 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); } @@ -155,6 +161,7 @@ struct Group { } int idx = 0; + int coset, gen, target, fact_idx, lst, gen_; while (true) { while (idx < cosets.data.size() and cosets.get(idx) >= 0) idx++; @@ -162,22 +169,22 @@ struct Group { if (idx == cosets.data.size()) break; - int coset = idx / ngens; - int gen = idx % ngens; - int target = cosets.len; - + target = cosets.len; cosets.add_row(); for (RelTable &rel : rel_tables) { rel.add_row(); } - std::priority_queue, std::greater> facts; - facts.push(coset*ngens + gen); + std::vector facts; + facts.push_back(idx); + + coset = idx / ngens; + gen = idx % ngens; while (!facts.empty()) { - int fact_idx = facts.top(); - facts.pop(); + fact_idx = facts.back(); + facts.pop_back(); if (cosets.get(fact_idx) != -1) continue; @@ -187,9 +194,9 @@ struct Group { coset = fact_idx / ngens; gen = fact_idx % ngens; - - for (RelTable &rel : rel_tables) { - if ( (gen == rel.gens[0] or gen == rel.gens[1]) and (rel.fam[target] == -1) ) { + for (int rel_idx : gen_map[gen]) { + RelTable &rel = rel_tables[rel_idx]; + if ( rel.fam[target] == -1 ) { rel.fam[target] = rel.fam[coset]; rel.gen[target] = rel.gen[coset] + 1; @@ -197,19 +204,21 @@ struct Group { rel.gen[target] -= 2; if (rel.gen[target] == rel.mult) { - int lst = rel.lst[rel.fam[target]]; - int gen_ = rel.gens[(int)(rel.gens[0] == gen)]; - facts.push(lst*ngens + gen_); + lst = rel.lst[rel.fam[target]]; + gen_ = rel.gens[(int)(rel.gens[0] == gen)]; + facts.push_back(lst*ngens + gen_); } else if (rel.gen[target] == -rel.mult) { - int gen_ = rel.gens[rel.gens[0] == gen]; - facts.push(target*ngens + gen_); + gen_ = rel.gens[rel.gens[0] == gen]; + facts.push_back(target*ngens + gen_); } else if (rel.gen[target] == rel.mult - 1) { rel.lst[rel.fam[target]] = target; } } } + + std::sort(facts.begin(), facts.end(), std::greater()); } for (RelTable &rel : rel_tables) { diff --git a/test.cpp b/test.cpp index 4a7ca89..c820604 100644 --- a/test.cpp +++ b/test.cpp @@ -3,7 +3,7 @@ #include int main() { - Group g = E(7); + Group g = B(9); auto s = std::chrono::system_clock::now(); auto cosets = g.solve();