X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=8558bf155bb390d3ff4252d528768efdfeb5932c;hp=4592ac084ebc56d60a59b83415167bd2f75af146;hb=661d48c27b6b95a743947fcf5ab25e82e6835512;hpb=b638f6b0354ea124dc80e5e38189474d34141e2d diff --git a/src/search.cpp b/src/search.cpp index 4592ac08..8558bf15 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -216,11 +216,11 @@ namespace { // Step 14. Reduced search // Reduction lookup tables (initialized at startup) and their getter functions - int8_t PVReductionMatrix[64][64]; // [depth][moveNumber] - int8_t NonPVReductionMatrix[64][64]; // [depth][moveNumber] + int8_t PVReductionMatrix[8][64][64]; // [depth][moveNumber] + int8_t NonPVReductionMatrix[8][64][64]; // [depth][moveNumber] - inline Depth pv_reduction(Depth d, int mn) { return (Depth) PVReductionMatrix[Min(d / 2, 63)][Min(mn, 63)]; } - inline Depth nonpv_reduction(Depth d, int mn) { return (Depth) NonPVReductionMatrix[Min(d / 2, 63)][Min(mn, 63)]; } + inline Depth pv_reduction(Depth d, int mn) { return (Depth) PVReductionMatrix[0][Min(d / 2, 63)][Min(mn, 63)]; } + inline Depth nonpv_reduction(Depth d, int mn) { return (Depth) NonPVReductionMatrix[0][Min(d / 2, 63)][Min(mn, 63)]; } // Common adjustments @@ -544,20 +544,31 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move, return !Quit; } +// init_reduction_tables() -/// init_search() is called during startup. It initializes various lookup tables - -void init_search() { +void init_reduction_tables(int8_t pvTable[64][64], int8_t nonPvTable[64][64], int pvInhib, int nonPvInhib) +{ + double pvBase = 1.001 - log(3.0) * log(16.0) / pvInhib; + double nonPvBase = 1.001 - log(3.0) * log(4.0) / nonPvInhib; - // Init our reduction lookup tables + // Init reduction lookup tables for (int i = 1; i < 64; i++) // i == depth (OnePly = 1) for (int j = 1; j < 64; j++) // j == moveNumber { - double pvRed = 0.5 + log(double(i)) * log(double(j)) / 6.0; - double nonPVRed = 0.5 + log(double(i)) * log(double(j)) / 3.0; - PVReductionMatrix[i][j] = (int8_t) ( pvRed >= 1.0 ? floor( pvRed * int(OnePly)) : 0); - NonPVReductionMatrix[i][j] = (int8_t) (nonPVRed >= 1.0 ? floor(nonPVRed * int(OnePly)) : 0); + double pvRed = pvBase + log(double(i)) * log(double(j)) / pvInhib; + double nonPVRed = nonPvBase + log(double(i)) * log(double(j)) / nonPvInhib; + + pvTable[i][j] = (int8_t) ( pvRed >= 1.0 ? floor( pvRed * int(OnePly)) : 0); + nonPvTable[i][j] = (int8_t) (nonPVRed >= 1.0 ? floor(nonPVRed * int(OnePly)) : 0); } +} + +// init_search() is called during startup. It initializes various lookup tables + +void init_search() { + + for (int i = 0; i < 8; i++) + init_reduction_tables(PVReductionMatrix[i], NonPVReductionMatrix[i], 4.0 * pow(1.3, i), 2.0 * pow(1.3, i)); // Init futility margins array for (int i = 0; i < 16; i++) // i == depth (OnePly = 2) @@ -1378,13 +1389,17 @@ namespace { if (nullValue >= beta) { + // Do not return unproven mate scores + if (nullValue >= value_mate_in(PLY_MAX)) + nullValue = beta; + if (depth < 6 * OnePly) - return beta; + return nullValue; // Do zugzwang verification search Value v = search(pos, ss, beta, depth-5*OnePly, ply, false, threadID); if (v >= beta) - return beta; + return nullValue; } else { // The null move failed low, which means that we may be faced with // some kind of threat. If the previous move was reduced, check if