From 55520fd50a8001591d7a5f69ad1019994f23d5c0 Mon Sep 17 00:00:00 2001 From: JCRaymond Date: Tue, 24 Dec 2019 23:23:12 -0500 Subject: [PATCH] Modified facts to use heap --- solver.cpp | 33 +++++++++++++++------------------ test.cpp | 2 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/solver.cpp b/solver.cpp index 389f131..00ffc38 100644 --- a/solver.cpp +++ b/solver.cpp @@ -1,6 +1,6 @@ #include +#include #include -#include #include #include @@ -62,12 +62,6 @@ struct RelTable { } }; -struct { - bool operator()(std::pair p1, std::pair p2) { - return p1.first == p2.first ? p1.second > p2.second : p1.first > p2.first; - } -} intpair_greater; - struct Group { int ngens; std::vector> _mults; @@ -178,16 +172,21 @@ struct Group { rel.add_row(); } - std::vector> facts; - facts.push_back(std::make_pair(coset, gen)); + std::priority_queue, std::greater> facts; + facts.push(coset*ngens + gen); while (!facts.empty()) { - auto top = facts.back(); - coset = top.first; - gen = top.second; - facts.pop_back(); + int fact_idx = facts.top(); + facts.pop(); + + if (cosets.get(fact_idx) != -1) + continue; + + cosets.put(fact_idx, target); + + coset = fact_idx / ngens; + gen = fact_idx % ngens; - cosets.put(coset, gen, target); for (RelTable &rel : rel_tables) { if ( (gen == rel.gens[0] or gen == rel.gens[1]) and (rel.fam[target] == -1) ) { @@ -200,19 +199,17 @@ struct Group { if (rel.gen[target] == rel.mult) { int lst = rel.lst[rel.fam[target]]; int gen_ = rel.gens[(int)(rel.gens[0] == gen)]; - facts.push_back(std::make_pair(lst, gen_)); + facts.push(lst*ngens + gen_); } else if (rel.gen[target] == -rel.mult) { int gen_ = rel.gens[rel.gens[0] == gen]; - facts.push_back(std::make_pair(target, gen_)); + facts.push(target*ngens + gen_); } else if (rel.gen[target] == rel.mult - 1) { rel.lst[rel.fam[target]] = target; } } } - - std::sort(facts.begin(), facts.end(), intpair_greater); } for (RelTable &rel : rel_tables) { diff --git a/test.cpp b/test.cpp index c820604..4a7ca89 100644 --- a/test.cpp +++ b/test.cpp @@ -3,7 +3,7 @@ #include int main() { - Group g = B(9); + Group g = E(7); auto s = std::chrono::system_clock::now(); auto cosets = g.solve();