]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Retire zobMaterial[]
[stockfish] / src / position.cpp
index a389e9c05a6e77d3892ae240b644a3ee730062e7..cd2a596572b48e7958e4dc9dcd855d87be27bb6a 100644 (file)
@@ -1,7 +1,7 @@
 /*
   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
-  Copyright (C) 2008-2009 Marco Costalba
+  Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
 
   Stockfish is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -44,12 +44,9 @@ using std::string;
 //// Variables
 ////
 
-int Position::castleRightsMask[64];
-
 Key Position::zobrist[2][8][64];
 Key Position::zobEp[64];
 Key Position::zobCastle[16];
-Key Position::zobMaterial[2][8][16];
 Key Position::zobSideToMove;
 Key Position::zobExclusion;
 
@@ -87,7 +84,7 @@ Position::Position() {}
 
 Position::Position(const Position& pos) {
 
-  fast_copy(pos);
+  memcpy(this, &pos, sizeof(Position));
   detach(); // Always detach() in copy c'tor to avoid surprises
 }
 
@@ -97,19 +94,6 @@ Position::Position(const string& fen) {
 }
 
 
-/// Position::fast_copy() creates a partial copy of the given position,
-/// only data that changes with a do_move() / undo_move() cycle is copied,
-/// in particular for stateInfo are copied only the pointers, so that the
-/// actual data remains stored in the parent Position. This is not a problem
-/// if the parent Position is known not to be destroyed while we are still alive,
-/// as is the common case, see detach() otherwise.
-
-void Position::fast_copy(const Position& pos) {
-
-  memcpy(this, &pos, sizeof(Position));
-}
-
-
 /// Position::detach() copies the content of the current state and castling
 /// masks inside the position itself. This is needed when the st pointee could
 /// become stale, as example because the caller is about to going out of scope.
@@ -712,7 +696,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
   assert(is_ok());
   assert(move_is_ok(m));
 
-  Bitboard key = st->key;
+  Key key = st->key;
 
   // Copy some fields of old state to our new StateInfo object except the
   // ones which are recalculated from scratch anyway, then switch our state
@@ -843,13 +827,13 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
       set_bit(&(byTypeBB[promotion]), to);
       board[to] = piece_of_color_and_type(us, promotion);
 
-      // Update material key
-      st->materialKey ^= zobMaterial[us][PAWN][pieceCount[us][PAWN]];
-      st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]+1];
-
-      // Update piece counts
-      pieceCount[us][PAWN]--;
+      // Update piece counts      
       pieceCount[us][promotion]++;
+      pieceCount[us][PAWN]--;
+
+      // Update material key
+      st->materialKey ^= zobrist[us][PAWN][pieceCount[us][PAWN]];
+      st->materialKey ^= zobrist[us][promotion][pieceCount[us][promotion]-1];
 
       // Update piece lists, move the last pawn at index[to] position
       // and shrink the list. Add a new promotion piece to the list.
@@ -911,7 +895,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
 /// Position::do_capture_move() is a private method used to update captured
 /// piece info. It is called from the main Position::do_move function.
 
-void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Square to, bool ep) {
+void Position::do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep) {
 
     assert(capture != KING);
 
@@ -947,12 +931,12 @@ void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Squ
     else
         st->npMaterial[them] -= piece_value_midgame(capture);
 
-    // Update material hash key
-    st->materialKey ^= zobMaterial[them][capture][pieceCount[them][capture]];
-
     // Update piece count
     pieceCount[them][capture]--;
 
+    // Update material hash key
+    st->materialKey ^= zobrist[them][capture][pieceCount[them][capture]];
+
     // Update piece list, move the last piece at index[capsq] position
     //
     // WARNING: This is a not perfectly revresible operation. When we
@@ -1613,8 +1597,8 @@ Key Position::compute_material_key() const {
       for (PieceType pt = PAWN; pt <= QUEEN; pt++)
       {
           int count = piece_count(c, pt);
-          for (int i = 0; i <= count; i++)
-              result ^= zobMaterial[c][pt][i];
+          for (int i = 0; i < count; i++)
+              result ^= zobrist[c][pt][i];
       }
   return result;
 }
@@ -1673,6 +1657,7 @@ Value Position::compute_non_pawn_material(Color c) const {
 /// Position::is_draw() tests whether the position is drawn by material,
 /// repetition, or the 50 moves rule. It does not detect stalemates, this
 /// must be done by the search.
+// FIXME: Currently we are not handling 50 move rule correctly when in check
 
 bool Position::is_draw() const {
 
@@ -1686,7 +1671,7 @@ bool Position::is_draw() const {
       return true;
 
   // Draw by repetition?
-  for (int i = 2; i < Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2)
+  for (int i = 4; i <= Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2)
       if (history[gamePly - i] == st->key)
           return true;
 
@@ -1766,15 +1751,6 @@ void Position::init_zobrist() {
       zobCastle[i] = genrand_int64();
 
   zobSideToMove = genrand_int64();
-
-  for (int i = 0; i < 2; i++)
-      for (int j = 0; j < 8; j++)
-          for (int k = 0; k < 16; k++)
-              zobMaterial[i][j][k] = (k > 0)? Key(genrand_int64()) : Key(0LL);
-
-  for (int i = 0; i < 16; i++)
-      zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = Key(0ULL);
-
   zobExclusion = genrand_int64();
 }