]> git.sesse.net Git - stockfish/commitdiff
Split PSQT init from Position init
authorMarco Costalba <mcostalba@gmail.com>
Sat, 2 May 2015 00:36:39 +0000 (02:36 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 3 May 2015 18:07:15 +0000 (20:07 +0200)
Easier for tuning psq tables:

TUNE(myParameters, PSQT::init);

Also move PSQT code in a new *.cpp file, and retire the
old and hacky psqtab.h that required to be included only
once to work correctly, this is not idiomatic for a header
file.

Give wide visibility to psq tables (previously visible only
in position.cpp), this will easy the use of psq tables outside
Position, for instance in move ordering.

Finally trivial code style fixes of the latest patches.

Original patch of Lucas Braesch.

No functional change.

src/Makefile
src/main.cpp
src/movepick.cpp
src/position.cpp
src/position.h
src/psqt.cpp [moved from src/psqtab.h with 84% similarity]
src/search.cpp

index 65ef297ee837bc3c37566e8e2f33ddb3f212e92c..840312d972c8b4c473cb1e4cebba87ae2b0fda90 100644 (file)
@@ -35,7 +35,7 @@ PGOBENCH = ./$(EXE) bench 16 1 1000 default time
 
 ### Object files
 OBJS = benchmark.o bitbase.o bitboard.o endgame.o evaluate.o main.o \
 
 ### Object files
 OBJS = benchmark.o bitbase.o bitboard.o endgame.o evaluate.o main.o \
-       material.o misc.o movegen.o movepick.o pawns.o position.o \
+       material.o misc.o movegen.o movepick.o pawns.o position.o psqt.o \
        search.o thread.o timeman.o tt.o uci.o ucioption.o syzygy/tbprobe.o
 
 ### ==========================================================================
        search.o thread.o timeman.o tt.o uci.o ucioption.o syzygy/tbprobe.o
 
 ### ==========================================================================
index 8cdf9e6f895b4e2b863260e29b2cab10fc13ed92..adc13db488a4182f022fa94c9be3b221970859d8 100644 (file)
@@ -33,6 +33,7 @@ int main(int argc, char* argv[]) {
   std::cout << engine_info() << std::endl;
 
   UCI::init(Options);
   std::cout << engine_info() << std::endl;
 
   UCI::init(Options);
+  PSQT::init();
   Bitboards::init();
   Position::init();
   Bitbases::init();
   Bitboards::init();
   Position::init();
   Bitbases::init();
index 3fe09bb7391260bdf94f6eee465c86dee3f82374..914cd80e422eddf58dfdd9bf81b70e11a001718a 100644 (file)
@@ -147,9 +147,9 @@ void MovePicker::score<CAPTURES>() {
   // badCaptures[] array, but instead of doing it now we delay until the move
   // has been picked up in pick_move_from_list(). This way we save some SEE
   // calls in case we get a cutoff.
   // badCaptures[] array, but instead of doing it now we delay until the move
   // has been picked up in pick_move_from_list(). This way we save some SEE
   // calls in case we get a cutoff.
-  for (auto& m : *this){
-      m.value = PieceValue[MG][pos.piece_on(to_sq(m))] - 200*relative_rank(pos.side_to_move(), to_sq(m));
-  }
+  for (auto& m : *this)
+      m.value =  PieceValue[MG][pos.piece_on(to_sq(m))]
+               - 200 * relative_rank(pos.side_to_move(), to_sq(m));
 }
 
 template<>
 }
 
 template<>
index 573b5df59a7885071a73855d9a0ff49739f0227b..1aa476b6dea9529d5a68cc565c86716f44a6b27f 100644 (file)
@@ -27,7 +27,6 @@
 #include "misc.h"
 #include "movegen.h"
 #include "position.h"
 #include "misc.h"
 #include "movegen.h"
 #include "position.h"
-#include "psqtab.h"
 #include "thread.h"
 #include "tt.h"
 #include "uci.h"
 #include "thread.h"
 #include "tt.h"
 #include "uci.h"
@@ -52,7 +51,6 @@ Key Position::exclusion_key() const { return st->key ^ Zobrist::exclusion; }
 namespace {
 
 const string PieceToChar(" PNBRQK  pnbrqk");
 namespace {
 
 const string PieceToChar(" PNBRQK  pnbrqk");
-Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
 
 // min_attacker() is a helper function used by see() to locate the least
 // valuable attacker for the side to move, remove the attacker we just found
 
 // min_attacker() is a helper function used by see() to locate the least
 // valuable attacker for the side to move, remove the attacker we just found
@@ -130,10 +128,7 @@ std::ostream& operator<<(std::ostream& os, const Position& pos) {
 
 
 /// Position::init() initializes at startup the various arrays used to compute
 
 
 /// Position::init() initializes at startup the various arrays used to compute
-/// hash keys and the piece square tables. The latter is a two-step operation:
-/// Firstly, the white halves of the tables are copied from PSQT[] tables.
-/// Secondly, the black halves of the tables are initialized by flipping and
-/// changing the sign of the white scores.
+/// hash keys.
 
 void Position::init() {
 
 
 void Position::init() {
 
@@ -160,20 +155,6 @@ void Position::init() {
 
   Zobrist::side = rng.rand<Key>();
   Zobrist::exclusion  = rng.rand<Key>();
 
   Zobrist::side = rng.rand<Key>();
   Zobrist::exclusion  = rng.rand<Key>();
-
-  for (PieceType pt = PAWN; pt <= KING; ++pt)
-  {
-      PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt];
-      PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt];
-
-      Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]);
-
-      for (Square s = SQ_A1; s <= SQ_H8; ++s)
-      {
-         psq[WHITE][pt][ s] =  (v + PSQT[pt][s]);
-         psq[BLACK][pt][~s] = -(v + PSQT[pt][s]);
-      }
-  }
 }
 
 
 }
 
 
@@ -373,7 +354,7 @@ void Position::set_state(StateInfo* si) const {
       Square s = pop_lsb(&b);
       Piece pc = piece_on(s);
       si->key ^= Zobrist::psq[color_of(pc)][type_of(pc)][s];
       Square s = pop_lsb(&b);
       Piece pc = piece_on(s);
       si->key ^= Zobrist::psq[color_of(pc)][type_of(pc)][s];
-      si->psq += psq[color_of(pc)][type_of(pc)][s];
+      si->psq += PSQT::psq[color_of(pc)][type_of(pc)][s];
   }
 
   if (si->epSquare != SQ_NONE)
   }
 
   if (si->epSquare != SQ_NONE)
