|
4 | 4 |
|
5 | 5 | #include "pvs.h" |
6 | 6 |
|
7 | | -#include "syzygy/tbprobe.h" |
| 7 | +#include "fathom.h" |
8 | 8 |
|
9 | 9 | namespace pvs { |
10 | 10 | struct pv_move_t { |
@@ -201,19 +201,21 @@ namespace pvs { |
201 | 201 |
|
202 | 202 | // Probe endgame tablebases |
203 | 203 | if (ply && board->now().halfmove_clock == 0 && pop_count(board->all()) <= use_tb) { |
204 | | - int success; |
205 | | - int value = probe_wdl(*board, &success); |
206 | | - if (success) { |
| 204 | + std::optional<WDL> result = probe_wdl(*board); |
| 205 | + if (result) { |
207 | 206 | tb_hits++; |
208 | | - tt::Bound bound; |
209 | | - if (value < 0) { |
| 207 | + |
| 208 | + WDL wdl = result.value(); |
| 209 | + tt::Bound bound; int value; |
| 210 | + if (wdl == WDL::LOSS || wdl == WDL::BLESSED_LOSS) { |
210 | 211 | bound = tt::UPPER; |
211 | 212 | value = -TO_MATE_SCORE(MAX_TB_PLY + ply + 1); |
212 | | - } else if (value > 0) { |
| 213 | + } else if (wdl == WDL::WIN || wdl == WDL::CURSED_WIN) { |
213 | 214 | bound = tt::LOWER; |
214 | 215 | value = TO_MATE_SCORE(MAX_TB_PLY + ply + 1); |
215 | 216 | } else { |
216 | 217 | bound = tt::EXACT; |
| 218 | + value = 0; |
217 | 219 | } |
218 | 220 |
|
219 | 221 | if (bound == tt::EXACT |
@@ -392,28 +394,32 @@ namespace pvs { |
392 | 394 |
|
393 | 395 | // Probe endgame tablebases |
394 | 396 | if (ply && board->now().halfmove_clock == 0 && pop_count(board->all()) <= use_tb) { |
395 | | - int success; |
396 | | - int value = probe_wdl(*board, &success); |
397 | | - if (success) { |
| 397 | + std::optional<WDL> result = probe_wdl(*board); |
| 398 | + if (result) { |
398 | 399 | tb_hits++; |
399 | | - tt::Bound bound; |
400 | | - if (value < 0) { |
| 400 | + |
| 401 | + WDL wdl = result.value(); |
| 402 | + tt::Bound bound; int value; |
| 403 | + if (wdl == WDL::LOSS || wdl == WDL::BLESSED_LOSS) { |
401 | 404 | bound = tt::UPPER; |
402 | 405 | value = -TO_MATE_SCORE(MAX_TB_PLY + ply + 1); |
403 | | - } else if (value > 0) { |
| 406 | + } else if (wdl == WDL::WIN || wdl == WDL::CURSED_WIN) { |
404 | 407 | bound = tt::LOWER; |
405 | 408 | value = TO_MATE_SCORE(MAX_TB_PLY + ply + 1); |
406 | 409 | } else { |
407 | 410 | bound = tt::EXACT; |
| 411 | + value = 0; |
408 | 412 | } |
409 | 413 |
|
410 | 414 | if (bound == tt::EXACT |
411 | | - || (bound == tt::LOWER && value >= beta) |
412 | | - || (bound == tt::UPPER && value <= alpha)) { |
413 | | - tt->save(bound, board->now().hash, MAX_PLY - 1, ply, stack[ply].eval, value, |
414 | | - EMPTY_MOVE); |
| 415 | + || (bound == tt::LOWER && value >= beta) |
| 416 | + || (bound == tt::UPPER && value <= alpha)) { |
| 417 | + tt->save(bound, board->now().hash, MAX_PLY, ply, stack[ply].eval, value, EMPTY_MOVE); |
415 | 418 | return value; |
416 | 419 | } |
| 420 | + |
| 421 | + if (bound == tt::LOWER) alpha = std::max(alpha, value); |
| 422 | + if (bound == tt::UPPER) beta = std::min(beta, value); |
417 | 423 | } |
418 | 424 | } |
419 | 425 |
|
@@ -504,28 +510,31 @@ namespace pvs { |
504 | 510 |
|
505 | 511 | // Probe endgame tablebases |
506 | 512 | if (ply && board->now().halfmove_clock == 0 && pop_count(board->all()) <= use_tb) { |
507 | | - int success; |
508 | | - int value = probe_wdl(*board, &success); |
509 | | - if (success) { |
| 513 | + std::optional<WDL> result = probe_wdl(*board); |
| 514 | + if (result) { |
510 | 515 | tb_hits++; |
511 | | - tt::Bound bound; |
512 | | - if (value < 0) { |
| 516 | + |
| 517 | + WDL wdl = result.value(); |
| 518 | + tt::Bound bound; int value; |
| 519 | + if (wdl == WDL::LOSS || wdl == WDL::BLESSED_LOSS) { |
513 | 520 | bound = tt::UPPER; |
514 | 521 | value = -TO_MATE_SCORE(MAX_TB_PLY + ply + 1); |
515 | | - } else if (value > 0) { |
| 522 | + } else if (wdl == WDL::WIN || wdl == WDL::CURSED_WIN) { |
516 | 523 | bound = tt::LOWER; |
517 | 524 | value = TO_MATE_SCORE(MAX_TB_PLY + ply + 1); |
518 | 525 | } else { |
519 | 526 | bound = tt::EXACT; |
| 527 | + value = 0; |
520 | 528 | } |
521 | 529 |
|
522 | 530 | if (bound == tt::EXACT |
523 | | - || (bound == tt::LOWER && value >= beta) |
524 | | - || (bound == tt::UPPER && value <= beta - 1)) { |
525 | | - tt->save(bound, board->now().hash, MAX_PLY - 1, ply, stack[ply].eval, value, |
526 | | - EMPTY_MOVE); |
| 531 | + || (bound == tt::LOWER && value >= beta) |
| 532 | + || (bound == tt::UPPER && value <= beta - 1)) { |
| 533 | + tt->save(bound, board->now().hash, MAX_PLY, ply, stack[ply].eval, value, EMPTY_MOVE); |
527 | 534 | return value; |
528 | 535 | } |
| 536 | + |
| 537 | + if (bound == tt::UPPER) beta = std::min(beta, value); |
529 | 538 | } |
530 | 539 | } |
531 | 540 |
|
|
0 commit comments