X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=c018cbe3c49b7283d3d64de2f5ce235c79b74864;hp=3512f20e376b8f354947b93399a0be740e3c11e3;hb=7f519a246327e164056bbd3e77ed5a672618094d;hpb=53ccba8457231677897f531ff283136edc550cf2 diff --git a/src/search.cpp b/src/search.cpp index 3512f20e..c018cbe3 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -79,16 +79,9 @@ namespace { Move pv[PLY_MAX_PLUS_2]; }; - // RootMoveList struct is just a vector of RootMove objects, - // with an handful of methods above the standard ones. + // RootMoveList struct is mainly a std::vector of RootMove objects struct RootMoveList : public std::vector { - - typedef std::vector Base; - void init(Position& pos, Move searchMoves[]); - void sort() { insertion_sort(begin(), end()); } - void sort_first(int n) { insertion_sort(begin(), begin() + n); } - int bestMoveChanges; }; @@ -219,7 +212,7 @@ namespace { int current_search_time(int set = 0); std::string score_to_uci(Value v, Value alpha, Value beta); std::string speed_to_uci(int64_t nodes); - std::string pv_to_uci(Move pv[], int pvNum); + std::string pv_to_uci(Move pv[], int pvNum, bool chess960); std::string depth_to_uci(Depth depth); void poll(const Position& pos); void wait_for_stop_or_ponderhit(); @@ -400,7 +393,7 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) { NodesSincePoll = 0; current_search_time(get_system_time()); Limits = limits; - TimeMgr.init(Limits, pos.full_moves()); + TimeMgr.init(Limits, pos.startpos_ply_counter()); // Set output steram in normal or chess960 mode cout << set960(pos.is_chess960()); @@ -596,7 +589,7 @@ namespace { << depth_to_uci(depth * ONE_PLY) << score_to_uci(Rml[i].pv_score, alpha, beta) << speed_to_uci(pos.nodes_searched()) - << pv_to_uci(Rml[i].pv, i + 1) << endl; + << pv_to_uci(Rml[i].pv, i + 1, pos.is_chess960()) << endl; // In case of failing high/low increase aspiration window and research, // otherwise exit the fail high/low loop. @@ -640,12 +633,6 @@ namespace { // Check for some early stop condition if (!StopRequest && Limits.useTimeManagement()) { - // Stop search early when the last two iterations returned a mate score - if ( depth >= 5 - && abs(bestValues[depth]) >= VALUE_MATE_IN_PLY_MAX - && abs(bestValues[depth - 1]) >= VALUE_MATE_IN_PLY_MAX) - StopRequest = true; - // Stop search early if one move seems to be much better than the // others or if there is only a single legal move. Also in the latter // case we search up to some depth anyway to get a proper score. @@ -733,7 +720,14 @@ namespace { if (PvNode && thread.maxPly < ss->ply) thread.maxPly = ss->ply; - if (SpNode) + // Step 1. Initialize node and poll. Polling can abort search + if (!SpNode) + { + ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE; + (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO; + (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; + } + else { sp = ss->sp; tte = NULL; @@ -742,11 +736,6 @@ namespace { goto split_point_start; } - // Step 1. Initialize node and poll. Polling can abort search - ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE; - (ss+1)->skipNullMove = false; (ss+1)->reduction = DEPTH_ZERO; - (ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE; - if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls) { NodesSincePoll = 0; @@ -1217,7 +1206,7 @@ split_point_start: // At split points actual search starts from here // because all the values but the first are usually set to // -VALUE_INFINITE and we want to keep the same order for all // the moves but the new PV that goes to head. - Rml.sort_first(moveCount); + sort(Rml.begin(), Rml.begin() + moveCount); // Update alpha. In multi-pv we don't use aspiration window, so set // alpha equal to minimum score among the PV lines searched so far. @@ -1553,7 +1542,8 @@ split_point_start: // At split points actual search starts from here bool connected_moves(const Position& pos, Move m1, Move m2) { Square f1, t1, f2, t2; - Piece p; + Piece p1, p2; + Square ksq; assert(m1 && move_is_ok(m1)); assert(m2 && move_is_ok(m2)); @@ -1571,26 +1561,24 @@ split_point_start: // At split points actual search starts from here return true; // Case 3: Moving through the vacated square - if ( piece_is_slider(pos.piece_on(f2)) + p2 = pos.piece_on(f2); + if ( piece_is_slider(p2) && bit_is_set(squares_between(f2, t2), f1)) return true; // Case 4: The destination square for m2 is defended by the moving piece in m1 - p = pos.piece_on(t1); - if (bit_is_set(pos.attacks_from(p, t1), t2)) + p1 = pos.piece_on(t1); + if (bit_is_set(pos.attacks_from(p1, t1), t2)) return true; // Case 5: Discovered check, checking piece is the piece moved in m1 - if ( piece_is_slider(p) - && bit_is_set(squares_between(t1, pos.king_square(pos.side_to_move())), f2) - && !bit_is_set(squares_between(t1, pos.king_square(pos.side_to_move())), t2)) + ksq = pos.king_square(pos.side_to_move()); + if ( piece_is_slider(p1) + && bit_is_set(squares_between(t1, ksq), f2)) { - // discovered_check_candidates() works also if the Position's side to - // move is the opposite of the checking piece. - Color them = opposite_color(pos.side_to_move()); - Bitboard dcCandidates = pos.discovered_check_candidates(them); - - if (bit_is_set(dcCandidates, f2)) + Bitboard occ = pos.occupied_squares(); + clear_bit(&occ, f2); + if (bit_is_set(pos.attacks_from(p1, t1, occ), ksq)) return true; } return false; @@ -1790,11 +1778,11 @@ split_point_start: // At split points actual search starts from here // pv_to_uci() returns a string with information on the current PV line // formatted according to UCI specification. - std::string pv_to_uci(Move pv[], int pvNum) { + std::string pv_to_uci(Move pv[], int pvNum, bool chess960) { std::stringstream s; - s << " multipv " << pvNum << " pv "; + s << " multipv " << pvNum << " pv " << set960(chess960); for ( ; *pv != MOVE_NONE; pv++) s << *pv << " "; @@ -2029,7 +2017,7 @@ split_point_start: // At split points actual search starts from here while ( (tte = TT.probe(pos.get_key())) != NULL && tte->move() != MOVE_NONE && pos.move_is_pl(tte->move()) - && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces(pos.side_to_move())) + && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces()) && ply < PLY_MAX && (!pos.is_draw() || ply < 2)) { @@ -2091,7 +2079,7 @@ split_point_start: // At split points actual search starts from here break; } - Rml.sort(); + sort(Rml.begin(), Rml.end()); } } // namespace