@@ -725,7 +706,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
       do_castling<true>(us, from, to, rfrom, rto);
 
       captured = NO_PIECE_TYPE;
       do_castling<true>(us, from, to, rfrom, rto);
 
       captured = NO_PIECE_TYPE;
-      st->psq += psq[us][ROOK][rto] - psq[us][ROOK][rfrom];
+      st->psq += PSQT::psq[us][ROOK][rto] - PSQT::psq[us][ROOK][rfrom];
       k ^= Zobrist::psq[us][ROOK][rfrom] ^ Zobrist::psq[us][ROOK][rto];
   }
 
       k ^= Zobrist::psq[us][ROOK][rfrom] ^ Zobrist::psq[us][ROOK][rto];
   }
 
@@ -764,7 +745,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
       prefetch(thisThread->materialTable[st->materialKey]);
 
       // Update incremental scores
       prefetch(thisThread->materialTable[st->materialKey]);
 
       // Update incremental scores
-      st->psq -= psq[them][captured][capsq];
+      st->psq -= PSQT::psq[them][captured][capsq];
 
       // Reset rule 50 counter
       st->rule50 = 0;
 
       // Reset rule 50 counter
       st->rule50 = 0;
@@ -820,7 +801,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
                             ^ Zobrist::psq[us][PAWN][pieceCount[us][PAWN]];
 
           // Update incremental score
                             ^ Zobrist::psq[us][PAWN][pieceCount[us][PAWN]];
 
           // Update incremental score
-          st->psq += psq[us][promotion][to] - psq[us][PAWN][to];
+          st->psq += PSQT::psq[us][promotion][to] - PSQT::psq[us][PAWN][to];
 
           // Update material
           st->nonPawnMaterial[us] += PieceValue[MG][promotion];
 
           // Update material
           st->nonPawnMaterial[us] += PieceValue[MG][promotion];
