Code: Select all
// in the iteration function at the beginning
memset(pvs, 0, sizeof(pvs));
pvl[ply] = ply;
// after each iteration
PrintBest(bestMove, d);
// in PrintBest
if (d == 0) {
printf("move %s\n", xbmove);
}
else {
printf("%i %i %i %i", d, bestMove.score, (clock() - begin) / 10, nodes);
for (i = 0; i < pvl[0]; i++) {
if (pvs[0][i].fs == 0 && pvs[0][i].ts == 0) break;
xbmove[0] = 'a' + (pvs[0][i].fs & 7);
xbmove[1] = '1' + (pvs[0][i].fs >> 3);
xbmove[2] = 'a' + (pvs[0][i].ts & 7);
xbmove[3] = '1' + (pvs[0][i].ts >> 3);
xbmove[4] = '\0';
if (pvs[0][i].type == Wn || pvs[0][i].type == Bn) xbmove[4] = 'n';
if (pvs[0][i].type == Wb || pvs[0][i].type == Bb) xbmove[4] = 'b';
if (pvs[0][i].type == Wr || pvs[0][i].type == Br) xbmove[4] = 'r';
if (pvs[0][i].type == Wq || pvs[0][i].type == Bq) xbmove[4] = 'q';
printf(" %s", xbmove);
}
printf("\n");
}
fflush(stdout);
// in SearchRoot() after each move
if (mov->score > alpha) {
alpha = mov->score;
bestMove = *mov;
pvs[ply][ply] = *mov;
for (j = ply + 1; j < pvl[ply + 1]; j++)pvs[ply][j] = pvs[ply + 1][j];
pvl[ply] = pvl[ply + 1];
}
// in Search() at the beginning
pvl[ply] = ply;
// in Search() after each move
if (mov->score > alpha) {
alpha = mov->score;
pvs[ply][ply] = *mov;
for (j = ply + 1; j < pvl[ply + 1]; j++) pvs[ply][j] = pvs[ply + 1][j];
pvl[ply] = pvl[ply + 1];
}
FEN: rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1
Bricabrac:
1 00:00 20 20 +0.50 b1c3
2 00:00 85 85 0.00 b1c3
3 00:00 618 618 +0.50 b1c3
4 00:00 4k 4k 0.00 b1c3
5 00:00 23k 23k +0.50 b1c3
6 00:00 155k 15,529k 0.00 b1c3
7 00:00 940k 13,422k +0.40 e2e4
8 00:00 5,717k 10,394k +0.10 e2e4
9 00:01 26,270k 13,335k +0.40 e2e4
10 00:19 213,102k 10,768k +0.10 e2e4
Then if I undo that move and search again.
FEN: rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1
Bricabrac:
1 00:00 20 20 +0.50 b1c3
2 00:00 85 85 0.00 b1c3
3 00:00 618 618 +0.50 b1c3 d7d5 d2d4
4 00:00 4k 4k 0.00 b1c3 d7d5 d2d4 b8c6
5 00:00 23k 23k +0.50 b1c3 d7d5 g1f3 b8c6 d2d4
6 00:00 155k 15,529k 0.00 b1c3 d7d5 g1f3 b8c6 d2d4 g8f6
7 00:00 940k 13,422k +0.40 e2e4 b8c6 g1f3 d7d5 e4d5 d8d5 d2d4
8 00:00 5,717k 10,394k +0.10 e2e4 e7e5 b1c3 b8c6 g1f3 f8c5 d2d3 g8f6
9 00:01 26,270k 13,335k +0.40 e2e4 b8c6 b1c3 g8f6 d2d4 d7d5 e4e5 f6e4 g1e2
10 00:19 213,102k 10,763k +0.10 e2e4 e7e5 b1c3 g8f6 g1f3 f8d6 d2d4 e5d4 f3d4 e8g8
Ply two is missing a move but it works. Does pvs[][] and pvl[] need primed in some way? Does anyone know why it would not work the first time but then works the second time?