// Different node types, used as template parameter
enum NodeType { Root, PV, NonPV, SplitPointRoot, SplitPointPV, SplitPointNonPV };
- // Lookup table to check if a Piece is a slider and its access function
- const bool Slidings[18] = { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1 };
- inline bool piece_is_slider(Piece p) { return Slidings[p]; }
-
// Dynamic razoring margin based on depth
inline Value razor_margin(Depth d) { return Value(512 + 16 * int(d)); }
&& depth >= Threads.min_split_depth()
&& bestValue < beta
&& Threads.available_slave_exists(thisThread))
+ {
bestValue = Threads.split<FakeSplit>(pos, ss, alpha, beta, bestValue, &bestMove,
depth, threatMove, moveCount, mp, NT);
+ if (bestValue >= beta)
+ break;
+ }
}
if (SpNode)
if (ss->staticEval == VALUE_NONE || ss->evalMargin == VALUE_NONE) // Due to a race
ss->staticEval = bestValue = evaluate(pos, ss->evalMargin);
}
+ else if ((ss-1)->currentMove == MOVE_NULL)
+ {
+ ss->staticEval = bestValue = -(ss-1)->staticEval;
+ ss->evalMargin = VALUE_ZERO; // Hack, we really don't know the value
+ }
else
ss->staticEval = bestValue = evaluate(pos, ss->evalMargin);
return true;
}
- // If the threat piece is a slider, don't prune safe moves which block it
- if ( piece_is_slider(pos.piece_on(tfrom))
- && (between_bb(tfrom, tto) & mto)
- && pos.see_sign(move) >= 0)
+ // Don't prune safe moves which block the threat path
+ if ((between_bb(tfrom, tto) & mto) && pos.see_sign(move) >= 0)
return true;
return false;