Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / WM Partien ply für ply als Engine-Turnier
- - By Stefan Pohl Date 2024-11-26 08:29
Ich habe mir überlegt, wie ich zur SchachWM etwas Nützliches beitragen kann:

Ich habe schnell ein kleines Tool geschrieben, mit dem die jeweilige WM-Partie, Halbzug für Halbzug (automatisiert) als Vorgabe für ein kleines, schnelles Engineturnier genutzt wird. Dazu braucht man ja nur cutechess-cli und programmiert eine simple Schleife, die das Turnier immer wieder neu startet, nur mit immer einem Ply mehr aus der WM-Partie als Vorgabe.

In jedem dieser Turniere spielt Stockfish 17 ein Gauntlet-Turnier gegen die 5 stärksten anderen Engines (Torch 3, Obsidian 14, Berserk 13, KomodoDragon 3.3 und Caissa 1.21), natürlich immer 2 Partien pro head-to-head. Also spielt Stockfish 17 immer 10 Partien ab jedem Partiehalbzug.

Natürlich nicht ab Halbzug 1, das wäre ja Quatsch. StartHalbzug und StopHalbzug kann ich individuell festlegen. Ich starte bei der 1.WM-Partie z.B. nach dem 9.Zug von Schwarz (9...Le7) und beende das Ganze 2 Halbzüge vor dem Ende, die letzte Vorgabe ist 41...Dxa2. Das ergibt in diesem Fall 650 Partien insgesamt (hat eine WM-Partie mehr Züge, sind es entsprechend auch mehr Partien). Damit ich das über Nacht schaffe, ist die Bedenkzeit sehr kurz 20sec+0.2sec (das ergibt eine durchschnittliche Partiedauer von knapp 1 Minute), allerdings läuft immr nur eine Partie gleichzeitig, d.h. es steht der rechnenden Engine immer der volle PC zur Verfügung. Das Ganze läuft auf einem meiner beiden neuen ultraschnellen 16core Notebooks, die ich sonst für meine Ranglistentests nutze. Daher ist das schachliche Niveau immer noch jenseits  von gut und böse - verglichen mit dem menschlichen Schach-Begriffsvermögen...

Wozu ist das gut?

Zum Einen sieht man, wo viele nicht-Remis-Partien entstehen (solange die Vorgabestellung halbwegs ausgeglichen ist, hat man 100% Remisen bei so starken Engines auf so starker Hardware), hier findet man also zuverlässig mögliche Kipp-Punkte in der WM-Partie.

Zum Anderen kann man sich die Gewinnführung bzw. die Verteidigung der Engines ansehen und mit der realen Partie vergleichen. Da es immer 10 Partien pro VorgabeHalbzug sind, und es immer  andere Engines sind, die spielen, ergeben sich hier sicher auch sehr interessante Variationen bei Gewinnführung und Verteidigung.

Hier der Download zur WM-Partie 01, inklusive ReadMe Datei und einem Screenshot, wie die Datenbank in Fritz/ChessBase aussieht:

https://drive.google.com/file/d/1P_MqZm4shMzDXpd549LHOHao3_fcXUgX/view?usp=sharing
Parent - By Stefan Pohl Date 2024-11-26 08:43 Edited 2024-11-26 08:50
Falls das jemand nachmachen will, vielleicht nach der WM mit mehr Bedenkzeit, hier der lächerlich simple "Porgrammcode". Die cutechess-cli Programmzeilen muß man für den Gebrauch natürlich noch zu einer langen Zeile machen. Da das dann aber hier unlesbar wäre, lasse ich das mal so.
Das packt man alles eine .bat Datei und startet sie per Doppelklick.

