1
0

tc::solve() no longer a method of tc::Group.

Group::solve() to tc::solve(Group)
This commit is contained in:
David Allemang
2021-10-31 22:12:15 -04:00
parent d67768d85c
commit d4c2ffb8f3
5 changed files with 15 additions and 20 deletions

View File

@@ -8,7 +8,7 @@
template<class G>
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;

View File

@@ -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<std::string> names = {"a", "b", "c"};

View File

@@ -5,3 +5,4 @@
#include "tc/core/cosets.hpp"
#include "tc/core/rel.hpp"
#include "tc/core/group.hpp"
#include "tc/core/solver.hpp"

View File

@@ -70,10 +70,6 @@ namespace tc {
[[nodiscard]] SubGroup subgroup(
const std::vector<int> &gens
) const;
[[nodiscard]] Cosets solve(
const std::vector<int> &sub_gens = {}
) const;
};
struct SubGroup : public Group {
@@ -148,5 +144,3 @@ namespace tc {
return power(g, p);
}
}
#include "solve.hpp"

View File

@@ -39,23 +39,23 @@ namespace {
}
namespace tc {
Cosets Group::solve(const std::vector<int> &sub_gens) const {
Cosets cosets(ngens);
Cosets solve(const Group &g, const std::vector<int> &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<int> null_lst_ptr = std::make_shared<int>();
@@ -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;