]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Remove a redundant check in passed pawn eval
[stockfish] / src / position.cpp
index 09daeba04ae10c6af40d68bee1b2697af24d7b32..176806976bb4234105d25826a973097537984b4a 100644 (file)
@@ -74,23 +74,23 @@ CheckInfo::CheckInfo(const Position& pos) {
 }
 
 
-/// Position c'tors. Here we always create a slower but safer copy of
-/// the original position or the FEN string, we want the new born Position
-/// object do not depend on any external data. Instead if we know what we
-/// are doing and we need speed we can create a position with default
-/// c'tor Position() and then use just fast_copy().
+/// Position c'tors. Here we always create a copy of the original position
+/// or the FEN string, we want the new born Position object do not depend
+/// on any external data so we detach state pointer from the source one.
 
-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));
   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);
+  threadID = th;
 }
 
 
@@ -340,7 +340,7 @@ void Position::print(Move m) const {
   std::cout << std::endl;
   if (m != MOVE_NONE)
   {
-      Position p(*this);
+      Position p(*this, thread());
       string col = (color_of_piece_on(move_from(m)) == BLACK ? ".." : "");
       std::cout << "Move is: " << col << move_to_san(p, m) << std::endl;
   }
@@ -641,10 +641,10 @@ bool Position::move_is_check(Move m, const CheckInfo& ci) const {
       }
   }
 
-  // En passant capture with check We have already handled the case
+  // En passant capture with check ? We have already handled the case
   // of direct checks and ordinary discovered check, the only case we
-  // need to handle is the unusual case of a discovered check through the
-  // captured pawn.
+  // need to handle is the unusual case of a discovered check through
+  // the captured pawn.
   if (move_is_ep(m))
   {
       Square capsq = make_square(square_file(to), square_rank(from));
@@ -703,7 +703,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
   // pointer to point to the new, ready to be updated, state.
   struct ReducedStateInfo {
     Key pawnKey, materialKey;
-    int castleRights, rule50, ply, pliesFromNull;
+    int castleRights, rule50, gamePly, pliesFromNull;
     Square epSquare;
     Score value;
     Value npMaterial[2];
@@ -715,7 +715,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
 
   // Save the current key to the history[] array, in order to be able to
   // detect repetition draws.
-  history[st->ply++] = key;
+  history[st->gamePly++] = key;
 
   // Update side to move
   key ^= zobSideToMove;
@@ -772,7 +772,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
   }
 
   // Prefetch TT access as soon as we know key is updated
-  TT.prefetch(key);
+  prefetch((char*)TT.first_entry(key));
 
   // Move the piece
   Bitboard move_bb = make_move_bb(from, to);
@@ -1243,14 +1243,14 @@ void Position::do_null_move(StateInfo& backupSt) {
 
   // Save the current key to the history[] array, in order to be able to
   // detect repetition draws.
-  history[st->ply++] = st->key;
+  history[st->gamePly++] = st->key;
 
   // Update the necessary information
   if (st->epSquare != SQ_NONE)
       st->key ^= zobEp[st->epSquare];
 
   st->key ^= zobSideToMove;
-  TT.prefetch(st->key);
+  prefetch((char*)TT.first_entry(st->key));
 
   sideToMove = opposite_color(sideToMove);
   st->epSquare = SQ_NONE;
@@ -1278,7 +1278,7 @@ void Position::undo_null_move() {
   // Update the necessary information
   sideToMove = opposite_color(sideToMove);
   st->rule50--;
-  st->ply--;
+  st->gamePly--;
 }
 
 
@@ -1307,11 +1307,11 @@ int Position::see_sign(Move m) const {
   Square from = move_from(m);
   Square to = move_to(m);
 
-  // Early return if SEE cannot be negative because capturing piece value
-  // is not bigger then captured one.
-  if (   midgame_value_of_piece_on(from) <= midgame_value_of_piece_on(to)
-      && type_of_piece_on(from) != KING)
-         return 1;
+  // Early return if SEE cannot be negative because captured piece value
+  // is not less then capturing one. Note that king moves always return
+  // here because king midgame value is set to 0.
+  if (midgame_value_of_piece_on(to) >= midgame_value_of_piece_on(from))
+      return 1;
 
   return see(from, to);
 }
@@ -1481,15 +1481,15 @@ void Position::clear() {
 }
 
 
-/// Position::reset_ply() simply sets ply to 0. It is used from the
+/// Position::reset_game_ply() simply sets gamePly to 0. It is used from the
 /// UCI interface code, whenever a non-reversible move is made in a
 /// 'position fen <fen> moves m1 m2 ...' command.  This makes it possible
 /// for the program to handle games of arbitrary length, as long as the GUI
 /// handles draws by the 50 move rule correctly.
 
-void Position::reset_ply() {
+void Position::reset_game_ply() {
 
-  st->ply = 0;
+  st->gamePly = 0;
 }
 
 
@@ -1666,11 +1666,9 @@ bool Position::is_draw() const {
   if (st->rule50 > 100 || (st->rule50 == 100 && !is_check()))
       return true;
 
-  assert(st->ply >= st->rule50);
-
-  // Draw by repetition?  
-  for (int i = 4, e = Min(st->rule50, st->pliesFromNull); i <= e; i += 2)
-      if (history[st->ply - i] == st->key)
+  // Draw by repetition?
+  for (int i = 4, e = Min(Min(st->gamePly, st->rule50), st->pliesFromNull); i <= e; i += 2)
+      if (history[st->gamePly - i] == st->key)
           return true;
 
   return false;
@@ -1785,6 +1783,7 @@ void Position::flipped_copy(const Position& pos) {
   assert(pos.is_ok());
 
   clear();
+  threadID = pos.thread();
 
   // Board
   for (Square s = SQ_A1; s <= SQ_H8; s++)