Store moves sent with "position" UCI command
authorMarco Costalba <mcostalba@gmail.com>
Sat, 2 Mar 2013 12:03:56 +0000 (13:03 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sat, 2 Mar 2013 12:08:50 +0000 (13:08 +0100)
Store all the game moves until current position.

This will be used by next patch.

No functional change.

src/benchmark.cpp
src/search.cpp
src/search.h
src/thread.cpp
src/thread.h
src/uci.cpp

index 25dab6c..fa0aa3e 100644 (file)
@@ -114,6 +114,7 @@ void benchmark(const Position& current, istream& is) {
 
   int64_t nodes = 0;
   Search::StateStackPtr st;
+  Search::MovesVectPtr mv;
   Time::point elapsed = Time::now();
 
   for (size_t i = 0; i < fens.size(); i++)
@@ -130,7 +131,7 @@ void benchmark(const Position& current, istream& is) {
       }
       else
       {
-          Threads.start_thinking(pos, limits, vector<Move>(), st);
+          Threads.start_thinking(pos, limits, vector<Move>(), st, mv);
           Threads.wait_for_think_finished();
           nodes += Search::RootPos.nodes_searched();
       }
index 76653ff..15f09bc 100644 (file)
@@ -44,6 +44,7 @@ namespace Search {
   Color RootColor;
   Time::point SearchTime;
   StateStackPtr SetupStates;
+  MovesVectPtr SetupMoves;
 }
 
 using std::string;
index bd21023..73fa79a 100644 (file)
@@ -93,6 +93,7 @@ struct SignalsType {
 };
 
 typedef std::auto_ptr<std::stack<StateInfo> > StateStackPtr;
+typedef std::auto_ptr<std::vector<Move> > MovesVectPtr;
 
 extern volatile SignalsType Signals;
 extern LimitsType Limits;
@@ -101,6 +102,7 @@ extern Position RootPos;
 extern Color RootColor;
 extern Time::point SearchTime;
 extern StateStackPtr SetupStates;
+extern MovesVectPtr SetupMoves;
 
 extern void init();
 extern size_t perft(Position& pos, Depth depth);
index f5b8b5e..0d8070f 100644 (file)
@@ -357,8 +357,8 @@ void ThreadPool::wait_for_think_finished() {
 // start_thinking() wakes up the main thread sleeping in MainThread::idle_loop()
 // so to start a new search, then returns immediately.
 
-void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits,
-                                const std::vector<Move>& searchMoves, StateStackPtr& states) {
+void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits, const std::vector<Move>& searchMoves,
+                                StateStackPtr& setupStates, MovesVectPtr& setupMoves) {
   wait_for_think_finished();
 
   SearchTime = Time::now(); // As early as possible
@@ -368,7 +368,8 @@ void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits,
 
   RootPos = pos;
   Limits = limits;
-  SetupStates = states; // Ownership transfer here
+  SetupStates = setupStates; // Ownership transfer here
+  SetupMoves = setupMoves;   // Ownership transfer here
   RootMoves.clear();
 
   for (MoveList<LEGAL> ml(pos); !ml.end(); ++ml)
index fbd3b7f..ac6040f 100644 (file)
@@ -151,8 +151,8 @@ struct ThreadPool : public std::vector<Thread*> {
   void read_uci_options();
   Thread* available_slave(Thread* master) const;
   void wait_for_think_finished();
-  void start_thinking(const Position&, const Search::LimitsType&,
-                      const std::vector<Move>&, Search::StateStackPtr&);
+  void start_thinking(const Position&, const Search::LimitsType&, const std::vector<Move>&,
+                      Search::StateStackPtr&, Search::MovesVectPtr&);
 
   bool sleepWhileIdle;
   Depth minimumSplitDepth;
index c8f5044..3a33b9f 100644 (file)
@@ -42,6 +42,7 @@ namespace {
   // Keep track of position keys along the setup moves (from start position to the
   // position just before to start searching). Needed by repetition draw detection.
   Search::StateStackPtr SetupStates;
+  Search::MovesVectPtr SetupMoves;
 
   void set_option(istringstream& up);
   void set_position(Position& pos, istringstream& up);
@@ -148,10 +149,13 @@ namespace {
 
     pos.set(fen, Options["UCI_Chess960"], Threads.main_thread());
     SetupStates = Search::StateStackPtr(new std::stack<StateInfo>());
+    SetupMoves = Search::MovesVectPtr(new std::vector<Move>());
+    SetupMoves->reserve(200); // Try to avoid reallocations
 
     // Parse move list (if any)
     while (is >> token && (m = move_from_uci(pos, token)) != MOVE_NONE)
     {
+        SetupMoves->push_back(m);
         SetupStates->push(StateInfo());
         pos.do_move(m, SetupStates->top());
     }
@@ -211,6 +215,6 @@ namespace {
         else if (token == "ponder")    limits.ponder = true;
     }
 
-    Threads.start_thinking(pos, limits, searchMoves, SetupStates);
+    Threads.start_thinking(pos, limits, searchMoves, SetupStates, SetupMoves);
   }
 }