https://gitlab.com/apgoucher/ikpx2
It's a considerable improvement over the original ikpx in a number of ways:
- Supports arbitrary isotropic 2-state Moore-neighbourhood cellular automata (not just B3/S23);
- Makes use of top-tier modern SAT solvers (namely Armin Biere's cadical and kissat);
- Uses the 'multi-armed bandit' notion from reinforcement learning to learn which of the SAT solvers are best for which subproblems;
- More efficient, being written in C++ and statically linked against the solvers instead of spawning subprocesses and using named pipes;
- Better method of avoiding redundant repetition of work;
- More user-friendly: can digest partials as RLEs (oriented to move between north and north-west) without requiring manual truncation or running that awkward golly2ikpx script.
- Better lattice basis: it tries to grow spaceships in the direction exactly antiparallel to the direction of travel;
- Internal priority heap: it tries to extend the partials with the narrowest backends first (as they're more likely to admit a completion), using length as a tie-breaker (to prefer shorter completions);
- Adaptive symmetry switching: for orthogonal velocities, it can find spaceships which mix and match components of different symmetries (such as a c/3 turtle with an asymmetric tagalong);
- Integrated apgsearch: you can use the familiar -n and/or -k flags from apgsearch, and it will run every phase of every intermediate partial through apgsearch (without requiring Unix pipes!) and upload the results to Catagolue's ikpx2_stdin symmetry. This is useful for finding higher-period spaceships and puffers travelling at the target speed.
As an example, here's a period-24 c/2 puffer it quickly found in MirrorTLife:
Code: Select all
x = 21, y = 14, rule = B3-kq4j/S2-i34q
3bo13bo$b2ob2o9b2ob2o$b2ob2o9b2ob2o$bo3bo9bo3bo$2o3b2o7b2o3b2o2$2o3b2o
2b3o2b2o3b2o$2bobo3b2ob2o3bobo$2bo4bo5bo4bo$4bobo2bobo2bobo$8bo3bo$6bo
7bo$5bobo5bobo$6bo7bo!
Code: Select all
x = 13, y = 41, rule = B3-kq4j/S2-i34q
b4ob3o$b2obob2obo$obo3b4o$bo2b3o$2bo4bo$b2obo3bo$b2o2bo3bo$7bobo$5bo$4b2o$4b
2o$5b2o$6bo$9bo$3b3obob2o$2bobo$7bo$5b2o2$5bo4bo$5bob2ob2o$11b2o2$4b3ob3o$4b
3obobo$6bo$6bo$5bobo$5bobo2$4b2ob2o$6bo$3b2o3b2o$3b2obob2o$4bo3bo3$4bo$3b2o$
2bobo$3bo!