mirror of
https://github.com/allemangD/toddcox-visualize.git
synced 2025-11-10 03:52:48 -05:00
Improve tc::Group, tc::Cosets API.
This is a combination of many commits: --------------------------------------------------------------------------- final. add public/private for core classes. wip - big cleanup cosets. index<>, cosets<>, and group<> all defined transparent <void> overrides that operate directly on indices, not names inheritance hierarchy means one can drop or change generator names still missing path support. wip - named cosets fix lang test wip - named generators Move Group docstring away from specialization. Remove tc::Gen; use Group<void> remove tc::Rel add thousands separators for benchmark limits add generators list to tc::group remove pair_map
This commit is contained in:
@@ -1,2 +1,5 @@
|
||||
add_executable(benchmark benchmark.cpp)
|
||||
target_link_libraries(benchmark PUBLIC tc fmt::fmt)
|
||||
|
||||
add_executable(named named.cpp)
|
||||
target_link_libraries(named PUBLIC tc fmt::fmt)
|
||||
|
||||
@@ -11,20 +11,20 @@
|
||||
void bench(
|
||||
const std::string &group_expr,
|
||||
const std::string &symbol,
|
||||
const std::vector<tc::Gen> &gens,
|
||||
const tc::Coset bound = tc::UNBOUNDED
|
||||
const std::vector<size_t> &gens,
|
||||
const size_t bound = SIZE_MAX
|
||||
) {
|
||||
tc::Group group = tc::coxeter(symbol);
|
||||
tc::Group<> group = tc::coxeter(symbol);
|
||||
|
||||
std::clock_t s = std::clock();
|
||||
tc::Cosets cosets = tc::solve(group, gens, bound);
|
||||
tc::Cosets<> cosets = group.solve(gens, bound);
|
||||
std::clock_t e = std::clock();
|
||||
|
||||
auto time = (double) (e - s) / CLOCKS_PER_SEC;
|
||||
tc::Coset order = cosets.size();
|
||||
size_t order = cosets.order();
|
||||
auto cos_s = (size_t) (order / time);
|
||||
|
||||
bool complete = cosets.complete;
|
||||
bool complete = cosets.complete();
|
||||
|
||||
std::string name = fmt::format("{}/{}", group_expr, gens);
|
||||
std::string row = fmt::format(
|
||||
@@ -80,59 +80,59 @@ int main(int argc, char *argv[]) {
|
||||
// Affine Groups
|
||||
|
||||
// ~A_n: {3 * `n+1`}
|
||||
bench("~A_5", "{3 * 6}", {}, 1000000);
|
||||
bench("~A_6", "{3 * 7}", {}, 1000000);
|
||||
bench("~A_7", "{3 * 8}", {}, 1000000);
|
||||
bench("~A_8", "{3 * 9}", {}, 1000000);
|
||||
bench("~A_5", "{3 * 6}", {}, 10'000'000);
|
||||
bench("~A_6", "{3 * 7}", {}, 10'000'000);
|
||||
bench("~A_7", "{3 * 8}", {}, 10'000'000);
|
||||
bench("~A_8", "{3 * 9}", {}, 10'000'000);
|
||||
// ~B_n: 4 3 * `n-3` 3 * [1 1]
|
||||
bench("~B_5", "4 3 * 2 3 * [1 1]", {}, 1000000);
|
||||
bench("~B_6", "4 3 * 3 3 * [1 1]", {}, 1000000);
|
||||
bench("~B_7", "4 3 * 4 3 * [1 1]", {}, 1000000);
|
||||
bench("~B_8", "4 3 * 5 3 * [1 1]", {}, 1000000);
|
||||
bench("~B_5", "4 3 * 2 3 * [1 1]", {}, 10'000'000);
|
||||
bench("~B_6", "4 3 * 3 3 * [1 1]", {}, 10'000'000);
|
||||
bench("~B_7", "4 3 * 4 3 * [1 1]", {}, 10'000'000);
|
||||
bench("~B_8", "4 3 * 5 3 * [1 1]", {}, 10'000'000);
|
||||
// ~B_n: 4 3 * `n-2` 4
|
||||
bench("~C_5", "4 3 * 3 4", {}, 1000000);
|
||||
bench("~C_6", "4 3 * 4 4", {}, 1000000);
|
||||
bench("~C_7", "4 3 * 5 4", {}, 1000000);
|
||||
bench("~C_8", "4 3 * 6 4", {}, 1000000);
|
||||
bench("~C_5", "4 3 * 3 4", {}, 10'000'000);
|
||||
bench("~C_6", "4 3 * 4 4", {}, 10'000'000);
|
||||
bench("~C_7", "4 3 * 5 4", {}, 10'000'000);
|
||||
bench("~C_8", "4 3 * 6 4", {}, 10'000'000);
|
||||
// ~D_n: 3 * [1 1] 3 * `n-4` 3 * [1 1]
|
||||
bench("~D_5", "3 * [1 1] 3 * 1 3 * [1 1]", {}, 1000000);
|
||||
bench("~D_6", "3 * [1 1] 3 * 2 3 * [1 1]", {}, 1000000);
|
||||
bench("~D_7", "3 * [1 1] 3 * 3 3 * [1 1]", {}, 1000000);
|
||||
bench("~D_8", "3 * [1 1] 3 * 4 3 * [1 1]", {}, 1000000);
|
||||
bench("~D_5", "3 * [1 1] 3 * 1 3 * [1 1]", {}, 10'000'000);
|
||||
bench("~D_6", "3 * [1 1] 3 * 2 3 * [1 1]", {}, 10'000'000);
|
||||
bench("~D_7", "3 * [1 1] 3 * 3 3 * [1 1]", {}, 10'000'000);
|
||||
bench("~D_8", "3 * [1 1] 3 * 4 3 * [1 1]", {}, 10'000'000);
|
||||
// grid: `p` `q` ; 2(p+q) = pq
|
||||
// triangle: `p` `q` `r` ; 1/p + 1/q + 1/r = 1
|
||||
|
||||
// Special Affine Groups
|
||||
bench("~I_1", "-", {}, 1000000);
|
||||
bench("~E_6", "3 * [2 2 2]", {}, 1000000);
|
||||
bench("~E_7", "3 * [1 3 3]", {}, 1000000);
|
||||
bench("~E_8", "3 * [1 2 5]", {}, 1000000);
|
||||
// bench("E_9", "3 * [1 2 5]", {}, 1000000); // ~E_8 == E_9
|
||||
bench("~F_4", "3 4 3 3", {}, 1000000);
|
||||
bench("~G_2", "6 3", {}, 1000000);
|
||||
bench("~I_1", "-", {}, 10'000'000);
|
||||
bench("~E_6", "3 * [2 2 2]", {}, 10'000'000);
|
||||
bench("~E_7", "3 * [1 3 3]", {}, 10'000'000);
|
||||
bench("~E_8", "3 * [1 2 5]", {}, 10'000'000);
|
||||
// bench("E_9", "3 * [1 2 5]", {}, 10'000'000); // ~E_8 == E_9
|
||||
bench("~F_4", "3 4 3 3", {}, 10'000'000);
|
||||
bench("~G_2", "6 3", {}, 10'000'000);
|
||||
|
||||
// Hyperbolic Groups
|
||||
// grid: `p` `q` ; 2(p+q) < pq
|
||||
// triangle: `p` `q` `r` ; 1/p + 1/q + 1/r < 1
|
||||
|
||||
// Special Hyperbolic Groups
|
||||
bench("-BH_3", "4 3 5", {}, 1000000);
|
||||
bench("-K_3", "5 3 5", {}, 1000000);
|
||||
bench("-J_3", "3 5 3", {}, 1000000);
|
||||
// bench("~H_3", "3 5 3", {}, 1000000); // -J_3 == ~H_3
|
||||
bench("-DH_3", "5 3 * [1 1]", {}, 1000000);
|
||||
bench("^AB_3", "{3 3 3 4}", {}, 1000000);
|
||||
bench("^AH_3", "{3 3 3 5}", {}, 1000000);
|
||||
bench("^BB_3", "{3 4 3 4}", {}, 1000000);
|
||||
bench("^BH_3", "{3 4 3 5}", {}, 1000000);
|
||||
bench("^HH_3", "{3 5 3 5}", {}, 1000000);
|
||||
bench("-H_4", "5 3 3 3", {}, 1000000);
|
||||
// bench("~H_4", "5 3 3 3", {}, 1000000); // -H_4 == ~H_4 == H_5
|
||||
// bench("H_5", "5 3 3 3", {}, 1000000);
|
||||
bench("-BH_4", "4 3 3 5", {}, 1000000);
|
||||
bench("-K_4", "5 3 3 5", {}, 1000000);
|
||||
bench("-DH_4", "5 3 3 * [1 1]", {}, 1000000);
|
||||
bench("^AF_4", "{3 3 3 3 4}", {}, 1000000);
|
||||
bench("-BH_3", "4 3 5", {}, 10'000'000);
|
||||
bench("-K_3", "5 3 5", {}, 10'000'000);
|
||||
bench("-J_3", "3 5 3", {}, 10'000'000);
|
||||
// bench("~H_3", "3 5 3", {}, 10'000'000); // -J_3 == ~H_3
|
||||
bench("-DH_3", "5 3 * [1 1]", {}, 10'000'000);
|
||||
bench("^AB_3", "{3 3 3 4}", {}, 10'000'000);
|
||||
bench("^AH_3", "{3 3 3 5}", {}, 10'000'000);
|
||||
bench("^BB_3", "{3 4 3 4}", {}, 10'000'000);
|
||||
bench("^BH_3", "{3 4 3 5}", {}, 10'000'000);
|
||||
bench("^HH_3", "{3 5 3 5}", {}, 10'000'000);
|
||||
bench("-H_4", "5 3 3 3", {}, 10'000'000);
|
||||
// bench("~H_4", "5 3 3 3", {}, 10'000'000); // -H_4 == ~H_4 == H_5
|
||||
// bench("H_5", "5 3 3 3", {}, 10'000'000);
|
||||
bench("-BH_4", "4 3 3 5", {}, 10'000'000);
|
||||
bench("-K_4", "5 3 3 5", {}, 10'000'000);
|
||||
bench("-DH_4", "5 3 3 * [1 1]", {}, 10'000'000);
|
||||
bench("^AF_4", "{3 3 3 3 4}", {}, 10'000'000);
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
55
tc/bench/named.cpp
Normal file
55
tc/bench/named.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <fmt/ranges.h>
|
||||
|
||||
#include <tc/core.hpp>
|
||||
|
||||
template<typename G>
|
||||
void show(G const &g) { // todo add formatter for groups, cosets.
|
||||
fmt::print(" | ");
|
||||
for (const auto &v: g.gens()) {
|
||||
fmt::print("{} ", v);
|
||||
}
|
||||
fmt::print("\n");
|
||||
|
||||
for (const auto &u: g.gens()) {
|
||||
fmt::print("{} | ", u);
|
||||
for (const auto &v: g.gens()) {
|
||||
fmt::print("{} ", g.get(u, v));
|
||||
}
|
||||
fmt::print("\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
tc::Group<char> group(4, {'r', 'g', 'b', 'y'});
|
||||
|
||||
group.set('r', 'g', 5);
|
||||
group.set('g', 'b', 4);
|
||||
group.set('b', 'y', 3);
|
||||
|
||||
show(group);
|
||||
|
||||
auto sub = group.sub({'r', 'g', 'y'});
|
||||
show(sub);
|
||||
|
||||
auto res = sub.solve({});
|
||||
fmt::print("res order: {}\n", res.order());
|
||||
|
||||
auto cos = sub.solve({'r', 'y'});
|
||||
|
||||
fmt::print("order: {}\n", cos.order());
|
||||
|
||||
// tc::Group<u_int8_t> group(4, {0, 1, 2, 3});
|
||||
//
|
||||
// group.set(0, 1, 5);
|
||||
// group.set(1, 2, 4);
|
||||
// group.set(2, 3, 3);
|
||||
//
|
||||
// show(group);
|
||||
//
|
||||
// auto sub = group.sub({3, 2, 0, 1});
|
||||
// show(sub);
|
||||
}
|
||||
Reference in New Issue
Block a user