We just need to verify if a legal move is among the
SearchMoves, so we don't need a vector for this.
No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
#include <fstream>
#include <iostream>
#include <fstream>
#include <iostream>
#include <vector>
#include "misc.h"
#include <vector>
#include "misc.h"
- Threads.start_thinking(pos, limits, vector<Move>(), false);
+ Threads.start_thinking(pos, limits, set<Move>(), false);
nodes += RootPosition.nodes_searched();
}
}
nodes += RootPosition.nodes_searched();
}
}
volatile SignalsType Signals;
LimitsType Limits;
volatile SignalsType Signals;
LimitsType Limits;
- std::vector<Move> SearchMoves;
+ std::set<Move> SearchMoves;
static Book book; // Defined static to initialize the PRNG only once
static Book book; // Defined static to initialize the PRNG only once
Position& pos = RootPosition;
Chess960 = pos.is_chess960();
elapsed_time(true);
Position& pos = RootPosition;
Chess960 = pos.is_chess960();
elapsed_time(true);
// Populate RootMoves with all the legal moves (default) or, if a SearchMoves
// is given, with the subset of legal moves to search.
for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
// Populate RootMoves with all the legal moves (default) or, if a SearchMoves
// is given, with the subset of legal moves to search.
for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
- if (SearchMoves.empty() || count(SearchMoves.begin(), SearchMoves.end(), ml.move()))
+ if (SearchMoves.empty() || SearchMoves.count(ml.move()))
RootMoves.push_back(RootMove(ml.move()));
RootMoves.push_back(RootMove(ml.move()));
- if (Options["OwnBook"])
- Move bookMove = book.probe(pos, Options["Book File"], Options["Best Book Move"]);
+ cout << "info depth 0 score "
+ << score_to_uci(pos.in_check() ? -VALUE_MATE : VALUE_DRAW) << endl;
- if (bookMove && count(RootMoves.begin(), RootMoves.end(), bookMove))
- {
- std::swap(RootMoves[0], *find(RootMoves.begin(), RootMoves.end(), bookMove));
- goto finalize;
- }
+ RootMoves.push_back(MOVE_NONE);
+ goto finalize;
+ }
+
+ if ( Options["OwnBook"]
+ && (bm = book.probe(pos, Options["Book File"], Options["Best Book Move"])) != MOVE_NONE
+ && count(RootMoves.begin(), RootMoves.end(), bm))
+ {
+ std::swap(RootMoves[0], *find(RootMoves.begin(), RootMoves.end(), bm));
+ goto finalize;
}
// Read UCI options: GUI could change UCI parameters during the game
}
// Read UCI options: GUI could change UCI parameters during the game
- // When we reach max depth we arrive here even without a StopRequest, but if
- // we are pondering or in infinite search, we shouldn't print the best move
- // before we are told to do so.
+ // When we reach max depth we arrive here even without Signals.stop is raised,
+ // but if we are pondering or in infinite search, we shouldn't print the best
+ // move before we are told to do so.
if (!Signals.stop && (Limits.ponder || Limits.infinite))
Threads.wait_for_stop_or_ponderhit();
if (!Signals.stop && (Limits.ponder || Limits.infinite))
Threads.wait_for_stop_or_ponderhit();
bestValue = delta = -VALUE_INFINITE;
ss->currentMove = MOVE_NULL; // Hack to skip update gains
bestValue = delta = -VALUE_INFINITE;
ss->currentMove = MOVE_NULL; // Hack to skip update gains
- // Handle the special case of a mated/stalemate position
- if (RootMoves.empty())
- {
- cout << "info depth 0 score "
- << score_to_uci(pos.in_check() ? -VALUE_MATE : VALUE_DRAW) << endl;
-
- RootMoves.push_back(MOVE_NONE);
- return;
- }
-
// Iterative deepening loop until requested to stop or target depth reached
while (!Signals.stop && ++depth <= MAX_PLY && (!Limits.maxDepth || depth <= Limits.maxDepth))
{
// Iterative deepening loop until requested to stop or target depth reached
while (!Signals.stop && ++depth <= MAX_PLY && (!Limits.maxDepth || depth <= Limits.maxDepth))
{
#define SEARCH_H_INCLUDED
#include <cstring>
#define SEARCH_H_INCLUDED
#include <cstring>
extern volatile SignalsType Signals;
extern LimitsType Limits;
extern volatile SignalsType Signals;
extern LimitsType Limits;
-extern std::vector<Move> SearchMoves;
+extern std::set<Move> SearchMoves;
extern Position RootPosition;
extern void init();
extern Position RootPosition;
extern void init();
// the search to finish.
void ThreadsManager::start_thinking(const Position& pos, const LimitsType& limits,
// the search to finish.
void ThreadsManager::start_thinking(const Position& pos, const LimitsType& limits,
- const std::vector<Move>& searchMoves, bool asyncMode) {
+ const std::set<Move>& searchMoves, bool asyncMode) {
Thread& main = threads[0];
lock_grab(&main.sleepLock);
Thread& main = threads[0];
lock_grab(&main.sleepLock);
#define THREAD_H_INCLUDED
#include <cstring>
#define THREAD_H_INCLUDED
#include <cstring>
#include "lock.h"
#include "material.h"
#include "lock.h"
#include "material.h"
void wait_for_stop_or_ponderhit();
void stop_thinking();
void start_thinking(const Position& pos, const Search::LimitsType& limits,
void wait_for_stop_or_ponderhit();
void stop_thinking();
void start_thinking(const Position& pos, const Search::LimitsType& limits,
- const std::vector<Move>& searchMoves, bool asyncMode);
+ const std::set<Move>& searchMoves, bool asyncMode);
template <bool Fake>
Value split(Position& pos, Search::Stack* ss, Value alpha, Value beta, Value bestValue,
template <bool Fake>
Value split(Position& pos, Search::Stack* ss, Value alpha, Value beta, Value bestValue,
string token;
Search::LimitsType limits;
string token;
Search::LimitsType limits;
- std::vector<Move> searchMoves;
+ std::set<Move> searchMoves;
int time[] = { 0, 0 }, inc[] = { 0, 0 };
while (is >> token)
int time[] = { 0, 0 }, inc[] = { 0, 0 };
while (is >> token)
is >> limits.maxTime;
else if (token == "searchmoves")
while (is >> token)
is >> limits.maxTime;
else if (token == "searchmoves")
while (is >> token)
- searchMoves.push_back(move_from_uci(pos, token));
+ searchMoves.insert(move_from_uci(pos, token));
}
limits.time = time[pos.side_to_move()];
}
limits.time = time[pos.side_to_move()];