diff --git a/example/bench.cpp b/example/bench.cpp index d40c7a9..6744ee0 100644 --- a/example/bench.cpp +++ b/example/bench.cpp @@ -8,7 +8,7 @@ template void test(const G &group) { auto s = std::clock(); - auto cosets = group.solve({0}); + auto cosets = tc::solve(group, {0}); auto e = std::clock(); double diff = (double) (e - s) / CLOCKS_PER_SEC; diff --git a/example/path.cpp b/example/path.cpp index 56f586f..2fc68f4 100644 --- a/example/path.cpp +++ b/example/path.cpp @@ -5,7 +5,7 @@ int main() { auto cube = tc::group::B(3); - auto vars = cube.solve(); + auto vars = tc::solve(cube); std::string start; std::vector names = {"a", "b", "c"}; diff --git a/include/tc/core.hpp b/include/tc/core.hpp index ec21531..73b3a7a 100644 --- a/include/tc/core.hpp +++ b/include/tc/core.hpp @@ -5,3 +5,4 @@ #include "tc/core/cosets.hpp" #include "tc/core/rel.hpp" #include "tc/core/group.hpp" +#include "tc/core/solver.hpp" diff --git a/include/tc/core/group.hpp b/include/tc/core/group.hpp index f7ba567..e89bd4a 100644 --- a/include/tc/core/group.hpp +++ b/include/tc/core/group.hpp @@ -70,10 +70,6 @@ namespace tc { [[nodiscard]] SubGroup subgroup( const std::vector &gens ) const; - - [[nodiscard]] Cosets solve( - const std::vector &sub_gens = {} - ) const; }; struct SubGroup : public Group { @@ -148,5 +144,3 @@ namespace tc { return power(g, p); } } - -#include "solve.hpp" diff --git a/include/tc/core/solve.hpp b/include/tc/core/solver.hpp similarity index 88% rename from include/tc/core/solve.hpp rename to include/tc/core/solver.hpp index 8ee13ec..3d38b48 100644 --- a/include/tc/core/solve.hpp +++ b/include/tc/core/solver.hpp @@ -39,23 +39,23 @@ namespace { } namespace tc { - Cosets Group::solve(const std::vector &sub_gens) const { - Cosets cosets(ngens); + Cosets solve(const Group &g, const std::vector &sub_gens = {}) { + Cosets cosets(g.ngens); cosets.add_row(); - if (ngens == 0) { + if (g.ngens == 0) { return cosets; } - for (int g: sub_gens) { - if (g < ngens) - cosets.put(0, g, 0); + for (int gen: sub_gens) { + if (gen < g.ngens) + cosets.put(0, gen, 0); } - const auto &rels = get_rels(); // todo move to Group member + const auto &rels = g.get_rels(); // todo move to Group member const auto nrels = rels.size(); - auto deps = dependency_map(ngens, rels); + auto deps = dependency_map(g.ngens, rels); std::shared_ptr null_lst_ptr = std::make_shared(); @@ -99,8 +99,8 @@ namespace tc { cosets.put(fact_idx, target); - int coset = fact_idx / ngens; - int gen = fact_idx % ngens; + int coset = fact_idx / g.ngens; + int gen = fact_idx % g.ngens; if (target == coset) { for (int irel: deps[gen]) { @@ -128,11 +128,11 @@ namespace tc { // forward learn int lst = *target_row.lst; int gen_ = rel.gens[rel.gens[0] == gen]; - facts.push(lst * ngens + gen_); + facts.push(lst * g.ngens + gen_); } else if (target_row.gnr == -rel.mult) { // stationary learn int gen_ = rel.gens[rel.gens[0] == gen]; - facts.push(target * ngens + gen_); + facts.push(target * g.ngens + gen_); } else if (target_row.gnr == rel.mult - 1) { // determined family *target_row.lst = target;