#include <iostream>
#include <sstream>
-#include "bitcount.h"
#include "book.h"
#include "evaluate.h"
#include "history.h"
Value qsearch(Position& pos, SearchStack ss[], Value alpha, Value beta, Depth depth, int ply, int threadID);
void sp_search(SplitPoint* sp, int threadID);
void sp_search_pv(SplitPoint* sp, int threadID);
- void init_node(const Position& pos, SearchStack ss[], int ply, int threadID);
+ void init_node(SearchStack ss[], int ply, int threadID);
void update_pv(SearchStack ss[], int ply);
void sp_update_pv(SearchStack* pss, SearchStack ss[], int ply);
bool connected_moves(const Position& pos, Move m1, Move m2);
void ponderhit();
void print_current_line(SearchStack ss[], int ply, int threadID);
void wait_for_stop_or_ponderhit();
+ void init_ss_array(SearchStack ss[]);
void idle_loop(int threadID, SplitPoint* waitSp);
void init_split_point_stack();
read_weights(pos.side_to_move());
- // Set the number of active threads.
+ // Set the number of active threads
int newActiveThreads = get_option_value_int("Threads");
if (newActiveThreads != ActiveThreads)
{
{
Value v = id_loop(pos, searchMoves);
loseOnTime = ( UseLSNFiltering
- && myTime < LSNTime
- && myIncrement == 0
- && v < -LSNValue);
+ && myTime < LSNTime
+ && myIncrement == 0
+ && v < -LSNValue);
}
else
{
// Initialize
TT.new_search();
H.clear();
- for (int i = 0; i < 3; i++)
- {
- ss[i].init(i);
- ss[i].initKillers();
- }
+ init_ss_array(ss);
IterationInfo[1] = IterationInfoType(rml.get_move_score(0), rml.get_move_score(0));
Iteration = 1;
// Update PV
rml.set_move_score(i, value);
update_pv(ss, 0);
- TT.extract_pv(pos, ss[0].pv);
+ TT.extract_pv(pos, ss[0].pv, PLY_MAX);
rml.set_move_pv(i, ss[0].pv);
if (MultiPV == 1)
// Initialize, and make an early exit in case of an aborted search,
// an instant draw, maximum ply reached, etc.
- init_node(pos, ss, ply, threadID);
+ init_node(ss, ply, threadID);
// After init_node() that calls poll()
if (AbortSearch || thread_should_stop(threadID))
// Initialize, and make an early exit in case of an aborted search,
// an instant draw, maximum ply reached, etc.
- init_node(pos, ss, ply, threadID);
+ init_node(ss, ply, threadID);
// After init_node() that calls poll()
if (AbortSearch || thread_should_stop(threadID))
bool useFutilityPruning = depth < SelectiveDepth
&& !isCheck;
+ // Avoid calling evaluate() if we already have the score in TT
+ if (tte && (tte->type() & VALUE_TYPE_EVAL))
+ futilityValue = value_from_tt(tte->value(), ply) + FutilityMargins[int(depth) - 2];
+
// Loop through all legal moves until no moves remain or a beta cutoff
// occurs.
while ( bestValue < beta
// Initialize, and make an early exit in case of an aborted search,
// an instant draw, maximum ply reached, etc.
- init_node(pos, ss, ply, threadID);
+ init_node(ss, ply, threadID);
// After init_node() that calls poll()
if (AbortSearch || thread_should_stop(threadID))
// Find a quick score for the move
StateInfo st;
SearchStack ss[PLY_MAX_PLUS_2];
+ init_ss_array(ss);
moves[count].move = cur->move;
pos.do_move(moves[count].move, st);
// NodesBetweenPolls nodes, init_node() also calls poll(), which polls
// for user input and checks whether it is time to stop the search.
- void init_node(const Position& pos, SearchStack ss[], int ply, int threadID) {
+ void init_node(SearchStack ss[], int ply, int threadID) {
assert(ply >= 0 && ply < PLY_MAX);
assert(threadID >= 0 && threadID < ActiveThreads);
}
+ // init_ss_array() does a fast reset of the first entries of a SearchStack array
+
+ void init_ss_array(SearchStack ss[]) {
+
+ for (int i = 0; i < 3; i++)
+ {
+ ss[i].init(i);
+ ss[i].initKillers();
+ }
+ }
+
+
// wait_for_stop_or_ponderhit() is called when the maximum depth is reached
// while the program is pondering. The point is to work around a wrinkle in
// the UCI protocol: When pondering, the engine is not allowed to give a