Sokwe wrote: October 13th, 2024, 3:13 am
Thanks for the responses. You've given me a lot to ruminate on. I'm sure I'll have more questions as I continue experimenting.
This entire lattice business almost didn't happen. All named geometries either use U=X, W=Y (anything "s2s", diagonal, or knightship) or have U=X, and W a fraction of Y (mod V) and so can be treated that way in input files anyway. I knew that would be true before I started but the arbitrary geometries had helped a few victories in LGOL (especially allowing arbitrary vector doubly-periodic searches to look for greyship edges at specific offsets) so I kept it. Here in LLSSS there are no doubly-periodic searches but there have still been a few times it has helped (specifically U=T for floating alignment, and U=X+kT for exhaustive searches in the presence of some almost half planes).
Generally the codebase has been moving in the direction of hiding its existence where possible (e.g. inventing named geometries so you can let the code pick W and pretend it's all X/Y grids anyway) and so this is all uncommon ground you're digging in with "raw" geometries.
This is all to say sorry this part of the tool as confusing and weird as it is and thanks for helping test it and work through its issues. And thank you for your work on this thread (and threads like it) in general. There have been a lot of good ideas come out and I am grateful both for the feature increases and for the tiny, tiny steps towards easier (or at least less difficult) usability.
Sokwe wrote: October 13th, 2024, 3:13 am
Oops! I got lost in the length of my own post and "corrected" the correct rule to an incorrect rule that I used elsewhere. The correct rule is 'B26!8/S02567', which I think very likely has a spaceship, but I've been unable to find one at least in part due to memory constraints
It is of course not helpful in general but I'll run s2s to 60 GB real quick and see if something shows up.
Sokwe wrote: October 13th, 2024, 3:13 am
I can only extend the few random partial results that I'm shown
It's probably worth mentioning explicitly that by "random partials" I don't really mean (just) the "random" partials view. I mean I would configure seam ripper V2 (`--partials srv2` or `--partials srv2:4:8`) and skim those partials (well, I'd probably skim the actual random view as well). Especially the "choke width" ones which are the thinnest "at the bottom" (where what "bottom" counts is defined by the two specified W positions, see release notes way, way up thread if you want to know horrible details). Especially finding the thinnest that were found over the entire search.
Srv2 can be expensive (I've easily seen it take more than 50% of total search time) but I find it's worth it on most search projects. I of course wouldn't include it on searches I expect to produce a negative result.
Sokwe wrote: October 13th, 2024, 3:13 am
I've tried extending partial results (that's how I found
a very large photon in B256/S02357), but it can be a bit cumbersome, and I can only extend the few random partial results that I'm shown. I was hoping maybe I could just discard a random bunch of slices and continue the search, but I'm not sure if there would be an elegant way to do that.
I had had some very, very prototypical ideas about automatically "choking" down searches when the memory ceiling was believed to be near. Unfortunately nothing ever worked out.
One problem is the memory ceiling detection is a nightmare. I have no way to tell that the next expand step is going to hit the configured `ulimit` (or even a hypothetical configured limit on internal view of memory) to decide to reduce first. Instead I started working on guessing right before the most memory expensive part of the expand step ("reify"). This means any potential reduction algorithm has to work on the weird partly-expanded state which is unfortunate but it's only code.
The real problem though is deciding what to reduce. I was working on a fixed board search implementation and decided we'd pick some as-of-yet-not-uniquely-determined cell, do some hand-waving math to estimate which value was more common (live or dead), and then filter the search to that value. We'd of course repeat until we thought we had filtered enough to survive the rest of the expand step.
This is all written and shipped as `--pre-reify-autochoke[-type]` and despite verifying/believing it works as intended, I've never really used it. It seemed like it was going to be a pain figuring out what internal memory limit corresponded to external `ulimit` although I would probably try to fight that estimating fight if I thought it was the only problem.
The real problem is that none of this really makes sense for recentering and the vast majority of my searches these days are recentering. Recentering has a "unique" partial view and so could reasonably compute or limit by cell values, but only in those columns, and searches tend to wander left/right (the whole point of recentering). In the end I could not figure out a way to do it and didn't think implementing a version only capable of choking on cell values in the "u" columns was worth it. Note that in from zero WAO searches there are no "u" columns and so none of this applies, at all. You could maybe instead write (with wildcards) a more explicit version of WAO and make some "u" columns that way? E.g. for c/1 searches I think something like...
Code: Select all
| LLLuuuuuRRRRR |
| ............. |
| ............. |
| .....*WWWWW.. |
...would enable it to choke down on cell values in the five columns centered around the topmost, leftmost on cell.
I never convinced myself it was worth doing all the work (rebuilding all the autochoke stuff for recentering, then running searches with "u"-unrolled inputs and fighting the fight to figure out the relationship between internal and external memory limits), but I guess I'll try to think about it some more...
Sokwe wrote: October 13th, 2024, 3:13 am
Another possibility would be to reduce the width of the search after a certain depth is reached. Sometimes a short middle is only supported by large wings. This is generally how
the known ships in B23 rules have been found (find a large outer wing that narrows, then reduce width and look for symmetric or glide-symmetric centers). Of course, reducing the search width during the search might be difficult or nonsensical for LLSSS.
From a code perspective this is borderline trivial and there is no reason expand's mid_steps has to be the same at every W position other than that's just what it has been historically. The only problem is figuring out how to best convey human will, through commandline arguments, all the way down into the expand step code. Unfortunately it's sort of a big problem.
Do you have a notion of how you'd like to determine/specify mid_steps, even forgetting how we would encode it on the commandline? Like are you thinking you'd say something like "31 until w_pos 50, then 30"? Or something more automatic like "31 until internal memory hits 4 GB, then 30"?
At the risk of anchoring the brainstorming maybe we'd want to just let you run arbitrary code in some dynamic language that can be embedded in rust and make available enough APIs to read the relevant data and reach into the expand step and change mid_steps according to whatever logic you want? This is pleasingly general although I'm a little unsure about what language to embed, how to make mutating steps possible dynamically, etc.
It occurs to me now that reducing mid_steps dynamically during expand based on estimated memory is probably possible. There is no analog of reducing mid_steps in fixed board so I hadn't thought if it when I was writing the autochoke stuff. I will also think more on this idea specifically... The worst problem is probably that I'm not sure we'd be able to salvage anything so if we decided we had a memory problem right before reify we'd have to toss everything we had done and start the expand step over from scratch with mid_steps reduced one. Even so a slow search is better then no search. We might be cooking something here.
amling wrote: October 12th, 2024, 8:06 pm
I am somewhat interested in the existence of such a case. I of course knew it was hypothetically possible but am at least a little surprised to find one. If there is no finite photon then the way in which that is true is very weird.
I ran B2467/S134568 searches f2b, s2s, and b2f to 60 GB and the resulting partials are crazy. I guess I agree that there is unlikely to be a finite photon, but the grammar of parts that can be stitched together to make almost half planes seems actually rather complicated, e.g. here is a random partial from near the end of f2b:
Code: Select all
x = 185, y = 48, rule = B2467/S134568History
F.181B.F$F.181B.F$F.166B2A13B.F$F.13B2A139B2A9BA2BA12B.F$F.12BA2BA9B
2A10B2A8B2A8B2A8B2A8B2A8B2A8B2A8B2A8B2A8B2A8B2A14BA2BA7BA4BA11B.F$F.
11BA4BA7BA2BA8BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6B
A2BA6BA2BA12BA4BA7B4A12B.F$F.12B4A7BA4BA6BA4BA4BA4BA4BA4BA4BA4BA4BA4B
A4BA4BA4BA4BA4BA4BA4BA4BA4BA4BA4BA4BA12B4A6BA6BA10B.F$F.10BA6BA6B4A8B
4A6B4A6B4A6B4A6B4A6B4A6B4A6B4A6B4A6B4A6B4A11BA6BA6B4A12B.F$F.12B4A6BA
6BA4BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA
11B4A4B4A4B4A8B.F$F.8B4A4B4A4B4A8B4A6B4A6B4A6B4A6B4A6B4A6B4A6B4A6B4A
6B4A6B4A13B3A2BABA12BA7B.F$F.7BA12BABA2B3A4B4A4B6A4B6A4B6A4B6A4B6A4B
6A4B6A4B6A4B6A4B6A4B4A9B3AB3A5BA2BA5BA6B.F$F.6BA5BA2BA5B3AB3A3BA112BA
4B2A2BABAB3A12BA2BA5B.F$F.5BA2BA12B3ABABA2BA5BA2BA6BA2BA6BA2BA6BA2BA
6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA6BA2BA5BA2BA2BA5B3A14B4A3B.F$F.3B
4A14B3A5BA2BA112B7A3BABABA2B2A4B2A4B3A4B.F$F.4B3A4B2A4B2A2BABABA3B2A
114B7A9BA2BA2BA2BA3BABABA2B.F$F.2BABABA3BA2BA2BA2BA9B2A114B7A5BA3B12A
8B.F$F.8B12A3BA5B2A114B7A9B12A3BA4B.F$F.4BA3B12A9B2A19B2A77B2A14B7A9B
12A8B.F$F.8B12A9B2A18BA2BA9B2A10B2A8B2A8B2A8B2A11B2A9BA2BA13B7A9B12A
8B.F$F.8B12A9B2A17BA4BA7BA2BA8BA2BA6BA2BA6BA2BA6BA2BA9BA2BA7BA4BA12B
7A9B12A8B.F$F.8B12A9B2A18B4A7BA4BA6BA4BA4BA4BA4BA4BA4BA4BA7BA4BA7B4A
13B7A9B12A8B.F$F.8B12A9B2A16BA6BA6B4A8B4A6B4A6B4A6B4A9B4A6BA6BA11B7A
9B12A8B.F$F.8B12A9B2A18B4A6BA6BA4BA6BA2BA6BA2BA6BA2BA6BA5BA6BA6B4A13B
7A9B12A8B.F$F.8B12A9B2A14B4A4B4A4B4A8B4A6B4A6B4A6B4A9B4A4B4A4B4A9B7A
9B12A8B.F$F.8B12A9B2A13BA12BABA2B3A4B4A4B6A4B6A4B6A4B4A5B3A2BABA12BA
8B7A9B12A8B.F$F.8B12A9B2A12BA5BA2BA5B3AB3A3BA42BA4B3AB3A5BA2BA5BA7B7A
9B12A8B.F$F.8B12A9B2A11BA2BA12B3ABABA2BA5BA2BA6BA2BA6BA2BA6BA2BA5BA3B
ABAB3A12BA2BA6B7A9B12A8B.F$F.8B12A9B2A9B4A14B3A5BA2BA42B3A5B3A14B4A4B
7A9B12A8B.F$F.8B12A9B2A10B3A4B2A4B2A2BABABA3B2A44B3A3BABABA2B2A4B2A4B
3A5B7A9B12A8B.F$F.8B12A9B2A8BABABA3BA2BA2BA2BA9B2A44B3A9BA2BA2BA2BA3B
ABABA3B7A9B12A8B.F$F.8B12A9B2A14B12A3BA5B2A44B3A5BA3B12A9B7A9B12A8B.F
$F.8B12A9B2A10BA3B12A9B2A44B3A9B12A3BA5B7A9B12A8B.F$F.8B12A9B2A14B12A
9B2A28B2A14B3A9B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A27BA2BA13B3A9B
12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A26BA4BA12B3A9B12A9B7A9B12A8B.F$
F.8B12A9B2A14B12A9B2A27B4A13B3A9B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B
2A25BA6BA11B3A9B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A27B4A13B3A9B12A
9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A16B2A5B4A4B4A9B3A9B12A9B7A9B12A8B.
F$F.8B12A9B2A14B12A9B2A15BA2BA3BA12BA8B3A9B12A9B7A9B12A8B.F$F.8B12A9B
2A14B12A9B2A14BA4BA3BABA4BA5BA7B3A9B12A9B7A9B12A8B.F$F.8B12A9B2A14B
12A9B2A12B4ABA2BAB2A12B3A5B3A9B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A
13B3A3B2A15B2A6B3A9B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A11BABABABA
5B3A10B2ABA4BABA2B2A5B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A19B2ABA3B
A9B2ABAB2A5BA2BA4B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A13BA3BA2B2A5B
A8B2A2BA2B3AB2ABA5B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A10B2ABAB4AB
2A5B3A6B2AB7A5B3A2B12A9B7A9B12A8B.F$F.8B12A9B2A14B12A9B2A11B3AB4AB2A
4B3A7B2AB5ABAB2A2B2A3B12A9BABABABA9B12A8B.F!
I struggle to even imagine how a general program to try to prove no finite photons in such a case might operate.