Mit startply=X legt man fest ab welchem Ply die Partie ausgespielt werden soll.
Den Endpunkt legt man hier fest: if %startply% LSS 83 goto loop1
LSS heißt less also kleiner als. Hier endet das Ganze also nach dem 82.Ply, also nach Zug 41 von Schwarz.
Die WM-Partie Notation als pgn muß man hier angeben: -openings file="C:/Cutechess/Gukesh D_vs_Ding, Liren_01.pgn"
Die gewünschte Zeitkontrolle hier: -each tc=/20+0.2 (20sec für die ganze Partie +0.2sec Inkrement)
Wer keine Tablebases hat oder sie nicht nutzen will, damit cutechess die Partie beendet, löscht: -tb "C:/Cutechess/syzygy_5" -tbpieces 5
Die Pfadangaben zu den Engine-Binaries muß man natürlich an die Gegebenheiten auf seinem PC anpassen (bei mir ist es eben "C:/Cutechess/Engines/AB_testruns")
Threads und Hash kann man natürlich ebenfalls an das eigene System anpassen: option.Hash=4096 option.Threads=26

set /a startply=18
:loop1

cutechess-cli.exe -engine name="Stockfish 17" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="stockfish_17_240906_avx2.exe" proto=uci
-engine name="Torch 3" dir="C:/Cutechess/Engines/AB_testruns" option.MoveOverhead=300 option.Hash=4096 option.Threads=26 cmd="torch_v3_avx2-popcnt.exe" proto=uci
-engine name="Obsidian 14.0" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="Obsidian_14.0_avx512.exe" proto=uci
-engine name="Berserk 13" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="berserk-13-avx2.exe" proto=uci
-engine name="KomodoDragon 3.3" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="dragon-3.3-64bit-avx2.exe" proto=uci
-engine name="Caissa 1.21" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="caissa_1.21_avx512.exe" proto=uci
-pgnout "WM2024_Partie01_Ausspielung.pgn" -event "WM 2024 Ausspielung" -each tc=/20+0.2 timemargin=2000 -recover -concurrency 1 -tournament gauntlet -ratinginterval 10 -wait 200 -tb "C:/Cutechess/syzygy_5" -tbpieces 5 -games 2 -rounds 1 -openings file="C:/Cutechess/Gukesh D_vs_Ding, Liren_01.pgn" format=pgn order=sequential plies=%startply% policy=round -repeat

set /a startply=%startply%+1
if %startply% LSS 83 goto loop1
Parent - - By Lothar Jung Date 2024-11-26 08:45
Vielen Dank. Sehr nützlich.
Könntest Du das cli Skript für Cutechess bereitstellen?
Das wäre für jegliche Partieanalysen geeignet.
Danke Du warst schneller:)
Parent - - By Stefan Pohl Date 2024-11-26 08:45
Gerade passiert
Parent - - By Lothar Jung Date 2024-11-26 08:52
Kann man das Ende des Loops hier 84 nicht flexibel setzen, also nach dem Partieende oder WDL Wert 999.
Parent - - By Stefan Pohl Date 2024-11-26 09:45 Edited 2024-11-26 10:25
Ich habe eine absteigende Suche nach Zugnummern vorgesetzt, die bei 300 losgeht. Es wird hier korrekt erkannt, daß die WMPartie Nummer 1 42. Züge lang ist. Also 84 plies. Sollte allerdings Schwarz keinen 42. Zug mehr gespielt haben, dann würde der letzte Partie-ply (letzter Zug von Weiß) 2x ausgespielt werden. Das läßt sich nicht vermeiden, da das pgn-Format ggf. Züge auch so ablegt 42. Re1 Re8 oder aber eben auch 42. Re1 42...Re8.
In letzterem Fall wäre das Abfangen möglich, im ersten aber eben nicht. Damit werden wir also leben müssen. Aber das ist ja nun wirklich nicht so schlimm...

