1
0

Remove Rel

This commit is contained in:
David Allemang
2021-11-01 12:49:55 -04:00
parent aa3d3b5149
commit 6585d79ed9
5 changed files with 20 additions and 59 deletions

View File

@@ -1,6 +1,8 @@
cmake_minimum_required(VERSION 3.10)
project(toddcox-faster)
set(CMAKE_CXX_STANDARD 17)
option(TC_BUILD_EXAMPLE "Build example executables" OFF)
add_subdirectory(ext)

View File

@@ -1,5 +1,4 @@
#pragma once
#include "tc/core/rel.hpp"
#include "tc/core/group.hpp"
#include "tc/core/solver.hpp"

View File

@@ -7,8 +7,6 @@
#include <memory>
#include <queue>
#include "rel.hpp"
#include <Eigen/Eigen>
#include <iostream>
@@ -65,16 +63,6 @@ namespace tc {
typename Matrix::Scalar operator()(int a, int b) const {
return _mults(a, b);
}
[[nodiscard]] std::vector<Rel> get_rels() const {
std::vector<Rel> res;
for (int i = 0; i < Rank - 1; ++i) {
for (int j = i + 1; j < Rank; ++j) {
res.emplace_back(i, j, _mults(i, j));
}
}
return res;
}
};
template<unsigned int GR, unsigned int HR>
@@ -121,12 +109,4 @@ namespace tc {
return res;
}
// Group operator*(const Group &g, const Group &h) {
// return product(g, h);
// }
//
// Group operator^(const Group &g, int p) {
// return power(g, p);
// }
}

View File

@@ -1,20 +0,0 @@
#pragma once
#include <array>
struct Rel {
std::array<int, 2> gens;
int mult;
Rel() = default;
Rel(const Rel &) = default;
Rel(int a, int b, int m)
: gens({a, b}), mult(m) {
}
[[nodiscard]] Rel shift(int off) const {
return Rel(gens[0] + off, gens[1] + off, mult);
}
};

View File

@@ -105,11 +105,13 @@ namespace {
struct Table {
private:
public:
Rel rel;
int i, j, mult;
std::vector<Row> rows;
public:
explicit Table(const Rel &rel) : rel(rel) {
explicit Table(int i, int j, int mult) :
i(i), j(j), mult(mult) {
}
};
@@ -159,13 +161,13 @@ namespace {
public:
explicit Tables(const tc::Group<Rank> &group) {
const auto &rels = group.get_rels();
for (int i = 0; i < Rels; ++i) {
const auto &rel = rels[i];
auto table = std::make_shared<Table>(rel);
tables[i] = table;
deps[rel.gens[0]].push_back(table);
deps[rel.gens[1]].push_back(table);
for (int i = 0, irel = 0; i < Rank - 1; ++i) {
for (int j = i + 1; j < Rank; ++j, ++irel) {
auto table = std::make_shared<Table>(i, j, group(i, j));
tables[irel] = table;
deps[i].push_back(table);
deps[j].push_back(table);
}
}
}
@@ -178,12 +180,11 @@ namespace {
void initialize(int target, const tc::Cosets<Rank> &cosets) {
for (auto &table: tables) {
const Rel &rel = table->rel;
Row &row = table->rows[target];
if (row.lst == nullptr) {
if (cosets.get(target, rel.gens[0]) != target and
cosets.get(target, rel.gens[1]) != target) {
if (cosets.get(target, table->i) != target and
cosets.get(target, table->j) != target) {
row.lst = alloc();
row.gnr = 0;
} else {
@@ -212,7 +213,6 @@ namespace {
for (auto &table: deps[gen]) {
Row &target_row = table->rows[target];
Row &coset_row = table->rows[coset];
const Rel &rel = table->rel;
if (target_row.lst == nullptr) {
target_row.lst = coset_row.lst;
@@ -222,16 +222,16 @@ namespace {
target_row.gnr -= 2;
}
if (target_row.gnr == rel.mult) {
if (target_row.gnr == table->mult) {
// forward learn
int lst = *target_row.lst;
int gen_ = rel.gens[rel.gens[0] == gen];
int gen_ = (table->i == gen) ? table->j : table->i;
facts.push(lst * Rank + gen_);
} else if (target_row.gnr == -rel.mult) {
} else if (target_row.gnr == -table->mult) {
// stationary learn
int gen_ = rel.gens[rel.gens[0] == gen];
int gen_ = (table->i == gen) ? table->j : table->i;
facts.push(target * Rank + gen_);
} else if (target_row.gnr == rel.mult - 1) {
} else if (target_row.gnr == table->mult - 1) {
// determined family
*target_row.lst = target;
}