#UE Threat Inputs for AB

1 messages Β· Page 12 of 1

rocky vigil
#

yeah i see, if you or someone else solves it just make a pr

prime mica
#

yep doing that rn!

#

lol I can't test 32-bit builds locally

#

is there a way for me to run CI from my branch

rocky vigil
#

πŸ’€

#

idk

prime mica
#

ok lemme make sure it works on godbolt 32-bit compilers and then if it does we can just try it?

#

worst case we revert

#

except godbolt doesn't have them either blob_facepalm

foggy wind
foggy wind
#

Hmm, at least that's how I understood it. Maybe it also needs to be activated in your repository settings?

#

Maybe I'm completely wrong, but something like this existed πŸ˜„

prime mica
#

lol

#

powerful

#

I guess I'll just cerate a dummy PR to stockfish

violet badger
#

sudo apt-get install gcc-multilib

#

or similar

prime mica
#

gotcha

#

ugh why is vmovl_high_s8 not defined on armv7-neon

#

oh it's 64-bit only?? why

#

good news tho, seems like my patch fixes x86-32...

#

will now try to fix armv7--neon

#

also matetrack... @violet badger any ideas what might be happening there?

#

what is matetrack anyway 😩

violet badger
prime mica
#

ack

#

you mean the tablebase crash?

violet badger
#

#1336647760388034610 message

#

yes

#

same problem

prime mica
#

gotcha

violet badger
#

gotta run.

prime mica
#

πŸƒβ€β™‚οΈ

amber fern
#

oh yeah! Does anyone know how threat inputs performs on matetrack?? Im so curious!

prime mica
#

it crashes :P

#

ok time to download TBs I guess

#

I was gonna do that anyway at some opint

lofty cedar
#

Whoa! After all the patches and 20+ people working for like half a year or longer, the final code is only about 1000 lines?

#

Stockfish code is so compact.

stray reef
#

quite a few months of the time "spent" on this project was me thinking that increasing L1 would not work

#

it's not that complex once everything works. though there's ofc some trainer changes as well

lofty cedar
#

But why is it only like 6 elo in Stockfish even at VVLTC?

lofty cedar
lofty cedar
stray reef
amber fern
lofty cedar
lofty cedar
prime mica
#

I mean it's more like 15 elo when you take into account that one NN is SPSAed

#

also you'd expect gains to be smaller when modifying stronger engines right

amber fern
stray reef
# lofty cedar In Yukari, it's like 25 elo.

the engines are so different and so far apart, it's absolutely not comparable. maybe threat inputs work quite well with little data, weak data, or suboptimal training procedures. too many factors to say

#

also we don't know the speed diff (TI vs. pre-TI) in yukari

#

comparing a same-sized net in plenty vs. yukari, i found it's a rather slow engine, that might explain some of it

lofty cedar
#

In Monty it's like 40.

Well, in Plentychess... it's less gain, but still.

#

But wow, Stockfish was fast.

stray reef
#

monty is MCTS

prime mica
#
info depth 7 seldepth 9 multipv 1 score cp -96 nodes 1268 nps 181142 hashfull 0 tbhits 0 time 7 pv g4e2 d3d4 e2f3 b3d2 f3g2 d2c4 g2f3
syzygy/tbprobe.cpp:1081:22: runtime error: shift exponent 64 is too large for 64-bit type 'value_type' (aka 'unsigned long long')
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior syzygy/tbprobe.cpp:1081:22 
(base) cowpox@Cowpox src % 

ok great, can reproduce locally

#

this is on ARM, so I doubt it's any of the vector code

#

so only CI failure now is matetrack (and include what you need whcih should be trivial to fix)

lofty cedar
#

It looks like you're on a zero to one of the valuable contributors speedrun.

prime mica
#

meh

#

need to beat shash

rocky vigil
#

cool cool

#

exciting

lofty cedar
#

Now, do we wait a bit longer for things to settle? When do we launch a search tune?

NNUE weight tune wouldn't be done until we've exhausted the training options, but search params are not trainable anyway, so they can be tuned.

rocky vigil
prime mica
#

which PR

#

oh to your thing? yeah sure

#

am just debugging matetrack rn

rocky vigil
#

yeah

#

matetrack will take longer

prime mica
#

true

#

ok one sec

rocky vigil
#

i have no idea how we have issue, we didn't touch tb code...

prime mica
#

probably memory corurptoin

rocky vigil
#

ok

#

merged

#

now CI should officially work

#

except for IWYU / matetrack

prime mica
#

huzzah

#

ok lldb time

#

ah, e.pieceCount is 5 for some reason

