1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

Save threadID info in Position

This is the best place because when we split we do a
copy of the position and also threadID, once set in a
given position, never changes anymore.

Forbid use of Position's default and copy c'tor to avoid
nasty bugs in case a position is created without explicitly
setting the threadID.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-06-02 20:13:51 +01:00
parent f148a8f6cc
commit 2f6927ac08
8 changed files with 32 additions and 22 deletions

View file

@ -151,7 +151,7 @@ void benchmark(const string& commandLine) {
{ {
Move moves[1] = {MOVE_NONE}; Move moves[1] = {MOVE_NONE};
int dummy[2] = {0, 0}; int dummy[2] = {0, 0};
Position pos(*it); Position pos(*it, 0);
cerr << "\nBench position: " << cnt << '/' << positions.size() << endl << endl; cerr << "\nBench position: " << cnt << '/' << positions.size() << endl << endl;
if (limitType == "perft") if (limitType == "perft")
{ {

View file

@ -403,7 +403,7 @@ Key EndgameFunctions::buildKey(const string& keyCode) {
s << char(upcase? toupper(keyCode[i]) : tolower(keyCode[i])); s << char(upcase? toupper(keyCode[i]) : tolower(keyCode[i]));
} }
s << 8 - keyCode.length() << "/8/8/8/8/8/8/8 w -"; s << 8 - keyCode.length() << "/8/8/8/8/8/8/8 w -";
return Position(s.str()).get_material_key(); return Position(s.str(), 0).get_material_key();
} }
const string EndgameFunctions::swapColors(const string& keyCode) { const string EndgameFunctions::swapColors(const string& keyCode) {

View file

@ -74,23 +74,23 @@ CheckInfo::CheckInfo(const Position& pos) {
} }
/// Position c'tors. Here we always create a slower but safer copy of /// Position c'tors. Here we always create a copy of the original position
/// the original position or the FEN string, we want the new born Position /// or the FEN string, we want the new born Position object do not depend
/// object do not depend on any external data. Instead if we know what we /// on any external data so we detach state pointer from the source one.
/// are doing and we need speed we can create a position with default
/// c'tor Position() and then use just fast_copy().
Position::Position() {} Position::Position(int th) : threadID(th) {}
Position::Position(const Position& pos) { Position::Position(const Position& pos, int th) {
memcpy(this, &pos, sizeof(Position)); memcpy(this, &pos, sizeof(Position));
detach(); // Always detach() in copy c'tor to avoid surprises detach(); // Always detach() in copy c'tor to avoid surprises
threadID = th;
} }
Position::Position(const string& fen) { Position::Position(const string& fen, int th) {
from_fen(fen); from_fen(fen);
threadID = th;
} }
@ -340,7 +340,7 @@ void Position::print(Move m) const {
std::cout << std::endl; std::cout << std::endl;
if (m != MOVE_NONE) if (m != MOVE_NONE)
{ {
Position p(*this); Position p(*this, thread());
string col = (color_of_piece_on(move_from(m)) == BLACK ? ".." : ""); string col = (color_of_piece_on(move_from(m)) == BLACK ? ".." : "");
std::cout << "Move is: " << col << move_to_san(p, m) << std::endl; std::cout << "Move is: " << col << move_to_san(p, m) << std::endl;
} }
@ -1785,6 +1785,7 @@ void Position::flipped_copy(const Position& pos) {
assert(pos.is_ok()); assert(pos.is_ok());
clear(); clear();
threadID = pos.thread();
// Board // Board
for (Square s = SQ_A1; s <= SQ_H8; s++) for (Square s = SQ_A1; s <= SQ_H8; s++)

View file

@ -139,6 +139,9 @@ class Position {
friend class MaterialInfo; friend class MaterialInfo;
friend class EndgameFunctions; friend class EndgameFunctions;
Position(); // No default or copy c'tor allowed
Position(const Position& pos);
public: public:
enum GamePhase { enum GamePhase {
MidGame, MidGame,
@ -146,9 +149,9 @@ public:
}; };
// Constructors // Constructors
Position(); explicit Position(int threadID);
explicit Position(const Position& pos); Position(const Position& pos, int threadID);
explicit Position(const std::string& fen); Position(const std::string& fen, int threadID);
// Text input/output // Text input/output
void from_fen(const std::string& fen); void from_fen(const std::string& fen);
@ -272,6 +275,7 @@ public:
bool has_pawn_on_7th(Color c) const; bool has_pawn_on_7th(Color c) const;
// Game ply information // Game ply information
int thread() const;
int ply() const; int ply() const;
void reset_ply(); void reset_ply();
@ -328,6 +332,7 @@ private:
int castleRightsMask[64]; int castleRightsMask[64];
StateInfo startState; StateInfo startState;
File initialKFile, initialKRFile, initialQRFile; File initialKFile, initialKRFile, initialQRFile;
int threadID;
StateInfo* st; StateInfo* st;
// Static variables // Static variables
@ -557,6 +562,10 @@ inline PieceType Position::captured_piece() const {
return st->capture; return st->capture;
} }
inline int Position::thread() const {
return threadID;
}
inline int Position::ply() const { inline int Position::ply() const {
return st->ply; return st->ply;
} }

View file

@ -299,7 +299,7 @@ const string line_to_san(const Position& pos, Move line[], int startColumn, bool
string moveStr; string moveStr;
size_t length = 0; size_t length = 0;
size_t maxLength = 80 - startColumn; size_t maxLength = 80 - startColumn;
Position p(pos); Position p(pos, pos.thread());
for (int i = 0; line[i] != MOVE_NONE; i++) for (int i = 0; line[i] != MOVE_NONE; i++)
{ {

View file

@ -603,7 +603,7 @@ namespace {
Value id_loop(const Position& pos, Move searchMoves[]) { Value id_loop(const Position& pos, Move searchMoves[]) {
Position p(pos); Position p(pos, pos.thread());
SearchStack ss[PLY_MAX_PLUS_2]; SearchStack ss[PLY_MAX_PLUS_2];
Move EasyMove = MOVE_NONE; Move EasyMove = MOVE_NONE;
Value value, alpha = -VALUE_INFINITE, beta = VALUE_INFINITE; Value value, alpha = -VALUE_INFINITE, beta = VALUE_INFINITE;
@ -1662,7 +1662,7 @@ namespace {
int moveCount; int moveCount;
value = -VALUE_INFINITE; value = -VALUE_INFINITE;
Position pos(*sp->pos); Position pos(*sp->pos, threadID);
CheckInfo ci(pos); CheckInfo ci(pos);
int ply = pos.ply(); int ply = pos.ply();
SearchStack* ss = sp->sstack[threadID] + 1; SearchStack* ss = sp->sstack[threadID] + 1;

View file

@ -205,7 +205,7 @@ void TranspositionTable::new_search() {
void TranspositionTable::insert_pv(const Position& pos, Move pv[]) { void TranspositionTable::insert_pv(const Position& pos, Move pv[]) {
StateInfo st; StateInfo st;
Position p(pos); Position p(pos, pos.thread());
for (int i = 0; pv[i] != MOVE_NONE; i++) for (int i = 0; pv[i] != MOVE_NONE; i++)
{ {
@ -227,7 +227,7 @@ void TranspositionTable::extract_pv(const Position& pos, Move pv[], const int PL
const TTEntry* tte; const TTEntry* tte;
StateInfo st; StateInfo st;
Position p(pos); Position p(pos, pos.thread());
int ply = 0; int ply = 0;
// Update position to the end of current PV // Update position to the end of current PV

View file

@ -54,7 +54,7 @@ namespace {
// The root position. This is set up when the user (or in practice, the GUI) // The root position. This is set up when the user (or in practice, the GUI)
// sends the "position" UCI command. The root position is sent to the think() // sends the "position" UCI command. The root position is sent to the think()
// function when the program receives the "go" command. // function when the program receives the "go" command.
Position RootPosition; Position RootPosition(0);
// Local functions // Local functions
bool handle_command(const string& command); bool handle_command(const string& command);
@ -143,7 +143,7 @@ namespace {
RootPosition.print(); RootPosition.print();
else if (token == "flip") else if (token == "flip")
{ {
Position p(RootPosition); Position p(RootPosition, RootPosition.thread());
RootPosition.flipped_copy(p); RootPosition.flipped_copy(p);
} }
else if (token == "eval") else if (token == "eval")
@ -308,7 +308,7 @@ namespace {
string token; string token;
int depth, tm, n; int depth, tm, n;
Position pos(RootPosition); Position pos(RootPosition, RootPosition.thread());
if (!(uip >> depth)) if (!(uip >> depth))
return; return;