LLSSS-ng is a version of LLSSS by gchromodynamics (specifically, a C++ port) that uses significantly less memory and is much faster, at the cost of stripping out most of LLSSS’s extra features (most notably, the ability to do floating-row searches; L2S3ng can only do fixed-width orthogonal and diagonal searches). This is the program I used to find this 3c/7 in TTs in one night: https://conwaylife.com/forums/viewtopic ... 22#p234622
Here's the github: https://github.com/SuffixAutomata/llsss-ng
It also adds two major features:
-The ability to pause a search, producing a save file, which can be resumed later
-The ability to partition searches, which allows doing searches which would otherwise require far more memory, at the cost of an absurd amount of disk (I highly recommend using an external drive!)
This guide will not cover custom geometry and really complex features because I do not understand them. For those, refer to the github or pester gchromodynamics.
Installing
I’m bad at computer, so refer to the github:
Build instructions for linux: https://github.com/SuffixAutomata/llsss-ng
If you have a mac, there’s a downloadable binary at https://github.com/SuffixAutomata/llsss-ng/releases.
If you have a windows machine, uhh good luck there’s probably some way to do it idk
Using (no partitioning)
The command format is ./rlife llsss [options] <geometry> <start>.
Geometry follows one of the standard f2b LLSSS geometries (cP-f2b, KcP-f2b, cPd-f2b, or KcPd-f2b). Non f2b geometries aren’t supported at the moment. You can also use --left-edge even, --left-edge odd, or --left-edge gse/gso (for glide-symmetric searches) in the options section to do standard symmetries.
Start is the starting grid. You should typically do @bg(W) to do a search at a given width. There are more complex options, but I don’t know how to do them and won’t go into it here.
No, I do not know how diagonal widths correspond to other programs, each program seems to use a different system for diagonal width and I cannot for the life of me figure it out. Do a test run and kill it quickly and look at the bounding box.
For options, there are a lot of things to use. I’ll go over the most important ones; you can see the others with ./rlife llsss --help.
--filters bcaf: Break at zero. If you don’t include this, your search will not terminate when it finds a spaceship. Unless you specifically want a zillion tagalongs, I would include this.
--left-edge: I went over it above.
--rule: Determines the rule to do the search in (for example, --rule B3/S23-a5 searches in Travelling Ts)
--threads: If you do not set this option, L2S3ng will only use one thread. Example format: --threads 20
--halts: Halts the search when a specified condition is met. The most useful condition is w_pos:X, which halts the search at a certain W position (This is some weird LLSSS terminology that I do not understand but you probably do.)
--max-memory: Memory cap; if the program goes above this it saves and then stops.
--search-name: Determines the name of the save folder in the saves directory. Speaking of saving:
L2S3ng has the ability to save and load searches. If you ctrl-C the search (once, but I’m fairly sure you can do it multiple times, but I haven’t tested so be careful), it will detect the interrupt and exit once the current row is complete, saving a file in the save directory. These files are several gigabytes in size, by the way. You can also set it to save at other times using the --save command; the most important option is --save every:N, which saves a backup every N rows.
You can start the search again with the command ./rlife llsss --load saves/(save name). When you load, you can change --halts, --threads, --max-memory, and a few other things, but you cannot change the search parameters (width, rule, etc).
Partitioning
This is an extremely powerful feature that allows L2S3ng to split a run into multiple branches when memory use gets too high and continue each one individually. Partitioning is extremely storage intensive. Please use an external drive.
You can partition manually; I don’t really understand how, so refer to the github on that. L2S3ng comes with a partition manager python script, however, which automatically partitions searches when memory gets too high and goes back to earlier partitions when a partition is exhausted. Here’s how to use it:
Stick the following in front of your regular command: scripts/rlife_manager.py start saves/(search name) ./rlife --max-memory X --disk-reserve Y --parts Z (the rest of the options).
(search name) is the name of your search. This should be an entirely empty folder inside the directory you are using (by default, saves).
max-memory is the maximum amount of RAM L2S3ng is allowed to use before partitioning.
disk-reserve is how much space on disk the run is able to use; if it fills up this space, then the search pauses.
parts is how many pieces the search is split into at each partition. The recommended number is 4, and I don’t see much of a reason to change that.
There are some useful additional options (some more are documented on the github):
--delete-immediately: Automatically deletes exhausted save files. I strongly recommend using this. It reduces disk space used significantly.
--bfs: Runs the search breadth-first instead of depth-first. I haven’t tested this and there probably aren’t many situations where it’s useful.
Partitioning is slow, so you should ideally not do it very often. Pausing the search while it is in the middle of creating a partition loses progress on the partition creation, I lost 30 minutes of progress this way.
You can pause a partitioned search the same way you pause a normal search and then resume it with scripts/rlife_manager.py resume saves/(search name).
Good luck!