#
1
1
0
Piece count:5```
rocky vigil
#

????

#

oh

#

bruh

#

yeah i know the crash occurred

#

after two captures on h1

prime mica
#

so I guess we're not decrementing pieceCount properly

#

maybe swap_piece?

#

but what's weird is the pos_is_ok check is passing...

#

lemme verify by calling pos_is_ok in tbprobe

rocky vigil
#

e is passed in this code

#

*entry = e

#

I think

#

so maybe the material key is off?

prime mica
#

oh bc fricking Fast = true

#
    constexpr bool Fast = true;  // Quick (default) or full check?

ok this is aura

prime mica
#

that would make more sense actually

#

also explains why even with Fast = false there's no pos_is_ok fails

#

I don't rly understand how materialKey works tho ngl

#

maybe something here?

rocky vigil
#

oh

#

promotion

#

that might be a culprit

#

bc of h1=bishop underpromo

prime mica
#

hm

#

swap_piece doesn't modify its arguments though

rocky vigil
#

actually idk

#

materialKey is not changed in the code

#

hmm

prime mica
#

fk

rocky vigil
#

oh did you use git bisect

prime mica
#

no but lemme try reverting this

#

ok that fixes the TB crash

#

so there's some subtle issue here

#

help me find it?

#

evidently it's somewhere which changes how materialKey is computed...

rocky vigil
#

huh

#

must be indirectly

#

bc everywhere materialKey is directly updated is the same

prime mica
#

right

#

how is en passant handled here

rocky vigil
#

this line

#

swap doesn't update the material key

#

when it should

prime mica
#

ohhhh

rocky vigil
#

wait

#

maybe

#

not

#

idk

prime mica
#

lol

rocky vigil
#

i think there is something sus

#

about calling swap though

#

without the material key updates

prime mica
#

sure

rocky vigil
#

actually I might be trolling

#

nvm

#

this is really strange

stray reef
#

put_piece and remove_piece don't update the material key either tho

rocky vigil
#

maybe try printing material keys before and after revert

#

that might help us understand where they diverge

prime mica
#

agree

#

brb

#

might have made a mistake

rocky vigil
#

that has same bench right

#

just wait for CI to run ig

rocky vigil
#

like ??

#

move_blunder is going on here

prime mica
#

we're so close bro

#

I'm trying to step through the code in my head for every class of move lol

#

I think ur right that it might have to do with (under)promotion that's also a capture...

rocky vigil
#

it's just underpromo

#

i think

#

no underpromo capture

#

though that would probably be even worse

prime mica
#

oh ok

rocky vigil
#

but it is an underpromo followed by 2 captures

prime mica
#

wait

#

I think pieceCount[captured] is not updated yet at line 785

#

if it's not an ep

#

(This is the fix diff)

#

it has to be that right

rocky vigil
#

ohhh

prime mica
#

testing

#

YES

#

it works

rocky vigil
#

ah

#

ok

rocky vigil
#

so it was a capture

#

and not underpromot

#

that was the issue

prime mica
#

fun times

#

ok now let's fix IWYU

#

maybe in a later PR I'll add a check that materialKey is correct to pos_is_ok...

#

didn't realize TB depended on its accuracy

rocky vigil
#

yeah compute it from scratch ig

#

and verify

prime mica
#

yessir

rocky vigil
#

anyways for now if this works I'll just accept it

#

and hopefully IWYU won't take so long

prime mica
#

@regal steeple tribunal for u

#

jk much love

twilit oriole
#

@rocky vigil u can do this also now the pr is opened. download the file and then edit PR description and there is attach file button there

prime mica
#

how close are we on the cleanup/code quality side?

rocky vigil
#

btw I'm just gonna download the pr doc

#

the "everything" section

#

unless ppl still have stuff to add to it

prime mica
#

sounds good to me

#

can edit in the futuer if necessary...

rocky vigil
#

yeah ok

#

so now the PR message looks half decent

#

we can complete it once everything else is done

prime mica
#

great

lucid grove
#

Given that we have been extremely lucky that matetrack caught the bug, is there a case for including a specific test to the ci that would catch the original bug?

prime mica
#

materialKey is only used for tablebases fwiw

#

so it makes sense that we never detected this until now...

rocky vigil
#

yeah but it would've been really sad if matetrack didn't catch it

prime mica
#

also additional debug checks in tbprobe.cpp make sense to me

rocky vigil
#

and then we got had in a tcec game...

prime mica
#

haha yeah

#

cucked by materialKey

#

we can do more extensive testing with TBs maybe

twilit oriole
#

use pdf for the attachment

prime mica
#

bruh is my clang-format outdated

rocky vigil
#

bruh

rocky vigil
prime mica
#

sorry lol

twilit oriole
#

lol

prime mica
#

hm the other problem is that even if we add the materialKey check to pos_is_ok, the checks in that function are hidden by default because of their enormous runtime cost

#

so likely no one would have found it during testing...

#

@lucid grove any ideas?

#

I guess asserts in tbprobe are enough given that tablebases are used in CI...

#

it would be nice to have 6-men checked in CI but eh

twilit oriole
#

πŸ‘€

lucid grove
#

Would need to take a closer look. Naively any test that would discover the mismatch is fine. Doesn't necessarily need tb for it iiuc

#

I think assert in tb probe is a possibility. But apart from matetrack no other ci uses TB atm iirc

prime mica
#

matetrack runs on every SF Pr

lucid grove
#

But we were lucky it triggered, right? It's not a given that it would trigger for any mismatch.

prime mica
#

If we add an assert in probe it should catch any mismatch

lucid grove
#

Agreed

prime mica
#

Honestly I’m not why such an assert didn’t previously exist

#

Passing the wrong position to a TB seems easy to do lol

#

Skill issue ig

lucid grove
#

But even with assert, it would only trigger if search comes up with a position that has capture promotion or whatever triggered this bug

prime mica
#

The bug was actually just a capture

#

any non en passant capture was buggy

#

but yeah an extremely subtle bug could escape detection

#

fuzzing with TBs could be nice

#

but I think only when updating do_move and such functions

#

yay CI passed

#

@rocky vigil I think you can hold off on merging the speedup(s)

#

That way the upcoming non regression test is more accurate…

rocky vigil
violet badger
lucid grove
#

rare ones are the hardest to debug πŸ˜‰

violet badger
#

cool, great fixes, btw!

#

sure, but also hard to exhaustively cover.

#

But I'm all for adding some more tests.

#

Now, for completeness, our tests did catch it, which isn't bad at all.

rocky vigil
#

do maintainers (vondele, disservin) have any comments on PR

green moat
#

I think Yoshie2000 said he would have read the whole diff.....
pauseChamp

stray reef
#

had to actually listen to the lecture unfortunately

prime mica
#

mfw you're actually learning in school

rocky vigil
prime mica
stray reef
#

compsci masters, the lecture was on statistical signal processing

prime mica
#

super cool :)

#

(not sure if this is ideal, but here's something)

violet badger
rocky vigil
#

ok

violet badger
#

That documents exactly what needs to be done to 'reproduce'

prime mica
#

when the net is reproducible 😍

violet badger
#

unfortunately pytorch training is not bitwise-reproducible, but executing this recipe enough times should yield a net of similar strength. In practice the variation is actually fairly small.

rocky vigil
#

comment modified

#

to include that information

lofty cedar
#

Bitwise-reproducibility is probably not possible on a gpu with floating point unit.

#

Because GPUs might operate in different orders affecting the rounding.

prime mica
#

demented

rocky vigil
#

there is a simpler reason, and that would be the random skipping of positions

#

(and presumably, the shuffling)

violet badger
#

which is of course pseudo-random..

formal smelt
#

the core issue is use of atomics in FT backprop
i think pretty much everything else could be resolved (e.g. by fixing seeds)

lofty cedar
#

Nah... randoms aren't truly random.

#

Seeds can be fixed.

rocky vigil
#

oh

lofty cedar
#

Another thing moving forward is... do we let people submit net training runs?

rocky vigil
#

making the position order deterministic is strange to me but in principle it could be done

rocky vigil
lofty cedar
formal smelt
lofty cedar
#

Since training ideas only take like a few days or so, we should be able to test at least a hundred training ideas in a year.

rocky vigil
#

the ability to PR to nettest has also been open for a while

lofty cedar
#

Really?

#

What about making a run?

lofty cedar
prime mica
#

seems a bit tricky w/o volunteer resources for GPUs

rocky vigil
#

i thought if you made a PR to nettest then a run for it could have been set up on gitlab pipelines

#

there is at least support for 4 concurrent runs

violet badger
#

so, ideally we get DDP to work, would reduce the cost ....

prime mica
#

DDP?

violet badger
#

distributed data parallelism in our nnue-pytorch.

#

right now doesn't seem to work.

prime mica
#

oh I see

violet badger
#

some bug somewhere.

lofty cedar
prime mica
prime mica
#

etc. etc., it's a lot more requirements than fishtest...

rocky vigil
#

many gigabytes is an understatement

violet badger
#

about 1TB

prime mica
#

lololol

#

would just barely fit in RAM ;)

violet badger
#

some people's RAM ...

prime mica
violet badger
#

seems reasonable.

#

I've also asked co-pilot for a review, only consider what is reasonable...

#

Stockfish threat inputs PR summary.pdf I think some of anematode's speedups could be mentioned?

#

once the PR is in final stage, I'd like it to be squashed, with the commit message containing the appropriate co-author: ... designations and also the PR message as commit comment... please.

lofty cedar
#

Ummn what do we do after the cleanup, after the merge? Do we launch a VVLTC search tune first?

violet badger
#

have a medium-strength, cold beer, and enjoy the day?

green moat
prime mica
#

although hm let's just let it run as is

green moat
#

still PLENTY (pun intended πŸ˜› ) things to do....

rocky vigil
violet badger
#

so, all PRs are usually squashed into one commit, easiest for maintainers if this is done by the author. By adding to he commit message something like

    Co-authored-by: sscg13 <[email protected]>
    Co-authored-by: Timothy Herchen <[email protected]>

Also a single commit can be attributed to multiple authors.

rocky vigil
#

ok cool

#

once everything is done I can squash it into a new PR

prime mica
#

one kinda goofy idea I've been mulling over

#

to try to address the x86 pain

#

is to have an i16 expanded version of the threat weights as well... then use that for features which are being very frequently used

#

it would be quite complex to track tho

#

and the tracking would have to be extremely fast

#

but I'll probably try it at some point... if the distribution of threat feature incremental updates is good then it could be a significant speedup

#

also somehow I didn't realize that the L1 size is now 1024...

#

that changes the calculus on add/sub honestly

#

loop overhead and index generation will matter more

rocky vigil
#

oh yeah talk about claude comments

#

I do have a determination that 64 is an upper bound

#

and I know why 32 is insufficient

#

and I suspect 48 is sufficient

prime mica
#

once snowy-egret is merged there will be no perf difference

#

but yeah maybe nice to have a justification about the size

rocky vigil
#

here the move Qxe3 modifies 48 threats

prime mica
rocky vigil
#

wait shoot

#

why doesn't 32 work

#

aren't added/removed separate

prime mica
#

no

#

we have a boolean add

rocky vigil
#

ohhhhh

#

ok

#

yeah then 48

#

16 * 3 pieces

prime mica
#

that makes sense

rocky vigil
#

the only way to involve 4 pieces in a move is castling

#

but I strongly suspect you cannot hit anywhere near 48 with castling

prime mica
#

right

#

need a queen for maximal enjoyment

rocky vigil
#

oh actually it's easy

#

9 * 4 is a trivial upper bound for castling

prime mica
#

you'd make a good mathematician

rocky vigil
#

did I mention I'm supposed to be a math major

prime mica
#

lol

#

I have this one math friend who always calls things trivial

rocky vigil
#

sounds about right

prime mica
#

but then it requires 15 minutes of explanation covering two chalkboards to explain why its' trivial

rocky vigil
#

"trivial" means "i could come up with the reason on the spot"

prime mica
#

ok well we can try 48 then...

#

maybe in a future PR for safety? unless you're 100% confident

rocky vigil
#

yeah

#

I'll put the argument down tho

prime mica
#

great

rocky vigil
#

to silence claude

prime mica
#

🀐

#

also maybe you saw but I made a small PR to clean up some redundant stuff in full_threats.cpp

rocky vigil
#

ah ok

#

lemme get to it

violet badger
prime mica
#

yess

#

let's write a Coq proof that at most 48 threats are changed

violet badger
prime mica
#

Gurobi

#

so we can probably simp it out after snowy-egret

violet badger
#

I actually think there was another blog post on that... maybe tehre are two.

prime mica
#

O where

violet badger
#

nah, probably that one. Even though I thought it appeared on lichess recently. Seemingly is already a bit older

dark stream
#

So, basically everyone is waiting for shawn_xu to do his change to nnue-pytorch, right?

"Remove unused code (Legacy PSQ stuff in Full_Threats.h looking at you)" : this is one of the checklist items. Was this done?

rocky vigil
#

this is considered done when everyone agrees it is

#

although the thing I specifically called out indeed has been removed

prime mica
#

I didn’t see anything unused…

dark stream
#

So, do you think there is any possible regression from this cleanup?

rocky vigil
#

no

#

but just to be sure

#

(it's maintainer decision)

#

(as a stc nonreg will take a while)

violet badger
#

LTC might be the shortcut πŸ™‚

#

STC filtering has been done.

#

and yeah, I think we should do a final LTC run, maybe after the squash.

rocky vigil
#

oh so like do a second LTC test after squashing?

violet badger
#

yeah.

rocky vigil
#

ok

#

in that case i guess we still welcome more speedups

#

as they pass fishtest

violet badger
#

nah..

rocky vigil
#

oh

violet badger
#

let's move forward as is.

rocky vigil
#

ok

prime mica
#

Agre

rocky vigil
#

do we continue waiting on shawn to do nnue-pytorch work or do the merges asynchronously

violet badger
#

can be asynchronous.. in the end the net generation was with a specific sha which we know where to find. Obviously, I'd like to move forward with integrating that in the main branch, but I'm confident we'll do that.

rocky vigil
regal steeple
#

I just noticed that I forgot to remove some things from the FusedUpdateData struct, dp2from and dp2fromBoard can be removed I think

prime mica
#

@long quest

base (...stockfish.ti) =    1515728  +/- 1787
test (./stockfish    ) =    1542716  +/- 1503
diff                   =     +26988  +/- 2310

speedup        = +0.0178
P(speedup > 0) =  1.0000
#

your patch works extremely well locally

rocky vigil
#

or let me know what to remove

prime mica
#
   2dd15:   41 31 d8                xor    r8d,ebx
   2dd18:   31 de                   xor    esi,ebx
   2dd1a:   41 c1 ec 1c             shr    r12d,0x1c
   2dd1e:   49 0f be d1             movsx  rdx,r9b
   2dd22:   49 39 f0                cmp    r8,rsi
   2dd25:   40 0f 92 c5             setb   bpl
   2dd29:   49 89 d1                mov    r9,rdx
   2dd2c:   c1 e8 10                shr    eax,0x10
   2dd2f:   49 c1 e1 04             shl    r9,0x4
   2dd33:   83 e0 0f                and    eax,0xf
   2dd36:   48 c1 e2 06             shl    rdx,0x6
   2dd3a:   4c 01 c8                add    rax,r9
   2dd3d:   48 8d 6c 45 00          lea    rbp,[rbp+rax*2+0x0]
   2dd42:   4a 8d 04 02             lea    rax,[rdx+r8*1]
   2dd46:   48 89 c2                mov    rdx,rax
   2dd49:   45 8b 0c af             mov    r9d,DWORD PTR [r15+rbp*4]
   2dd4d:   48 c1 e2 06             shl    rdx,0x6
   2dd51:   4c 01 ea                add    rdx,r13
   2dd54:   44 0f b6 04 32          movzx  r8d,BYTE PTR [rdx+rsi*1]
   2dd59:   45 03 04 86             add    r8d,DWORD PTR [r14+rax*4]
   2dd5d:   45 01 c1                add    r9d,r8d
   2dd60:   41 81 f9 ef 37 01 00    cmp    r9d,0x137ef
   2dd67:   77 22                   ja     2dd8b

assembly after also applying bald-eagle, they seem to synergize rly well

#

"small"-speedup my ass

#
Result of 100 runs
==================
base (...stockfish.ti) =    1515621  +/- 1655
test (./stockfish    ) =    1569287  +/- 2560
diff                   =     +53666  +/- 2930

speedup        = +0.0354
P(speedup > 0) =  1.0000

threat-inputs vs. small-speedup + bald-eagle

#

super exciting

regal steeple
rocky vigil
rocky vigil
#

if no new suggestions I'll make a new LTC soon

prime mica
#

Go for it I think…

#

Maybe a maintainer should review first tho

#

idk

rocky vigil
#

yeah I'll wait

#

for a bit

rocky vigil
#

aight well I've made it

twilit oriole
#

Is this including extra speedups or smth

#

Why not a non reg

#

@rocky vigil

rocky vigil
#

vondele wanted a new ltc vs master

#

so a new ltc it shall be

#

it unironically might finish faster

twilit oriole
#

Really? That seems not right, it's opening it up to the machine lottery again.

twilit oriole
#

I'll approve but a non reg wouldn't have that issue

#

Yeah I'm not seeing the Vs master. Because I don't see the logic behind that

rocky vigil
#

wait what do we want then

#

LTC against master again?

#

LTC nonreg against passed version?

twilit oriole
#

A LTC non reg to make sure you didn't regress anything?

#

Vs what has already passed

rocky vigil
#

ok

#

I can set that u

#

aight

#

yeah

#

let's do that

#

it might take like a day or so idk

prime mica
#

am I crazy or is the github diff different than the diff on fishtest...

#

the one on github looks wrong

#

but the commit hashes look right

violet badger
#

Here's the result on the ARM nodes for an LTC test vs master, you might want to add that to the PR:

   # PLAYER    :  RATING  ERROR   POINTS  PLAYED   (%)
   1 patch     :    13.9    1.9  38296.5   73728    52
   2 master    :     0.0   ----  35431.5   73728    48
twilit oriole
violet badger
#

it make sense to test the final version of the patch by the usual standards...

#

it would also have saved resources..

twilit oriole
#

But it does not tell you if it is actually non reg

violet badger
#

no, it tells if it gains against master..

prime mica
#

why does it matter if it regressed slightl

violet badger
#

anyway,

prime mica
#

will be fixed in the normal course of development

twilit oriole
violet badger
#

any patch that passes the normal fishtest development, is actually handled that way..

#

but it is not worth long discussion.

twilit oriole
#

Anyways correct it is not a big deal. I just think a non reg is more appropriate here

violet badger
#

let's instead bet on how long it takes till the first gainers pass on fishtest after merging..

#

My bet.. 1 day for code and .. 1 day for net?

twilit oriole
#

I think you have some insider info Kappa

violet badger
#

πŸ™‚

#

SEC going after me.

prime mica
#

I thought Swiss banks were good for that

foggy wind
#

There are already speedups ready that are not part of the PR, right?

violet badger
#

I think so.

#

at least options and half passed tests.

foggy wind
prisma hatchBOT
regal steeple
#

This position with move e4d5 has 68 dirty threats if I didnt measure anything wrong

lapis parrot
#

I think sf should just segfault there

regal steeple
#
    assert(pos_is_ok());

    assert(dp.pc != NO_PIECE);
    assert(!(bool(captured) || m.type_of() == CASTLING) ^ (dp.remove_sq != SQ_NONE));
    assert(dp.from != SQ_NONE);
    assert(!(dp.add_sq != SQ_NONE) ^ (m.type_of() == PROMOTION || m.type_of() == CASTLING));

+   std::cout << dts.list.size() << std::endl;

    return {dp, dts};
Stockfish dev-20251109-dbc3dcc3 by the Stockfish developers (see AUTHORS file)
position fen k7/2n1n3/1nbNbN2/2NbRBN1/1nbRQR2/2NBRBN1/3N1N2/7K w - - 0 1 moves e4d5
68
lapis parrot
#

so people wouldn't feed it some garbage

violet badger
#

Is that relevant for this list?
using DirtyThreatList = ValueList<DirtyThreat, 64>;

regal steeple
#

I think it should be

twilit oriole
#

Oh actually it isn't

#

Because there isn't enough pawns to promo into all the extra pieces

violet badger
#

Triggers an assert indeed:

stockfish: misc.h:138: void Stockfish::ValueList<T, MaxSize>::push_back(const T&) [with T = Stockfish::DirtyThreat; long unsigned int MaxSize = 64]: Assertion `size_ < MaxSize' failed.
twilit oriole
#

What to figure out is if any legal position triggers it?

violet badger
#

it is not too far from legal though..

prime mica
prisma hatchBOT
prime mica
#

but obviously it'd be nice to have a good idea of the bound

regal steeple
#

this should be legal

violet badger
#

but yeah, still triggering the issue.

#

stockfish: misc.h:138: void Stockfish::ValueList<T, MaxSize>::push_back(const T&) [with T = Stockfish::DirtyThreat; long unsigned int MaxSize = 64]: Assertion `size_ < MaxSize' failed.

prime mica
#

😩

lapis parrot
violet badger
#

so, we should probably fix the code... and probably include this position in CI somewhere.

lapis parrot
#

sf should segfault and print "fuck off" message

rocky vigil
#

i also forgot about x rays

#

lemme get a new upper bound then

prisma hatchBOT
rocky vigil
#

Qxe3 should have 71

rocky vigil
rocky vigil
#

If it’s just raw threats before deduplication we can use 80 as an upper bound

frosty imp
prime mica
#

O no

#

feel better

frosty imp
#

Basically what I wanted to do is to move features to under model/modules, and for each feature set, define its own module by inheriting from DoubleTransformerSlice

#

Then each module specific to the input feature can define its own coalesce weights function

#

FeatureSet stuff can prolly just be deleted. Combined features can be reimplemented if needed anyway

amber fern
long quest
prime mica
#

if it's ok with you we can stack our two changes and it'll probably pass a bit faster...

#

but taking a while is also fine

long quest
#

sure, can you just make a combined patch?

prime mica
#

yes!

long quest
#

cool, I'll stop my test

prime mica
dark stream
#

Time to merge?

amber fern
#

Merging time??? 😁

amber fern
#

Obsevation: The stockfish discord channel is either really busy, or completely quiet depending on the time of day it is xD

dark stream
amber fern
#

If I remember correctly

dark stream
amber fern
#

I most curious for the progression tests before and after search tuning with the best net, just how much elo will be gained since sf 17/17.1!?

dark stream
violet badger
dark stream
rocky vigil
#

(8 attacks + 16 attacked) * 3 pieces + 8 discovered attacks

dark stream
#

Oh, right. Btw, will this change playing strength or something like that?

rocky vigil
#

No

#

I guess it is just update this and the logic

#

And then it is in a mergeable state

violet badger
#

sounds good...

frosty imp
#

wait a second

#

is the small net totalinputs correct

#

ah nvm it's correct

amber fern
#

can we get a countdown to merge? Like on new years? Very serious request.

frosty imp
#

ig some of the random newlines in the diff can be removed

rocky vigil
#

for the squashed commit, would people prefer I use their public emails or noreply emails?

#

btw with the change, it can now run both positions without triggering an assert

rocky vigil
violet badger
#

I think we could just add that position to bench, it gets caught by the asserts.

rocky vigil
#

ah sure

violet badger
#

(in that way github should properly associate it with the accounts I think)

rocky vigil
#

ok

amber fern
#

where are all you guys from? Its 2am in the US right now, so I'm guessing not there?

violet badger
#

let's try to keep this thread on development please..

frosty imp
#

@rocky vigil pr sent

amber fern
#

kidding lol

frosty imp
#

also I forgot to include disservin as a coauthor

rocky vigil
violet badger
#

now, as part of the correction

rocky vigil
#

ok

#

with this change, bench becomes 2626086, can someone else confirm

#

(it has been pushed to the PR)

violet badger
#

2626086

prime mica
#

woot

#

Starting to wonder the true max now haha

rocky vigil
#

how should I do this

#

I have uh, never really done big PRs before

prime mica
#

I think the public email makes most sense

rocky vigil
#

ok

#

so I'll use public email if I can find it in git logs, and noreply otherwise

prime mica
#

Huzzah

frosty imp
prime mica
#

Goated domain name

rocky vigil
frosty imp
#

huh that seems to not be my github email actulaly

rocky vigil
#

is what git logs have

violet badger
#

he used his bench

frosty imp
#

nvm it is on my gh profile. just anything is fine I guess

rocky vigil
#

i didn't find a public email for cj in this log

#

yeah it seems that cj prefers noreply

frosty imp
#

@rocky vigil PR sent

rocky vigil
#

ok ok

#

cool

#

is this it fr

rocky vigil
stray reef
#

are we about to merge πŸ‘€

rocky vigil
#

if no further suggestions

#

but somehow I feel like there will still be one

violet badger
#

From my side, I think we're basically good to go, but can only merge later today, so still a couple of hours to fix small things, if needed.

rocky vigil
#

ok

#

i can wait until you are able to merge then

#

to do this

violet badger
#

I think you can squash it essentially now. Even if tiny stuff comes after, this can still be integrated.

rocky vigil
#

ok

dark stream
#

Btw, there are still some speedups and stuff ready for after the merge, right?

violet badger
#

probably. We'll see.

#

one thing at a time ..

rocky vigil
#

ok it looks like contributors came out fine

frosty imp
#

oops seems that the inline wasn't removed

#

I've made a pr but is the branch right

stray reef
#

oh i still have a suggestion, gotta add yoshie2000 to AUTHORS Kappa

frosty imp
#

true

violet badger
#

The purple elimination plan is working well.

stray reef
#

i can pr in 5mins

rocky vigil
#

ok just do it to the original pr branch

#

I'll redo the squash in a moment

rocky vigil
#

I've already written up the PR / squash commit msgs so it's fast

stray reef
rocky vigil
#

merge

#

d

#

alright lemme actually

#

redo the squash

frosty imp
#

cool

rocky vigil
frosty imp
#

mergers when

rocky vigil
#

when vondele gets back

stray reef
#

ci failing nohope

rocky vigil
#

eh why's it complaining about bench mismatch

#

???

frosty imp
#

you didn't include bench in the commit

rocky vigil
#

shoot

#

ok

#

force-with-lease my beloved

stray reef
#

ci says

signature mismatch: reference 2351426 obtained: 2626086 .
tho, where is it taking the reference from then? latest commit with bench?

frosty imp
#

yeah

rocky vigil
#

yeah that's master

frosty imp
#

it searches backwards

stray reef
#

alright, then it's an easy fix

rocky vigil
#

ye

#

i've done it

rocky vigil
frosty imp
#

finally this threat can go to rest

#

or maybe not until nnue-pytorch merge

rocky vigil
#

yeah

#

also it's funny

#

how the random people cannot seem to like

#

comprehend

#

L1 is 3x smaller

#

but the net is larger

prime mica
#

who is "random people"

prime mica
frosty imp
#

surely threat smallnet could work now

prime mica
#

;)

rocky vigil
prime mica
#

ah ok

rocky vigil
#

how did we violate clang-format πŸ’€

#

oh well

rocky vigil
#

blegh

frosty imp
#

vondele can do it during merge tho

rocky vigil
#

yea

rocky vigil
#

it was going really good in stc

#

but then antiscaled

stray reef
#

it's an attempt to migrate to viriformat. but it was using a different teacher net since i haven't gotten around to writing an updated relabeler in c++ yet, that's probably the reason it antiscaled

#

next one with correct teacher net ready in 5-ish hours, but also wrong channel probably

rocky vigil
#

ah yeah this channel will probably just be used to finalize nnue-pytorch merge

#

at which point it becomes mainstream

#

and we move to the general channels

frosty imp
#

but in the meantime if someone wants to try

foggy wind
rocky vigil
#

ok ok

#

i misinterpreted that

violet badger
#

makes it easier to avoid mistakes on my part, if I copy and paste from the PR message formating links etc might be off.

#

we're super close though....

rocky vigil
#

btw I edited

#

the PR text

#

into the commit message

#

i think the only remaining thing is clang-format

violet badger
#

that's easy enough on my side.

rocky vigil
#

other than that I think everything else is good now?

violet badger
#

I think so.

#

and merged πŸ™‚

rocky vigil
#

nice

violet badger
#

huge thanks to all contributors

#

this has been very nice

#

particular thanks to @rocky vigil and @frosty imp for their huge effort and endurance!

rocky vigil
#

yep

#

still got more nnue-pytorch work

#

before it's truly done though

violet badger
#

sure, beginning of a journey, hopefully!

dark stream
#

So, where will the conversation surrounding this move? SF-general and dev?

violet badger
#

I propose that on-topic conversations can move there indeed.

stray reef
#

Huge congrats everyone!

formal smelt
#

Bruh

#

No coauthor for doing most of the code for threat inputs until it got handed off?

rocky vigil
#

did you want it

#

sorry

formal smelt
#

You can literally see I wrote all the code in the Monty PRs

violet badger
#

hm, oversight and unfortunately 1min late... we can't change the commit, we can add it to the PR.

formal smelt
violet badger
#

at least that one is referenced

rocky vigil
#

yeah I thought while we took inspiration from that code in early impl the current impl is quite far
if we widen the co-authoring range then lofty should also be credited for having the precursor UE impl that Yoshie took inspiration from

#

ok I'll add a comment to the PR

#

@formal smelt is this okay?

formal smelt
#

Sure

formal smelt
rocky vigil
#

that was a misunderstanding on my part, I thought Viren did all of the architecture design work

violet badger
#

meanwhile SF 17 sees this as an opportunity

stray reef
#

SF 18.1 coming

dark stream
#

Oh, wait. I just thought of one thing. There was a gap between th1 and th8 performance in the previous PT. That will probably be closed this time.

formal smelt
lapis parrot
#

8 th PT has bigger gamepair ratio

#

just that it compresses because of bigger game pair draw %

rocky vigil
rocky vigil
formal smelt
rocky vigil
#

yeah that was definitely part of it, i hope that last comment in the PR makes amends at least somewhat

formal smelt
#

Yeah seems good to me

#

Malding over

rocky vigil
#

in retrospect I should have taken some more care handling the crediting, I forgot that SF is a way larger project and that the vast majority of people don't know the "inside info" and just go by what is written

rocky vigil
violet badger
#

sure

lofty cedar
#

Wait... you merged the threat input first without merging the other PRs?

#

Why?

candid ivy
#

cause it’s an easy merge

#

and the biggest

#

with the highest possibility of conflicts

lofty cedar
#

I see.

amber fern
violet badger
#

no

naive comet
#

@rocky vigil wasn't it me.....

#

.

rocky vigil
#

πŸ’€

#

yeah I remembered this one sorry

#

this is what happens when too many messages get sent

twilit oriole
#

@formal smelt I was under the impression you were getting credited second from the prior list posted. On the linked document the credit I claim is for creating the feature set. On the issue of who created the PRs, you raised no issues at the time with being coauthored on all of them. I had no problem if you wanted to open some of them yourself

formal smelt
lapis parrot
#

ugh

#

now I seem to need to download networks by hand kek

rocky vigil
#

huh

#

it should still autodownload

lapis parrot
#

if you can autoopen fishtest which seem to not work I guess

violet badger
#

nothing changed there, should still be working unless some IP block? (not by us).

lapis parrot
#

yes, and this is what I'm referring to (IP block)

#

since our net haven't changed in ages welp, it wasn't an issue

#

well it's not really an issue anyway

rocky vigil
lapis parrot
#

just put stuff on fishtest

rocky vigil
#

ok

violet badger
#

yes, probably best... in this case, I couldn't run a local test, since the inference code wasn't immediately available. For model arch changes, it is nice if that's available, in that case the local test runs directly.

lofty cedar
#

After all the efforts... we got about 1 elo PT 😭

#

All of that... for a drop of elo?

#

Like... if we knew this from the start, would we have done this at all?

native lake
lofty cedar
#

Yeah... it was 6 elo VVLTC SPRT before.

Then the PT came and only 1 was real progress.

dark stream
lofty cedar
#

Yes, I know that.

lofty cedar
# dark stream

The point is not that the 6 elo was accurate. The point was that...

We got 1 freaking elo from all these?

#

There were times where you got a few random patches and like 3 elo.

#

And this time, all these for a single elo drop?

dark stream
# lofty cedar And this time, all these for a single elo drop?

Are you being serious here?

  1. We have no idea what effect the verbatim patch had, so we are not really getting good reference. Ideally, it should have improved elo in PT, but unless threat-inputs actually lost elo in PT, we don't really know.
  2. There is still "a lot of low hanging fruit" left as per Viren. So some elo gains can be expected from that, purely from speedups and things.
  3. There is much scope for things like search tunes, which should also gain a nice bit.
  4. Most importantly, search gains have stagnated for months at this point. This might change that.
twilit oriole
#

There is the 8 Elo of net spsa also for later

lofty cedar
#

Oh... yeah... I guess maybe we can gain 10 elo after these. That would be nice.

And the fact that now we aren't stagnant on net anymore too.

dark stream
#

And honestly, the PTs haven't exactly matched sources like NCM or SPCC a lot lately. I'm curious what SPCC will show.

#

SPCC even has the verbatim patch, so...

stray gyro
#

I'm fine even if this was neutral at all, what important for me is that we now have simple training steps that don't require SPSA.

dark stream
stray gyro
#

Well eventually master net will have SPSA optimized on top of everything, but this is a good improvement.

lapis parrot
#

also since threat inputs are really hardware dependent

#

you can get w/e the hell noise from PT

#

someone can actually run a script that separates results by archs on pt

#

would be interesting

dark stream
#

SF18 already on ARM.

rocky vigil
rocky vigil
#

eventually

amber fern
#

The progression tests are about +2 elo at the moment for the last progression tests, so thats not too bad πŸ™‚

violet badger
# rocky vigil you'll also get credited on the NNUE pytorch PR

btw, I would also see the fact that we currently have clearly defined how to train the master net with nnue-pytorch as an opportunity to repeat this will bullet. I can only believe this is beneficial for both toolchains. I'm not religious about nnue-pytorch and wouldn't mind running some trainings with bullet, while showing equivalence (or reaching it) might be useful for all engines using bullet.

rocky vigil
#

weren't there still some kinds of conversion issues to be resolved

violet badger
#

so far it is not working, afaik.

#

certainly would take some effort, but could be worth it?

rocky vigil
#

i strongly suspect this is because the default psq order in bullet is different, btw

#

in sf it goes like, white pawn, black pawn, white knight, black knight, ... , king

#

whereas in bullet it goes like white pawn, white knight, ... , black pawn, black knight, ...

violet badger
rocky vigil
#

indicates it's using a bullet default

violet badger
#

would be a good reason..

formal smelt
#

there was also the 127/128 stuff

rocky vigil
#

yep

#

now it's 255/256

rocky vigil
#

still good to fix

formal smelt
#

i can't remember where it is off the top of my head but couldn't it cause overflow or something

rocky vigil
#

oh huh

#

i thought that was a trainer-side thing

#

some form of QAT

formal smelt
#

i thought it was so you could divide by 128 rather than 127 in inference

#

probably fine

rocky vigil
#

yeah

#

using 1, anyways

#

is like -2 elo at most

formal smelt
#

well it would be nice to try again
also bullet_lib api has been stable for many months now, unlike when Disservin's branch was written

rocky vigil
#

yep

#

someone just has to write it

#

and that someone wouldn't be me :P

formal smelt
#

probably not me either for some time

#

i am currently rewriting the compiler part

rocky vigil
#

yoshie is the most likely person to ask to write

rocky vigil
#

btw @stray reef would you want to look into attempting to write a bullet training config for sf net?

stray reef
#

i believe there's already some (more or less working) training configs, but they just can't be loaded into SF?

rocky vigil
#

i think this is the main one to fix

stray reef
#

that sounds very easy to fix then

rocky vigil
#

yeah if the later layers quantization still works

#

then it's just a matter of modifying psq part of features to match sf

#

ofc the transposing still needs to be done

stray reef
#

transposing seems to already be done via SavedFormat in disservins config

rocky vigil
#

there's a separate one

stray reef
#

ah

#

is stockfish not using floats for the later layers anymore?

rocky vigil
#

i thought it's always been ints

stray reef
#

alright then

rocky vigil
#

feature_set_hash needs to change, idk what else

#

i forgot what "version" was

#

but yeah it seems like it shouldn't be too much additional work

stray reef
#

what's better, doing the pst shuffling in bullet or the python script?

rocky vigil
#

i think it'll be easier for you if you do it in the python script

#

also beware of the input buckets and the mirroring as well

#

sf mirrors to efgh

#

and '

#

'e1' is bucket 31

stray reef
#

h8 h7 ... g8 g7 ... e8 ... e1
or
h8 g8 ... h7 g7 ... h1 ... e1
?

rocky vigil
#

h1 = 28 (so, the latter)

#

actually you might be better off just defining the psq part properly in bullet

#

so that you don't need extra shuffling

formal smelt
#

if you were implementing it properly you should probably write a custom dataloader and input type and then obviate the shuffling entirely

rocky vigil
#

so many complications

formal smelt
#

its not really that hard

stray reef
#

custom input type sure, but why the dataloader?

#

at least, what does it have to do with the pst order and mirroring

stray reef
#

https://github.com/Disservin/sf-bullet-train/compare/main...Yoshie2000:sf-bullet-train:fix-inputs
Basically did it (hopefully) exactly like https://github.com/official-stockfish/Stockfish/blob/master/src/nnue/features/half_ka_v2_hm.cpp so it should work, but I can't try it right now.
One thing that confused me a bit was the merged kings stuff vs. halfkav2, i thought the stm king has no feature in halfkav2 because it's implicitly encoded in the bucket, but it doesn't seem like that's the case now

rocky vigil
#

no the king is merged

#

it's just like post processed

stray reef
rocky vigil
#

wdym

#

the king also has a feature

#

iirc there was an idea to remove the biases to merge them into the king feature

stray reef
#

i thought the stm king has no feature in halfkav2 because it's implicitly encoded in the bucket
i guess i misinterpreted your response to this then

rocky vigil
#

someone should test if 32 buckets vs 16 is really worth it

#

later

rocky vigil
#

they are the same as in bullet

stray reef
#

i think it's much easier to first test this and then add threat inputs

rocky vigil
#

ok

#

how about reduce the L1 size to 1024 anyways

#

first

#

to make the test run faster

stray reef
#

only need to train 1 SB anyway to see if results are reasonable

rare jacinth
#

Maybe it's worth trying having additional features for the locations of pawns on the same or adjacent files to improve pawn structure understanding

rocky vigil
stray reef
#
Read checkpoints/test-1/quantised.bin successfully.
Organized data into 8 buckets.
Writing to checkpoints/test-1/pytorch.nnue...
Ending position for bucket 0: 69717832
Bucket 0 size: 1152 bytes
Ending position for bucket 1: 69768240
Bucket 1 size: 1152 bytes
Ending position for bucket 2: 69818648
Bucket 2 size: 1152 bytes
Ending position for bucket 3: 69869056
Bucket 3 size: 1152 bytes
Ending position for bucket 4: 69919464
Bucket 4 size: 1152 bytes
Ending position for bucket 5: 69969872
Bucket 5 size: 1152 bytes
Ending position for bucket 6: 70020280
Bucket 6 size: 1152 bytes
Ending position for bucket 7: 70070688
Bucket 7 size: 1152 bytes
Integer value at position 69389475: 2171895937
Conversion complete: checkpoints/test-1/quantised.bin -> checkpoints/test-1/pytorch.nnue

https://1drv.ms/u/c/74d39b59afff2586/IQCTyS0zPPq3Q7v_ywlBV3pKAbabde9n_4bMbBtd54dD5u0?e=8TTMZi

rocky vigil
#

this is l1=3072 right?

#

what does "integer value at position 69389475" refer to

stray reef
#

i have no idea

rocky vigil
#

what's startpos eval supposed to be?

#

i can get it in soon

stray reef
#

43 + quantisation error

rocky vigil
#

b9535843d87e is hash?

stray reef
#

hash of what?

rocky vigil
#

the net

#

appears so

#
info string NNUE evaluation using nn-37f18f62d772.nnue (6MiB, (22528, 128, 15, 32, 1))
info string Network replica 1: Shared memory.

 NNUE network contributions (White to move)
+------------+------------+------------+------------+
|   Bucket   |  Material  | Positional |   Total    |
|            |   (PSQT)   |  (Layers)  |            |
+------------+------------+------------+------------+
|  0         |     0.00   |  +  1.98   |  +  1.98   |
|  1         |     0.00   |  + 34.08   |  + 34.08   |
|  2         |     0.00   |  + 21.72   |  + 21.72   |
|  3         |     0.00   |  + 17.79   |  + 17.79   |
|  4         |     0.00   |  + 17.84   |  + 17.84   |
|  5         |     0.00   |  + 32.42   |  + 32.42   |
|  6         |     0.00   |  - 11.03   |  - 11.03   |
|  7         |     0.00   |  + 32.33   |  + 32.33   | <-- this bucket is used
+------------+------------+------------+------------+

NNUE evaluation        +32.33 (white side)
Final evaluation       +14.02 (white side) [with scaled NNUE, ...]```
#

