#include <iostream>
#include <sstream>
#include <vector>
+#include <algorithm>
#include "book.h"
#include "evaluate.h"
inline Value futility_margin(Depth d, int mn) {
- return d < 7 * ONE_PLY ? FutilityMargins[Max(d, 1)][Min(mn, 63)]
+ return d < 7 * ONE_PLY ? FutilityMargins[std::max(int(d), 1)][std::min(mn, 63)]
: 2 * VALUE_INFINITE;
}
template <bool PvNode> inline Depth reduction(Depth d, int mn) {
- return (Depth) Reductions[PvNode][Min(d / ONE_PLY, 63)][Min(mn, 63)];
+ return (Depth) Reductions[PvNode][std::min(int(d) / ONE_PLY, 63)][std::min(mn, 63)];
}
// Easy move margin. An easy move candidate must be at least this much
if ( captureOrPromotion
&& type_of(pos.piece_on(move_to(m))) != PAWN
&& ( pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK)
- - piece_value_midgame(pos.piece_on(move_to(m))) == VALUE_ZERO)
+ - PieceValueMidgame[pos.piece_on(move_to(m))] == VALUE_ZERO)
&& !is_special(m))
{
result += PawnEndgameExtension[PvNode];
*dangerous = true;
}
- return Min(result, ONE_PLY);
+ return std::min(result, ONE_PLY);
}
} // namespace
// Set best NodesBetweenPolls interval to avoid lagging under time pressure
if (Limits.maxNodes)
- NodesBetweenPolls = Min(Limits.maxNodes, 30000);
+ NodesBetweenPolls = std::min(Limits.maxNodes, 30000);
else if (Limits.time && Limits.time < 1000)
NodesBetweenPolls = 1000;
else if (Limits.time && Limits.time < 5000)
// Do we have to play with skill handicap? In this case enable MultiPV that
// we will use behind the scenes to retrieve a set of possible moves.
SkillLevelEnabled = (SkillLevel < 20);
- MultiPV = (SkillLevelEnabled ? Max(UCIMultiPV, 4) : UCIMultiPV);
+ MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, 4) : UCIMultiPV);
// Wake up needed threads and reset maxPly counter
for (int i = 0; i < Threads.size(); i++)
Rml.bestMoveChanges = 0;
// MultiPV loop. We perform a full root search for each PV line
- for (MultiPVIdx = 0; MultiPVIdx < Min(MultiPV, (int)Rml.size()); MultiPVIdx++)
+ for (MultiPVIdx = 0; MultiPVIdx < std::min(MultiPV, (int)Rml.size()); MultiPVIdx++)
{
// Calculate dynamic aspiration window based on previous iterations
if (depth >= 5 && abs(Rml[MultiPVIdx].prevScore) < VALUE_KNOWN_WIN)
int prevDelta1 = bestValues[depth - 1] - bestValues[depth - 2];
int prevDelta2 = bestValues[depth - 2] - bestValues[depth - 3];
- aspirationDelta = Min(Max(abs(prevDelta1) + abs(prevDelta2) / 2, 16), 24);
+ aspirationDelta = std::min(std::max(abs(prevDelta1) + abs(prevDelta2) / 2, 16), 24);
aspirationDelta = (aspirationDelta + 7) / 8 * 8; // Round to match grainSize
- alpha = Max(Rml[MultiPVIdx].prevScore - aspirationDelta, -VALUE_INFINITE);
- beta = Min(Rml[MultiPVIdx].prevScore + aspirationDelta, VALUE_INFINITE);
+ alpha = std::max(Rml[MultiPVIdx].prevScore - aspirationDelta, -VALUE_INFINITE);
+ beta = std::min(Rml[MultiPVIdx].prevScore + aspirationDelta, VALUE_INFINITE);
}
else
{
// protocol requires to send all the PV lines also if are still
// to be searched and so refer to the previous search's score.
if ((value > alpha && value < beta) || current_search_time() > 2000)
- for (int i = 0; i < Min(UCIMultiPV, (int)Rml.size()); i++)
+ for (int i = 0; i < std::min(UCIMultiPV, (int)Rml.size()); i++)
{
bool updated = (i <= MultiPVIdx);
// research, otherwise exit the fail high/low loop.
if (value >= beta)
{
- beta = Min(beta + aspirationDelta, VALUE_INFINITE);
+ beta = std::min(beta + aspirationDelta, VALUE_INFINITE);
aspirationDelta += aspirationDelta / 2;
}
else if (value <= alpha)
AspirationFailLow = true;
StopOnPonderhit = false;
- alpha = Max(alpha - aspirationDelta, -VALUE_INFINITE);
+ alpha = std::max(alpha - aspirationDelta, -VALUE_INFINITE);
aspirationDelta += aspirationDelta / 2;
}
else
// Step 3. Mate distance pruning
if (!RootNode)
{
- alpha = Max(value_mated_in(ss->ply), alpha);
- beta = Min(value_mate_in(ss->ply+1), beta);
+ alpha = std::max(value_mated_in(ss->ply), alpha);
+ beta = std::min(value_mate_in(ss->ply+1), beta);
if (alpha >= beta)
return alpha;
}
if (refinedValue - PawnValueMidgame > beta)
R++;
- pos.do_null_move(st);
+ pos.do_null_move<true>(st);
(ss+1)->skipNullMove = true;
nullValue = depth-R*ONE_PLY < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -beta, -alpha, DEPTH_ZERO)
: - search<NonPV>(pos, ss+1, -beta, -alpha, depth-R*ONE_PLY);
(ss+1)->skipNullMove = false;
- pos.undo_null_move();
+ pos.do_null_move<false>(st);
if (nullValue >= beta)
{
&& !pos.is_passed_pawn_push(move))
{
futilityValue = futilityBase
- + piece_value_endgame(pos.piece_on(move_to(move)))
+ + PieceValueEndgame[pos.piece_on(move_to(move))]
+ (is_enpassant(move) ? PawnValueEndgame : VALUE_ZERO);
if (futilityValue < beta)
while (b)
{
victimSq = pop_1st_bit(&b);
- futilityValue = futilityBase + piece_value_endgame(pos.piece_on(victimSq));
+ futilityValue = futilityBase + PieceValueEndgame[pos.piece_on(victimSq)];
// Note that here we generate illegal "double move"!
if ( futilityValue >= beta
// Case 2: If the threatened piece has value less than or equal to the
// value of the threatening piece, don't prune moves which defend it.
if ( pos.is_capture(threat)
- && ( piece_value_midgame(pos.piece_on(tfrom)) >= piece_value_midgame(pos.piece_on(tto))
+ && ( PieceValueMidgame[pos.piece_on(tfrom)] >= PieceValueMidgame[pos.piece_on(tto)]
|| type_of(pos.piece_on(tfrom)) == KING)
&& pos.move_attacks_square(m, tto))
return true;
Value v = value_from_tt(tte->value(), ply);
return ( tte->depth() >= depth
- || v >= Max(VALUE_MATE_IN_PLY_MAX, beta)
- || v < Min(VALUE_MATED_IN_PLY_MAX, beta))
+ || v >= std::max(VALUE_MATE_IN_PLY_MAX, beta)
+ || v < std::min(VALUE_MATED_IN_PLY_MAX, beta))
&& ( ((tte->type() & VALUE_TYPE_LOWER) && v >= beta)
|| ((tte->type() & VALUE_TYPE_UPPER) && v < beta));
// Rml list is already sorted by score in descending order
int s;
int max_s = -VALUE_INFINITE;
- int size = Min(MultiPV, (int)Rml.size());
+ int size = std::min(MultiPV, (int)Rml.size());
int max = Rml[0].score;
- int var = Min(max - Rml[size - 1].score, PawnValueMidgame);
+ int var = std::min(max - Rml[size - 1].score, int(PawnValueMidgame));
int wk = 120 - 2 * SkillLevel;
// PRNG sequence should be non deterministic