Hier der neue Code:
Die ersten beiden set-Zeilen muß man anpassen. Der Partie.pgn Dateiname darf keine Leerzeichen enthalten und startmove ist die Zugzahl (nicht plies!!!), ab der das Ausspielen losgehen soll. Hier also ab Zug 10, also nach dem 9. Zug von Schwarz in der Partie...
Und die cutechess-cli Zeilen muß man zu einer machen, die würde aber hier monströs aussehen.

@echo off
REM *** No spaces allowed in the filename!!! ***
set gamepgn="partie01.pgn"
set /a startmove=10

set /a startply=(%startmove%*2)-2
REM *** How long is the game ? ***
set /a length=300
:looplength
set /a found=0
for /f "tokens=2,* delims= " %%G in ('find /C "%length%. " %gamepgn%') do set /A found=%%H
if %found% GTR 0 goto exit01
set /a length=%length%-1
goto :looplength
:exit01

REM *** Start tournament-Loop ***

set /a numberofplies=%length%*2

@echo Gamefile is %gamepgn%
@echo Game is %length% moves long (%numberofplies% plies)

@echo on
:loop1

cutechess-cli.exe -engine name="Stockfish 17" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="stockfish_17_240906_avx2.exe" proto=uci
-engine name="Torch 3" dir="C:/Cutechess/Engines/AB_testruns" option.MoveOverhead=300 option.Hash=4096 option.Threads=26 cmd="torch_v3_avx2-popcnt.exe" proto=uci
-engine name="Obsidian 14.0" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="Obsidian_14.0_avx512.exe" proto=uci
-engine name="Berserk 13" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="berserk-13-avx2.exe" proto=uci
-engine name="KomodoDragon 3.3" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="dragon-3.3-64bit-avx2.exe" proto=uci
-engine name="Caissa 1.21" dir="C:/Cutechess/Engines/AB_testruns" option.Hash=4096 option.Threads=26 cmd="caissa_1.21_avx512.exe" proto=uci
-pgnout "WM2024_Partie01_Ausspielung.pgn" -event "WM 2024 Ausspielung" -each tc=/20+0.2 timemargin=2000 -recover -concurrency 1 -tournament gauntlet -ratinginterval 10 -wait 200 -tb "C:/Cutechess/syzygy_5" -tbpieces 5 -games 2 -rounds 1 -openings file="C:/Cutechess/%gamepgn%" format=pgn order=sequential plies=%startply% policy=round -repeat

set /a startply=%startply%+1
if %startply% LSS %numberofplies% goto loop1

pause

(Ich muß das heute Nacht erst selber probieren, ob z.B. das Ende des Turniers hier ganz korrekt ist, muß ich erst sehen (könnte sein, daß es ein Ply zuwenig ist, oder einer zuviel). Der Rest sollte laufen. Ich bitte um Verständnis, das ist hier alles mit heißer Nadel gestrickt. Probleme (besonders Anfang/Ende der Turnierserie) bitte melden!)
Parent - By Stefan Pohl Date 2024-11-26 13:45
Diese Zeile:
if %startply% LSS %numberofplies% goto loop1

ist leider nicht ganz korrekt, sie bricht das Ausspielen einen ply zu früh ab. Statt LSS muß dort LEQ stehen (nicht LSS="less" also kleiner als, sondern LEQ="less or equal" also kleinergleich als). Sorry.

if %startply% LEQ %numberofplies% goto loop1
Parent - - By Lothar Jung Date 2024-11-26 14:36
Danke, eine gute Zwischenlösung!
Also die Bewertung kann nicht direkt ausgelesen werden?
UCI stellt die aktuelle Bewertung in seinen übermittelten Daten an die GUI zur Verfügung.
Wäre das ein Ansatzpunkt?
Mit deinem Tool könnte man ganze Turniere auswerten.
Peter ist auf diesem Gebiet sehr fleißig. Besonders den Punkt wo die Partie kippt.
Parent - - By Stefan Pohl Date 2024-11-27 07:05
Lothar Jung schrieb:

