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?

