Skip to content

Commit 997d389

Browse files
committed
Improve atomic en passant and crazyhouse pocket FEN parsing #479
Assert that FEN position setup generates accurate positions and update benchmark positions to be well-formatted FEN
1 parent 558b2fe commit 997d389

File tree

3 files changed

+33
-31
lines changed

3 files changed

+33
-31
lines changed

src/benchmark.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -140,19 +140,19 @@ const vector<string> Defaults[SUBVARIANT_NB] = {
140140
{
141141
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1",
142142
"rnbqkb1r/ppp1pppp/5n2/3pP3/8/8/PPPP1PPP/RNBQKBNR[] w KQkq d6 4 3", // en passant
143-
"r1bk3r/pppp1Bpp/2n5/4p1N1/4P3/3P4/PPP1p1PP/RNK4R[NQPBqb] b - - 23 12", // repetition detection
143+
"r1bk3r/pppp1Bpp/2n5/4p1N1/4P3/3P4/PPP1p1PP/RNK4R[QBNPqb] b - - 23 12", // repetition detection
144144
"r3k2r/pppb1ppp/4n3/2P1Q3/2p1n3/2Pb1N2/PP1NpPPP/R1BqR1K1[BP] w kq - 28 15",
145-
"r1b1kb1r/p1p3pp/2pp4/8/4P3/2NR3P/PPP2P1P/5K1R[BBQNnqnppp] b kq - 39 20", // many pieces in hand
146-
"r1b1r1k1/ppp1Pppp/8/3p4/3P2P1/PN6/2PBQP1P/q1q~1KB1R[NNbrnp] w - - 42 22", // promoted queen
145+
"r1b1kb1r/p1p3pp/2pp4/8/4P3/2NR3P/PPP2P1P/5K1R[QBBNqnnppp] b kq - 39 20", // many pieces in hand
146+
"r1b1r1k1/ppp1Pppp/8/3p4/3P2P1/PN6/2PBQP1P/q1q~1KB1R[NNrbnp] w - - 42 22", // promoted queen
147147
"r3kb1r/1bpppppp/p1N2p2/2NPP3/2PP4/2N2Pb1/P3P1R1/R1Q2KBq[Pn] w kq - 54 28",
148148
"7k/Q2P1pp1/2PPpn1p/3p1b2/3P4/P1n1P3/P1n1bPPP/R1B3KR[RRqbnp] w - - 48 25", // promotion
149149

150150
// Checkmate
151-
"r1b2rk1/pppp1ppp/2P2b2/1N6/5N2/4P1K1/P1P4P/1Nrb1b1n~[NPPQQrp] w - - 64 33", // promoted knight
151+
"r1b2rk1/pppp1ppp/2P2b2/1N6/5N2/4P1K1/P1P4P/1Nrb1b1n~[QQNPPrp] w - - 64 33", // promoted knight
152152
"1Rbk3r/p1pQ1ppp/2Bn3n/4p1b1/4Pn2/3p4/PbPP1PPP/3RK1R1[QPPn] b - - 45 23",
153153

154154
// Stalemate
155-
"2R5/3Q2pk/2p1p3/1pP1P1Qp/1P3P1P/p1P1B3/P7/1R2K3[NRBNPBPRNPBN] b - - 98 55",
155+
"2R5/3Q2pk/2p1p3/1pP1P1Qp/1P3P1P/p1P1B3/P7/1R2K3[RRBBBNNNNPPP] b - - 98 55",
156156
},
157157
#endif
158158
#ifdef EXTINCTION
@@ -262,12 +262,12 @@ const vector<string> Defaults[SUBVARIANT_NB] = {
262262
{
263263
"rnbqkknr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKKNR w KQkq - 0 1",
264264
"r1b1kk1r/pp1ppppp/2N2n2/8/4P3/2N5/PPP2qPP/R1BQKK1R w KQkq - 0 7",
265-
"rnbqk2r/ppppkppp/5n2/4p3/4P3/5N2/PPPPKPPP/RNBQK2R w KQkq - 4 4"
265+
"rnbqk2r/ppppkppp/5n2/4p3/4P3/5N2/PPPPKPPP/RNBQK2R w KQ - 4 4"
266266
},
267267
#endif
268268
#ifdef SUICIDE
269269
{
270-
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
270+
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - - 0 1",
271271
"rn1qkbnr/p1pBpppp/8/8/8/4P3/PPPP1PbP/RNBQK1NR w - - 0 4",
272272
"rnbqkbnr/p2p1ppp/8/2p1p3/2pP4/2N3P1/PP2PP1P/R1BQKBNR b - d3 0 5",
273273
"rnb1kbn1/p4ppr/8/3q4/1p6/6PB/P3PP1P/R1B1K1NR b - - 1 11",
@@ -301,19 +301,19 @@ const vector<string> Defaults[SUBVARIANT_NB] = {
301301
{
302302
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1",
303303
"rnbqkb1r/ppp1pppp/5n2/3pP3/8/8/PPPP1PPP/RNBQKBNR[] w KQkq d6 4 3", // en passant
304-
"r1bk3r/pppp1Bpp/2n5/4p1N1/4P3/3P4/PPP1p1PP/RNK4R[NQPBqb] b - - 23 12", // repetition detection
304+
"r1bk3r/pppp1Bpp/2n5/4p1N1/4P3/3P4/PPP1p1PP/RNK4R[QBNPqb] b - - 23 12", // repetition detection
305305
"r3k2r/pppb1ppp/4n3/2P1Q3/2p1n3/2Pb1N2/PP1NpPPP/R1BqR1K1[BP] w kq - 28 15",
306-
"r1b1kb1r/p1p3pp/2pp4/8/4P3/2NR3P/PPP2P1P/5K1R[BBQNnqnppp] b kq - 39 20", // many pieces in hand
307-
"r1b1r1k1/ppp1Pppp/8/3p4/3P2P1/PN6/2PBQP1P/q1q~1KB1R[NNbrnp] w - - 42 22", // promoted queen
306+
"r1b1kb1r/p1p3pp/2pp4/8/4P3/2NR3P/PPP2P1P/5K1R[QBBNqnnppp] b kq - 39 20", // many pieces in hand
307+
"r1b1r1k1/ppp1Pppp/8/3p4/3P2P1/PN6/2PBQP1P/q1q~1KB1R[NNrbnp] w - - 42 22", // promoted queen
308308
"r3kb1r/1bpppppp/p1N2p2/2NPP3/2PP4/2N2Pb1/P3P1R1/R1Q2KBq[Pn] w kq - 54 28",
309309
"7k/Q2P1pp1/2PPpn1p/3p1b2/3P4/P1n1P3/P1n1bPPP/R1B3KR[RRqbnp] w - - 48 25", // promotion
310310

311311
// Checkmate
312-
"r1b2rk1/pppp1ppp/2P2b2/1N6/5N2/4P1K1/P1P4P/1Nrb1b1n~[NPPQQrp] w - - 64 33", // promoted knight
312+
"r1b2rk1/pppp1ppp/2P2b2/1N6/5N2/4P1K1/P1P4P/1Nrb1b1n~[QQNPPrp] w - - 64 33", // promoted knight
313313
"1Rbk3r/p1pQ1ppp/2Bn3n/4p1b1/4Pn2/3p4/PbPP1PPP/3RK1R1[QPPn] b - - 45 23",
314314

315315
// Stalemate
316-
"2R5/3Q2pk/2p1p3/1pP1P1Qp/1P3P1P/p1P1B3/P7/1R2K3[NRBNPBPRNPBN] b - - 98 55",
316+
"2R5/3Q2pk/2p1p3/1pP1P1Qp/1P3P1P/p1P1B3/P7/1R2K3[RRBBBNNNNPPP] b - - 98 55",
317317
},
318318
#endif
319319
#ifdef DISPLACEDGRID
@@ -325,19 +325,19 @@ const vector<string> Defaults[SUBVARIANT_NB] = {
325325
{
326326
"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR[] w KQkq - 0 1",
327327
"rnbqkb1r/ppp1pppp/5n2/3pP3/8/8/PPPP1PPP/RNBQKBNR[] w KQkq d6 4 3", // en passant
328-
"r1bk3r/pppp1Bpp/2n5/4p1N1/4P3/3P4/PPP1p1PP/RNK4R[NQPBqb] b - - 23 12", // repetition detection
328+
"r1bk3r/pppp1Bpp/2n5/4p1N1/4P3/3P4/PPP1p1PP/RNK4R[QBNPqb] b - - 23 12", // repetition detection
329329
"r3k2r/pppb1ppp/4n3/2P1Q3/2p1n3/2Pb1N2/PP1NpPPP/R1BqR1K1[BP] w kq - 28 15",
330-
"r1b1kb1r/p1p3pp/2pp4/8/4P3/2NR3P/PPP2P1P/5K1R[BBQNnqnppp] b kq - 39 20", // many pieces in hand
331-
"r1b1r1k1/ppp1Pppp/8/3p4/3P2P1/PN6/2PBQP1P/q1q1KB1R[NNbrnp] w - - 42 22",
330+
"r1b1kb1r/p1p3pp/2pp4/8/4P3/2NR3P/PPP2P1P/5K1R[QBBNqnnppp] b kq - 39 20", // many pieces in hand
331+
"r1b1r1k1/ppp1Pppp/8/3p4/3P2P1/PN6/2PBQP1P/q1q1KB1R[NNrbnp] w - - 42 22", // promoted queen
332332
"r3kb1r/1bpppppp/p1N2p2/2NPP3/2PP4/2N2Pb1/P3P1R1/R1Q2KBq[Pn] w kq - 54 28",
333333
"7k/Q2P1pp1/2PPpn1p/3p1b2/3P4/P1n1P3/P1n1bPPP/R1B3KR[RRqbnp] w - - 48 25", // promotion
334334

335335
// Checkmate
336-
"r1b2rk1/pppp1ppp/2P2b2/1N6/5N2/4P1K1/P1P4P/1Nrb1b1n[NPPQQrp] w - - 64 33",
336+
"r1b2rk1/pppp1ppp/2P2b2/1N6/5N2/4P1K1/P1P4P/1Nrb1b1n[QQNPPrp] w - - 64 33", // promoted knight
337337
"1Rbk3r/p1pQ1ppp/2Bn3n/4p1b1/4Pn2/3p4/PbPP1PPP/3RK1R1[QPPn] b - - 45 23",
338338

339339
// Stalemate
340-
"2R5/3Q2pk/2p1p3/1pP1P1Qp/1P3P1P/p1P1B3/P7/1R2K3[NRBNPBPRNPBN] b - - 98 55",
340+
"2R5/3Q2pk/2p1p3/1pP1P1Qp/1P3P1P/p1P1B3/P7/1R2K3[RRBBBNNNNPPP] b - - 98 55",
341341
},
342342
#endif
343343
#ifdef SLIPPEDGRID

src/position.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,11 @@ Position& Position::set(const string& fenStr, bool isChess960, Variant v, StateI
242242

243243
else if (token == '/')
244244
{
245+
sq += 2 * SOUTH;
245246
#ifdef CRAZYHOUSE
246-
if (is_house() && sq < Square(SQ_A3))
247+
if (is_house() && sq < SQ_A1)
247248
break;
248249
#endif
249-
sq += 2 * SOUTH;
250250
}
251251

252252
else if ((idx = PieceToChar.find(token)) != string::npos)
@@ -261,22 +261,23 @@ Position& Position::set(const string& fenStr, bool isChess960, Variant v, StateI
261261
#else
262262
else if (is_house() && token == '~')
263263
#endif
264-
promotedPieces |= sq - 1;
264+
promotedPieces |= SquareBB[sq - 1];
265265
// Stop before pieces in hand
266266
else if (is_house() && token == '[')
267-
{
268-
// Pieces in hand
269-
while ((ss >> token) && !isspace(token))
270-
{
271-
if (token == ']')
272-
continue;
273-
else if ((idx = PieceToChar.find(token)) != string::npos)
274-
add_to_hand(color_of(Piece(idx)), type_of(Piece(idx)));
275-
}
276267
break;
277-
}
278268
#endif
279269
}
270+
#ifdef CRAZYHOUSE
271+
// Pieces in hand
272+
if (!isspace(token))
273+
while ((ss >> token) && !isspace(token))
274+
{
275+
if (token == ']')
276+
continue;
277+
else if ((idx = PieceToChar.find(token)) != string::npos)
278+
add_to_hand(color_of(Piece(idx)), type_of(Piece(idx)));
279+
}
280+
#endif
280281

281282
// 2. Active color
282283
ss >> token;
@@ -368,7 +369,7 @@ Position& Position::set(const string& fenStr, bool isChess960, Variant v, StateI
368369
else if (sideToMove == BLACK && !(shift<NORTH>(SquareBB[st->epSquare]) & pieces(WHITE, PAWN)))
369370
st->epSquare = SQ_NONE;
370371
#ifdef ATOMIC
371-
else if (attacks_from<KING>(st->epSquare) && square<KING>(sideToMove))
372+
else if (is_atomic() && (attacks_from<KING>(st->epSquare) && square<KING>(sideToMove)))
372373
st->epSquare = SQ_NONE;
373374
#endif
374375
}

src/uci.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ namespace {
125125

126126
states = StateListPtr(new std::deque<StateInfo>(1)); // Drop old and create a new one
127127
pos.set(fen, Options["UCI_Chess960"], variant, &states->back(), Threads.main());
128+
assert(pos.is_chess960() || (pos.fen() + " ").find(fen) == 0);
128129

129130
// Parse move list (if any)
130131
while (is >> token && (m = UCI::to_move(pos, token)) != MOVE_NONE)

0 commit comments

Comments
 (0)