1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Introduce and use qsearch_scoring()

Move qsearch scoring functionality out of RootMoveList
initialization. Will be needed by future patches.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-01-23 10:19:30 +01:00
parent 6849f0800e
commit f352008958

View file

@ -302,6 +302,7 @@ namespace {
void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount); void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount);
void update_killers(Move m, Move killers[]); void update_killers(Move m, Move killers[]);
void update_gains(const Position& pos, Move move, Value before, Value after); 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(); int current_search_time();
std::string value_to_uci(Value v); std::string value_to_uci(Value v);
@ -1522,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<PV>(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(). // 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 // bestValue is updated only when returning false because in that case move
// will be pruned. // will be pruned.
@ -2559,19 +2580,15 @@ split_point_start: // At split points actual search starts from here
void RootMoveList::init(Position& pos, Move searchMoves[]) { void RootMoveList::init(Position& pos, Move searchMoves[]) {
SearchStack ss[PLY_MAX_PLUS_2];
MoveStack mlist[MOVES_MAX]; MoveStack mlist[MOVES_MAX];
StateInfo st;
Move* sm; 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(); clear();
bestMoveChanges = 0;
// Generate all legal moves // Generate all legal moves and score them
MoveStack* last = generate<MV_LEGAL>(pos, mlist); MoveStack* last = generate<MV_LEGAL>(pos, mlist);
qsearch_scoring(pos, mlist, last);
// Add each move to the RootMoveList's vector // Add each move to the RootMoveList's vector
for (MoveStack* cur = mlist; cur != last; cur++) for (MoveStack* cur = mlist; cur != last; cur++)
@ -2583,16 +2600,11 @@ split_point_start: // At split points actual search starts from here
if (searchMoves[0] && *sm != cur->move) if (searchMoves[0] && *sm != cur->move)
continue; continue;
// Find a quick score for the move and add to the list
pos.do_move(cur->move, st);
RootMove rm; RootMove rm;
rm.pv[0] = ss[0].currentMove = cur->move; rm.pv[0] = cur->move;
rm.pv[1] = MOVE_NONE; rm.pv[1] = MOVE_NONE;
rm.pv_score = -qsearch<PV>(pos, ss+1, -VALUE_INFINITE, VALUE_INFINITE, DEPTH_ZERO, 1); rm.pv_score = Value(cur->score);
push_back(rm); push_back(rm);
pos.undo_move(cur->move);
} }
sort(); sort();
} }