X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=68b19cd34b116bf229e26e9e1dee9c1de7d728aa;hp=59025fba1215d78525890a6e56b44251281bbf0a;hb=a44f79141eb887f6fbcf06282ff91ed125a70ef4;hpb=94b9c65e09b5d396bebb29b62d9979139b5fbdfa diff --git a/src/search.cpp b/src/search.cpp index 59025fba..68b19cd3 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -117,7 +117,7 @@ namespace { struct RootMove { - RootMove() { nodes = cumulativeNodes = ourBeta = theirBeta = 0ULL; } + RootMove() { mp_score = 0; nodes = cumulativeNodes = ourBeta = theirBeta = 0ULL; } // RootMove::operator<() is the comparison function used when // sorting the moves. A move m1 is considered to be better @@ -125,11 +125,12 @@ namespace { // have equal score but m1 has the higher beta cut-off count. bool operator<(const RootMove& m) const { - return score != m.score ? score < m.score : theirBeta <= m.theirBeta; + return score != m.score ? score < m.score : mp_score <= m.mp_score; } Move move; Value score; + int mp_score; int64_t nodes, cumulativeNodes, ourBeta, theirBeta; Move pv[PLY_MAX_PLUS_2]; }; @@ -143,6 +144,8 @@ namespace { public: RootMoveList(Position& pos, Move searchMoves[]); + void set_mp_scores(const Position &pos); + int move_count() const { return count; } Move get_move(int moveNum) const { return moves[moveNum].move; } Value get_move_score(int moveNum) const { return moves[moveNum].score; } @@ -739,6 +742,7 @@ namespace { while (1) { // Sort the moves before to (re)search + rml.set_mp_scores(pos); rml.sort(); // Step 10. Loop through all moves in the root move list @@ -1179,7 +1183,7 @@ namespace { && tte && tte->move() && !excludedMove // Do not allow recursive singular extension search - && is_lower_bound(tte->type()) + && (tte->type() & VALUE_TYPE_LOWER) && tte->depth() >= depth - 3 * ONE_PLY; // Step 10. Loop through moves @@ -1957,8 +1961,8 @@ namespace { || v >= Max(value_mate_in(PLY_MAX), beta) || v < Min(value_mated_in(PLY_MAX), beta)) - && ( (is_lower_bound(tte->type()) && v >= beta) - || (is_upper_bound(tte->type()) && v < beta)); + && ( ((tte->type() & VALUE_TYPE_LOWER) && v >= beta) + || ((tte->type() & VALUE_TYPE_UPPER) && v < beta)); } @@ -1971,8 +1975,8 @@ namespace { Value v = value_from_tt(tte->value(), ply); - if ( (is_lower_bound(tte->type()) && v >= defaultEval) - || (is_upper_bound(tte->type()) && v < defaultEval)) + if ( ((tte->type() & VALUE_TYPE_LOWER) && v >= defaultEval) + || ((tte->type() & VALUE_TYPE_UPPER) && v < defaultEval)) return v; return defaultEval; @@ -2777,6 +2781,26 @@ namespace { } + void RootMoveList::set_mp_scores(const Position &pos) + { + MovePicker mp = MovePicker(pos, MOVE_NONE, ONE_PLY, H); + Move move; + + int moveCount = 0; + while ((move = mp.get_next_move()) != MOVE_NONE) + { + moveCount++; + for (int i = 0; i < count; i++) + { + if (moves[i].move == move) + { + moves[i].mp_score = 512 - moveCount; + break; + } + } + } + } + // RootMoveList simple methods definitions void RootMoveList::set_move_nodes(int moveNum, int64_t nodes) {