1
0
Files
toddcox-faster/include/tc/groups.hpp
David Allemang fa13493569 Un-template groups.
Templating the groups doesn't improve performance that much, but it severely hinders usability. Switch things to be dynamically sized so that different ranked groups are the same type.

Could also now separate headers and implementation... but will probably leave it for now.
2021-11-07 20:40:34 -05:00

149 lines
2.9 KiB
C++

#pragma once
#include "group.hpp"
namespace tc::group {
/**
* Universal Coxeter Group
*/
Group U(size_t rank) {
std::string name = "U(" + std::to_string(rank) + ")";
Group res(rank);
res.name = name;
res.fill(2);
return res;
}
/**
* Simplex
*/
Group A(size_t rank) {
std::string name = "A(" + std::to_string(rank) + ")";
if (rank == 0) {
Group res(rank);
res.name = name;
return res;
}
tc::Symbol symbol(rank - 1);
symbol.fill(3);
return schlafli(symbol, name);
}
/**
* Cube, Orthoplex
*/
Group B(size_t rank) {
std::string name = "B(" + std::to_string(rank) + ")";
tc::Symbol symbol(rank - 1);
symbol.fill(3);
symbol(0) = 4;
return schlafli(symbol, name);
}
/**
* Demicube, Orthoplex
*/
Group D(size_t rank) {
std::string name = "D(" + std::to_string(rank) + ")";
tc::Symbol symbol(rank - 1);
symbol.fill(3);
symbol((Eigen::Index) rank - 2) = 2;
Group g = schlafli(symbol, name);
g(1, (Eigen::Index) rank - 1) = 3;
g((Eigen::Index) rank - 1, 1) = 3;
return g;
}
/**
* E groups
*/
Group E(size_t rank) {
std::string name = "E(" + std::to_string(rank) + ")";
tc::Symbol symbol(rank - 1);
symbol.fill(3);
symbol((Eigen::Index) rank - 2) = 2;
Group g = schlafli(symbol, name);
g(2, (Eigen::Index) rank - 1) = 3;
g((Eigen::Index) rank - 1, 2) = 3;
return g;
}
/**
* 24 Cell
*/
Group F4() {
tc::Symbol symbol(3);
symbol << 3, 4, 3;
return schlafli(symbol, "F4");
}
/**
* Hexagon
*/
Group G2() {
tc::Symbol symbol(1);
symbol << 6;
return schlafli(symbol, "G2");
}
/**
* Icosahedron
*/
Group H(size_t rank) {
std::string name = "H(" + std::to_string(rank) + ")";
tc::Symbol symbol(rank - 1);
symbol.fill(3);
symbol(0) = 5;
return schlafli(symbol, name);
}
/**
* Polygonal
*/
Group I2(unsigned int n) {
std::string name = "I2(" + std::to_string(n) + ")";
tc::Symbol symbol(1);
symbol << n;
return schlafli(symbol, name);
}
/**
* Toroidal. I2(n) * I2(m)
*/
Group T(unsigned int n, unsigned int m) {
std::string name = "T(" + std::to_string(n) + "," + std::to_string(m) + ")";
tc::Symbol symbol(3);
symbol << n, 2, m;
return schlafli(symbol, name);
}
/**
* Toroidal. T(n, n)
*/
Group T(unsigned int n) {
std::string name = "T(" + std::to_string(n) + ")";
tc::Symbol symbol(3);
symbol << n, 2, n;
return schlafli(symbol, name);
}
}