mirror of
https://github.com/sockspls/badfish
synced 2025-07-13 04:29:15 +00:00
Remove Gain Stats
Additionally in futility pruning the margin is raised for compensation. STC LLR: 2.96 (-2.94,2.94) [-3.00,1.00] Total: 48481 W: 9229 L: 9156 D: 30096 LTC LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 32058 W: 5134 L: 5031 D: 21893 Bench: 8098149 Resolves #350
This commit is contained in:
parent
411e704fdf
commit
e14046517e
2 changed files with 9 additions and 28 deletions
|
@ -30,14 +30,13 @@
|
||||||
|
|
||||||
|
|
||||||
/// The Stats struct stores moves statistics. According to the template parameter
|
/// The Stats struct stores moves statistics. According to the template parameter
|
||||||
/// the class can store History, Gains and Countermoves. History records how often
|
/// the class can store History and Countermoves. History records how often
|
||||||
/// different moves have been successful or unsuccessful during the current search
|
/// different moves have been successful or unsuccessful during the current search
|
||||||
/// and is used for reduction and move ordering decisions. Gains records the move's
|
/// and is used for reduction and move ordering decisions.
|
||||||
/// best evaluation gain from one ply to the next and is used for pruning decisions.
|
|
||||||
/// Countermoves store the move that refute a previous one. Entries are stored
|
/// Countermoves store the move that refute a previous one. Entries are stored
|
||||||
/// using only the moving piece and destination square, hence two moves with
|
/// using only the moving piece and destination square, hence two moves with
|
||||||
/// different origin but same destination and piece will be considered identical.
|
/// different origin but same destination and piece will be considered identical.
|
||||||
template<bool Gain, typename T>
|
template<typename T>
|
||||||
struct Stats {
|
struct Stats {
|
||||||
|
|
||||||
static const Value Max = Value(250);
|
static const Value Max = Value(250);
|
||||||
|
@ -54,10 +53,7 @@ struct Stats {
|
||||||
|
|
||||||
void update(Piece pc, Square to, Value v) {
|
void update(Piece pc, Square to, Value v) {
|
||||||
|
|
||||||
if (Gain)
|
if (abs(table[pc][to] + v) < Max)
|
||||||
table[pc][to] = std::max(v, table[pc][to] - 1);
|
|
||||||
|
|
||||||
else if (abs(table[pc][to] + v) < Max)
|
|
||||||
table[pc][to] += v;
|
table[pc][to] += v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,10 +61,9 @@ private:
|
||||||
T table[PIECE_NB][SQUARE_NB];
|
T table[PIECE_NB][SQUARE_NB];
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Stats< true, Value> GainsStats;
|
typedef Stats<Value> HistoryStats;
|
||||||
typedef Stats<false, Value> HistoryStats;
|
typedef Stats<Move> MovesStats;
|
||||||
typedef Stats<false, Move> MovesStats;
|
typedef Stats<HistoryStats> CounterMovesHistoryStats;
|
||||||
typedef Stats<false, HistoryStats> CounterMovesHistoryStats;
|
|
||||||
|
|
||||||
|
|
||||||
/// MovePicker class is used to pick one pseudo legal move at a time from the
|
/// MovePicker class is used to pick one pseudo legal move at a time from the
|
||||||
|
|
|
@ -134,7 +134,6 @@ namespace {
|
||||||
Value DrawValue[COLOR_NB];
|
Value DrawValue[COLOR_NB];
|
||||||
HistoryStats History;
|
HistoryStats History;
|
||||||
CounterMovesHistoryStats CounterMovesHistory;
|
CounterMovesHistoryStats CounterMovesHistory;
|
||||||
GainsStats Gains;
|
|
||||||
MovesStats Countermoves;
|
MovesStats Countermoves;
|
||||||
|
|
||||||
template <NodeType NT, bool SpNode>
|
template <NodeType NT, bool SpNode>
|
||||||
|
@ -188,7 +187,6 @@ void Search::reset () {
|
||||||
TT.clear();
|
TT.clear();
|
||||||
History.clear();
|
History.clear();
|
||||||
CounterMovesHistory.clear();
|
CounterMovesHistory.clear();
|
||||||
Gains.clear();
|
|
||||||
Countermoves.clear();
|
Countermoves.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -643,7 +641,7 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 5. Evaluate the position statically and update parent's gain statistics
|
// Step 5. Evaluate the position statically
|
||||||
if (inCheck)
|
if (inCheck)
|
||||||
{
|
{
|
||||||
ss->staticEval = eval = VALUE_NONE;
|
ss->staticEval = eval = VALUE_NONE;
|
||||||
|
@ -672,17 +670,6 @@ namespace {
|
||||||
if (ss->skipEarlyPruning)
|
if (ss->skipEarlyPruning)
|
||||||
goto moves_loop;
|
goto moves_loop;
|
||||||
|
|
||||||
if ( !pos.captured_piece_type()
|
|
||||||
&& ss->staticEval != VALUE_NONE
|
|
||||||
&& (ss-1)->staticEval != VALUE_NONE
|
|
||||||
&& (move = (ss-1)->currentMove) != MOVE_NULL
|
|
||||||
&& move != MOVE_NONE
|
|
||||||
&& type_of(move) == NORMAL)
|
|
||||||
{
|
|
||||||
Square to = to_sq(move);
|
|
||||||
Gains.update(pos.piece_on(to), to, -(ss-1)->staticEval - ss->staticEval);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 6. Razoring (skipped when in check)
|
// Step 6. Razoring (skipped when in check)
|
||||||
if ( !PvNode
|
if ( !PvNode
|
||||||
&& depth < 4 * ONE_PLY
|
&& depth < 4 * ONE_PLY
|
||||||
|
@ -915,8 +902,7 @@ moves_loop: // When in check and at SpNode search starts from here
|
||||||
// Futility pruning: parent node
|
// Futility pruning: parent node
|
||||||
if (predictedDepth < 7 * ONE_PLY)
|
if (predictedDepth < 7 * ONE_PLY)
|
||||||
{
|
{
|
||||||
futilityValue = ss->staticEval + futility_margin(predictedDepth)
|
futilityValue = ss->staticEval + futility_margin(predictedDepth) + 256;
|
||||||
+ 128 + Gains[pos.moved_piece(move)][to_sq(move)];
|
|
||||||
|
|
||||||
if (futilityValue <= alpha)
|
if (futilityValue <= alpha)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue