kiskujab1/coke-nitro-lichess-bot
Coke Zero 10.0 ♟️
Nulláról, C++17-ben írt UCI sakk-engine, ami a klasszikus (kézzel hangolt értékelésű, HCE) megközelítés modern eszköztárát igyekszik teljesen kihasználni. Bármelyik UCI-kompatibilis felülettel (Arena, Cute Chess, BanksiaGUI, lichess-bot) használható.
10.0 (ARM64 NEON SIMD): a teljes NNUE-számítás hardveresen vektorizált Apple Siliconon. A forward pass fő szűk keresztmetszete (512→32 réteg) NEONvdotq_s32hardveres int8 dot-producttal megy, 4 független akkumulátorral (latencia-rejtés) és kimenet-blokkolással (4× kevesebb aktiváció-load); az akkumulátor-frissítés (vaddq_s16/vsubq_s16) szintén NEON. Az egész#ifdef __ARM_NEONágban, skalár fallbackkel — a számítás bitre azonos a skalárral (egész aritmetika), csak gyorsabb: az NNUE bench NPS ~820k → ~1.0M (Apple M2). A v9 minden funkciója (inkrementális akkumulátor, skála-kalibráció) változatlan. 9.0 (NNUE-korszak): teljes NNUE-alrendszer — HalfKP(Friend) háló (41024→256x2), inkrementális akkumulátor + forward pass,UseNNUE/NNUEPathopciók. Acoke_net.nnue(nn-62ef826d1a6d, klasszikus Stockfish HalfKP) élesben betöltődik és fut;setoption name UseNNUE true-> neurális kiértékelés. A betöltő fail-safe: ismeretlen formátumnál a kiváló HCE-n marad. A v8 minden funkciója változatlan. - Inkrementális akkumulátor: ado_move/undo_movea szülő-akkumulátorból olcsó deltákkal származtatja a gyermeket (a királylépés az adott perspektívát refresheli), így keresésenként lényegében csak a gyökér kap teljes refresht. Per-szál akkumulátor-verem (a Lazy SMP szálak sajátPosition-másolaton dolgoznak) — bitre azonos a teljes refresh-sel. - Skála-kalibráció: a nyers HalfKP-kimenetet a HCE centipawn-skálájához igazítja (gyalog ≈ 100, vezér ≈ 1014), így a keresési paraméterek helyes nagyságrendben kapják az NNUE-értéket. ``setoption name UseNNUE value true # neurális háló be (alap: HCE) setoption name NNUEPath value coke_net.nnue`Korábbi mérföldkövek: **v2** ponder, **v3** lazy eval, **v4** PolyGlot könyv, **v5** continuation history, **v6** Lazy SMP + singular + capture history, **v7** Syzygy, **v8** intelligens időkezelés, **v9** NNUE (inkrementális akkumulátor + skála-kalibráció). Av1` és minden korábbi mappa érintetlen.
Végjáték-adatbázis (Syzygy)
# A közös ../Syzygy mappa az alapértelmezett (nincs verziónként duplikálva):
setoption name SyzygyPath value ../Syzygy # felülírható tetszőleges úttalTöbbszálúság (Lazy SMP)
setoption name Threads value 4 # 4 keresőszál a közös hash-táblán
setoption name Hash value 512 # nagyobb TT ajánlott több szálhozFordítás
make # optimalizált build -march=native -O3 -flto mellett -> ./coke-zero-v9
make portable # hordozható build (march=native nélkül)
make perft # lépésgenerátor helyességének ellenőrzése (perft tesztek)
make bench # rögzített benchmark (csomópontszám / sebesség)Csak Apple clang / g++ kell, külső függőség nincs. (CMake nem szükséges.)
Használat
UCI motorként indítható egy GUI-ból, vagy közvetlenül a terminálból:
./coke-zero-v9
uci
position startpos moves e2e4 e7e5
go movetime 3000Pondírozás (gondolkodás az ellenfél idejében)
position startpos moves e2e4
go ponder wtime 60000 btime 60000 # háttérkeresés a várt válaszra, óra NEM ketyeg
ponderhit # az ellenfél a várt lépést játszotta -> óra indul
# (vagy 'stop', ha mást lépett -> azonnal kiadjuk az eddigi legjobb lépést)Hasznos saját parancsok a szabványos UCI mellett:
Támogatott go opciók: wtime btime winc binc movestogo movetime depth nodes infinite ponder perft. Beállítható opciók: Hash (TT mérete MB-ban, 1–65536), Ponder (képesség jelzése), Threads.
Architektúra
src/
├── types.h alaptípusok, lépés-kódolás (16 bites Move)
├── bitboard.* bitboard-műveletek, magic bitboard támadások (futásidőben generált magicek)
├── position.* állásreprezentáció, make/unmake, Zobrist-hash, SEE, gives_check
├── movegen.* pszeudo-legális generálás (captures/quiets/evasions) + legalitás-szűrés
├── tt.* transzpozíciós tábla (4-utas cluster, korosítás, mélység-eltolás)
├── eval.* tapered HCE: PeSTO PST + mobilitás, királybiztonság, gyalogstruktúra...
├── search.* PVS alfa-béta (lásd lent)
└── uci.cpp UCI protokoll, perft, bench, belépési pontTábla és lépések
- Bitboard reprezentáció, magic bitboard csúszó-figura támadások.
- Legális lépésgenerálás: pszeudo-legális captures/quiets/evasions, majd pin- és király-biztonsági szűrés (
Position::legal). Sakk esetén dedikált evasion-generálás. - A helyességet a
make perftigazolja (Kiwipete és a többi standard tesztállás bitre pontos).
Keresés (search.cpp)
- Iteratív mélyítés aspiration window-okkal
- PVS (principal variation search) + transzpozíciós tábla
- Null-move pruning (mély csomóban verifikációval)
- ProbCut (probability cutoff): értékes ütés redukált keresésben béta fölött → vágás
- Late Move Reductions — dinamikus, history/cont-hist + taktikai kontextus (sakk, ütés, cutNode, ttCapture, PV, improving) szerint hangolt redukció
- History-pruning: kis mélységben a történelmileg rossz csendes lépéseket elhagyjuk
- Reverse futility (static null move), futility pruning, late move pruning, razoring
- SEE-alapú metszés csendes és ütő lépésekre
- Singular extension, sakk-kiterjesztés, mate-distance pruning
- Quiescence search SEE- és delta-metszéssel
- Lépésrendezés: TT-lépés → jó ütések (MVV-LVA + SEE) → killer → countermove → history → rossz ütések
- Ismétlés / 50-lépés szabály szerinti döntetlen, idő-menedzsment
Értékelés (eval.cpp)
- Tapered eval közép- és végjáték között (game phase alapján)
- PeSTO anyagi értékek és piece-square táblák
- Mobilitás, királybiztonság (támadó-súlyozás + gyalogpajzs), futópár
- Gyalogstruktúra: szabadgyalog (rang szerint), izolált, duplázott
- Bástya nyílt / félnyílt vonalon, tempó, elégtelen anyag → döntetlen
Megjegyzés az erősségről
A motor egyszálas. A keresés tipikusan ~20 ply mélységet ér el pár másodperc alatt közepjátékban, és a klasszikus taktikai teszteket (pl. Win At Chess) magas arányban megoldja. További erősítési lehetőségek: Lazy SMP (több szál), NNUE értékelés, megnyitáskönyv, Syzygy végjáték-táblák, és az értékelő/keresési paraméterek SPSA-hangolása.