appears wrong

#

(startpos)

stray reef
rocky vigil
#

sigh

stray reef
#

well it would have been too good to be true if it just worked

rocky vigil
#

can you load startpos in to bullet

#

and get the active feature indices?

#

for white perspective

stray reef
#

22272 22017 22146 22403 22468 22149 22022 22279 21896 21897 21898 21899 21900 21901 21902 21903 21872 21873 21874 21875 21876 21877 21878 21879 22264 22009 22138 22395 22524 22141 22014 22271

rocky vigil
#

ok lemme see

rocky vigil
#

huh

stray reef
#

ah so mine are completely wrong then

rocky vigil
#

it looks off

#

yeah

#

22208 is (stm rook, a1, bucket 31)

stray reef
#

ah lol i just had all piece colors wrong

rocky vigil
#

31 * 704 + 6 * 64

#

ok

#

yeah yours are all off by 64

#

lol

stray reef
#

lemme train another SB

#

hm loss is fucked. can you send the nstm features as well?

rocky vigil
#

wait shoot why are these not the same

#

are they the same

stray reef
#

yeah, just a different order

#

ok

rocky vigil
#

oh yeah

#

right

#

pop order different

rocky vigil
#

BLACK added: 22328 22524 22335 21936 21937 21938 22195 22196 21941 21942 21943 22058 22445 21871 21857 21924 21915 22044 22096 21969 21844 21973 21846 21832 21834 21835 22348 21837 22094 22208 22468 22215```
stray reef
#

that looks like startpos

rocky vigil
#

oh

#

shoot

#

huh

#

no it's just bc the white rook on a1

#

is the same among both

stray reef
#

bruh sorry

rocky vigil
#

lot of features will look similar

#

but some are different

stray reef
#

ok looks good now. let's try again

rocky vigil
#

cool

#

well hopefully startpos eval shouldn't be cooked

stray reef
#

loss is still fucked, let's try smth where stm and ntm have different buckets and mirroring, e.g. 8/2p5/8/2kPKp1p/2p4P/2P5/3P4/8 w - - 0 1

rocky vigil
#

ok

#

BLACK added: 12788 12781 12709 12768 13341 12764 13339 12698 12696 12685```
stray reef
#