Danke, eine gute Zwischenlösung!
Also die Bewertung kann nicht direkt ausgelesen werden?
UCI stellt die aktuelle Bewertung in seinen übermittelten Daten an die GUI zur Verfügung.
Wäre das ein Ansatzpunkt?
Mit deinem Tool könnte man ganze Turniere auswerten.
Peter ist auf diesem Gebiet sehr fleißig. Besonders den Punkt wo die Partie kippt.


Man kann fast alles machen. Aber das geht mit jetzt doch zu weit. Das wäre (für einen Programmier-Noob wie mich) viel Arbeit und die Batch-Skript Programmiersprache ist an vielen Stellen doch sehr limitiert) und dazu habe ich zumindest momentan keine rechte Lust. Vielleicht ändert sich das mal, aber momentan reicht mir mein Mini-Tool für den Zweck völlig aus.
Parent - By Lothar Jung Date 2024-11-27 09:26
Kann ich verstehen.
Die von mir generierte 2. Lösung sieht danach aus, das die cli-Sciptsprache von cutechess doch hinreichend mächtig ist, Schleifen, Entscheidungsanweisungen etc..
Jedenfalls war ich erstaunt, welche Möglichkeiten sich bieten.
Cutechess ist eine sehr gute Plattform für ComputerSchach.
Grüße
Lothar
Parent - - By Stefan Pohl Date 2024-11-27 07:02
Ich habe den Download-Link, den ich hier gepostet hatte, gelöscht. Da ich nun alle 14 WM Partien auspielen lasse, ist es sinnvoller einen Ordner-Link zu posten:
https://drive.google.com/drive/folders/1oFL12Xyme3TfJ7IOH_TDIDv-MbdvOXFO?usp=sharing

In diesen Ordner füge ich dann die weiteren Partie-Ausspielungen ein.
Das kleine Batch-Tool, mit dem ich das tue, ist dort auch drin.

Sorry, für diese Link-Änderung, das mache ich ungern, aber es muß jetzt leider mal sein.
Parent - By Stefan Pohl Date 2024-11-30 08:34
Ab heute (Partie 04) habe ich zusätzlich noch eine Ausspielung zwischen der neuen Patricia Dev Version und Revenge 1 (also immer nur 2 Partien pro WM Partie Halbzug) als 2. Datei (Partie04_Patricia_Ausspielung) beigefügt.
Das Gute ist, Revenge 1 spielt auch ziemlich aggressiv und ist in der Spielstärke auf Augenhöhe mit der neuen Patricia Dev (ca. 3400 Elo, also knapp 400 Elo unter den Top Engines, aber immer noch 600 Elo über den besten Menschen!). Hier hat man also immer 2 Partien ab jedem WM-Partie Halbzug, wo 2 aggressive Engines versuchen, sich gegenseitg den Schädel einzuschlagen...

Weiterer Zusatzservice: Beide Ausspielungs-pgn Dateien habe ich noch durch mein Interesting Wins Search Tool gejagt und die gefundenen Partien in den beiden interesting_wins.pgn beigefügt. Mit allen Kommentaren (evals etc.). So kann man schnell erstmal die spektakulären Gewinnpartien durchschauen. Sind natürlich nicht sehr viele, die Partievorlage war ja nicht so spannend (WM Partie 4...).

Der Link ist ja jetzt stabil der Link zum Ordner für alle Ausspielungen der WM:
https://drive.google.com/drive/folders/1oFL12Xyme3TfJ7IOH_TDIDv-MbdvOXFO?usp=sharing
- - By Ingo Althöfer Date 2024-11-26 09:51
Hallo, danke für das Engagement.
Aber irgendetwas passt nicht. Ich habe die 2 MB grosse Datei mit
den pgn's grob durchgeschaut. Und entweder sind nicht alle Partien
drin oder sie sind nicht in chronologischer Reihung.

