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.
Makes tc::Group a direct subclass of Eigen::Matrix. Group should represent a Schlafli matrix.
Added a note that tc::solve assumes the matrix to be for a coxeter group.
In theory we could also implement the "normal" todd-coxeter and allow any Schlafli matrix as input.
Profiling revealed significant performance overhead in using std::shared_ptr for lst.
There is even significant overhead in using new for lst.
Using pointers to blocks of pre-allocated memory for lst drastically improves performance (about 50%).
E7 and E8 show this well, since they allocate many lst pointers.
With shared_ptr: E7 ~3.3s, B8 ~21s.
With BlockAllocator: E7 ~1.6s, B8 ~11s.
Some performance hit, but remember that std::vector already does block allocation so it's not too bad.
- Remove block-allocation from RelTables
- Use std::shared_ptr for lst_ptrs
- Replace vector-of-struct-of-vector with vector-of-struct.
- Remove rels from RelTables