@@ -835,7 +816,7 @@ void Position::do_move(Move m, StateInfo& newSt, bool givesCheck) {
   }
 
   // Update incremental scores
   }
 
   // Update incremental scores
-  st->psq += psq[us][pt][to] - psq[us][pt][from];
+  st->psq += PSQT::psq[us][pt][to] - PSQT::psq[us][pt][from];
 
   // Set capture piece
   st->capturedType = captured;
 
   // Set capture piece
   st->capturedType = captured;
index ece3f44232e9411222248dcc0fe4519aab09523a..e38020d5b5a2188661103f46f4e12506ff1e48e8 100644 (file)
 class Position;
 struct Thread;
 
 class Position;
 struct Thread;
 
+namespace PSQT {
+
+  extern Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
+
+  void init();
+}
+
 /// CheckInfo struct is initialized at c'tor time and keeps info used to detect
 /// if a move gives check.
 
 /// CheckInfo struct is initialized at c'tor time and keeps info used to detect
 /// if a move gives check.
 
similarity index 84%
rename from src/psqtab.h
rename to src/psqt.cpp
index 57fb30b94f842bd1a78bc6376dd6aea11a6fc936..32601c0a56cafbdaddc2f1f2e23f5582c0eb9eae 100644 (file)
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef PSQTAB_H_INCLUDED
-#define PSQTAB_H_INCLUDED
-
 #include "types.h"
 
 #include "types.h"
 
-#define S(mg, eg) make_score(mg, eg)
-
+namespace PSQT {
 
 
-/// PSQT[PieceType][Square] contains Piece-Square scores. For each piece type on
-/// a given square a (middlegame, endgame) score pair is assigned. PSQT is defined
-/// for the white side and the tables are symmetric for the black side.
+#define S(mg, eg) make_score(mg, eg)
 
 
-static const Score PSQT[][SQUARE_NB] = {
+/// BaseTable[PieceType][Square] contains Piece-Square scores. For each piece
+/// type on a given square a (middlegame, endgame) score pair is assigned. Table
+/// is defined just for the white side; it is symmetric for the black side.
+const Score BaseTable[][SQUARE_NB] = {
   { },
   { // Pawn
    S(  0, 0), S(  0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S(  0, 0), S(  0, 0),
   { },
   { // Pawn
    S(  0, 0), S(  0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S( 0, 0), S(  0, 0), S(  0, 0),
@@ -95,4 +92,23 @@ static const Score PSQT[][SQUARE_NB] = {
 
 #undef S
 
 
 #undef S
 
-#endif // #ifndef PSQTAB_H_INCLUDED
+Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB];
+
+// init() initializes piece square tables: the white halves of the tables are
+// copied from BaseTable[] adding the piece value, then the black halves of the
+// tables are initialized by flipping and changing the sign of the white scores.
+void init() {
+
+  for (PieceType pt = PAWN; pt <= KING; ++pt)
+  {
+      PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt];
+      PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt];
+
+      Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]);
+
+      for (Square s = SQ_A1; s <= SQ_H8; ++s)
+          psq[BLACK][pt][~s] = -(psq[WHITE][pt][ s] = (v + BaseTable[pt][s]));
+  }
+}
+
+} // namespace PSQT
index 636b1db404e4424721e42473108cb36869aaa21b..18e0cb95af9abaa1cb15a03d7ae173fdeb3f87fc 100644 (file)
@@ -961,7 +961,8 @@ moves_loop: // When in check and at SpNode search starts from here
 
           if (   (!PvNode && cutNode)
               || (   History[pos.piece_on(to_sq(move))][to_sq(move)] < VALUE_ZERO
 
           if (   (!PvNode && cutNode)
               || (   History[pos.piece_on(to_sq(move))][to_sq(move)] < VALUE_ZERO
-                  && CounterMovesHistory[pos.piece_on(prevMoveSq)][prevMoveSq][pos.piece_on(to_sq(move))][to_sq(move)] <= VALUE_ZERO))
+                  && CounterMovesHistory[pos.piece_on(prevMoveSq)][prevMoveSq]
+                                        [pos.piece_on(to_sq(move))][to_sq(move)] <= VALUE_ZERO))
               ss->reduction += ONE_PLY;
 
           if (move == countermove)
               ss->reduction += ONE_PLY;
 
           if (move == countermove)