mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-20 09:06:45 +08:00
Avoid constructing an empty tuple in qsearch
Avoid constructing, passing as a parameter and binding a useless empty tuple of pointers in the qsearch move picker constructor. Also reformat the scoring function in movepicker.cpp and do some cleaning in evaluate.cpp while there. No functional change.
This commit is contained in:
committed by
Marco Costalba
parent
5ea327d924
commit
002bf4d8db
@@ -66,6 +66,7 @@ namespace {
|
||||
/// search captures, promotions, and some checks) and how important good move
|
||||
/// ordering is at the current node.
|
||||
|
||||
/// MovePicker constructor for the main search
|
||||
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHistory* mh,
|
||||
const PieceToHistory** ch, Move cm, Move* killers_p)
|
||||
: pos(p), mainHistory(mh), contHistory(ch), countermove(cm),
|
||||
@@ -78,9 +79,9 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHist
|
||||
stage += (ttMove == MOVE_NONE);
|
||||
}
|
||||
|
||||
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHistory* mh,
|
||||
const PieceToHistory** ch, Square s)
|
||||
: pos(p), mainHistory(mh), contHistory(ch) {
|
||||
/// MovePicker constructor for quiescence search
|
||||
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHistory* mh, Square s)
|
||||
: pos(p), mainHistory(mh) {
|
||||
|
||||
assert(d <= DEPTH_ZERO);
|
||||
|
||||
@@ -104,14 +105,14 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHist
|
||||
stage += (ttMove == MOVE_NONE);
|
||||
}
|
||||
|
||||
/// MovePicker constructor for ProbCut: we generate captures with SEE higher
|
||||
/// than or equal to the given threshold.
|
||||
MovePicker::MovePicker(const Position& p, Move ttm, Value th)
|
||||
: pos(p), threshold(th) {
|
||||
|
||||
assert(!pos.checkers());
|
||||
|
||||
stage = PROBCUT;
|
||||
|
||||
// In ProbCut we generate captures with SEE higher than or equal to the given threshold
|
||||
ttMove = ttm
|
||||
&& pos.pseudo_legal(ttm)
|
||||
&& pos.capture(ttm)
|
||||
@@ -123,22 +124,30 @@ MovePicker::MovePicker(const Position& p, Move ttm, Value th)
|
||||
/// score() assigns a numerical value to each move in a list, used for sorting.
|
||||
/// Captures are ordered by Most Valuable Victim (MVV), preferring captures
|
||||
/// near our home rank. Quiets are ordered using the histories.
|
||||
template<GenType T>
|
||||
template<GenType Type>
|
||||
void MovePicker::score() {
|
||||
|
||||
static_assert(Type == CAPTURES || Type == QUIETS || Type == EVASIONS, "Wrong type");
|
||||
|
||||
for (auto& m : *this)
|
||||
if (T == CAPTURES || (T == EVASIONS && pos.capture(m)))
|
||||
m.value = PieceValue[MG][pos.piece_on(to_sq(m))]
|
||||
- (T == EVASIONS ? Value(type_of(pos.moved_piece(m)))
|
||||
: Value(200 * relative_rank(pos.side_to_move(), to_sq(m))));
|
||||
else if (T == QUIETS)
|
||||
if (Type == CAPTURES)
|
||||
m.value = PieceValue[MG][pos.piece_on(to_sq(m))]
|
||||
- Value(200 * relative_rank(pos.side_to_move(), to_sq(m)));
|
||||
|
||||
else if (Type == QUIETS)
|
||||
m.value = (*mainHistory)[pos.side_to_move()][from_to(m)]
|
||||
+ (*contHistory[0])[pos.moved_piece(m)][to_sq(m)]
|
||||
+ (*contHistory[1])[pos.moved_piece(m)][to_sq(m)]
|
||||
+ (*contHistory[3])[pos.moved_piece(m)][to_sq(m)];
|
||||
|
||||
else // Quiet evasions
|
||||
m.value = (*mainHistory)[pos.side_to_move()][from_to(m)] - (1 << 28);
|
||||
else // Type == EVASIONS
|
||||
{
|
||||
if (pos.capture(m))
|
||||
m.value = PieceValue[MG][pos.piece_on(to_sq(m))]
|
||||
- Value(type_of(pos.moved_piece(m)));
|
||||
else
|
||||
m.value = (*mainHistory)[pos.side_to_move()][from_to(m)] - (1 << 28);
|
||||
}
|
||||
}
|
||||
|
||||
/// next_move() is the most important method of the MovePicker class. It returns
|
||||
|
||||
Reference in New Issue
Block a user