amling search program principles discussion / brain dump
Re: amling search program principles discussion / brain dump
I'm going to elide the details about root labels and geometry and just talk about the typical cases (default build, normal geometry, pretend all fixed board roots are identical, etc.) from here on in.
As things are right now the spine store stores streams of bits which are expanded one at a time. These are thought of as filling in a stack of "tiles" in W order. How it does this storage doesn't super matter as it's never come up performance-wise. bcols are stored as a pair of u32 indices into the spine store. jcols are stored as a pair of u32 indices into the bcols on either side (and the shared middle spine store pointer matches). This pair of u32s for each jcol entry is quite expensive and even the pair of u32s in the bcols is not great.
As an example, consider the 2c5-wing.in searches from far above. Expanded 0/4/2 with the existing code at the peak moment of memory the internal view is 3.22 GB. The jcols are 2.13 GB, the bcols are 580 MB, the spine store is 99 MB, and various other structures that are part of the expansion algorithm make up the rest. As searches get bigger this disparity of jcols over bcols and bcols over spine store widens but even in this, a middling search, bcols are still relevant.
The new "bit tree" structure is somewhat like the old spine store in that it's sort of storing streams of bits, but this time it's stored much more compressed. A bit tree knows its bit width W (1 for spine store, 2 for bcol, 3 for jcol) and thinks of itself as storing a stream of W-grams of bits. It stores these as a stack of generations. Each generation is a bit vector with a total of 2^W bits corresponding to each nonzero bit in the parent generation (indicating the presence/absence of the 2^W possible extensions). Each generation also has some extra index jiggerpokery to help translate quickly between absolute bit indices in that generation (which you'd use to look up in this generation's bit vector), and nonzero bit indices in that generation (which you'd use to find absolute indices of children in the next generation). This does mean keeping a lot of generations around (one per "w pos" per bit tree), but they are so very dense that it works out to be pretty efficient. With this the spine store and bcols aren't really doing as much as they used to (bcols are just projections of jcols and spine store is just a union of the projections of everything), but they're still used (via indices into themselves) to coordinate other sorts of data stored in other code.
The new code, for the same 2c5-wing.in expanded 0/4/2, reaches only an internal view of 874.91 MB which is an enormous, enormous savings from 3.22 GB (3.77x!). It's even possible this would give us another crack at "hollow" jcols where the jcols are removed entirely and we do CA joins between adjacent bcols (whose tree forms are somewhat more amenable to this than the old bcol format). At that 874.91 MB moment it's 478.51 MB jcols, 79 MB bcols, 5.07 MB spine store, and the rest is taken up by expansion algorithm stuff. If we did hollow jcols I'd expect to save the 478.51 MB directly but also 273.01 MB of the expansion structures maybe putting us at just 123.39 MB (this is the same search that took 35 GB so long ago before the one bit at a time changes).
Unfortunately this may all be premature as I'm not sure I can get the performance up to snuff. This 0/4/2 search with old code is ~187s. The first cut of the new stuff I had run took 1900s, about 10x (10x also consistent for the 0/3/2 search). I did some work to clean up the worst offenders and to try to fix it parallelizing poorly, but even after about a half of a day of effort I've only got it down to maybe 7x slower and unfortunately that time is all over (i.e. the parallel tree walk algorithm which is the common denominator between everything is almost certainly the problem and I have spent nearly the entire time on trying to optimize it). 3.77x memory reduction is amazing but I'm not sure we're willing to pay a 7x slowdown for it.
Also unfortunately, this is on a wacky proof of concept branch where I've deleted like 95% of the code/features to make the rewrite as simple as possible (keeping just fixed board searches, firstest partials to see what's happening, and almost nothing else). I'm not sure this is something I can reasonably abstract out so it can co-exist with the current code as it touches every main data structure in the program.
I guess I'm gonna sleep on it and see if I can't think of some other trick to pull off to either make this perform better or integrate with the main codebase.
Re: amling search program principles discussion / brain dump
That depends on whether there are any interesting searches that were restricted by memory limits, rather than time. If an interesting search takes only an hour to run out of memory, but could complete with a 3.77x memory reduction, then it might be worthwhile to run such a search even with a 7x slowdown. I doubt I can think of any real examples, since until recently I was restricted to ~5GB of RAM, so most of my searches hit memory limits long before time became an issue.amling wrote: October 18th, 2025, 3:24 am 3.77x memory reduction is amazing but I'm not sure we're willing to pay a 7x slowdown for it.
Most of the examples I was interested in were arbitrary-width searches, such as a side-to-side search for a p1 photon in B2458/S13467 (the last unsolved rule without S0 in the Life-like p1 photon project). Unfortunately, this doesn't work with your simplifying assumption of a fixed board. Perhaps it could be used to determine the minimum staggered height for a period-5 2c/5 spaceship, although I'm not sure how long the "height 9.2" search took, and perhaps this problem is better suited for normal LLSSS on your 1TB RAM machine.
Re: amling search program principles discussion / brain dump
Re: amling search program principles discussion / brain dump
I'm not sure "planning" describes my approach to software development although that's neither here nor there.Sylvani wrote: October 26th, 2025, 3:08 pm Are you planning on adding support for MAP rules any time soon? I'd like to find some discoveries in a few of my favorite MAP rules.
My best efforts to search the wiki for "MAP" and figure out what is meant led me to the "Non-isotropic_rule" page which suggests we're talking about the 2^512 rules for arbitrary, deterministic, square grid range 1 rules. This is within the bounds of what the existing LLSSS engine can do but there is no way to specify such a rule with the --rule argument parser which makes this just a small UI change, at least assuming we're both talking about the same thing.
I'm at an awkward moment in (real) life right now which makes it unlikely I will get to this just right now but it's a small change I'm happy to take on later if it will be of use to anyone.
Unfortunately what I found on the wiki is somewhat short of a clear and objective spec so it would be helpful to me if you have example (specifically non-INT) rules and ships, ideally small and with a low period to serve as test cases, both for my understanding of the MAP string format and for the full LLSSS search itself. It's possible some digging in the forums would allow me to provide this myself, but it would be a favor to me to save me that work.
Finally, LLSSS named geometries are fixed for ships traveling certain directions (f2b NNW, s2s W or NW, b2f SSE) and so you may end up having to reorient rules or specify "raw" geometries depending on what you want to search.
Re: amling search program principles discussion / brain dump
I found this post which convinced me my initial guesses about which way certain bit orderings would go are almost certainly correct.Sylvani wrote: October 26th, 2025, 3:08 pm Are you planning on adding support for MAP rules any time soon? I'd like to find some discoveries in a few of my favorite MAP rules.
I've sketched a quick parser for when --rule arguments are "MAP" plus 86 letters but I'm sort of missing examples to test it on. That linked post gives a MAP equivalent of B3/S23 which I have verified my code parses into an identical rule table to "B3/S23". The only other MAP string I could find anywhere was "MAPAAD//zAwPz8AAP//MDA/PwAA//8AAP//AAD//wAA//8AAD8/AAD//wAAPz8AAP//wMD//wAA///AwP//AAD//w". I found a pyramidal family of c/2 south partials (had to search with "raw" geometry "raw:1:0:0:0:1:2:0:0:1") and verified they simulate in life viewer as LLSSS expects.
I've pushed the changes to codeberg just now. I would really appreciate it if you could verify them or provide some sort of examples (rules, ships, partials, anything) for more test cases.
As a note about LLSSS internals, this MAP string is almost as general as LLSSS can support without a severe overhaul. The assumptions of 2 states and range 1 are built in very deeply and generalizing either of them would basically require rebuilding the entire program from scratch. Within those assumptions you could imagine there instead being 2^2^10 "rules" describing which 10 cell neighborhoods (9 cells in present plus one cell in future) are permitted. MAP strings require for a given 9 cell present that exactly one of the two possible extensions to 10 cell neighborhood is allowed (for 2^2^9 rules), whereas LLSSS can be configured to allow neither (forbidden 9 cell neighborhood) or both (non-deterministic 9 cell neighborhood).
Re: amling search program principles discussion / brain dump
Code: Select all
x = 52, y = 21, rule = MAPAVRRGAIAgAUAEICAgCAAAACgBAAAAAAAAABAgAAAAAAAiIgAgABAAAAAAggAAAAAAIABAKAAAACAAEAABAAAAA
24b3o$9bo6bo7bo$7bo2bo5b2o7bo$9bo$bo$3o$3bo$50b2o$2bo46bo11$12b3o$12b
3o!R2INT's Rule Collection
Travelling Ts has surpassed LeapLife in post count, but not yet in technology.
Re: amling search program principles discussion / brain dump
Yes, thank you, that's perfect. So many ships, and so much asymmetry! It requires a "raw" geometry, but a c/2 south search finds that one immediately:R2INT wrote: October 30th, 2025, 1:30 pm Here is a MAP rule with a (0,1)c/3, a (0,2)c/6, a (0,1)c/4, a (-1,1)c/3, and a (0,-1)c/2:Code: Select all
x = 52, y = 21, rule = MAPAVRRGAIAgAUAEICAgCAAAACgBAAAAAAAAABAgAAAAAAAiIgAgABAAAAAAggAAAAAAIABAKAAAACAAEAABAAAAA 24b3o$9bo6bo7bo$7bo2bo5b2o7bo$9bo$bo$3o$3bo$50b2o$2bo46bo11$12b3o$12b 3o!
Code: Select all
$ export LLSSS_HALT_ON_ENDS=true
$ rlife llsss-recentering-wao --rule 'MAPAVRRGAIAgAUAEICAgCAAAACgBAAAAAAAAABAgAAAAAAAiIgAgABAAAAAAggAAAAAAIABAKAAAACAAEAABAAAAA' 'raw:1:0:0:0:1:2:0:0:1' '@bg' XX
...
20251030 11:01:32 [INFO] End [thinnest] ("LlsssEndsAgar", "zero"):
20251030 11:01:32 [INFO] | ......... | |
20251030 11:01:32 [INFO] | ......... | ......... |
20251030 11:01:32 [INFO] | ....*.... | ......... |
20251030 11:01:32 [INFO] | ..***.... | ......... |
20251030 11:01:32 [INFO] | ...*..*.. | ...***... |
20251030 11:01:32 [INFO] | ....*.... | ...***... |
20251030 11:01:32 [INFO] | ......... | ......... |
20251030 11:01:32 [INFO] | ......... | ......... |
20251030 11:01:32 [INFO] | | ZZZZZZZZZ |
...
Code: Select all
$ rlife llsss-recentering-wao --rule 'MAPAVRRGAIAgAUAEICAgCAAAACgBAAAAAAAAABAgAAAAAAAiIgAgABAAAAAAggAAAAAAIABAKAAAACAAEAABAAAAA' 'c2-f2b' '@bg' XX
...
20251030 11:05:54 [DEBUG] Completed w_pos 6: 808 B [+64.05%], 15.064691ms [+21.10%]
...
20251030 11:05:54 [INFO] Thinnest partial:
20251030 11:05:54 [INFO] | | ZZZZZZZ |
20251030 11:05:54 [INFO] | ....... | ....... |
20251030 11:05:54 [INFO] | ....... | ....... |
20251030 11:05:54 [INFO] | ...*... | ..***.. |
20251030 11:05:54 [INFO] | ...**.. | |
...
20251030 11:05:54 [DEBUG] Completed w_pos 7: 0 B [-200.00%], 16.858968ms [+11.24%]
...
20251030 11:05:54 [INFO] Done
$
Code: Select all
$ rlife llsss-recentering-wao --rule 'MAPAVRRGAIAgAUAEICAgCAAAACgBAAAAAAAAABAgAAAAAAAiIgAgABAAAAAAggAAAAAAIABAKAAAACAAEAABAAAAA' 'raw:0:1:0:1:0:2:0:0:1' '@bg' XX
20251030 11:06:30 [DEBUG] Completed w_pos 5: 400 B [+63.16%], 26.540725ms [+30.83%]
...
20251030 11:06:30 [INFO] Thinnest partial:
20251030 11:06:30 [INFO] | ... | ...Z |
20251030 11:06:30 [INFO] | ... | ...Z |
20251030 11:06:30 [INFO] | ... | *..Z |
20251030 11:06:30 [INFO] | *.. | *..Z |
20251030 11:06:30 [INFO] | ... | ...Z |
20251030 11:06:30 [INFO] | ... | ...Z |
...
20251030 11:06:30 [DEBUG] Completed w_pos 6: 0 B [-200.00%], 16.916292ms [-44.29%]
...
20251030 11:06:30 [INFO] Done
$
Code: Select all
$ rlife llsss-recentering-wao --rule 'MAPAVRRGAIAgAUAEICAgCAAAACgBAAAAAAAAABAgAAAAAAAiIgAgABAAAAAAggAAAAAAIABAKAAAACAAEAABAAAAA' 'raw:0:1:0:-1:0:2:0:0:1' '@bg' XX
20251030 11:07:27 [DEBUG] Completed w_pos 7: 848 B [+39.55%], 20.004908ms [+32.54%]
...
20251030 11:07:27 [INFO] Thinnest partial:
20251030 11:07:27 [INFO] | .... | Z.... |
20251030 11:07:27 [INFO] | .... | Z.... |
20251030 11:07:27 [INFO] | ..*. | Z..** |
20251030 11:07:27 [INFO] | ...* | Z..*. |
20251030 11:07:27 [INFO] | .... | Z...* |
20251030 11:07:27 [INFO] | .... | Z...* |
20251030 11:07:27 [INFO] | .... | Z.... |
20251030 11:07:27 [INFO] | .... | Z.... |
...
20251030 11:07:27 [DEBUG] Completed w_pos 8: 0 B [-200.00%], 15.087344ms [-28.03%]
...
20251030 11:07:27 [INFO] Done
$
If enterprising OCA explorers need help juggling coordinates or these raw geometries they should feel free to check in here.
Ultimately maybe we'd invent something like "c2-s-f2b" to allow specifying the V orientation? It's awkward that the default V orientation depends on the f2b/b2f/s2s choice after it. For s2s you maybe even need another (optional?) tag to distinguish "c2-e-s2s-s" (W=Y) or "c2-e-s2s-n" (W=-Y). We'd also have to figure out what to do with diagonal geometries where you've got a mess of choices for UW: c4d-nw-down-s (W=Y), c4d-nw-down-e (W=X), c4d-nw-up-n (W=-Y), c4d-nw-up-w (W=-X), c4d-nw-f2b (W=T), c4d-nw-b2f (W=-T), c4d-nw-s2s-sw (W=(-1, 1, 0)), and c4d-nw-s2s-ne (W=(1, -1, 0)).
Maybe we'd rather invent something as general as "raw" but hopefully easier to understand? Like have you specify V, oriented, then U, then W? E.g. "V=2c5-s,U=X,W=~T" or "V=(0,2)c/5,U=X,W=~T" -> V 2c/5 south, W is "T-like", i.e. chosen to be the weird division of T (mod V) that we do now for things like 2c5-f2b. Unclear if "W=~T" could be made to work in all cases. Or e.g. "V=(-1,-2)c/6,U=X,W=Y" or "V=c6k-nnw,U=X,W=Y" -> current c6k-1, but spelled out. Current c6k-2 is then "V=(-2,-1)c/6,U=X,W=Y" or "V=c6k-wnw,U=X,W=Y".
Something to think about, although I'm not super excited about it. I think I rather prefer partials to build the direction(s) the current named geometries do and if I were actually searching in one of these MAP rules myself I would probably choose to reorient the rule accordingly.
Re: amling search program principles discussion / brain dump
I apologize for not providing any examples of rules myself, and I appreciate you pushing this update.amling wrote: October 29th, 2025, 7:34 pm
I've sketched a quick parser for when --rule arguments are "MAP" plus 86 letters but I'm sort of missing examples to test it on.
...
I've pushed the changes to codeberg just now. I would really appreciate it if you could verify them or provide some sort of examples (rules, ships, partials, anything) for more test cases.
A while ago, I noticed that LLSSS had no support for von Neumann neighborhood rules. Since I couldn't find a script that converted von Neumann to Hensel notation (I do recall such a thing existing but it could've been my mind playing tricks), I decided to convert it to 512-bit MAP (with a script that will be pasted at the end of this reply), then ran LLSSS with that as the rule. This allowed me to find a few ships and partials in a few B0 rules.
Here are some notable ones:
I ran a c6k-1 search on a lot of von Neumann rules (every rule excluding S4 or "phoenix" rules such as B0/SV or B0/S34V), which led to...
A large (largest out of my overnight mid_steps 12 searches) (2,1)c/6 partial that sprouts occasional thin parts during searches:
Code: Select all
x = 20, y = 37, rule = B0124/S013V
2b3o$2b2obo$ob2o$b5o$bobob2o$6b2o$5b5o$4b7o2bo$3bob6o2b2o$4b2ob3o2bo$
7b6o$5bob6o$5b3o2b3o$5bo2bo2bo$6bob4o$7b4obo2bo$6bo4bob2obo$7bo2bob3ob
2o$8b9o$9b4ob6o$7b3ob4obobo$7b4o4bo$8b2obo2bo$6b4obobo$6b3ob2ob2o$7bob
obo$7bob3o$7b2obob2o$6bobo3b2o2bo$6b3obobo2bobo$7b2obo3b3o$6b8ob2obo$
6b5ob2o3bo$8bobo2b3ob2o$6bobo2bobob5o$6bobob2o3b2o$9bobo4bo!
Code: Select all
x = 35, y = 22, rule = B0123/S013V
7b3o3b2o2b2o4b5o$6b5ob8o2b7o$7b2o5b4o7bo$6bo7bo2bo4b3ob3o$7b2o12b9o$6b
4o10b11o$b3o2b3obo3b3o5b7o$4ob14ob7obo$b3ob4ob2obob2o2bo2b2o2b3o$o2bob
ob2o5b4o6b5o$bo6b4obob4o4b8o$8b3obob6o5b6o$7bo4bob7o4bob6o$7b3ob2o2b7o
6b6o$6bobob5ob8o3b8o$7b8ob6o8b3o$6b3ob6o2b4o6b5o$8bob5ob3o2b2o7b3o$8bo
2b7obobo9b2o$12b4o2b4obo7bo$13bobo2bob3o$13bo6bo!Code: Select all
x = 26, y = 16, rule = B012/S013V
2b2o18b2o$bo2bo16bo2bo$b3o18b3o$o2b2o6b4o6b2o2bo$3b3o4b6o4b3o$2b5ob4o
2b4ob5o$3b2o2b5o2b5o2b2o$bob2ob14ob2obo$2b3ob5o4b5ob3o$3bo2b4o2b2o2b4o
2bo$4bo6b4o6bo$10b6o$9b8o$7bob8obo2$9bobo2bobo!Code: Select all
x = 43, y = 14, rule = B02/S1V
36b2o$3bobo2bobo9b6o7b2ob2ob2o$bob2o2bo3bo6bobob2obobo3bobob4obobo$3b
2o2b2ob2o10b2o8bo8bo$4bo3b4obo7bo2bo7b3o4b3o$obo6b7o18bo4bo$3b2o5b5obo
17bo4bo$6obo3b2obo$3b3o2bo3bob2o$5bob2o2b2o$6b3o4b2o$6b2o3bobo2$5b2o!Why is it 22 characters long instead of 86? Golly (EDIT2: LifeViewer as well) can actually support hexagonal-only and even vN-only (6-letter long) MAP rules.
My favorite pastime (of the pastime of CA) is to "rule-golf" with words, flipping capital letters.
This "Gorilla Gorilla Gorilla" rule is so far my favorite. It is asymmetric and has a lot of (potential) speeds.
I've only found four of them but the rest could be found easily.
Code: Select all
#C MAPu8wzVZnM7t27zDNVmczu3e6IRCIiMwAz7ohEIiIzADO7uxHume4R7ru7Ee6Z7hHuzER3iGaZAADMRHeIZpkAAA
x = 44, y = 37, rule = MAP/gOrillaGorillaGorilLA
26bo13bo$2bo10bo11bo15bo$b2o11bo11bobo12bo$2ob2o11bo8bo2bo10bobo$2o14b
2o8bob2o6bo3bo$3b2o9bobo9bo2b3o6b2o$4bo8b3ob2o8bobo6b2ob4o$o3b2o8b2o2b
2o9b2o6b5o$3bobo9b2o2b2o9bo10bo$2bo2b3o13bo9b2o7b4o$3bob3o15bo16bo$5bo
13bobo18bo$5bobobo11bob2o16b2o$6b2ob2o9b4obo$9b2o11b4o$10bo11bob2o$11b
2o10bob2o$24b2o$26b2obo$29bo$27b2o$27bobo$28bobo$30bo$30b3o$29b2o$30bo
$31b2obo$31bob3obo$32b3o2b2o$33b3obo$36bo2b2o$36bob4o$38b2o2bo$40bo$
39bo$40b2o!
Code: Select all
import base64
import golly as g
from itertools import product
# There's probably a more primitive and slow version of this somewhere deep in the forums.
# This can convert any *range 1 2-state rule* to 512-bit MAP format.
# (i.e. B3/S23, B24/S12V, B2-a/S12)
# (You can try with any other rule but it might lead to unexpected results.)
orig_rules = ["MAP/gOrillaGorillaGorilLA"]
is_b0 = True # "B0" in g.getrule() # You can set this yourself if you want, but it is important.
# orig_rules = []
# rule_births = ["0", "1", "2", "3", "4"] # This is from my von Neumann searches
# rule_survivals = ["0", "1", "2", "3"]
#
# for b in product(*map(lambda e: ["", e], rule_births)):
# for s in product(*map(lambda e: ["", e], rule_survivals)):
# if "0" in b and any(len(e) > 0 for e in s):
# orig_rules.append("B{}/S{}V".format("".join(b), "".join(s)))
rules = []
for rule in orig_rules:
g.setrule(rule)
m = ""
oldsel = g.getselrect()
g.setstep(0)
g.select([0, 0, 1, 1])
g.clear(0)
g.clear(1)
for i, n in enumerate(product([0, 1], repeat=9)):
clist = []
for j in range(3):
for k in range(3):
if n[j * 3 + k]:
g.setcell(k + i * 10, j, 1)
g.step()
for i in range(512):
if is_b0:
m += str(1 - g.getcell(1 + i * 10, 1))
else:
m += str(g.getcell(1 + i * 10, 1))
g.update()
q = b""
for i in range(0, 512, 8):
q += int(m[i:i+8], 2).to_bytes(1)
rules.append("MAP" + base64.b64encode(q).decode("utf-8").strip("="))
g.clear(0)
g.clear(1)
g.show("Generated: " + ", ".join(rules))
g.setclipstr("\n".join(rules))Re: amling search program principles discussion / brain dump
LLSSS roadmap is a messy mix of my interest and my perception of community interest balanced against weight on the codebase to implement. I had never ever heard of all these various rule string formats before and they're somewhat outside of my range of interest, but they are very simple to implement and tuck away nicely inside GolRule::parse.Sylvani wrote: November 9th, 2025, 12:16 pm A while ago, I noticed that LLSSS had no support for von Neumann neighborhood rules.
I implemented terminal "V" rules similar to terminal "H" rules. I couldn't quite find a clear indication of the expectation for hensel notation letters for the two "2" neighborhood shapes and ended up picking "e" and "i" based on what I did find on the wiki. It's easy enough to find that c/2 ship from your examples:
Code: Select all
$ rlife llsss-recentering-wao --rule 'B0123/S013V' c2-f2b --bg-agar b0 '@bg' --llsss-env LLSSS_HALT_ON_ENDS=true XX
...
20251111 10:08:02 [INFO] End [thinnest] ("LlsssEndsAgar", "b0"):
20251111 10:08:02 [INFO] | | ZZZZZZZZZZZZ |
20251111 10:08:02 [INFO] | ............ | ************ |
20251111 10:08:02 [INFO] | ............ | ************ |
20251111 10:08:02 [INFO] | ...**..**... | ***..**..*** |
20251111 10:08:02 [INFO] | ..********.. | ****.**.**** |
20251111 10:08:02 [INFO] | ....****.... | ************ |
20251111 10:08:02 [INFO] | ....*..*.... | ************ |
20251111 10:08:02 [INFO] | ............ | ************ |
20251111 10:08:02 [INFO] | ............ | |
...
$
For any poor souls trying to figure this out who find this post: to make the indices 0-511 the 9-bit neighborhood is packed SE (contributes 1), SC (contributes 2), SW (contributes 4), CE, CC, CW, NE, NC, NW, as is documented on the wiki, but then the hex neighborhoods are packed into 0-127 indices as NC (contributes 1), NW (contributes 2), CE (contributes 4), CC, CW, SE, SC.
I skipped straight to reverse engineering the von Neumann neighborhood order from carefully cooking up 1 bit rule strings (e.g. "MAPQAAAAA") and testing them in golly. I think I've got it (and it was what I would have expected analogous to full MAP strings), but I don't really have any great, fast way to test it. I would be interested in 6-letter MAP string example not-even-isotropic rules and/or ships for them if there are any known for test cases. For the time being I guess I'm just gonna ship what I wrote as-is and hope it's right.
I've pushed all of the above changes to codeberg just now. As always, if you have the time to write a bit, I would love to hear how usage of it goes.
Re: amling search program principles discussion / brain dump
I did a bunch more work on optimizing that 7x slower and it was down to about 5x slower when I was last looking before I was called away by real life. I'm not sure I can do that much better and even if I could get it down to, say, 2x slower, it is kind of a big loss to accept.amling wrote: October 18th, 2025, 3:24 am I sketched a wild cut of the code where I changed all the main datastructures entirely. I moved all of the spine store, the bcols, and jcols to a new "bit tree" datastructure, optimized somewhat more for memory efficiency with the assumption of few writes.
...
I've only got it down to maybe 7x slower... 3.77x memory reduction is amazing but I'm not sure we're willing to pay a 7x slowdown for it.
Also unfortunately, ... I'm not sure this is something I can reasonably abstract out so it can co-exist with the current code as it touches every main data structure in the program.
I guess I'm gonna sleep on it and see if I can't think of some other trick to pull off to either make this perform better or integrate with the main codebase.
I also did a bunch more work recently and rebuilt the entire proof of concept more like how I did "hollow jcols" where the type system is able to hold the abstraction and then all the existing big dynamic main methods use what is mostly the current version (minus a few changes for abstraction) while a separate, very stripped down main with no features can run the simplest possible fixed board searches with the new bit tree version. Performance all TBD as I haven't done any benchmarking yet, just got it compiling and smoke-tested. There is maybe some hope that we would pay the abstraction cost, both in terms of the compiler/optimizer, but also in terms of the algorithm changes I made to unify things and then also some hope that we could make features (and search modes like recentering) work for the bit tree version one at a time and eventually catch back up. I guess stay tuned...
Re: amling search program principles discussion / brain dump
Re: amling search program principles discussion / brain dump
"No" is probably the short answer to that. LLSSS intermediate state and LLSSS recentering results aren't really stored as the boards you see (rather as a space of strips that can be recombined to make boards) and so such notions of filtering don't really make sense (neither for LLSSS state generally nor for recentering results). LLSSS fixed board results are fully reified boards so you could filter those I suppose.Sylvani wrote: November 19th, 2025, 8:28 pm Is there a way to exclude or filter out results that contain smaller unwanted objects (For example, finding a still life other than a beehive in rules like B34/S24)? Maybe a minimum population search somehow?
I have no idea why you mention the min pop work in this context. While the associated threads are titled "min pop" the actual implementation is to filter state and results to a maximum population, thus filtering out large patterns rather than small ones, although the sense in which this filters and the sense in which it works at all are quite, quite limited.
If you multiplied AF2 up large enough to "see" an entire beehive and surrounding whitespace (either increasing AF2 or making U a multiple of X), then forbidding one to appear is an "intra-strip" question and can be done with the "forbid_blocks" filter, although I am not optimistic about the performance of such multiplying up.
Having spent just a few minutes poking B34/S24 searches they seem extremely finicky and my money might be on no other finite still lifes existing, but I do not think proving that is within the range of techniques known to me.
If you think otherwise and want to put time and effort on it, I would probably suggest starting with an input file forcing a few cells on or off to prevent any all-beehive solution from existing, something like:
Code: Select all
$ cat n1.in
| LLLLLLuuRRRRRR |
| .............. |
| .............. |
| ...WWW..WWW... |
| ...WWW..WWW... |
| ...WWW**WWW... |
| ...WWW*.WWW... |
$ rlife llsss-recentering --rule 'B34/S24' p1 n1.in 20
...
Code: Select all
$ cat n2.in
| LLLLLLuuuuRRRRRR |
| ................ |
| ................ |
| ...WWW....WWW... |
| ...WWW....WWW... |
| ...WWW.**.WWW... |
| ...WWW*..*WWW... |
| ...WWW*WWWWWW... |
$ rlife llsss-recentering --rule 'B34/S24' p1 n2.in 20
...
- LuveelVoom
- Posts: 522
- Joined: April 27th, 2022, 7:59 pm
Re: amling search program principles discussion / brain dump
Aha! And amling bets on the wrong side for once:amling wrote: November 19th, 2025, 11:05 pm Having spent just a few minutes poking B34/S24 searches they seem extremely finicky and my money might be on no other finite still lifes existing, but I do not think proving that is within the range of techniques known to me.
viewtopic.php?f=11&t=1971&p=219894
Other finite still lives do exist!
My rules: https://conwaylife.com/forums/viewtopic.php?f=11&t=6843
Free compute: https://conwaylife.com/forums/viewtopic ... 77#p234677
Discord user: LuveelVoom
Re: amling search program principles discussion / brain dump
There is nothing quite like the pleasant surprise of being wrong on a CA conjecture. Even so my advice for trying to find others remains the same: have a seed input file that forces no beehive-only solution to exist.LuveelVoom wrote: November 19th, 2025, 11:07 pm Aha! And amling bets on the wrong side for once:
viewtopic.php?f=11&t=1971&p=219894
Other finite still lives do exist!
Re: amling search program principles discussion / brain dump
The first benchmarking results are in for the abstracted version of this. I ran the old standard 2c5-wing.in searches, with padding 0/1/1, 0/2/2, 0/3/2, 0/4/2, 0/5/2, 0/6/2, and 0/7/2 (!). I ran each 3 times and each with "t0" (current code), "t1a" (abstracted code, but still current storage), and "t1b" (abstracted code, new storage). Median times were (m1a=t1a/t0, m1b=t1b/t0):amling wrote: November 12th, 2025, 5:48 am I also did a bunch more work recently and rebuilt the entire proof of concept more like how I did "hollow jcols" where the type system is able to hold the abstraction and then all the existing big dynamic main methods use what is mostly the current version (minus a few changes for abstraction) while a separate, very stripped down main with no features can run the simplest possible fixed board searches with the new bit tree version. Performance all TBD...
Code: Select all
size t0 t1a m1a t1b m1b
---- -------------- -------------- ------------------ --------------- ------------------
01 2.720132046 5.073915236 1.86531945883336 33.706055476 12.391330606749523
02 11.51883046 18.326920904 1.591040077171168 130.029413659 11.2884215207904
03 33.895624727 46.294845623 1.3658059409102214 294.924292038 8.70095460441755
04 107.684864098 139.325148158 1.293822946474681 769.434103475 7.145239118979307
05 361.511794842 435.970283615 1.2059642032026712 1856.476791629 5.135314582032876
06 1493.004320973 1752.284093941 1.1736631095608792 5498.14024668 3.68260169742632
07 6441.533209701 7494.05975177 1.163396897571511 19509.000580201 3.02862687268619
"ph1 l2r" and "ph1 r2l" are sort of the main workhorses of fixed board expansion and they seem to be maybe 20-25% worse t1a over t0 and maybe 1.5-1.6x worse t1b over t1a. "ph3/filter_clean" is a huge loser, but whose time matters proportionally less in larger searches, maybe something like 2x t1a over t0 and 6x-7x t1b over t1a. There are of course many other steps and a ton more data but these two are a lot of it and sort of show the shape of things.
Memory looks about like we'd expect. Internal view of memory, measured in GB, with entries only for searches that reached 1 GB:
Code: Select all
size t0 t1a t1b
---- ------ ------ -----
03 1.12 1.12
04 3.10 3.10
05 11.40 11.40 3.12
06 47.92 47.92 13.09
07 184.71 184.71 50.35
I might have some ideas about improving some of these gaps but they're probably not going to get things that much better and I think we need to start coming to terms with whether or not we're going to take this. Those deep double digit percent bumps on smaller searches are tough to swallow, but I care so much more about larger searches and this really represents a shippable cut of things so we could be running these wacky BitTree searches tomorrow if we take it.
Re: amling search program principles discussion / brain dump
For me at least, LLSSS searches tend to fail by running out of memory, rather than taking too long, so sacrificing some speed for much lower memory use seems like a reasonable trade. This even holds true now that I have a computer with 64GB of RAM. For example, I wasn't able to determine the minimum length for a single-phase width-10 (1,0)c/5 spaceship because the search ran out of memory in less than 30 minutes. I suspect it would have finished under this new scheme. I'm sure there are still cases (especially at low periods) where memory isn't as much of a limiting factor, but I would happily take the hit in speed for the reduced memory use.amling wrote: December 11th, 2025, 8:31 pm Those deep double digit percent bumps on smaller searches are tough to swallow, but I care so much more about larger searches and this really represents a shippable cut of things so we could be running these wacky BitTree searches tomorrow if we take it.
- DroneBetter
- Posts: 139
- Joined: December 1st, 2021, 5:16 am
- Location: the OEIS headquarters
- Contact:
Re: amling search program principles discussion / brain dump
Sokwe (not themself knowing) suggested I ask you how to go about setting up an LLSSS search whose end is not an agar but a specific slice
in particular, I am still wanting a c/4d in Day & Night's chequerboard dual (containing a bubble of ordinary Day & Night universe inside it, so I can begin searching for wallcrawlers which grow and shrink the width (which also are ripe for discovery at c/3d btw)); I found (in this post) a remarkably small (but not known to be smallest possible) symmetric frontend for a tunnel 25 half-diagonals wide (after establishing nonexistence at width 23)
Code: Select all
x = 43, y = 43, rule = B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8
6b2o$5b5o$4b2o3bo$4bo2bobo$2b2ob2obo$b2obo2bo2bo$2o2bobobobo$2obobob4o5b3o$bo2bob2obob4o3bo$b3o3b2obob3ob3o$5b3obob2obo2bo$8bob4obo3bo$8b5obobobobo$8b2obobobobobobo$8b3obobobob2ob3o$11bobobob2obo2b3o$7bobo2bobobob2obo2b3o$7bob2o2bobo2bobo5bob2o$7b3o2bob4o2bob4obo2bo$11bob2obo2bobo2bobo2bobo$12bo2bob2ob2o3b4obobo$13b2obo2b2obob3o2bobobo$14bo3bo2bob7o2bobo$14b2o2bo3bobo3bob2obobo$15b2ob2ob3obobobo4bobo$15b2obob3obobobob4obobo$16b2ob4o2bobobobo2bobobo$18bobobobobob2o4b2obobo$17bo2bob2obob5ob2obobo2b2o$17bobob2obob4ob2o2bobo3b2o$18bobo2bobo2bob2o2bobo$19bobobob2ob6obo$20bobo2bo3bob2obo$21bobobo2bo2bobo$22bobob3obobo$23bobobobobo$24bobobobo$25bobobo$26bobo$27bo2$28b2o$28b2o!Code: Select all
x = 128, y = 128, rule = B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8
..........oo....................................................................................................................$
..........ooo...................................................................................................................$
...........ooo..................................................................................................................$
...............oo...............................................................................................................$
........ooo.o.o.o...............................................................................................................$
........oo.o.o.o.o..............................................................................................................$
.........o..o.o.o.o.............................................................................................................$
...........o.o.oo..o............................................................................................................$
....oo...o.oo.o.ooo.o...........................................................................................................$
....ooo.o....o.o...o.o..........................................................................................................$
oo..o.......ooo.....o.o.........................................................................................................$
ooo..o.oo....o.o.ooooo.o........................................................................................................$
.oo.o.o.o.o...ooo.oo.o..o.......................................................................................................$
..o..o.o.ooo...oooo.o.oo.o......................................................................................................$
....o.o.o.o.o...o.oo.o.oo.o.....................................................................................................$
...o.o.o.o.ooo...o.oo.o..o.o....................................................................................................$
...oo.ooo...ooo.o..o.oooo.o.o...................................................................................................$
.....o..o..o.o.o.oooooo..o.o.o..................................................................................................$
......o.o..oooo..oo.ooo...o.o.o.................................................................................................$
.......o.o.oo.oooo.o.o..o..o.o.o................................................................................................$
........o.oo.o.o.oo..o....o.o.o.o...............................................................................................$
.........o.oo.o.ooooo.oo...o.o.o.o..............................................................................................$
..........o..o.oooo..ooooo.oooo.o.o.............................................................................................$
...........o.oo.o....oo..o...o.o.o.o............................................................................................$
............o.o.o..o..o.o..oo...o.o.o...........................................................................................$
.............o.o.o....oo.o.o.oo.oo.o.o..........................................................................................$
..............o.o.o.o......oo..o....o.o.........................................................................................$
...............o.o.o.oo.ooooo.o.o.oo.o.o........................................................................................$
................o.o.o.o.o.oo.oo..ooo.o..o.......................................................................................$
.................o.o.ooo.o..oo..o..ooooo.o......................................................................................$
..................o.o.o..o.oo.o.o....o..o.o.....................................................................................$
...................o.o.o..o.....oo.ooo...o.o....................................................................................$
....................o.o.oo.o.oooo.ooooo.oo..o...................................................................................$
.....................o.o.o..o..o..o.o.oo.ooo.o..................................................................................$
......................o.o..oo...oo.o.oooo.o.o.o.................................................................................$
.......................o.o.ooo.oo.o.o.o...oo.o.o................................................................................$
........................o.o..o.ooo.o.o.o....o.o.o...............................................................................$
.........................o.oooooo.o.oooooo....oo.o..............................................................................$
..........................o..o..oooo.oo..ooo.o.o..o.............................................................................$
...........................o.o...oo.oo.o...ooooooo.o............................................................................$
............................o.o.o.o..o..oo.ooo...oo.o...........................................................................$
.............................o.ooo...oo.ooo.oo...o.o.o..........................................................................$
..............................o..ooo..o..o.o.oo.o..oo.o.........................................................................$
...............................o.o.o..ooo.o.o...o.oo.o.o........................................................................$
................................o.o.o..ooo.o.o.o.o.o.oo.o.......................................................................$
.................................o.o..ooooo.o.o.ooooo..o.o......................................................................$
..................................o.oo.o..o..o.oooooo.o.o.o.....................................................................$
...................................o.ooo....o.o.oo..o..o.o.o....................................................................$
....................................o..o..oo.ooo..oo.oo.o.o.o...................................................................$
.....................................o.ooo..oooo..ooo.o.oo.o.o..................................................................$
......................................o.o..o.oo.oo.o...oo.o.o.o.................................................................$
.......................................o.oooooo.ooo....o.o.o.o.o................................................................$
........................................o.o..ooo.o....o..oo.o.o.o...............................................................$
.........................................o.oo...o......ooo.o.oo..o..............................................................$
..........................................o.o.o.oo..o.oo.o.oo...o.o.............................................................$
...........................................o.o.o..oo.ooo......o.o..o............................................................$
............................................o.o.ooo..o...o...o.o.oo.o...........................................................$
.............................................o.o.o.oooo.o..oo.o.oo.o.o..........................................................$
..............................................o.o.o.o......o.o.o.oooo.o.........................................................$
...............................................o.o.o.oo..ooo...oo..o.o.o........................................................$
................................................o.o.o.o..o..o.o..o.oooo.o.......................................................$
.................................................o.o.o..o.o..o.o.o.oo....o......................................................$
..................................................o.oo.o.o..o.o.oo...o.oo.o.....................................................$
...................................................o....o.oo.o.o.o...oooo..o....................................................$
....................................................o.oo.o.o..o.o.o.oooo.oo.o...................................................$
.....................................................o..ooo.oooo.o...oo.o....o..................................................$
......................................................o.o.o.....o..o..oo.o.oo.o.................................................$
.......................................................o.ooooo....oo..o.o.o.o..o................................................$
........................................................o.o.oo..o...o..ooo.o.oo.o...............................................$
.........................................................o.oo.oooo...ooo.oo.o.oo.o..............................................$
..........................................................o.o..ooooo.o.ooo.o.oo.o.o.............................................$
...........................................................o..ooo.o.ooo..oo..o.o.o.o............................................$
............................................................o.oo.o.oo.o..oooooo..oo.o...........................................$
.............................................................o..o.o.ooooooooo.o..ooo.o..........................................$
..............................................................o.o..o.o.oooo..o..oo..o.o.........................................$
...............................................................o..o.o.o.oo.o...o...o.o.o........................................$
................................................................o.oo.o..oo..o.o.o..oo.o.o.......................................$
.................................................................o..o.ooo.o..o.o..oo...o.o......................................$
..................................................................o.ooo.oo..o.o.o...o...o.o.....................................$
...................................................................o.o.o...o.o.o.o.o..oooo.o....................................$
....................................................................o.o...o.o.o.o.....o.o.o.o...................................$
.....................................................................o.oooo....o.ooo.ooo.o.o.o..................................$
......................................................................o.oo...o...o...o.oo.o...o.................................$
.......................................................................o.o.ooo.o.o.oo..oo.oooo.o................................$
........................................................................o.o.o.o....oo.oo.o....o.o...............................$
.........................................................................o.o.....oo..o..oo.ooo.o.o..............................$
..........................................................................o.o..ooo..o.o.oooooo..o.o.............................$
...........................................................................o.o.o.oooo...o.....oo.o.o............................$
............................................................................o.ooo.oo.ooo.oo.oo.oo.o.o...........................$
.............................................................................o.o.o..ooo.o.oooo..o..o.o..........................$
..............................................................................o.o.oo..o.oo..o..o..o.o.o.........................$
...............................................................................o.o.o.oo..o..ooo.o....o.o........................$
................................................................................o..o.oo.oooooo.o.o.oo.o.o.......................$
.................................................................................o.o.oo.oo.oooooo.o.o.oo.o......................$
..................................................................................o.o..o...o.oo..o.o.oooo.o.....................$
...................................................................................o.o.oo.o.oo.oo...o..o.o.o....................$
....................................................................................o.o.oo.o.o.oo.oo.o.oo.o.o...................$
.....................................................................................o.o....o.o....o..o.o..o.o..................$
......................................................................................o.o.o..o..o.o..o.o....o.o.................$
.......................................................................................o.o..o.o.oo.o.o..o...oo.o................$
........................................................................................o.o.oo.o....o.o.o.o.....o...............$
.........................................................................................o.o..o.o.oo.o.o.o.o..oo.o..............$
..........................................................................................o.ooo..o..o.o.o.o..oo.o.o.............$
...........................................................................................o.oooo.o..o.o.o.ooo.o.o.o............$
............................................................................................o.o.oo.oo.o.o.o.o..o..o.o...........$
.............................................................................................o.o.....o.o.o.o.o....oo.o..........$
..............................................................................................o.o...o.o.o.o.o..o.o....o.........$
...............................................................................................o.o...o.o.o.o.o..o..o...o........$
................................................................................................o.oo...oo.o.o.oo.o......o.......$
.................................................................................................o.o..oo.o.o....o..oooo.o.......$
..................................................................................................o..oo.....o..o.oooo.ooo.......$
...................................................................................................o.o.oo.o.o.o..o.oo.o.oo......$
....................................................................................................o.o....o.o...oo..o.oooo.oO..$
.....................................................................................................o.o..o.o.oooo.oo.o.oo.oOOO.$
......................................................................................................o.oo....o.o....o.oo...OOOO$
.......................................................................................................o.o.o.ooo.o..o.o.OOOOOOOO$
........................................................................................................o....ooo.o.o.o.oOOOOOOOO$
.........................................................................................................o...o..o.o.oo..OOOOOOOO$
..........................................................................................................o..ooo.o.o....OOOOOOOO$
...........................................................................................................o..o.o.o.o..oOOOOOOOO$
............................................................................................................oooooooOOOOOOOOOOOOO$
...............................................................................................................ooo.OOOOOOOOOOOOO$
................................................................................................................o..OOOOOOOOOOOOO$
.................................................................................................................o.OOOOOOOOOOOOO$
................................................................................................................oOOOOOOOOOOOOOOO$
................................................................................................................OOOOOOOOOOOOOOOO$
.................................................................................................................OOOOOOOOOOOOOOO$
..................................................................................................................OOOOOOOOOOOOO.!alternatively, would LLSSS c/4d b2f from a seed backend be powerful enough to complete it?
Re: amling search program principles discussion / brain dump
That goal is definitely up my alley and there are a few things you might try with LLSSS here. Unfortunately a lot of searches are going to have problems getting gummed up on tunnels as once a search has found one it's generally going to be inexhaustible. I'll start with your suggested search ideas and add my own thoughts at the end...DroneBetter wrote: December 15th, 2025, 9:25 am I [want] a c/4d in Day & Night's chequerboard dual (containing a bubble of ordinary Day & Night universe inside it, so I can begin searching for wallcrawlers which grow and shrink the width ...)
This is absolutely something LLSSS can do, although the exact mechanics all have their own drawbacks and I'm not 100% convinced you're likely to get lucky and reach any part of that b2f partial.DroneBetter wrote: December 15th, 2025, 9:25 am ...[set] up an LLSSS search whose end is not an agar but a specific slice...
Key for this is deciding combination of geometry and symmetry. c4d-down and c4d-f2b asymmetric will look similar and can use ingest-1gp and the "slices" ends which is going to be much easier to set up. c4d-f2b odd isn't as nice as unfortunately none of that code is ready for symmetry and so we'd need to use something like regex ends which is quite tedious and error-prone to configure. In my experience LLSSS has been quite a bit slower with diagaonal oriented W (f2b as opposed to down which has W=Y), but of course if you want to benefit from symmetry it has to be f2b.
For the slices version, step one is to ingest the back partial as slices. Unfortunately the current cut of ingest-1gp with default configuration does awfully with diagonal geometries, both for c4d-down and c4d-f2b.
For c4d-down it can be convinced to cut it properly with "--left-x-pad 30". So...
Code: Select all
$ cat back-nw.rle
x = 125, y = 125, rule = B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8
12bo$11bo$12bo$11b3o$10b7o$5bo2bobobobo2bo$9bobob3o2bo$7b2obobo2bo3bo$
5bobobobob3o4bo$6bobo2bob3obobobo$4b2obo4bobo4b2obo$bob2obob2ob4obobo
2bobo$ob4obo2b2o3bobo4bobo$3b2obob2obo2bobobob2obobo$4b3ob4obo2bo5b2o
2bo$4bob4o2bo4bobob2o2bobo$4bo6bob2obobob2o3b2obo$5bo3bo2bo2bobobobobo
3bobo$6bo4bobo2bobobobobo3bobo$7bob2o4bobobobobo5bobo$8bobo2bo2bobobob
ob2ob2obobo$9bobobob3obobobo2bob4obo$10bobob2o2bobobobo2bo2b3obo$11bob
2o2bobobobob2obobo2bobo$12bo5bobobobo4bob2obobo$13bob2o3bo2bobob2obobo
2bobo$14bobo4bobo2bobo2bo2bobobo$15bobo2bobo2bo4bobo4bobo$16bobob2obob
2ob2obobob2obobo$17bobobo2bo3b2ob2obob2obobo$18bob4obobo2b2obo3bo2bobo
$19bob2obobob6ob2ob2obobo$20bobob2obobob6ob2obo2bo$21bobo4bob3o2bo2b2o
bobobo$22bobobo2bo2bo2b2obo2b2obobo$23bobo2bo2b4obob3o2bobobo$24bobob
2ob2ob2ob3ob2ob3obo$25bobob2o5bo3b4obobobo$26bobo2b6obobo2b3o2bobo$27b
obob3ob2o2bo2b2o5bobo$28bobo4bob2ob2o4bobobobo$29bob4ob2o2b2obobob3obo
bo$30bo3bob2obo3bo3bo3b2obo$31bobobob3ob3obo4b4obo$32bobobobo5bobobobo
3bobo$33bob4o2bobobobobo3bobobo$34bobo3bo3bobobo2b2ob3obo$35bobo3b2o2b
obo2bob3obo2bo$36bobob2o2bobobo2b2o2bob2obo$37bobobo3bo3bob2obobobo2bo
$38bobo2b2o2bo2b4obobo2bobo$39bob3o2bob9obobo2bo$40bob2o2b6o2bob2obob
2obo$41bobobobo2b2o2b3obob3o2bo$42bobob2obob3obob5o2bobo$43bob2obob2ob
3o3b4ob2obo$44bob2obob3o2bo3bo2b2obobo$45bo2bobobobo2b2o4b5obo$46bob2o
bob2o2bo2bo5bobobo$47bo4bob2o3bob4ob3o2bo$48bob2ob4obobobo2bobob2obo$
49bo2b4o3bobobob2obo4bo$50bob2obo3b2obobo2bobob2obo$51bo4b2obobobo2bob
o2bobobo$52bob4obo2bobo2bo2bobobobo$53bobobo2b2o3b3o2b2obobobo$54bob4o
bobobo6bobobobo$55bobob2obob2o2bob4obobobo$56bob2obobo3bo3bo2b3obobo$
57bo2bobo6b3ob2o2bobobo$58bobo3b2obob2obo2b2obobobo$59bo2b2obob3o6bo3b
2obo$60bobobob2o2bo4bob3o2bobo$61bobobobobo4b3ob6obo$62bobobob2o3bob2o
b2obo2bobo$63bobob2obob3o2b4o2b3obo$64bobobob2ob2o2b3ob2o2bo2bo$65bobo
bo2bo2b2obobo4b3obo$66bobobob6obo2bo2bob2obo$67bobo2b5obobob5o2bobo$
68bob2obobobobobob3o2bobobo$69bobob2obo3bobob3o2bobobo$70bob2o2bob2obo
bo2bo2b3o2bo$71bobobo3b2ob3ob2o3b3obo$72bob2o3b3ob2o2bo2bobobobo$73bob
7o3bob2ob2o3bobo$74bo2bobob3o2b2ob4o2bo2bo$75bob2o4b6obob6obo$76bobobo
4bobobob3obo2bobo$77bobob2o3bobobob2ob3obobo$78bobobob4obob2o3b2o2bobo
$79bob3ob2obobo2bo2bo2bobobo$80bo2b2ob5ob4obob2obobo$81bobo3b3ob2o5bo
2bobobo$82bobo2bo4bobob2obo2bobobo$83bob5o2bo2b2o2bob3obobo$84bo2bob3o
2b2ob2obobobobobo$85bobob2obobob5ob2obobobo$86bobo4bo2b2o6bobobobo$87b
obob2ob2obobob2o4bobobo$88bobobo3b2o2bobo2bo2bobobo$89bobobobo3bo2b2o
4bob2obo$90bobob4ob5o2b4obo2bo$91bobobobo3b2ob5obob2obo$92bobobobo4bo
2b2obobob2obo$93bobobo2bo2bobob4ob2obobo$94bobobo3b3ob2o2b4o2bobo$95bo
bobo2b6obobobo2bo2bo$96bobob4obo2bob3o3b3ob2o$97bobo2bob2obo3b3obobobo
bo$98bob2obob2obo3bobobobobo$99bob2obob4o3b3obobo2bo$100bo2bob2ob3o3bo
bobobob2o$101bob5obobo4b2obo2b3o$102bobo5b3o7bo2b2o$103bobo3bobo4bob3o
$104bob3obob2obo3b2o$105bo2b2obobo$106bobobobo2bo$107bobobobob2o$108bo
bobob3o$108b2o$111b3o$112b3o$113b2o!
$ rlife slices-tool ingest-1gp --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-down --left-x-pad 30 --w-cuts ALL back-nw.rle back-nw-down.slices
...
20251216 10:23:00 [INFO] Total of 109 slices.
20251216 10:23:00 [INFO] Saved to "back-nw-down.slices".
$
Code: Select all
$ rlife slices-tool ingest-1gp --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-f2b --left-x-pad 200 --right-x-pad 200 --top-y-pad 200 --bottom-y-pad 200 --shift-idxs ALL --w-cuts ALL back-nw.rle back-nw-f2b.slices
...
20251216 10:29:24 [INFO] Total of 853 slices.
20251216 10:29:24 [INFO] Saved to "back-nw-f2b.slices".
$
Now to run a search with this you'd include "--ends slices:<whatever>". Include "bg," if you want to find results that reach the back agar as well (as specifying "--ends" overrides that default "--ends bg").
Code: Select all
$ rlife llsss-recentering-wao --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-down '@bg' --ends bg,slices:back-nw-down.slices 10
...
20251216 10:32:49 [INFO] Start: compile step LlsssEndsSlices
20251216 10:32:49 [INFO] LlsssEndsSlices: 3087 NFA states
20251216 10:32:49 [INFO] LlsssEndsSlices: 2616 DFA states
20251216 10:32:49 [INFO] Finish: compile step LlsssEndsSlices -> took 4.69835ms (26.768ms user, 890µs sys)
...
$ rlife llsss-recentering-wao --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-f2b '@bg' --ends bg,slices:back-nw-f2b.slices 05
...
20251216 10:33:17 [INFO] Start: compile step LlsssEndsSlices
20251216 10:33:17 [INFO] LlsssEndsSlices: 14520 NFA states
20251216 10:33:17 [INFO] LlsssEndsSlices: 12316 DFA states
20251216 10:33:17 [INFO] Finish: compile step LlsssEndsSlices -> took 20.736431ms (64.934ms user, 4.067ms sys)
...
Code: Select all
| | R | . | R. |
| .. | R.. | ... | R... |
| .... | u.... | *... | u*... |
| .*.. | u.*.. | *.*. | u*.*. |
| .*.* | u.*.* | *.*. | u*.*. |
| *..* | u...* | *.** | u..** |
| .**. | u***. | ...* | u*.** |
| .*.* | u.*.* | *.*. | u*.** |
| .*.* | u.*.* | *.*. | u*.*. |
| .*.* | u.*.* | *.*. | u*.*. |
| .*.* | u.*.* | ..*. | u*.*. |
| .*.* | u**.* | *.*. | u..*. |
| **.* | u.*.* | *... | u*.** |
| ..** | u..** | *.** | u*.** |
| .*.. | u.*.. | *.** | u*.** |
| .*.* | L.*.* | ..*. | L..*. |
| ...* | L...* | .... | L.... |
| .... | .... | ... | ... |
| .. | .. | . | . |
Code: Select all
| LLuuuuuuuuuuuuuRR | LLuuuuuuuuuuuuuRR |
| .....*......*.... | ..****.*o*.****.. |
| ......*....*..... | ..***.*****.***.. |
| ................. | ..**.*******.**.. |
| ................. | ..**.*******.**.. |
| .....*......*.... | ..***.*****.***.. |
| .....*......*.... | ..*************.. |
| ....**......**... | ..**.*******.**.. |
| ....***....***... | ..**.*******.**.. |
Code: Select all
| uuuuuuu(Z)* | uuuuuuu(Z)* |
| ....*.._.__ | **.****_.__ |
| ...*..._.__ | ***.***_.__ |
| ......._.__ | ****.**_.__ |
| ......._.__ | ****.**_.__ |
| ....*.._.__ | ***.***_.__ |
| ....*.._.__ | *******_.__ |
| ....**._.__ | ****.**_.__ |
| ...***._.__ | ****.**_.__ |
Code: Select all
$ cat back-nw-f2b-odd.re
| | | | |
| | | * | _ |
| *_ | __ | )__ | ___ |
| )___ | ____ | Z____ | .___ |
| Z.___ | ..__ | (..__ | _.._ |
| (_.._ | __.. | u__.. | *__. |
| u*__. | .*__ | u.*__ | *.*_ |
| u*.*_ | .*.* | u.*.* | *.*. |
| u*.*. | *..* | u...* | *.** |
| u..** | .**. | u***. | ...* |
| u*.** | .*.* | u.*.* | *.*. |
| u*.** | .*.* | u.*.* | *.*. |
| u*.*. | .*.* | .*.* | .*. |
| .*. | .* | .* | . |
| . | | | |
Code: Select all
rlife llsss-recentering-wao --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-f2b '@bg' --left-edge odd --wao-left-edge-errors --ends bg,regex:back-nw-f2b-odd.re 05
...
20251216 10:44:26 [INFO] Start: compile step LlsssEndsRegex
20251216 10:44:26 [INFO] LlsssEndsRegex: 141 NFA states
20251216 10:44:26 [INFO] LlsssEndsRegex: 129 DFA states
20251216 10:44:26 [INFO] LlsssEndsRegex: bit depth 0 -> 10 table size 9 * 2^10 = 9216
20251216 10:44:26 [INFO] LlsssEndsRegex: bit depth 10 -> 16 table size 8 * 2^6 = 512
20251216 10:44:26 [INFO] Finish: compile step LlsssEndsRegex -> took 639.532µs (1.746ms user, 0ns sys)
...
Code: Select all
$ cat x1.in
| | | R | . |
| R. | .. | R.. | ... |
| R... | .... | R.... | .... |
| R.... | .... | u.... | *... |
| u*... | .*.. | u.*.. | ..*. |
| u*.*. | **.* | u**.* | ***. |
| u..*. | *..* | u**.* | ..*. |
| u.**. | ..*. | u**.. | ..*. |
| u.... | ...* | u.*** | *... |
| u*.*. | .*.* | u.*.* | *.*. |
| u*.*. | .*.* | .*.* | .*. |
| .*. | .* | .* | . |
| . | | | |
$ rlife llsss-recentering --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-f2b x1.in --left-edge odd --llsss-env LLSSS_HALT_ON_ENDS=true --ends regex:back-nw-f2b-odd.re XX
...
20251216 10:47:35 [INFO] End [thinnest] ("LlsssEndsRegex", "back-nw-f2b-odd.re"):
20251216 10:47:35 [INFO] | | R | . | R. |
20251216 10:47:35 [INFO] | .. | R.. | ... | R... |
20251216 10:47:35 [INFO] | .... | u.... | *.... | u*.... |
20251216 10:47:35 [INFO] | .*.... | u.*.... | ..*... | u*.*... |
20251216 10:47:35 [INFO] | **.*.. | u**.*.. | ***.*. | u..*.*. |
20251216 10:47:35 [INFO] | *..*.* | u**.*.* | ..*.*. | u.**.*. |
20251216 10:47:35 [INFO] | ..*..* | u**...* | ..*.** | u....** |
20251216 10:47:35 [INFO] | ...**. | u.****. | *....* | u*.*.** |
20251216 10:47:35 [INFO] | .*.*.* | u.*.*.* | *.*.*. | u*.*.** |
20251216 10:47:35 [INFO] | .*.*.* | .*.*.* | .*.*. | .*.*. |
20251216 10:47:35 [INFO] | .*.* | .*.* | .*. | .*. |
20251216 10:47:35 [INFO] | .* | .* | . | . |
...
Uncertain. Similar considerations apply about choosing between up, b2f, and b2f odd. Presumably include "s_periodic:0:0:1" ends either way to find any still life wicks (e.g. tunnel).DroneBetter wrote: December 15th, 2025, 9:25 am alternatively, would LLSSS c/4d b2f from a seed backend be powerful enough to complete it?
E.g. I fished the back-most slice out of the "ingest-1gp" output, reoriented it travelling SE, and cut it in half for odd symmetry:
Code: Select all
$ cat x2.in
| | | | |
| R. | . | R | |
| R... | ... | R.. | .. |
| R.... | .... | R.... | .... |
| u.... | .... | u.... | .... |
| u.... | .... | u.... | .... |
| u...* | .... | u.... | .... |
| u.... | .... | u...* | .... |
| u.... | .... | u.... | .... |
| u.... | .... | u.... | .... |
| u.... | .... | u.... | .... |
| ... | ... | .... | .... |
| . | . | .. | .. |
$ rlife llsss-recentering --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-b2f x2.in --left-edge odd --ends bg,s_periodic:0:0:1 05
...
Code: Select all
$ rlife llsss-recentering --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-b2f '@bg' --left-edge odd --ends bg,s_periodic:0:0:1 05
...
The most important major search idea of my own that I would add is to try for a back of variable size in f2b-like direction. For this you'd want to know what widths were useful, i.e. can be made by combining edge crawlers. Ideally this would be some small minimum width and a GCD of 2 HD (the smallest difference between tunnels anyway). Then you'd run a WAO search, f2b-like (i.e. down, f2b, or f2b odd), to start with every legal-sized tunnel searching for strict agar ends. As an example, let's imagine we had found edge growers/shrinkers that would allow us to create 7 HD or wider tunnels (i.e. min 7 HD, step 2 HD). I'll sketch the input file for "c4d-down" since I think it will be easiest to understand, but similar principles apply for f2b or f2b odd (modulo having to double f2b odd for center diagonal on versus center diagaonal off). For down I'd use an input file like this:
Code: Select all
$ cat x3.in
| LLLuuuuuuABABuRRR | LLLuuuuuuABABuRRR | LLLuuuuuuABABuRRR | LLLuuuuuuABABuRRR |
| ...*.*.*.*.*..... | ...*.*.*.*.*..... | ...*.*.*.*.*..... | ...*.*.*.*.*..... |
| ....*.*.*.*.*.... | ....*.*.*.*.*.... | ....*.*.*.*.*.... | ....*.*.*.*.*.... |
| .....*.*.*.*.*... | .....*.*.*.*.*... | .....*.*.*.*.*... | .....*.*.*.*.*... |
Code: Select all
$ rlife llsss-recentering-wao --rule 'B1e2cn3acjkr4cny5einqy6ei7c/S01e2-ei3acjkr4-ejr5einqy6-cn7c8' c4d-down x3.in 14
...
20251216 11:18:13 [INFO] Thinnest partial:
20251216 11:18:13 [INFO] | LLuuuuuuABuRRR | LLuuuuuuABuRRR | LLuuuuuuABuRRR | LLuuuuuuABuRRR |
20251216 11:18:13 [INFO] | ..*.*.*.*..... | ..*.*.*.*..... | ..*.*.*.*..... | ..*.*.*.*..... |
20251216 11:18:13 [INFO] | ...*.*.*.*.... | ...*.*.*.*.... | ...*.*.*.*.... | ...*.*.*.*.... |
20251216 11:18:13 [INFO] | ....*.*.*.*... | ....*.*.*.*... | ....*.*...*... | ....*.*.*.*... |
20251216 11:18:13 [INFO] | .....*.**..*.. | .....*..*..*.. | .....*.....*.. | .....**.*..*.. |
20251216 11:18:13 [INFO] | .........*.*.. | ......**.*.*.. | .......*.*.*.. | .........***.. |
20251216 11:18:13 [INFO] | ....***.*.*... | ....**....*... | ......***.**.. | ...*.*..**.*.. |
20251216 11:18:13 [INFO] | ...*..*.**.... | | | |
20251216 11:18:13 [INFO] Random[ish] partial:
20251216 11:18:13 [INFO] | SS | SS | SS | SS |
20251216 11:18:13 [INFO] | LLuuuuuuABABuRRRRR | LLuuuuuuABABuRRRRR | LLuuuuuuABABuRRRRR | LLuuuuuuABABuRRRRR |
20251216 11:18:13 [INFO] | ..*.*.*.*.*....... | ..*.*.*.*.*....... | ..*.*.*.*.*....... | ..*.*.*.*.*....... |
20251216 11:18:13 [INFO] | ...*.*.*.*.*...... | ...*.*.*.*.*...... | ...*.*.*.*.*...... | ...*.*.*.*.*...... |
20251216 11:18:13 [INFO] | ....*.*.*.*.*..... | ....*.*...*.*..... | ....*.*.*.*.*..... | ....*.*.*.*.*..... |
20251216 11:18:13 [INFO] | .....*..*..*.*.... | .....**.**.*.*.... | ......***..*.*.... | ......*.*....*.... |
20251216 11:18:13 [INFO] | .......**...*.*... | .......****.*.*... | .....*****.*..*... | ...*...*.*..*.*... |
20251216 11:18:13 [INFO] | ....****.*.*...*.. | ....*.*****.*..*.. | ...*..*....*...*.. | ...**..*.**....*.. |
20251216 11:18:13 [INFO] | ....**...*...*.*.. | | | |
...
You could also try looking for backs via two-side symmetry searches. These would likely be WAO c4d-f2b searches with a start of checkerboard agar (i.e. D&N bubble), end of bg agar (i.e. checkerboard), and both edges set to odd symmetry (is there also a gse-and-toggle symmetry possible here? I might need to think about it, but there certainly isn't yet one in the code). Due to horrible alignment issues with symmetry edges you'd only be able to find certain widths. If sufficiently unhelpful patterns exist you might switch to c4d-b2f (and reverse start/end). Ultimately you'd hope to find a very short result, some sort of tunnel expander, and then finally separate back corners to connect everything up. This is all much harder than the above ideas, although it would allow for a level back. Perhaps let's call this plan B.
Hopefully that's enough to get you started. Unless/until released I will do my best to restrain myself from rushing in and trying to solve this, as interesting a problem as it is. Please do let me know how it goes if you try any of this.
Re: amling search program principles discussion / brain dump
Ultimately I ran treatments (t0) master branch more or less as-is, (t1) t0 plus MDSE abstraction (and/or reworking algorithms as needed), (t2a) t1 plus actually adding the llsss-mdse-v2 subcommand, (t17a) t2a with a great deal of optimizations, (t17b) final version of MDSE V2 itself. There were also a great deal of intermediates between t2 and t17 and a (old storage) and b (new storage) variants of most, but all optimizations were kept and so these five tell the whole story. All times below are median of 3 runs:
Code: Select all
treatment L05 L06 L07
--------- --------------- --------------- ----------------
t0 362.875953636s 1495.629001077s 6450.784352112s
t1 433.849957118s 1737.636557094s 7422.138881551s
t2a 436.612041129s 1758.719470137s 7482.943059968s
t17a 344.610592972s 1322.390987985s 5546.475490166s
t17b 1679.941380975s 4860.325565846s 16499.540540317s
(*) t0 -> t1/t2a is a modest abstraction cost, as expected, worse for small searches.
(*) t2a -> t17a is an incredible bunch of improvements, overwhelmingly overpowering the abstraction cost.
(*) t17a -> t17b (actually using new storage) is gonna be about 3x worse for big searches and (more) worse for smaller searches.
Conceivably some of these optimizations (but not all!) could be reordered and committed to master independently, making the gap between old and new storage worse and restoring the apparent cost of the abstraction. I think I am becoming convinced to take this change so it's sort of academic.
I have cleaned up slightly the hacky cut of MDSE V2 WCAF to a more general "--filters", although only wcaf, acaf, and bcaf are included for the moment. Next up is similar benchmarking with a search that actually uses bcaf (I believe wcaf perf will be affected similarly).
Re: amling search program principles discussion / brain dump
An example of what I want to do:
c4d-down.in
Code: Select all
| | | | |
| ............ | ............ | ............ | ............ |
| ............ | ............ | ............ | ............ |
| ............ | ............ | ............ | ............ |
| .....**..... | .....**..... | ....***..... | ......*..... |
| .....*.*.... | ....**...... | ....*....... | .....**..... |
| .....*...... | ......*..... | .....*...... | .....*.*.... |
| ............ | ............ | ............ | ............ |
| ............ | ............ | ............ | ............ |
| | | | |
| | | | |
Code: Select all
| | | . | . |
| .. | .. | ... | ... |
| .... | .... | ..... | ..... |
| ...... | ...... | ....... | ....... |
| ........ | ........ | ......... | ....*.... |
| ....**.... | ....**.... | ....***.... | ....**..... |
| .....*.*.... | ....**...... | ....*...... | ....*.*.... |
| ....*..... | .....*.... | ....*.... | ......... |
| ........ | ........ | ....... | ....... |
| ...... | ...... | ..... | ..... |
| .... | .... | ... | ... |
| .. | .. | . | . |
Code: Select all
| | | ............ | ............ |
| ............ | ............ | ............ | ............ |
| ............ | ............ | ............ | ............ |
| ............ | ............ | .....**..... | .....**..... |
| ....***..... | ......*..... | .....*.*.... | ....**...... |
| ....*....... | .....**..... | .....*...... | ......*..... |
| .....*...... | .....*.*.... | ............ | ............ |
| ............ | ............ | ............ | ............ |
| ............ | ............ | | |
Re: amling search program principles discussion / brain dump
The exact definition of that question is complicated but what you're probably wishing for is to-uwi and from-uwi. I would use them, with e.g. argument "c4d-f2b" to convert between a set of four generations of XY views (what I'd call XYT view) and a set of two UW views (what I'd call UWI view). Specify whatever cells and/or question marks placeholders you want in the XYT view, convert to UWI view and then round to matching rectangles whatever way you need to (most likely pruning partial rows/columns off the sides or expanding question marks to complete a subrectangle).Sylvani wrote: January 2nd, 2026, 12:15 pm Is there a way to use "grid-tool" to convert a cNd-down search into a cNd-f2b search?
Unfortunately I am on the road and thus stuck on my cell which makes any real example impossible. When I return I will try to cook up something. In the mean time you might try feeding whatever XYT view you have through "rlife grid-tool to-uwi c4d-f2b", trying some edits, and feeding back through "rlife grid-tool from-uwi c4d-f2b" and see if any of this makes sense. Ultimately to run a c4d-f2b search your input is going to have to look like matching rectangles in that UWI view.
Re: amling search program principles discussion / brain dump
Well luckily I didn't have to wait! I managed to understand how it works roughly.amling wrote: January 3rd, 2026, 3:13 pmThe exact definition of that question is complicated but what you're probably wishing for is to-uwi and from-uwi. I would use them, with e.g. argument "c4d-f2b" to convert between a set of four generations of XY views (what I'd call XYT view) and a set of two UW views (what I'd call UWI view). Specify whatever cells and/or question marks placeholders you want in the XYT view, convert to UWI view and then round to matching rectangles whatever way you need to (most likely pruning partial rows/columns off the sides or expanding question marks to complete a subrectangle).Sylvani wrote: January 2nd, 2026, 12:15 pm Is there a way to use "grid-tool" to convert a cNd-down search into a cNd-f2b search?
Unfortunately I am on the road and thus stuck on my cell which makes any real example impossible. When I return I will try to cook up something. In the mean time you might try feeding whatever XYT view you have through "rlife grid-tool to-uwi c4d-f2b", trying some edits, and feeding back through "rlife grid-tool from-uwi c4d-f2b" and see if any of this makes sense. Ultimately to run a c4d-f2b search your input is going to have to look like matching rectangles in that UWI view.
Instead of cropping or doing some wacky automation, I just took the grid that was output by "to-uwi c4d-f2b", expanded it so it fit the whole box, added a few "W" wildcards (so the bottom doesn't get cut off with zeros), and then added question marks at the bottom.
Here's the resulting input file (non-monotonic? c/4 diagonal):
Code: Select all
| | | . | . |
| .. | .. | ... | ... |
| .... | .... | ..... | ..... |
| ...... | ...... | ....... | ....... |
| ........ | ........ | ......... | ......... |
| .......... | .......... | ........... | ........... |
| ............ | ........... | ............ | ........... |
| ............ | .........?. | ..........?. | ......*..?? |
| ..........?? | .........?? | ......***.?? | .......*.?? |
| ...*...**.?? | ..**.****?? | ...**.....?? | ..***...*?? |
| ...*****.*?? | ...*.***.?? | ...**.*...?? | ...*..***?? |
| ....*.....?? | ....*....?? | ....WWWWW?? | ....WWWW?? |
| ....WWWW?? | ....WWW?? | ....WWW?? | ....WW?? |
| ....WW?? | ....W?? | ....W?? | ....?? |
| ....?? | ....? | ....? | .... |
| .... | ... | ... | .. |
| .. | . | . | |
Re: amling search program principles discussion / brain dump
Well luckily, I didn't have to wait! I managed to understand how it works based on your explanation.amling wrote: January 3rd, 2026, 3:13 pmUnfortunately I am on the road and thus stuck on my cell which makes any real example impossible. When I return I will try to cook up something. In the mean time you might try feeding whatever XYT view you have through "rlife grid-tool to-uwi c4d-f2b", trying some edits, and feeding back through "rlife grid-tool from-uwi c4d-f2b" and see if any of this makes sense. Ultimately to run a c4d-f2b search your input is going to have to look like matching rectangles in that UWI view.Sylvani wrote: January 2nd, 2026, 12:15 pm Is there a way to use "grid-tool" to convert a cNd-down search into a cNd-f2b search?
Here's the resulting input file (non-monotonic? c/4 diagonal):
Code: Select all
| | | . | . |
| .. | .. | ... | ... |
| .... | .... | ..... | ..... |
| ...... | ...... | ....... | ....... |
| ........ | ........ | ......... | ......... |
| .......... | .......... | ........... | ........... |
| ............ | ........... | ............ | ........... |
| ............ | .........?. | ..........?. | ......*..?? |
| ..........?? | .........?? | ......***.?? | .......*.?? |
| ...*...**.?? | ..**.****?? | ...**.....?? | ..***...*?? |
| ...*****.*?? | ...*.***.?? | ...**.*...?? | ...*..***?? |
| ....*.....?? | ....*....?? | ....WWWWW?? | ....WWWW?? |
| ....WWWW?? | ....WWW?? | ....WWW?? | ....WW?? |
| ....WW?? | ....W?? | ....W?? | ....?? |
| ....?? | ....? | ....? | .... |
| .... | ... | ... | .. |
| .. | . | . | |
EDIT: Running this with mid_steps 10 on llsss-recentering gives... a single glider. I have no clue how that happened, but I should be able to fix it.
EDIT 2: I now realize that maybe the initial partial result was just too small to get any meaningful results.
EDIT 3: Scratch that, somehow llsss-recentering just interprets it as a blank grid. Plain llsss works though.
EDIT 4: c4d-s2s seems to work with llsss-recentering, so I am trying that with a different partial it generated.
Re: amling search program principles discussion / brain dump
My money would certainly be on identical roots of all periods meaning that an all zeros grid is a valid recombination of them (and of course the thinnest such). If you have an exact input file and search you want verified/explained you can leaves its details.Sylvani wrote: January 3rd, 2026, 6:08 pm ...llsss-recentering just interprets it as a blank grid...
In general if you are running recentering you need to think about and specify root labels. I am hesitant to refuse periods and asterisks as labels for no reason other than to preclude this sort of user error, but I feel like it has come up a lot.
Re: amling search program principles discussion / brain dump
LLSSS seems to ignore when cells don't oscillate even if the input file is inconsistent with the rule, and it's hard to control when the frontend of a partial it gives will actually work or not.
For example: running this input file (I don't see any inconsistencies in the rules):
Code: Select all
$ cat 0.in
| | | | | | |
| | | | | | |
| | | | | LLLuuuRRR | LLLuuuRRR |
| | | LLLuuuRRR | LLLuuuRRR | ......... | ......... |
| LLLuuuRRR | LLLuuuRRR | ......... | ......... | ......... | ......... |
| ......... | ......... | ......... | ......... | ......... | ......... |
| ......... | ......... | ......... | ......... | ......... | ......... |
| ......... | ......... | ......... | ......... | ......... | ......... |
| ......... | ......... | *........ | ......... | ..?????.. | ..?????.. |
| ......... | **....... | ..?????.. | ..?????.. | ..?????.. | ..?????.. |
| ..?????.. | ..?????.. | ..?????.. | ..?????.. | | |
| ..?????.. | ..?????.. | | | | |
| | | | | | |
| | | | | | |
| | | | | | |Code: Select all
LLSSS_HALT_ON_ENDS=true LLSSS_MAX_TABLE_SIZE=24 ./rlife llsss-recentering 3c6-f2b 0.in 17 --left-edge even --pre-reify-autochoke 8GBCode: Select all
x = 34, y = 20, rule = B3/S23
9bo14bo$7b2ob2ob8ob2ob2o$7b2obobob2o2b2obobob2o$6bobo3bo2b4o2bo3bobo$
5b2o2b4o8b4o2b2o2$4b2o6bo8bo6b2o$4bob2o3bo10bo3b2obo$3b2obo20bob2o$4bo
bo2bob3o6b3obo2bobo$b2o5b3o12b3o5b2o$5b6o3bo4bo3b6o$bo2b2obo2bo3b2o2b
2o3bo2bob2o2bo$bobobob2obobo8bobob2obobobo$4b2o2bo3b4o2b4o3bo2b2o$2bob
2o5b4o4b4o5b2obo$2b2o3bo5bo6bo5bo3b2o$o4bob3obo10bob3obo4bo$2b2o3bo4b
3o4b3o4bo3b2o$ob2o2b2o2bobo8bobo2b2o2b2obo!Code: Select all
x = 74, y = 25, rule = LifeHistory
9.E14.E24.D14.D$7.2E.2E.2E4A2E.2E.2E20.2D.2D.8D.2D.2D$7.2E.E.E.2E2D2E
.E.E.2E20.2D.D.D.2D2.2D.D.D.2D$6.E.E3.E2.4E2.E3.E.E18.D.DA2.D2.4D2.D
2.AD.D$5.2E2.4E8.4E2.2E16.2D2AD2ED8AD2ED2A2D$47.2A.A.A.2A2.2A.A.A.2A$
4.2E6.E8.E6.2E14.2DA.A3.E2.4A2.E3.A.A2D$4.E.2E3.E10.E3.2E.E14.DAED.2A
EA8.AE2A.DEAD$3.2E.E20.E.2E12.2D.D20.D.2D$4.E.E2.E.3E6.3E.E2.E.E14.EA
D2.D.DED6.DED.D2.DAE$.2E5.3E12.3E5.2E8.2D.A.2A3DA10.A3D2A.A.2D$5.6E3.
E4.E3.6E14.2ADE4D3.D4.D3.4DED2A$.E2.2E.E2.E3.2E2.2E3.E2.E.2E2.E8.D2.E
DAD.AD3A2D2.2D3ADA.DADE2.D$.E.E.E.2E.E.E8.E.E.2E.E.E.E8.EAD.D.DEAE.D
8.D.EAED.D.DAE$4.2E2.E3.4E2.4E3.E2.2E14.DE2AE2A.2DED2.DE2D.2AE2AED$2.
E.2E5.4E4.4E5.2E.E9.AD.2E.A2.A3DEA2.AE3DA2.A.2E.DA$2.2E3.E5.E6.E5.E3.
2E9.ADE.A.EA.A.AD6.DA.A.AE.A.EDA$A3D.A.3E.E2D6.2DE.3E.A.3DA6.D3.AE.DE
D.D4A2.4AD.DED.EA3.D$2DEA3.A2.D.2EA4.A2E.D2.A3.AE2D8.ED2A.D3.A3E4.3EA
3.D.2ADE$A.AE2.2A2DE.A8.A.E2D2A2.EA.A6.D.2E2.DE2.D.DA6.AD.D2.ED2.2E.D
$2.D6.D2.2D6.2D2.D6.D8.A4.A.3A.A10.A.3A.A4.A$2.2D4.D.2D2.D4.D2.2D.D4.
2D10.2A3.A4.3A4.3A4.A3.2A$5.D.4D12.4D.D11.A.2A2.2A2.A.A8.A.A2.2A2.2A.
A$4.D8.D6.D8.D$11.2D8.2D!
Also one last thing, most (if not all) of my questions are not directed just at Amling. I know there are other people who use LLSSS and I need advice from any one of those people, too.