also correct, i'll try disabling the factoriser, maybe the issue is there

rocky vigil
#

oh

#

ok

#

😨

#

yoshie is typing...

stray reef
#

hm can't really find the reason now. fixing the feature index calculation increases loss by like 50%, and even before that, it was too high for 0 WDL in my opinion, and also barely drops in the next SBs, that doesn't seem right

#

we can still compare startpos eval tho

rocky vigil
#

ok

#

sure

rocky vigil
#

yep

#

+10.67 startpos eval (after normalization)

#

welp

rocky vigil
stray reef
#

41-ish

#

hm

rocky vigil
#

can you get the psqt skip eval only?

#

for some asymmetric position

stray reef
#

tested the pre-TI plenty arch instead of the SF arch with this script. loss is similar, but it works fine in plenty. so i'll stop worrying about loss now :P

rocky vigil
#

ok

stray reef
rocky vigil
#

also idk bullet syntax but is this supposed to be forward(stm).crelu().pairwise_mul()

stray reef
#

that's being done in the lines above

rocky vigil
#

huh

#

how does pairwise_mul work

#

is it supposed to be done before or after concat

naive comet
#

well

rocky vigil
#

(in bullet)

stray reef
#

ah fuck you're right

#

i think pairwise mul worked differently back when disservin wrote this, at least i just renamed the function, and forgot that it's done differently now

rocky vigil
#

yeah the original one has like

#

pairwise_mul_with_affine

#

or smth

#

bruh why is L1 -> L2 also factorized

#

does sf really do this

stray reef
#

judging by what disservin wrote at least

rocky vigil
#

+36(.00)

#

soo

#

i think let's just try to get the basic stuff working

#

so remove the l1 -> l2 factorization

#

this is not screlu

formal smelt
stray reef
rocky vigil
#

literally endless whack a mole tho

#

lemme check the concat order of dual activation

stray reef
rocky vigil
rocky vigil
stray reef
#

bruh

stray reef
rocky vigil
#

yeah

#

if this does what I think it does

#

it's concatting ac_0_out to ac_sqr_0_out

#

which means the squared stuff should be first

rocky vigil
#
Final evaluation       -11.99 (white side) [with scaled NNUE, ...]```
#

πŸ’’