Closed gbtami closed 5 years ago
Many of such variants should work out of the box (i.e., by just defining the variant in variant.cpp without additional implementation work), e.g., I assume for "Caparandom-zh" that should be the case. Combinations of Crazyhouse and S-Chess might also work, since I tried consider that during the S-Chess implementation, but I am pretty sure a few small fixes might be required since dropping and gating have quite some overlapping code.
I added a few hybrid variants on branches a while ago, e.g., 3check-crazyhouse and anti-losalamos, mainly for the purpose of trying to weakly solve variants. I currently do not really want to add too exotic variants to master, since there are just too many possible combinations to add.
Moving the variant definition to a configuration file loaded at startup (as in Sjaak or fairymax) instead of the compiled variant.cpp
file would certainly help in that regard, I just did not find the time to implement this feature so far. As a workaround for the time being I could maybe add one branch where all the variants are collected that are too exotic to add to master.
Agreed. The configuration file approach would be awesome.
I tried the workaround and created Capahouse here https://github.com/gbtami/Fairy-Stockfish/commits/capahouse Seems OK. I find one interesting issue while tested it. In move 10. Fairy-Stockfish didn't delivered mate in 1 here just on next move. The full log of the BOT:
2019-08-12 18:03:56,746: << uci
2019-08-12 18:03:56,746: >> Fairy-Stockfish 120819 64 by F. Fichter
2019-08-12 18:03:56,852: >> id name Fairy-Stockfish 120819 64
2019-08-12 18:03:56,853: >> id author F. Fichter
2019-08-12 18:03:56,853: >>
2019-08-12 18:03:56,853: >> option name Protocol type combo default uci var uci var usi
2019-08-12 18:03:56,853: >> option name Debug Log File type string default
2019-08-12 18:03:56,853: >> option name Contempt type spin default 24 min -100 max 100
2019-08-12 18:03:56,853: >> option name Analysis Contempt type combo default Both var Both var Off var White var Black
2019-08-12 18:03:56,853: >> option name Threads type spin default 1 min 1 max 512
2019-08-12 18:03:56,854: >> option name Hash type spin default 16 min 1 max 131072
2019-08-12 18:03:56,854: >> option name Clear Hash type button
2019-08-12 18:03:56,854: >> option name Ponder type check default false
2019-08-12 18:03:56,854: >> option name MultiPV type spin default 1 min 1 max 500
2019-08-12 18:03:56,854: >> option name Skill Level type spin default 20 min 0 max 20
2019-08-12 18:03:56,854: >> option name Move Overhead type spin default 30 min 0 max 5000
2019-08-12 18:03:56,854: >> option name Minimum Thinking Time type spin default 20 min 0 max 5000
2019-08-12 18:03:56,854: >> option name Slow Mover type spin default 84 min 10 max 1000
2019-08-12 18:03:56,854: >> option name nodestime type spin default 0 min 0 max 10000
2019-08-12 18:03:56,854: >> option name UCI_Chess960 type check default false
2019-08-12 18:03:56,854: >> option name UCI_Variant type combo default chess var 3check var 5check var ai-wok var almost var amazon var antichess var asean var breakthrough var capablanca var capahouse var caparandom var chancellor var chess var chessgi var chigorin var clobber var clobber10 var codrus var connect4 var courier var crazyhouse var dobutsu var embassy var euroshogi var extinction var fairy var giveaway var gorogoro var gothic var hoppelpoppel var horde var janus var jesonmor var judkins var kinglet var kingofthehill var kyotoshogi var loop var losalamos var losers var makruk var micro var mini var minishogi var modern var placement var pocketknight var racingkings var seirawan var shako var shatar var shatranj var shogi var sittuyin var standard var tictactoe
2019-08-12 18:03:56,854: >> option name UCI_AnalyseMode type check default false
2019-08-12 18:03:56,854: >> option name UCI_LimitStrength type check default false
2019-08-12 18:03:56,855: >> option name UCI_Elo type spin default 1350 min 1350 max 2850
2019-08-12 18:03:56,855: >> option name SyzygyPath type string default <empty>
2019-08-12 18:03:56,855: >> option name SyzygyProbeDepth type spin default 1 min 1 max 100
2019-08-12 18:03:56,855: >> option name Syzygy50MoveRule type check default true
2019-08-12 18:03:56,855: >> option name SyzygyProbeLimit type spin default 7 min 0 max 7
2019-08-12 18:03:56,855: >> uciok
2019-08-12 18:03:56,855: << setoption name Move Overhead value 100
2019-08-12 18:03:56,855: << setoption name UCI_Variant value capahouse
2019-08-12 18:03:56,855: << isready
2019-08-12 18:03:56,856: >> readyok
2019-08-12 18:03:56,856: << ucinewgame
2019-08-12 18:03:56,856: << isready
2019-08-12 18:03:56,867: >> readyok
2019-08-12 18:03:56,867: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1
2019-08-12 18:03:56,867: << isready
2019-08-12 18:03:56,867: >> readyok
2019-08-12 18:03:56,868: +++ http://0.0.0.0:8080/GAXczxwy/black {perf?} vs AnonymousNVMI(None)
2019-08-12 18:03:56,868: << setoption name Skill Level value 16
2019-08-12 18:03:56,868: << isready
2019-08-12 18:03:56,868: >> readyok
2019-08-12 18:03:58,002: ||| control_queue event: ping
2019-08-12 18:03:58,008: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:01,003: ||| control_queue event: ping
2019-08-12 18:04:01,009: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:04,004: ||| control_queue event: ping
2019-08-12 18:04:04,009: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:06,869: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4
2019-08-12 18:04:06,869: << isready
2019-08-12 18:04:06,869: >> readyok
2019-08-12 18:04:06,870: << go wtime 300000 btime 300000 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:06,872: >> info depth 1 seldepth 1 multipv 1 score cp -19 nodes 136 nps 45333 tbhits 0 time 3 pv h8g6
2019-08-12 18:04:06,872: >> info depth 2 seldepth 2 multipv 1 score cp -37 nodes 268 nps 67000 tbhits 0 time 4 pv d7d6 c1i7
2019-08-12 18:04:06,873: >> info depth 3 seldepth 3 multipv 1 score cp -37 nodes 430 nps 86000 tbhits 0 time 5 pv d7d6 c1i7 c8i2
2019-08-12 18:04:06,877: >> info depth 4 seldepth 5 multipv 1 score cp 36 nodes 840 nps 93333 tbhits 0 time 9 pv h8g6 c1d3 d7d6 d3g6 h7g6
2019-08-12 18:04:06,885: >> info depth 5 seldepth 6 multipv 1 score cp -115 nodes 1705 nps 100294 tbhits 0 time 17 pv e7e5 c1i7 i8h6 i7h5 e5d4
2019-08-12 18:04:06,892: >> info depth 6 seldepth 7 multipv 1 score cp 0 nodes 2793 nps 116375 tbhits 0 time 24 pv i8h6 e2e4 e7e5
2019-08-12 18:04:06,924: >> info depth 7 seldepth 8 multipv 1 score cp 23 nodes 8032 nps 143428 tbhits 0 time 56 pv h8g6 h1i3 i8h6
2019-08-12 18:04:06,952: >> info depth 8 seldepth 9 multipv 1 score cp -57 nodes 13263 nps 157892 tbhits 0 time 84 pv h8g6 h1i3 i8h6 e2e4 d7d5 i1h3 d5e4 e1e4
2019-08-12 18:04:06,952: >> bestmove h8g6 ponder h1i3
2019-08-12 18:04:06,956: Starting new HTTP connection (1): 0.0.0.0:8080
2019-08-12 18:04:06,959: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/h8g6 HTTP/1.1" 200 12
2019-08-12 18:04:07,005: ||| control_queue event: ping
2019-08-12 18:04:07,010: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:10,007: ||| control_queue event: ping
2019-08-12 18:04:10,013: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:10,503: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4
2019-08-12 18:04:10,504: << isready
2019-08-12 18:04:10,504: >> readyok
2019-08-12 18:04:10,504: << go wtime 299466 btime 300000 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:10,505: >> info depth 1 seldepth 1 multipv 1 score cp 119 nodes 163 nps 81500 tbhits 0 time 2 pv d7d5
2019-08-12 18:04:10,506: >> info depth 2 seldepth 2 multipv 1 score cp 315 nodes 365 nps 121666 tbhits 0 time 3 pv d7d6 e2e4 c8i2
2019-08-12 18:04:10,507: >> info depth 3 seldepth 2 multipv 1 score cp 292 nodes 557 nps 139250 tbhits 0 time 4 pv c8d6 h1i3 d6f4 c1f4 g6f4 A@f3
2019-08-12 18:04:10,509: >> info depth 4 seldepth 3 multipv 1 score cp 97 nodes 932 nps 155333 tbhits 0 time 6 pv d7d5 h1i3 i8h6
2019-08-12 18:04:10,513: >> info depth 5 seldepth 5 multipv 1 score cp 42 nodes 1510 nps 151000 tbhits 0 time 10 pv d7d6 i1h3 e7e5 d4e5 d6e5
2019-08-12 18:04:10,522: >> info depth 6 seldepth 6 multipv 1 score cp 276 nodes 3126 nps 164526 tbhits 0 time 19 pv d7d5 h1i3 e7e5 e1b4 d8e7
2019-08-12 18:04:10,543: >> info depth 7 seldepth 8 multipv 1 score cp 70 nodes 6289 nps 157225 tbhits 0 time 40 pv d7d5 e2e4 c8i2 h1i3 i2h4 e1h4 g6h4 i3i7
2019-08-12 18:04:10,555: >> info depth 8 seldepth 10 multipv 1 score cp 197 nodes 8201 nps 157711 tbhits 0 time 52 pv c8d6 h1g3
2019-08-12 18:04:10,555: >> bestmove c8d6 ponder h1g3
2019-08-12 18:04:10,560: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/c8d6 HTTP/1.1" 200 12
2019-08-12 18:04:13,010: ||| control_queue event: ping
2019-08-12 18:04:13,015: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:14,505: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4
2019-08-12 18:04:14,505: << isready
2019-08-12 18:04:14,505: >> readyok
2019-08-12 18:04:14,505: << go wtime 298531 btime 299943 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:14,507: >> info depth 1 seldepth 1 multipv 1 score cp 205 nodes 194 nps 64666 tbhits 0 time 3 pv d6f4 c1f4
2019-08-12 18:04:14,508: >> info depth 2 seldepth 2 multipv 1 score cp 205 nodes 493 nps 123250 tbhits 0 time 4 pv d6f4 c1f4
2019-08-12 18:04:14,509: >> info depth 3 seldepth 4 multipv 1 score cp 232 nodes 758 nps 151600 tbhits 0 time 5 pv d6f4 d1e2 d7d6
2019-08-12 18:04:14,513: >> info depth 4 seldepth 4 multipv 1 score cp 232 nodes 1198 nps 133111 tbhits 0 time 9 pv d6f4 d1e2 d7d6 h1i3
2019-08-12 18:04:14,517: >> info depth 5 seldepth 7 multipv 1 score cp 162 nodes 2092 nps 174333 tbhits 0 time 12 pv i8h6 d1h5 g6f4 c1f4 d6f4
2019-08-12 18:04:14,527: >> info depth 6 seldepth 6 multipv 1 score cp 387 nodes 3460 nps 157272 tbhits 0 time 22 pv d6f4 d1e2 i8h6
2019-08-12 18:04:14,550: >> info depth 7 seldepth 10 multipv 1 score cp 242 nodes 7630 nps 165869 tbhits 0 time 46 pv d6f4 d1e2 i8h6 c1f4 g6f4 h1f2 f4g6
2019-08-12 18:04:14,586: >> info depth 8 seldepth 11 multipv 1 score cp 272 nodes 15246 nps 188222 tbhits 0 time 81 pv f7f5 e4e5 d6e4 e1e4 f5e4
2019-08-12 18:04:14,586: >> bestmove f7f5 ponder e4e5
2019-08-12 18:04:14,590: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/f7f5 HTTP/1.1" 200 12
2019-08-12 18:04:16,011: ||| control_queue event: ping
2019-08-12 18:04:16,016: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:16,208: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4 f7f5 e4e5
2019-08-12 18:04:16,208: << isready
2019-08-12 18:04:16,208: >> readyok
2019-08-12 18:04:16,208: << go wtime 299923 btime 299856 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:16,210: >> info depth 1 seldepth 1 multipv 1 score cp 272 nodes 240 nps 80000 tbhits 0 time 3 pv d6e4
2019-08-12 18:04:16,211: >> info depth 2 seldepth 2 multipv 1 score cp 272 nodes 507 nps 169000 tbhits 0 time 3 pv d6e4 e1e4
2019-08-12 18:04:16,212: >> info depth 3 seldepth 4 multipv 1 score cp 269 nodes 926 nps 185200 tbhits 0 time 5 pv d6e4 g1e3 g8c4 d1e2
2019-08-12 18:04:16,215: >> info depth 4 seldepth 6 multipv 1 score cp 276 nodes 1466 nps 183250 tbhits 0 time 8 pv g8c4 d1e2 c4e2 e1e2 d6e4 h1i3
2019-08-12 18:04:16,219: >> info depth 5 seldepth 7 multipv 1 score cp 286 nodes 2057 nps 171416 tbhits 0 time 12 pv g8c4 d1e2 c4e2 e1e2 d6e4 h1i3
2019-08-12 18:04:16,227: >> info depth 6 seldepth 8 multipv 1 score cp 235 nodes 3645 nps 191842 tbhits 0 time 19 pv d6e4 e1e4 f5e4 d1e2 Q@h4 h1f2
2019-08-12 18:04:16,238: >> info depth 7 seldepth 7 multipv 1 score cp 63 nodes 5925 nps 191129 tbhits 0 time 31 pv d6e4 e1e4 f5e4 d1e2 Q@h4 h1f2 d7d6 f2e4
2019-08-12 18:04:16,286: >> info depth 8 seldepth 8 multipv 1 score cp 252 nodes 15794 nps 199924 tbhits 0 time 79 pv d6e4 e1e4 f5e4 d1e2 Q@h4
2019-08-12 18:04:16,286: >> bestmove d6e4 ponder e1e4
2019-08-12 18:04:16,291: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/d6e4 HTTP/1.1" 200 12
2019-08-12 18:04:18,575: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4 f7f5 e4e5 d6e4 e1e4
2019-08-12 18:04:18,575: << isready
2019-08-12 18:04:18,575: >> readyok
2019-08-12 18:04:18,576: << go wtime 300651 btime 299773 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:18,577: >> info depth 1 seldepth 1 multipv 1 score cp 252 nodes 226 nps 75333 tbhits 0 time 3 pv f5e4
2019-08-12 18:04:18,577: >> info depth 2 seldepth 2 multipv 1 score cp 252 nodes 473 nps 157666 tbhits 0 time 3 pv f5e4 d1e2
2019-08-12 18:04:18,579: >> info depth 3 seldepth 3 multipv 1 score cp 252 nodes 837 nps 167400 tbhits 0 time 5 pv f5e4 d1e2 Q@h4
2019-08-12 18:04:18,585: >> info depth 4 seldepth 4 multipv 1 score cp 126 nodes 1632 nps 148363 tbhits 0 time 11 pv f5e4 b1c3 Q@e6 c3e4 e6i2
2019-08-12 18:04:18,588: >> info depth 5 seldepth 5 multipv 1 score cp 126 nodes 2190 nps 156428 tbhits 0 time 14 pv f5e4 b1c3 Q@e6 c3e4 e6i2
2019-08-12 18:04:18,601: >> info depth 6 seldepth 6 multipv 1 score cp 262 nodes 4008 nps 148444 tbhits 0 time 27 pv f5e4 b1c3 Q@h4
2019-08-12 18:04:18,627: >> info depth 7 seldepth 9 multipv 1 score cp 150 nodes 8703 nps 164207 tbhits 0 time 53 pv g8c4 d1e2 f5e4 b1c3 c4e2 c1e2 B@g4
2019-08-12 18:04:18,637: >> info depth 8 seldepth 12 multipv 1 score cp 288 nodes 10909 nps 173158 tbhits 0 time 63 pv g8c4 d1e2 f5e4 b1c3 c4e2 c1e2 B@g4
2019-08-12 18:04:18,637: >> bestmove f5e4 ponder b1c3
2019-08-12 18:04:18,646: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/f5e4 HTTP/1.1" 200 12
2019-08-12 18:04:19,012: ||| control_queue event: ping
2019-08-12 18:04:19,018: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:22,013: ||| control_queue event: ping
2019-08-12 18:04:22,018: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:24,652: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4 f7f5 e4e5 d6e4 e1e4 f5e4 f4f5
2019-08-12 18:04:24,652: << isready
2019-08-12 18:04:24,653: >> readyok
2019-08-12 18:04:24,653: << go wtime 302157 btime 299704 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:24,659: >> info depth 1 seldepth 2 multipv 1 score cp 1544 nodes 475 nps 67857 tbhits 0 time 7 pv g8c4 d1e2 Q@d1 A@e1 d1c1 f5g6 e8g6
2019-08-12 18:04:24,663: >> info depth 2 seldepth 4 multipv 1 score cp 1544 nodes 1095 nps 99545 tbhits 0 time 11 pv g8c4 d1e2 Q@d1 A@e1
2019-08-12 18:04:24,665: >> info depth 3 seldepth 5 multipv 1 score cp 1435 nodes 1579 nps 121461 tbhits 0 time 13 pv g8c4 d1e2 Q@d1 A@e1 d1c1 e2c4
2019-08-12 18:04:24,667: >> info depth 4 seldepth 6 multipv 1 score cp 1487 nodes 2146 nps 143066 tbhits 0 time 15 pv g8c4 d1e2 Q@d1 A@e1 d1c1 e2c4 g6f4 h1f2
2019-08-12 18:04:24,669: >> info depth 5 seldepth 8 multipv 1 score cp 1993 nodes 2733 nps 160764 tbhits 0 time 17 pv g8c4 d1e2 Q@d1 A@e1 d1c1 f5g6
2019-08-12 18:04:24,676: >> info depth 6 seldepth 9 multipv 1 score cp 2052 nodes 4921 nps 205041 tbhits 0 time 24 pv g8c4 d1e2 Q@d1 A@e1 d1c1 f5g6
2019-08-12 18:04:24,689: >> info depth 7 seldepth 10 multipv 1 score cp 1594 nodes 8726 nps 242388 tbhits 0 time 36 pv g8c4 f1e1 Q@f1 e1d2 e4e3 g1e3 f1h1
2019-08-12 18:04:24,694: >> info depth 8 seldepth 13 multipv 1 score cp 2130 nodes 10185 nps 242500 tbhits 0 time 42 pv g8c4 f1e1 Q@f1 e1d2 e4e3 d2c3
2019-08-12 18:04:24,694: >> bestmove g8c4 ponder f1e1
2019-08-12 18:04:24,705: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/g8c4 HTTP/1.1" 200 12
2019-08-12 18:04:25,014: ||| control_queue event: ping
2019-08-12 18:04:25,020: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:28,016: ||| control_queue event: ping
2019-08-12 18:04:28,021: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:31,017: ||| control_queue event: ping
2019-08-12 18:04:31,023: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:31,794: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4 f7f5 e4e5 d6e4 e1e4 f5e4 f4f5 g8c4 d1e2
2019-08-12 18:04:31,794: << isready
2019-08-12 18:04:31,795: >> readyok
2019-08-12 18:04:31,795: << go wtime 302512 btime 295153 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:31,801: >> info depth 1 seldepth 2 multipv 1 score cp 2047 nodes 619 nps 88428 tbhits 0 time 7 pv Q@d1 A@e1
2019-08-12 18:04:31,804: >> info depth 2 seldepth 2 multipv 1 score cp 2053 nodes 1125 nps 112500 tbhits 0 time 10 pv Q@f4 h1f2 f4c1 A@e1
2019-08-12 18:04:31,807: >> info depth 3 seldepth 4 multipv 1 score cp 2109 nodes 1789 nps 137615 tbhits 0 time 13 pv Q@f4 c1f4 g6f4 h1f2 c4e2 f1e1
2019-08-12 18:04:31,810: >> info depth 4 seldepth 6 multipv 1 score cp 2109 nodes 2572 nps 171466 tbhits 0 time 15 pv Q@f4 c1f4 g6f4 h1f2 c4e2 f1e1
2019-08-12 18:04:31,812: >> info depth 5 seldepth 8 multipv 1 score cp 2758 nodes 3347 nps 185944 tbhits 0 time 18 pv Q@f4 c1f4
2019-08-12 18:04:31,819: >> info depth 6 seldepth 9 multipv 1 score cp 2904 nodes 5772 nps 230880 tbhits 0 time 25 pv Q@f4 c1f4 g6f4 h1f2 A@e3 f1e1 e3f2 g1f2
2019-08-12 18:04:31,840: >> info depth 7 seldepth 11 multipv 1 score cp 2360 nodes 13455 nps 299000 tbhits 0 time 45 pv Q@d1 A@e1 d1c1 e2c4 g6f4 B@f3 e4f3
2019-08-12 18:04:31,866: >> info depth 8 seldepth 10 multipv 1 score cp 2501 nodes 20853 nps 289625 tbhits 0 time 72 pv Q@d1 A@e1 d1c1 e2c4 g6f4 B@f3 e4f3
2019-08-12 18:04:31,867: >> bestmove Q@d1 ponder A@e1
2019-08-12 18:04:31,875: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/Q@d1 HTTP/1.1" 200 12
2019-08-12 18:04:34,018: ||| control_queue event: ping
2019-08-12 18:04:34,024: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:37,018: ||| control_queue event: ping
2019-08-12 18:04:37,025: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:40,019: ||| control_queue event: ping
2019-08-12 18:04:40,025: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:41,981: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4 f7f5 e4e5 d6e4 e1e4 f5e4 f4f5 g8c4 d1e2 Q@d1 A@e1
2019-08-12 18:04:41,982: << isready
2019-08-12 18:04:41,982: >> readyok
2019-08-12 18:04:41,983: << go wtime 299781 btime 290640 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:41,986: >> info depth 1 seldepth 1 multipv 1 score cp 2501 nodes 287 nps 71750 tbhits 0 time 4 pv d1c1
2019-08-12 18:04:41,987: >> info depth 2 seldepth 2 multipv 1 score cp 2501 nodes 604 nps 100666 tbhits 0 time 6 pv d1c1 e2c4
2019-08-12 18:04:41,990: >> info depth 3 seldepth 4 multipv 1 score cp 2501 nodes 1006 nps 125750 tbhits 0 time 8 pv d1c1 e2c4 g6f4 B@f3 e4f3
2019-08-12 18:04:41,994: >> info depth 4 seldepth 5 multipv 1 score cp 2501 nodes 1558 nps 119846 tbhits 0 time 13 pv d1c1 e2c4 g6f4 B@f3 e4f3
2019-08-12 18:04:41,998: >> info depth 5 seldepth 7 multipv 1 score cp 2717 nodes 2741 nps 161235 tbhits 0 time 17 pv c4e2 c1e2 d1e2 f1e2
2019-08-12 18:04:42,007: >> info depth 6 seldepth 9 multipv 1 score cp 2780 nodes 5007 nps 192576 tbhits 0 time 26 pv d1c1 e2c4 g6f4 B@f3 e4f3
2019-08-12 18:04:42,013: >> info depth 7 seldepth 8 multipv 1 score cp 2761 nodes 6536 nps 204250 tbhits 0 time 32 pv d1c1 e2c4 g6f4 B@f3 e4f3 g1f2 c1e1 f1e1
2019-08-12 18:04:42,021: >> info depth 8 seldepth 9 multipv 1 score cp 3023 nodes 8424 nps 210600 tbhits 0 time 40 pv d1c1 e2c4 g6f4 B@f3
2019-08-12 18:04:42,021: >> bestmove d1c1 ponder e2c4
2019-08-12 18:04:42,030: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/d1c1 HTTP/1.1" 200 12
2019-08-12 18:04:43,020: ||| control_queue event: ping
2019-08-12 18:04:43,026: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:46,021: ||| control_queue event: ping
2019-08-12 18:04:46,027: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:49,022: ||| control_queue event: ping
2019-08-12 18:04:49,029: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:49,378: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4 f7f5 e4e5 d6e4 e1e4 f5e4 f4f5 g8c4 d1e2 Q@d1 A@e1 d1c1 e2c4
2019-08-12 18:04:49,379: << isready
2019-08-12 18:04:49,379: >> readyok
2019-08-12 18:04:49,380: << go wtime 299743 btime 286227 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:49,384: >> info depth 1 seldepth 2 multipv 1 score cp 3023 nodes 436 nps 109000 tbhits 0 time 4 pv g6f4 B@f3
2019-08-12 18:04:49,389: >> info depth 2 seldepth 3 multipv 1 score cp 3023 nodes 1163 nps 116300 tbhits 0 time 10 pv g6f4 B@f3 e4f3
2019-08-12 18:04:49,391: >> info depth 3 seldepth 4 multipv 1 score cp 3353 nodes 1677 nps 139750 tbhits 0 time 12 pv A@a5 b1c3 a5c4 B@d3 c4d2 f1e2 e4d3 e1d3 c1a1
2019-08-12 18:04:49,395: >> info depth 4 seldepth 6 multipv 1 score cp 4603 nodes 2603 nps 162687 tbhits 0 time 16 pv A@a5 b1c3 a5c4 B@d3 c4d2 f1f2 d2e1 f2e2 e4d3 c2d3 c1a1
2019-08-12 18:04:49,411: >> info depth 5 seldepth 8 multipv 1 score cp 4147 nodes 7802 nps 243812 tbhits 0 time 32 pv A@a5 g1f2 c1e1 f2e1
2019-08-12 18:04:49,415: >> info depth 6 seldepth 7 multipv 1 score cp 4357 nodes 9200 nps 255555 tbhits 0 time 36 pv A@a5 g1f2 c1e1 f2e1
2019-08-12 18:04:49,427: >> info depth 7 seldepth 10 multipv 1 score cp 4259 nodes 12936 nps 269500 tbhits 0 time 48 pv A@a5 g1f2 c1e1 f2e1
2019-08-12 18:04:49,434: >> info depth 8 seldepth 12 multipv 1 score cp 4440 nodes 15023 nps 273145 tbhits 0 time 55 pv A@a5 g1f2 c1e1 f2e1
2019-08-12 18:04:49,435: >> bestmove A@a5 ponder g1f2
2019-08-12 18:04:49,446: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/A@a5 HTTP/1.1" 200 12
2019-08-12 18:04:52,023: ||| control_queue event: ping
2019-08-12 18:04:52,029: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:55,024: ||| control_queue event: ping
2019-08-12 18:04:55,029: http://0.0.0.0:8080 "POST /api/pong HTTP/1.1" 200 12
2019-08-12 18:04:55,738: << position fen rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1 moves d2d4 h8g6 f2f4 c8d6 e2e4 f7f5 e4e5 d6e4 e1e4 f5e4 f4f5 g8c4 d1e2 Q@d1 A@e1 d1c1 e2c4 A@a5 f5g6
2019-08-12 18:04:55,738: << isready
2019-08-12 18:04:55,739: >> readyok
2019-08-12 18:04:55,739: << go wtime 300699 btime 281864 winc 3 binc 3 movetime 400 depth 8
2019-08-12 18:04:55,748: >> info depth 1 seldepth 2 multipv 1 score mate 1 nodes 935 nps 93500 tbhits 0 time 10 pv c1e1
2019-08-12 18:04:55,750: >> info depth 2 seldepth 2 multipv 1 score mate 1 nodes 1324 nps 110333 tbhits 0 time 12 pv c1e1
2019-08-12 18:04:55,751: >> info depth 3 seldepth 2 multipv 1 score mate 1 nodes 1647 nps 126692 tbhits 0 time 13 pv c1e1
2019-08-12 18:04:55,755: >> info depth 4 seldepth 2 multipv 1 score mate 1 nodes 2323 nps 145187 tbhits 0 time 16 pv c1e1
2019-08-12 18:04:55,763: >> info depth 5 seldepth 2 multipv 1 score mate 1 nodes 4276 nps 171040 tbhits 0 time 25 pv c1e1
2019-08-12 18:04:55,766: >> info depth 6 seldepth 2 multipv 1 score mate 1 nodes 5025 nps 179464 tbhits 0 time 28 pv c1e1
2019-08-12 18:04:55,769: >> info depth 7 seldepth 2 multipv 1 score mate 1 nodes 5861 nps 189064 tbhits 0 time 31 pv c1e1
2019-08-12 18:04:55,843: >> info depth 8 seldepth 2 multipv 1 score mate 1 nodes 24654 nps 234800 tbhits 0 time 105 pv c1e1
2019-08-12 18:04:55,843: >> bestmove e8f7 ponder g6f7
2019-08-12 18:04:55,851: http://0.0.0.0:8080 "POST /api/bot/game/GAXczxwy/move/e8f7 HTTP/1.1" 200 12
@gbtami If there are a handful of variants that you would like to support on your server, I have no problem with adding them on my side too, I just do not want to add random hybrid variants that are then not seriously used by anybody. Capahouse seems quite interesting, will you keep it or is it just for testing?
In the log I see that the skill level was set to 16, so it is expected that SF makes suboptimal moves. The comparison of the PV and the bestmove confirm that this can only be caused by skill level, since in case of skill level = 20, PV and bestmove are always consistent.
By the way, with the current code it could theoretically happen that SF crashes on a variant like Capahouse, since at the moment the move list is limited to 512 and I guess that capahouse might exceed this (e.g., 7 piece types x 80 drop squares = 560) in rare cases.
Yes, I plan to keep Capahouse. Unless it proves to be unplayable because of huge favor for one or other side it seems viable. S-chess house and 960 are the combinations I'm thinking about yet. But these doesn't seem as trivial as Capahouse.
Thx for remembering me the skill level. I missed that, sry.
Coming from Python I would never think lists can be limited :)
They are just playing it right now! https://www.twitch.tv/okeizh
I have not tried combining zh and seirawan yet, but I think it might be dominated by zh, which could make it too similar.
Dynamic containers (e.g., vectors) are too slow in the case of the move lists and since it is currently stored on the stack, increasing the size of the move list also requires a bigger stack size (since up to MAX_DEPTH = 256 instances of the move list are in memory), but increasing it should not really be a problem.
I will then add Capahouse soon.
Since it was quite easy to construct positions with more than 512 moves, I doubled the move list to 1024 in the capahouse implementation.
Cool, thx!
Thanks you two for making capahouse a thing! Yasser Seirawan will be thrilled when he hears of it. I messaged him on lichess. I've done a capahouse stream (okeizh on Twitch) with Jarl Carlander & the (standard lol) crazyhouse world champion opperwezen which was lots of fun. Jarl also has been streaming this on JarlCarlanderBughouse on Twitch. This was the VOD: https://youtu.be/hjfkcrHU5Z8
I'll be back home in September and hoping to organise some more team capahouse events. s-chess house would also be incredibly interesting if it were not too complicated to implement.
@okeizh Thanks for the feedback, it's nice to hear that the variant is taken up so quickly.
Regarding "s-chess house", to me the combination is less obvious than for capahouse, since capablanca chess and crazyhouse are basically orthogonal changes compared to standard chess, whereas s-chess and crazyhouse are clearly interfering. So we would first need to clarify the rules (or agree that we take what is easiest to implement :wink:), e.g.:
Good question! It would seem to me that gating pieces and drop pieces should be separate pockets to avoid any of these interference issues. Also, any similarity to crazyhouse or capahouse is not necessarily a bad thing. It is still fundamentally a different game because of the new pieces from crazyhouse and the different board size from capahouse. It will still be the same players who are likely to play all three variants but the attraction is that it is something fresh and unstudied so people aren't repeating memorised lines. Also with the new pieces players need to develop new piece pattern recognition of how pieces coordinate with each other. It may be that s-chess house isn't viable because White has too great an advantage from moving first in which case some kind of handicap might be considered such as Black having an extra gate or drop piece.
From the implementation side it would be preferable to have them as one pocket, firstly because that is simply how it is implemented so far, and secondly because it otherwise would complicate the FEN, since de-facto standard to use the same square bracket notation for the pocket in crazyhouse and s-chess, and having two separate pockets would need a new notation (or at least concatenation of the two).
I fixed a few issues with the encoding of gating squares in the FEN to get a first experimental implementation of seirawan-crazyhouse (I called the variant shouse for short) in Fairy-Stockfish with the following rules:
Seirawan-Crazyhouse is a cool hybrid for sure. As you guys may already know, many wants S-Chess for lichess. But the devs seems hesitant.
That seems to work so long as a hawk and elephant not gated can't then be used later as drops anywhere on the board.
With these rules they can (even from move one), because there is no distinction between between pieces for gating and for dropping.
Added to https://pychess-variants.herokuapp.com/ We will see :)
Fixed some bugs on the site. I think it follows above rules now.
In the meantime I merged the S-house implementation to master.
The implementation for parsing of variants from a configuration is already working with branch variants_ini (you only need to set the UCI option "VariantPath" to the path of your INI file, see variants.ini as an example), but there are a few things that are missing before I can merge it:
The implementation on branch variants_ini should be fully functional now, only the documentation of the options is very limited (I only have some examples in the variants.ini). I have not merged it yet, since I have only done limited testing so far (I only checked that perft for minishogi, 3check-crazyhouse, and anti-losalamos is correct), but if you like to test it, feel free to do so. Feedback would be very welcome.
Will try it. Thx!
I added one more feature which should be very useful especially with respect to combined variants: You can now use an existing variant, either pre-defined or in your INI file, as a template for new variants. This would make adding capahouse (if it was not already there) only a matter of seconds:
[capahouse:capablanca]
startFen = rnabqkbcnr/pppppppppp/10/10/10/10/PPPPPPPPPP/RNABQKBCNR[] w KQkq - 0 1
pieceDrops = true
capturesToHand = true
Variant configuration file feature merged in https://github.com/ianfab/Fairy-Stockfish/commit/772eb6caef808de9a53bb1a6a952afba87bceb91. I will open a new issue for the documentation on the configuration options.
@ianfab I find a paragraph in http://www.seirawanchess.com/ about bug that explains the intent of Yasser. "The Hawk and Elephant can (and should) be used in Bughouse. As in Seirawan chess, the Hawk and Elephant start off the board and enter play when a piece is first moved from its original square. Once in play, the Hawk and Elephant are exchanged and placed in the same manner as any other piece."
I agree that implementing different pockets for gating/dropping seems rather complicated, but maybe introducing something like gatedPieceType
to indicate that H/A was already gated before (similar to promotedPieceType
in Shogi) it can be avoided.
@gbtami That is of course a more natural way of merging drops and gating, so I am not surprised to read that. However, to me the two pockets are not only problematic for the implementation in the engine itself, but also for the FEN definition, and GUIs/server (as well as OTB play). Currently I see it as impracticable considering the required effort for such a niche variant.
What do you think about adding combinations of some base variant + chess960 + zh? Something like Seirawan-zh, Seirawan960-zh, Caparandom-zh. It would be fun IMO.