X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=d61fca1bca5a3d5d91749f9ad2f1a1966f1349e4;hp=61d0c4b2aaaadc36880ba5e59bcd00a8c58358dc;hb=4f6aa152284e80094467ea0051bb58b004042555;hpb=9a10313a9d72c16c90b46187ee41988abdfe1d86 diff --git a/src/search.cpp b/src/search.cpp index 61d0c4b2..d61fca1b 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -127,6 +127,35 @@ namespace { Move pv[3]; }; + // Set of rows with half bits set to 1 and half to 0. It is used to allocate + // the search depths across the threads. + typedef std::vector Row; + + const Row HalfDensity[] = { + {0, 1}, + {1, 0}, + {0, 0, 1, 1}, + {0, 1, 1, 0}, + {1, 1, 0, 0}, + {1, 0, 0, 1}, + {0, 0, 0, 1, 1, 1}, + {0, 0, 1, 1, 1, 0}, + {0, 1, 1, 1, 0, 0}, + {1, 1, 1, 0, 0, 0}, + {1, 1, 0, 0, 0, 1}, + {1, 0, 0, 0, 1, 1}, + {0, 0, 0, 0, 1, 1, 1, 1}, + {0, 0, 0, 1, 1, 1, 1, 0}, + {0, 0, 1, 1, 1, 1, 0 ,0}, + {0, 1, 1, 1, 1, 0, 0 ,0}, + {1, 1, 1, 1, 0, 0, 0 ,0}, + {1, 1, 1, 0, 0, 0, 0 ,1}, + {1, 1, 0, 0, 0, 0, 1 ,1}, + {1, 0, 0, 0, 0, 1, 1 ,1}, + }; + + const size_t HalfDensitySize = std::extent::value; + EasyMoveManager EasyMove; Value DrawValue[COLOR_NB]; CounterMoveHistoryStats CounterMoveHistory; @@ -353,33 +382,6 @@ void MainThread::search() { std::cout << sync_endl; } -const int halfDensityMap[][9] = -{ - {2, 0, 1}, - {2, 1, 0}, - - {4, 0, 0, 1, 1}, - {4, 0, 1, 1, 0}, - {4, 1, 1, 0, 0}, - {4, 1, 0, 0, 1}, - - {6, 0, 0, 0, 1, 1, 1}, - {6, 0, 0, 1, 1, 1, 0}, - {6, 0, 1, 1, 1, 0, 0}, - {6, 1, 1, 1, 0, 0, 0}, - {6, 1, 1, 0, 0, 0, 1}, - {6, 1, 0, 0, 0, 1, 1}, - - {8, 0, 0, 0, 0, 1, 1, 1, 1}, - {8, 0, 0, 0, 1, 1, 1, 1, 0}, - {8, 0, 0, 1, 1, 1, 1, 0 ,0}, - {8, 0, 1, 1, 1, 1, 0, 0 ,0}, - {8, 1, 1, 1, 1, 0, 0, 0 ,0}, - {8, 1, 1, 1, 0, 0, 0, 0 ,1}, - {8, 1, 1, 0, 0, 0, 0, 1 ,1}, - {8, 1, 0, 0, 0, 0, 1, 1 ,1}, -}; - // Thread::search() is the main iterative deepening loop. It calls search() // repeatedly with increasing depth until the allocated thinking time has been @@ -424,8 +426,8 @@ void Thread::search() { // 2nd ply (using a half-density matrix). if (!mainThread) { - int row = (idx - 1) % 20; - if (halfDensityMap[row][(rootDepth + rootPos.game_ply()) % halfDensityMap[row][0] + 1]) + const Row& row = HalfDensity[(idx - 1) % HalfDensitySize]; + if (row[(rootDepth + rootPos.game_ply()) % row.size()]) continue; } @@ -544,10 +546,6 @@ void Thread::search() { { if (!Signals.stop && !Signals.stopOnPonderhit) { - // Take some extra time if the best move has changed - if (rootDepth > 4 * ONE_PLY && multiPV == 1) - Time.pv_instability(mainThread->bestMoveChanges); - // Stop the search if only one legal move is available, or if all // of the available time has been used, or if we matched an easyMove // from the previous search and just did a fast verification. @@ -555,13 +553,14 @@ void Thread::search() { bestValue >= mainThread->previousScore }; int improvingFactor = 640 - 160*F[0] - 126*F[1] - 124*F[0]*F[1]; + double unstablePvFactor = 1 + mainThread->bestMoveChanges; bool doEasyMove = rootMoves[0].pv[0] == easyMove && mainThread->bestMoveChanges < 0.03 - && Time.elapsed() > Time.available() * 25 / 206; + && Time.elapsed() > Time.optimum() * 25 / 204; if ( rootMoves.size() == 1 - || Time.elapsed() > Time.available() * improvingFactor / 640 + || Time.elapsed() > Time.optimum() * unstablePvFactor * improvingFactor / 634 || (mainThread->easyMovePlayed = doEasyMove)) { // If we are allowed to ponder do not stop the search now but