X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=3f482e77146490cad1fc57e4ca06fd5efec64726;hb=afae86bfb49471113f14f9f0f56f2a08d052242f;hp=a3238a33f37c965874b3998bc1e42b24af75d03a;hpb=a8f457d4250a527f6b391f22a2f61f73272201fa;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index a3238a33..3f482e77 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -233,11 +233,6 @@ namespace { template inline Depth reduction(Depth d, int mn) { return (Depth) ReductionMatrix[PV][Min(d / 2, 63)][Min(mn, 63)]; } - // Common adjustments - - // Search depth at iteration 1 - const Depth InitialDepth = ONE_PLY; - // Easy move margin. An easy move candidate must be at least this much // better than the second best move. const Value EasyMoveMargin = Value(0x200); @@ -307,6 +302,7 @@ namespace { void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount); void update_killers(Move m, Move killers[]); void update_gains(const Position& pos, Move move, Value before, Value after); + void qsearch_scoring(Position& pos, MoveStack* mlist, MoveStack* last); int current_search_time(); std::string value_to_uci(Value v); @@ -329,8 +325,8 @@ namespace { // before to search them. template<> struct MovePickerExt : public MovePicker { - MovePickerExt(const Position& p, Move, Depth d, const History& h, SearchStack* ss, Value b) - : MovePicker(p, Rml[0].pv[0], d, h, ss, b), firstCall(true) { + MovePickerExt(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss, Value b) + : MovePicker(p, ttm, d, h, ss, b), firstCall(true) { Move move; Value score = VALUE_ZERO; @@ -656,7 +652,7 @@ namespace { cout << "info depth " << iteration << endl; Rml.bestMoveChanges = researchCountFL = researchCountFH = 0; - depth = (iteration - 2) * ONE_PLY + InitialDepth; + depth = (iteration - 1) * ONE_PLY; // Calculate dynamic aspiration window based on previous iterations if (MultiPV == 1 && iteration >= 6 && abs(bestValues[iteration - 1]) < VALUE_KNOWN_WIN) @@ -1527,6 +1523,26 @@ split_point_start: // At split points actual search starts from here } + // qsearch_scoring() scores each move of a list using a qsearch() evaluation, + // it is used in RootMoveList to get an initial scoring. + void qsearch_scoring(Position& pos, MoveStack* mlist, MoveStack* last) { + + SearchStack ss[PLY_MAX_PLUS_2]; + StateInfo st; + + memset(ss, 0, 4 * sizeof(SearchStack)); + ss[0].eval = ss[0].evalMargin = VALUE_NONE; + + for (MoveStack* cur = mlist; cur != last; cur++) + { + ss[0].currentMove = cur->move; + pos.do_move(cur->move, st); + cur->score = -qsearch(pos, ss+1, -VALUE_INFINITE, VALUE_INFINITE, DEPTH_ZERO, 1); + pos.undo_move(cur->move); + } + } + + // check_is_dangerous() tests if a checking move can be pruned in qsearch(). // bestValue is updated only when returning false because in that case move // will be pruned. @@ -2564,19 +2580,15 @@ split_point_start: // At split points actual search starts from here void RootMoveList::init(Position& pos, Move searchMoves[]) { - SearchStack ss[PLY_MAX_PLUS_2]; MoveStack mlist[MOVES_MAX]; - StateInfo st; Move* sm; - // Initialize search stack - memset(ss, 0, PLY_MAX_PLUS_2 * sizeof(SearchStack)); - ss[0].eval = ss[0].evalMargin = VALUE_NONE; - bestMoveChanges = 0; clear(); + bestMoveChanges = 0; - // Generate all legal moves + // Generate all legal moves and score them MoveStack* last = generate(pos, mlist); + qsearch_scoring(pos, mlist, last); // Add each move to the RootMoveList's vector for (MoveStack* cur = mlist; cur != last; cur++) @@ -2588,16 +2600,11 @@ split_point_start: // At split points actual search starts from here if (searchMoves[0] && *sm != cur->move) continue; - // Find a quick score for the move and add to the list - pos.do_move(cur->move, st); - RootMove rm; - rm.pv[0] = ss[0].currentMove = cur->move; + rm.pv[0] = cur->move; rm.pv[1] = MOVE_NONE; - rm.pv_score = -qsearch(pos, ss+1, -VALUE_INFINITE, VALUE_INFINITE, DEPTH_ZERO, 1); + rm.pv_score = Value(cur->score); push_back(rm); - - pos.undo_move(cur->move); } sort(); }