Hilfreich fände ich auch, wenn aus dem Datenfriedhof direkt
eine kleine Statistik extrahiert wird, die für jede Stellung eine
Zeile Output generiert, in der die Anzahl W-Siege, Remisen und
S-Siege angegeben sind.

Beispiel (fiktiv):
24a  +6  =3 -1
würde bedeuten, dass in den Partien nach dem 24. Zug von Weiß
6 W-Siege, 3 Remisen und 1 S-Sieg passieren.

Viele Grüße, Ingo Althöfer.
Parent - - By Stefan Pohl Date 2024-11-26 10:12 Edited 2024-11-26 10:15
Ingo Althöfer schrieb:

Hallo, danke für das Engagement.
Aber irgendetwas passt nicht. Ich habe die 2 MB grosse Datei mit
den pgn's grob durchgeschaut. Und entweder sind nicht alle Partien
drin oder sie sind nicht in chronologischer Reihung.

Hilfreich fände ich auch, wenn aus dem Datenfriedhof direkt
eine kleine Statistik extrahiert wird, die für jede Stellung eine
Zeile Output generiert, in der die Anzahl W-Siege, Remisen und
S-Siege angegeben sind.

Beispiel (fiktiv):
24a  +6  =3 -1
würde bedeuten, dass in den Partien nach dem 24. Zug von Weiß
6 W-Siege, 3 Remisen und 1 S-Sieg passieren.

Viele Grüße, Ingo Althöfer.


Natürlich sind die Partien chronologisch. Da immer nur eine Partie gleichzeitig gespielt wurde, ist es anders gar nicht möglich.
Erste Partie (1, 11, 21, 31, usw.) ist immer Stockfish 17 mit Weiß vs. Torch 3 mit Schwarz. Dann wiederholt mit vertauschten Farben.

Bitte mal das beigefügte PGN-Bild anschauen... Beweisstück A euer Ehren, so sieht die Partiedatenbank in Fritz/Chessbase aus. Dort sieht man auch die jeweils 10 Partien direkt mit den Ergebnissen untereinander. Bevor es mit den nächsten 10 Partien (mit einem ply mehr als Vorgabe aus der WM-Partie) weitergeht.
Bei 10 Partien kann man das ja wohl auch noch manuell durchschauen (also wieviele Remisen etc.). Eine Statistik-Auswertung werde ich nun nicht noch programmieren.
Parent - By Lothar Jung Date 2024-11-26 14:45
Ich habe mir von ChatGPT zu diesem Zweck ein Python Programm generieren lassen:

import chess.pgn
import chess.engine

# Engine laden (z. B. Stockfish)
engine = chess.engine.SimpleEngine.popen_uci("/path/to/stockfish")

# PGN-Datei laden
pgn = open("example.pgn")
game = chess.pgn.read_game(pgn)

board = game.board()
last_eval = None

# Schleife durch die Züge
for move in game.mainline_moves():
    board.push(move)
    info = engine.analyse(board, chess.engine.Limit(time=0.1))
    eval = info["score"].white().score(mate_score=1000)

    if last_eval is not None:
        delta = eval - last_eval
        if abs(delta) > 100:  # Schwellwert für "Kippen"
            print(f"Kritischer Zug bei {board.move_stack[-1]}: Bewertung änderte sich um {delta/100:.2f}")

    last_eval = eval

engine.quit()
Parent - By Lothar Jung Date 2024-11-26 14:50
Hier das Ergebnis für cutechess:

Ein CLI-Skript mit CuteChess zur Analyse von Schachpartien könnte folgendermaßen aussehen. CuteChess ist eine vielseitige Plattform für Schach-Engines und Partien und kann mit Schach-Engines wie Stockfish integriert werden, um Bewertungsänderungen zu identifizieren.

Hier ist ein Beispiel-Skript:

