X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=0068cbcac2e609079da443003ca267a87745c933;hp=bb09df984b7d301b9c3c93d6faa9f9eded4a68ec;hb=918c29f83ab8a013d3946916887e1d1d7b9cfb9a;hpb=64d29a633066e39b62af5ee0bbf32645994744ec diff --git a/src/search.cpp b/src/search.cpp index bb09df98..0068cbca 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -45,6 +45,7 @@ namespace Search { Color RootColor; Time::point SearchTime; StateStackPtr SetupStates; + Value Contempt[2]; // [bestValue > VALUE_DRAW] } using std::string; @@ -60,13 +61,13 @@ namespace { enum NodeType { Root, PV, NonPV, SplitPointRoot, SplitPointPV, SplitPointNonPV }; // Dynamic razoring margin based on depth - inline Value razor_margin(Depth d) { return Value(512 + 16 * int(d)); } + inline Value razor_margin(Depth d) { return Value(512 + 16 * d); } // Futility lookup tables (initialized at startup) and their access functions int FutilityMoveCounts[2][32]; // [improving][depth] inline Value futility_margin(Depth d) { - return Value(100 * int(d)); + return Value(100 * d); } // Reduction lookup tables (initialized at startup) and their access function @@ -129,8 +130,8 @@ void Search::init() { { double pvRed = 0.00 + log(double(hd)) * log(double(mc)) / 3.00; double nonPVRed = 0.33 + log(double(hd)) * log(double(mc)) / 2.25; - Reductions[1][1][hd][mc] = (int8_t) ( pvRed >= 1.0 ? floor( pvRed * int(ONE_PLY)) : 0); - Reductions[0][1][hd][mc] = (int8_t) (nonPVRed >= 1.0 ? floor(nonPVRed * int(ONE_PLY)) : 0); + Reductions[1][1][hd][mc] = int8_t( pvRed >= 1.0 ? pvRed * int(ONE_PLY) : 0); + Reductions[0][1][hd][mc] = int8_t(nonPVRed >= 1.0 ? nonPVRed * int(ONE_PLY) : 0); Reductions[1][0][hd][mc] = Reductions[1][1][hd][mc]; Reductions[0][0][hd][mc] = Reductions[0][1][hd][mc]; @@ -185,9 +186,9 @@ void Search::think() { RootColor = RootPos.side_to_move(); TimeMgr.init(Limits, RootPos.game_ply(), RootColor); - int cf = Options["Contempt Factor"] * PawnValueMg / 100; // From centipawns - DrawValue[ RootColor] = VALUE_DRAW - Value(cf); - DrawValue[~RootColor] = VALUE_DRAW + Value(cf); + DrawValue[0] = DrawValue[1] = VALUE_DRAW; + Contempt[0] = Options["Contempt Factor"] * PawnValueEg / 100; // From centipawns + Contempt[1] = (Options["Contempt Factor"] + 12) * PawnValueEg / 100; if (RootMoves.empty()) { @@ -339,6 +340,9 @@ namespace { { bestValue = search(pos, ss, alpha, beta, depth * ONE_PLY, false); + DrawValue[ RootColor] = VALUE_DRAW - Contempt[bestValue > VALUE_DRAW]; + DrawValue[~RootColor] = VALUE_DRAW + Contempt[bestValue > VALUE_DRAW]; + // Bring the best move to the front. It is critical that sorting // is done with a stable algorithm because all the values but the // first and eventually the new best one are set to -VALUE_INFINITE @@ -679,7 +683,7 @@ namespace { // Step 10. Internal iterative deepening (skipped when in check) if ( depth >= (PvNode ? 5 * ONE_PLY : 8 * ONE_PLY) && !ttMove - && (PvNode || ss->staticEval + Value(256) >= beta)) + && (PvNode || ss->staticEval + 256 >= beta)) { Depth d = depth - 2 * ONE_PLY - (PvNode ? DEPTH_ZERO : depth / 4); @@ -819,7 +823,7 @@ moves_loop: // When in check and at SpNode search starts from here if (predictedDepth < 7 * ONE_PLY) { futilityValue = ss->staticEval + futility_margin(predictedDepth) - + Value(128) + Gains[pos.moved_piece(move)][to_sq(move)]; + + 128 + Gains[pos.moved_piece(move)][to_sq(move)]; if (futilityValue <= alpha) { @@ -1124,7 +1128,7 @@ moves_loop: // When in check and at SpNode search starts from here if (PvNode && bestValue > alpha) alpha = bestValue; - futilityBase = bestValue + Value(128); + futilityBase = bestValue + 128; } // Initialize a MovePicker object for the current position, and prepare