From d67aab4d43280ec475c1fb6cfe1fe659ed9ece6d Mon Sep 17 00:00:00 2001 From: David Allemang Date: Wed, 14 Sep 2022 13:54:08 -0400 Subject: [PATCH] std::queue facts is faster --- tc/src/core.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/tc/src/core.cpp b/tc/src/core.cpp index d6b5ce4..13cae01 100644 --- a/tc/src/core.cpp +++ b/tc/src/core.cpp @@ -1,6 +1,8 @@ #include #include +#include +#include namespace tc { SubGroup Group::subgroup(const std::vector &gens) const { @@ -97,8 +99,8 @@ namespace tc { rel_tables.add_row(); // queue of products that can be determined by the new coset - std::vector facts; - facts.push_back(idx); + std::queue facts; + facts.push(idx); // todo unrolled linked list interval // coset = idx / ngens; @@ -106,16 +108,11 @@ namespace tc { // rel_tables.del_rows_to(coset); while (!facts.empty()) { - // todo heap - std::sort(facts.begin(), facts.end(), std::greater<>()); - fact_idx = facts.back(); - facts.pop_back(); + fact_idx = facts.front(); + facts.pop(); // skip if this product was already determined - // todo try to avoid these duplications - if (cosets.get(fact_idx) != -1) { - continue; - } + if (cosets.get(fact_idx) != -1)continue; cosets.put(fact_idx, target); @@ -149,10 +146,10 @@ namespace tc { lst = *(trow.lst_ptr); delete trow.lst_ptr; gen_ = rel.gens[(int) (rel.gens[0] == gen)]; - facts.push_back(lst * ngens + gen_); + facts.push(lst * ngens + gen_); } else if (trow.gnr == -rel.mult) { gen_ = rel.gens[rel.gens[0] == gen]; - facts.push_back(target * ngens + gen_); + facts.push(target * ngens + gen_); } else if (trow.gnr == rel.mult - 1) { *(trow.lst_ptr) = target; }