Voraussetzungen

  1.  Installiere CuteChess CLI:
  •  Lade CuteChess von der offiziellen Seite herunter: CuteChess.
  •  Stelle sicher, dass die ausführbare Datei cutechess-cli in deinem PATH liegt.
  2.  Installiere eine Schach-Engine (z. B. Stockfish):
  •  Lade Stockfish herunter: Stockfish.
  3.  Bereite deine PGN-Datei vor:
  •  Stelle sicher, dass du eine gültige PGN-Datei mit der Partie hast.

Das Skript

Hier ist ein Beispiel-Bash-Skript, das die Bewertung der Züge analysiert und Sprünge in der Bewertung markiert:

#!/bin/bash

# Pfade zu CuteChess und Stockfish
CUTECHESS="./cutechess-cli"  # Pfad zu cutechess-cli
STOCKFISH="./stockfish"     # Pfad zur Stockfish-Engine

# Eingabedatei (PGN-Datei)
PGN_FILE="example.pgn"

# Temporäre Dateien
ANALYSIS_FILE="analysis.txt"
CRITICAL_MOVES="critical_moves.txt"

# Analyse mit CuteChess durchführen
$CUTECHESS -engine cmd=$STOCKFISH -games $PGN_FILE -site analyze \
    -each tc=inf -resign movecount=0 -draw movenumber=0 > $ANALYSIS_FILE

# Bewertung der Züge auslesen und Sprünge identifizieren
echo "Kritische Züge mit Bewertungsänderungen:" > $CRITICAL_MOVES
PREV_SCORE=0
LINE_NUM=0

while IFS= read -r line; do
    if [[ "$line" == *"info depth"* ]]; then
        # Bewertung extrahieren (cp = Zentipawns)
        SCORE=$(echo "$line" | grep -oP "cp \K[-0-9]+")
       
        # Prüfe Bewertungsänderung
        if [[ -n "$SCORE" ]]; then
            DIFF=$((SCORE - PREV_SCORE))
            if (( DIFF > 100 || DIFF < -100 )); then
                echo "Zug $LINE_NUM: Bewertung änderte sich um $DIFF (Score: $SCORE)" >> $CRITICAL_MOVES
            fi
            PREV_SCORE=$SCORE
        fi
       
        ((LINE_NUM++))
    fi
done < $ANALYSIS_FILE

# Ergebnis anzeigen
cat $CRITICAL_MOVES

Erklärung des Skripts

  1.  cutechess-cli:
  •  Führt die Schachpartie mit einer Engine durch und gibt Analyseinformationen aus.
  •  Der Parameter tc=inf sorgt dafür, dass die Engine unendlich Zeit hat, um zu analysieren.
  •  Die Ausgabe wird in analysis.txt gespeichert.
  2.  Extrahieren der Bewertungen:
  •  Das Skript durchsucht die Ausgabe nach info depth-Zeilen, die die Bewertung (cp) enthalten.
  •  Es vergleicht die Bewertung mit der vorherigen und markiert Züge, bei denen sich die Bewertung um mehr als 100 Zentipawns (1 Bauer) ändert.
  3.  Ergebnisdatei:
  •  Kritische Züge mit Bewertungsänderungen werden in critical_moves.txt gespeichert.

Ergebnis

Nach der Ausführung des Skripts erhältst du eine Liste kritischer Züge wie:

Kritische Züge mit Bewertungsänderungen:
Zug 15: Bewertung änderte sich um -250 (Score: -300)
Zug 23: Bewertung änderte sich um +150 (Score: 50)

Vorteile von CuteChess

  •  CuteChess kann nicht nur analysieren, sondern auch Partien simulieren oder Engines gegeneinander spielen lassen.
  •  Du kannst das Skript erweitern, um tiefergehende Analysen oder visuelle Darstellungen zu erzeugen.

Wenn du Unterstützung bei der Anpassung oder Einrichtung brauchst, lass es mich wissen!
Up Topic Hauptforen / CSS-Forum / WM Partien ply für ply als Engine-Turnier

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill