X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovepick.cpp;h=6c3f4264dec1af0745aa575d2802f56ad39e362f;hp=6a7fd4ebce3e50bcc8d598b5d04702ad4fe7a455;hb=7c267587fc7f454182b4d527607bcf8fdbd8c41c;hpb=24b7ad54c747ef38818484567624696fe3ef5e9e diff --git a/src/movepick.cpp b/src/movepick.cpp index 6a7fd4eb..6c3f4264 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -45,14 +45,11 @@ namespace { int MainSearchPhaseIndex; int EvasionsPhaseIndex; int QsearchWithChecksPhaseIndex; - int QsearchNoCapturesPhaseIndex; int QsearchWithoutChecksPhaseIndex; - int NoMovesPhaseIndex; } - //// //// Functions //// @@ -66,7 +63,7 @@ namespace { /// move ordering is at the current node. MovePicker::MovePicker(const Position& p, bool pv, Move ttm, - const SearchStack& ss, Depth d, EvalInfo* ei) : pos(p) { + const SearchStack& ss, Depth d) : pos(p) { pvNode = pv; ttMove = ttm; mateKiller = (ss.mateKiller == ttm)? MOVE_NONE : ss.mateKiller; @@ -77,24 +74,16 @@ MovePicker::MovePicker(const Position& p, bool pv, Move ttm, numOfMoves = 0; numOfBadCaptures = 0; - // With EvalInfo we are able to know how many captures are possible before - // generating them. So avoid generating in case we know are zero. - Color us = pos.side_to_move(); - Color them = opposite_color(us); - bool noCaptures = ei - && (ei->attackedBy[us][0] & pos.pieces_of_color(them)) == 0 - && !ei->mi->specialized_eval_exists() - && (pos.ep_square() == SQ_NONE) - && !pos.has_pawn_on_7th(us); - if (p.is_check()) phaseIndex = EvasionsPhaseIndex; else if (depth > Depth(0)) phaseIndex = MainSearchPhaseIndex; else if (depth == Depth(0)) - phaseIndex = (noCaptures ? QsearchNoCapturesPhaseIndex : QsearchWithChecksPhaseIndex); + phaseIndex = QsearchWithChecksPhaseIndex; else - phaseIndex = (noCaptures ? NoMovesPhaseIndex : QsearchWithoutChecksPhaseIndex); + phaseIndex = QsearchWithoutChecksPhaseIndex; + + Color us = pos.side_to_move(); dc = p.discovered_check_candidates(us); pinned = p.pinned_pieces(us); @@ -174,7 +163,7 @@ Move MovePicker::get_next_move() { break; case PH_QCHECKS: - numOfMoves = generate_checks(pos, moves, dc); + numOfMoves = generate_non_capture_checks(pos, moves, dc); movesPicked = 0; break; @@ -311,16 +300,14 @@ void MovePicker::score_qcaptures() { /// find_best_index() loops across the moves and returns index of -/// the highest scored one. There is also a second version that -/// lowers the priority of moves that attack the same square, -/// so that if the best move that attack a square fails the next -/// move picked attacks a different square if any, not the same one. +/// the highest scored one. -int MovePicker::find_best_index() { +int MovePicker::find_best_index() const { assert(movesPicked < numOfMoves); - int bestIndex = movesPicked, bestScore = moves[movesPicked].score; + int bestIndex = movesPicked; + int bestScore = moves[movesPicked].score; for (int i = movesPicked + 1; i < numOfMoves; i++) if (moves[i].score > bestScore) @@ -331,45 +318,6 @@ int MovePicker::find_best_index() { return bestIndex; } -int MovePicker::find_best_index(Bitboard* squares, int values[]) { - - assert(movesPicked < numOfMoves); - - int hs; - Move m; - Square to; - int bestScore = -10000000, bestIndex = -1; - - for (int i = movesPicked; i < numOfMoves; i++) - { - m = moves[i].move; - to = move_to(m); - - if (!bit_is_set(*squares, to)) - { - // Init at first use - set_bit(squares, to); - values[to] = 0; - } - - hs = moves[i].score - values[to]; - if (hs > bestScore) - { - bestIndex = i; - bestScore = hs; - } - } - - if (bestIndex != -1) - { - // Raise value of the picked square, so next attack - // to the same square will get low priority. - to = move_to(moves[bestIndex].move); - values[to] += 0xB00; - } - return bestIndex; -} - /// MovePicker::pick_move_from_list() picks the move with the biggest score /// from a list of generated moves (moves[] or badCaptures[], depending on @@ -455,9 +403,9 @@ Move MovePicker::pick_move_from_list() { bestIndex = (movesPicked < 4 ? find_best_index() : movesPicked); move = moves[bestIndex].move; moves[bestIndex] = moves[movesPicked++]; - // Remember to change the line below if we decide to hash the qsearch! - // Maybe also postpone the legality check until after futility pruning? - if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned)) + // Maybe postpone the legality check until after futility pruning? + if ( move != ttMove + && pos.pl_move_is_legal(move, pinned)) return move; } break; @@ -470,8 +418,8 @@ Move MovePicker::pick_move_from_list() { while (movesPicked < numOfMoves) { move = moves[movesPicked++].move; - // Remember to change the line below if we decide to hash the qsearch! - if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned)) + if ( move != ttMove + && pos.pl_move_is_legal(move, pinned)) return move; } break; @@ -483,20 +431,10 @@ Move MovePicker::pick_move_from_list() { } -/// MovePicker::current_move_type() returns the type of the just -/// picked next move. It can be used in search to further differentiate -/// according to the current move type: capture, non capture, escape, etc. -MovePicker::MovegenPhase MovePicker::current_move_type() const { - - return PhaseTable[phaseIndex]; -} - - /// MovePicker::init_phase_table() initializes the PhaseTable[], /// MainSearchPhaseIndex, EvasionPhaseIndex, QsearchWithChecksPhaseIndex -/// QsearchNoCapturesPhaseIndex, QsearchWithoutChecksPhaseIndex and -/// NoMovesPhaseIndex variables. It is only called once during program -/// startup, and never again while the program is running. +/// and QsearchWithoutChecksPhaseIndex. It is only called once during +/// program startup, and never again while the program is running. void MovePicker::init_phase_table() { @@ -521,21 +459,14 @@ void MovePicker::init_phase_table() { // Quiescence search with checks QsearchWithChecksPhaseIndex = i - 1; + PhaseTable[i++] = PH_TT_MOVE; PhaseTable[i++] = PH_QCAPTURES; PhaseTable[i++] = PH_QCHECKS; PhaseTable[i++] = PH_STOP; - // Quiescence search with checks only and no captures - QsearchNoCapturesPhaseIndex = i - 1; - PhaseTable[i++] = PH_QCHECKS; - PhaseTable[i++] = PH_STOP; - // Quiescence search without checks QsearchWithoutChecksPhaseIndex = i - 1; + PhaseTable[i++] = PH_TT_MOVE; PhaseTable[i++] = PH_QCAPTURES; PhaseTable[i++] = PH_STOP; - - // Do not generate any move - NoMovesPhaseIndex = i - 1; - PhaseTable[i++] = PH_STOP; }