Michael Scheidl schrieb:
litten die neuen Fire-Versionen mitunter an einer Skepsis gegenüber ihrer Originalität. Das mag der Grund sein weswegen sie nicht überall mitgetestet werden.
Das ist eine sehr charmante Umschreibung...
Der "Fall" Fire ist ein wenig kompliziert, wegen des Bruches zwischen Version 4 und 5. Bis einschließlich Fire 4 war Fire (früher Firebird) ein Derivat des Ippo-Codes (davon gab es ja unzählige). Das kann man finden wie man will, aber immerhin war Fire 4 meßbar besser als viele andere Ippo-Derivate (von Gull/Houdini abgesehen). Aber eben auf jeden Fall besser als der Code von dem Fire "derived" wurde. Insofern fand ich die Engine Fire bis dahin gar nicht so schlecht. Denn sie enthielt einen durch Eigenleistung erbrachten Elo-Zuwachs gegenüber dem zugrundeliegenden Original-Code.
Ganz anders sieht es dann leider ab Version 5 aus. Diese ist nämlich nicht mehr in C, sondern in C++ geschrieben. Ein solcher Sprachenwechsel innerhalb einer Engine-Entwicklung ist schon mal seltsam. Aber, und das wiegt weit schwerer, das Fire 5 Compilat enthält zudem Strings, die definitiv durch Stockfish C++ Code (Endgame.cpp) entstanden sind. Zudem ist das Fire-Compilat mit MPRESS kompressed (und damit zumindest leidlich verschlüsselt worden, um Untersuchungen des Compilats zu erschweren) worden. Das Sim-Test-tool zeigt zwar nur einen relativ geringen Similaritätswert im Vergleich zu Stockfish an (wovon ich mich auch zunächst habe täuschen lassen)
sim version 3
------ Fire 5 x64 (time: 100 ms scale: 1.0) ------
52.31 Stockfish 6 64 POPCNT (time: 100 ms scale: 1.0)
50.67 Deep Synapse RZ4.8 64bit (time: 100 ms scale: 1.0)
49.81 Stockfish 7 64 POPCNT (time: 100 ms scale: 1.0)
48.81 Stockfish 8 64 POPCNT (time: 100 ms scale: 1.0)
45.96 Fritz 15 (time: 100 ms scale: 1.0)
44.89 komodo 9.2 64-bit (time: 100 ms scale: 1.0)
44.88 Rybka 4.1 (time: 100 ms scale: 1.0)
44.68 Fire 3.0 x64 (time: 100 ms scale: 1.0)
Allerdings (und das ist der Punkt), ist der sim-Wert von Fire 5 zu den diversen Stockfishen in dieser Tabelle (Deep Synapse ist ein primitiver Stockfish-Klon) höher, als zu anderen Engines. Und dieses Phänomen läßt sich nun dadurch erklären, daß Fire 5 ja sehr viel schwächer ist, als Stockfish 6,7,8 (siehe dazu die FGRL-Rangliste (
http://www.fastgm.de/10min.html).
Meiner Meinung nach, hat also der "Autor" von Fire 5 Folgendes gemacht: Er hat die Bewertungsfunktion von Stockfish 6 (oder einer zeitnahen DEv-Version) absichtlich so "zerschossen", daß ein beträchtlicher Elo-Verlust die Folge war (aber eben immer noch über +50 Elo-Gewinn zu Fire 4, sodaß es nach einem schönen EloPlus von Fire von Version 4 auf 5 aussieht). Damit erzeugt man natürlich ein stark abweichendes Spielverhalten, schraubt also den sim-Wert im Vergleich zu Stockfish weit nach unten. Aber die grundsätzlich immer noch bestehende Verwandschaft kann man so eben nicht komplett zerschiessen, sodaß eben genau der hier zu beobachtende Effekt eintritt: Ein niedriger sim-Wert zu den Stockfishen, aber der Wert ist eben immer noch höher als bei anderen Vergleichs-Engines.
Hier noch die String aus dem Fire 5 Compilat: "position w - - 0 10 /8/8/8/8/8/8/ KPK KNNK KBNK KRKP KRKB KRKN KQKP KQKR KNPK KNPKB KRPKR KRPKB KBPKB KBPKN KBPPKB KRPPKRP map/set"
Und der C++ Stockfish-code, der diese verursacht (man beachte, daß in Stockfish die Endspiele nicht nur exakt so codiert wurden, wie in Fire 5, sondern auch die Reihenfolge, in dem sie abgelegt wurden, ist "rein zufällig" komplett identisch...:
// Get the material key of Position out of the given endgame key code
// like "KBPKN". The trick here is to first forge an ad-hoc FEN string
// and then let a Position object do the work for us.
Key key(const string& code, Color c) {
assert(code.length() > 0 && code.length() < 8);
assert(code[0] == 'K');
string sides[] = { code.substr(code.find('K', 1)), // Weak
code.substr(0, code.find('K', 1)) }; // Strong
std::transform(sides[c].begin(), sides[c].end(), sides[c].begin(), tolower);
string fen = sides[0] + char(8 - sides[0].length() + '0') +
"/8/8/8/8/8/8/" + sides[1] + char(8 - sides[1].length() + '0') +
" w - - 0 10"; return Position(fen, false, nullptr).material_key();
}
} // namespace
/// Endgames members definitions
Endgames::Endgames() {
add<KPK>("KPK");
add<KNNK>("KNNK");
add<KBNK>("KBNK");
add<KRKP>("KRKP");
add<KRKB>("KRKB");
add<KRKN>("KRKN");
add<KQKP>("KQKP");
add<KQKR>("KQKR");
add<KNPK>("KNPK");
add<KNPKB>("KNPKB");
add<KRPKR>("KRPKR");
add<KRPKB>("KRPKB");
add<KBPKB>("KBPKB");
add<KBPKN>("KBPKN");
add<KBPPKB>("KBPPKB");
add<KRPPKRP>("KRPPKRP");}
Für mich ist also Fire 5 ein absichtlich demolierter Stockfish, dessen Demolierung genau soweit ging, daß scheinbar ein schönes Eloplus (von Fire 4 ausgehend zustande kommt), aber - quasi als erwünschte Nebenwirkung - ein möglichst geringer sim-Wert zu Stockfish die Folge ist ( wenn man ein elominus von ca. -75 in Kauf nimmt, ist es leicht, die Bewertungsfunktion so zu verdrehen, daß die "neue" Engine ganz anders spielt und bewertet, als das Original).
Insofern ist Fire nach Version 4 für mich gestorben. Schade. Aber kann man nichts machen.