X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmaterial.cpp;h=d13b309192039e1ad600d04317bf9d725f632ccf;hp=7ad5dc47e891b57a4d9717ee1a793dba3bb8d3a2;hb=304deb5e833baf47c147e93377f5c7ef582ab822;hpb=6963c3802d73c61396af32eb7fc6a4e4a76763ae diff --git a/src/material.cpp b/src/material.cpp index 7ad5dc47..d13b3091 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -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-2010 Marco Costalba, Joona Kiiski, Tord Romstad + Copyright (C) 2008-2012 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 @@ -19,6 +19,7 @@ #include #include +#include #include "material.h" @@ -83,22 +84,15 @@ namespace { } // namespace -/// MaterialInfoTable c'tor and d'tor allocate and free the space for Endgames +/// MaterialTable::probe() takes a position object as input, looks up a MaterialEntry +/// object, and returns a pointer to it. If the material configuration is not +/// already present in the table, it is computed and stored there, so we don't +/// have to recompute everything when the same material configuration occurs again. -void MaterialInfoTable::init() { Base::init(); if (!funcs) funcs = new Endgames(); } -MaterialInfoTable::~MaterialInfoTable() { delete funcs; } +MaterialEntry* MaterialTable::probe(const Position& pos) const { - -/// MaterialInfoTable::get_material_info() takes a position object as input, -/// computes or looks up a MaterialInfo object, and returns a pointer to it. -/// If the material configuration is not already present in the table, it -/// is stored there, so we don't have to recompute everything when the -/// same material configuration occurs again. - -MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) const { - - Key key = pos.get_material_key(); - MaterialInfo* mi = probe(key); + Key key = pos.material_key(); + MaterialEntry* mi = Base::probe(key); // If mi->key matches the position's material hash key, it means that we // have analysed this material configuration before, and we can simply @@ -106,13 +100,10 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) const { if (mi->key == key) return mi; - // Initialize MaterialInfo entry - memset(mi, 0, sizeof(MaterialInfo)); + memset(mi, 0, sizeof(MaterialEntry)); mi->key = key; mi->factor[WHITE] = mi->factor[BLACK] = (uint8_t)SCALE_FACTOR_NORMAL; - - // Store game phase - mi->gamePhase = MaterialInfoTable::game_phase(pos); + mi->gamePhase = MaterialTable::game_phase(pos); // Let's look if we have a specialized evaluation function for this // particular material configuration. First we look for a fixed @@ -142,7 +133,7 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) const { if ( pos.piece_count(WHITE, BISHOP) + pos.piece_count(WHITE, KNIGHT) <= 2 && pos.piece_count(BLACK, BISHOP) + pos.piece_count(BLACK, KNIGHT) <= 2) { - mi->evaluationFunction = &EvaluateKmmKm[WHITE]; + mi->evaluationFunction = &EvaluateKmmKm[pos.side_to_move()]; return mi; } } @@ -202,14 +193,14 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) const { // No pawns makes it difficult to win, even with a material advantage if (pos.piece_count(WHITE, PAWN) == 0 && npm_w - npm_b <= BishopValueMidgame) { - mi->factor[WHITE] = uint8_t - (npm_w == npm_b || npm_w < RookValueMidgame ? 0 : NoPawnsSF[Min(pos.piece_count(WHITE, BISHOP), 2)]); + mi->factor[WHITE] = (uint8_t) + (npm_w == npm_b || npm_w < RookValueMidgame ? 0 : NoPawnsSF[std::min(pos.piece_count(WHITE, BISHOP), 2)]); } if (pos.piece_count(BLACK, PAWN) == 0 && npm_b - npm_w <= BishopValueMidgame) { - mi->factor[BLACK] = uint8_t - (npm_w == npm_b || npm_b < RookValueMidgame ? 0 : NoPawnsSF[Min(pos.piece_count(BLACK, BISHOP), 2)]); + mi->factor[BLACK] = (uint8_t) + (npm_w == npm_b || npm_b < RookValueMidgame ? 0 : NoPawnsSF[std::min(pos.piece_count(BLACK, BISHOP), 2)]); } // Compute the space weight @@ -230,16 +221,16 @@ MaterialInfo* MaterialInfoTable::get_material_info(const Position& pos) const { { pos.piece_count(BLACK, BISHOP) > 1, pos.piece_count(BLACK, PAWN), pos.piece_count(BLACK, KNIGHT), pos.piece_count(BLACK, BISHOP) , pos.piece_count(BLACK, ROOK), pos.piece_count(BLACK, QUEEN) } }; - mi->value = int16_t((imbalance(pieceCount) - imbalance(pieceCount)) / 16); + mi->value = (int16_t)((imbalance(pieceCount) - imbalance(pieceCount)) / 16); return mi; } -/// MaterialInfoTable::imbalance() calculates imbalance comparing piece count of each +/// MaterialTable::imbalance() calculates imbalance comparing piece count of each /// piece type for both colors. template -int MaterialInfoTable::imbalance(const int pieceCount[][8]) { +int MaterialTable::imbalance(const int pieceCount[][8]) { const Color Them = (Us == WHITE ? BLACK : WHITE); @@ -253,7 +244,7 @@ int MaterialInfoTable::imbalance(const int pieceCount[][8]) { + RedundantQueenPenalty * pieceCount[Us][QUEEN]; // Second-degree polynomial material imbalance by Tord Romstad - for (pt1 = PIECE_TYPE_NONE; pt1 <= QUEEN; pt1++) + for (pt1 = NO_PIECE_TYPE; pt1 <= QUEEN; pt1++) { pc = pieceCount[Us][pt1]; if (!pc) @@ -261,7 +252,7 @@ int MaterialInfoTable::imbalance(const int pieceCount[][8]) { v = LinearCoefficients[pt1]; - for (pt2 = PIECE_TYPE_NONE; pt2 <= pt1; pt2++) + for (pt2 = NO_PIECE_TYPE; pt2 <= pt1; pt2++) v += QuadraticCoefficientsSameColor[pt1][pt2] * pieceCount[Us][pt2] + QuadraticCoefficientsOppositeColor[pt1][pt2] * pieceCount[Them][pt2]; @@ -271,11 +262,11 @@ int MaterialInfoTable::imbalance(const int pieceCount[][8]) { } -/// MaterialInfoTable::game_phase() calculates the phase given the current +/// MaterialTable::game_phase() calculates the phase given the current /// position. Because the phase is strictly a function of the material, it -/// is stored in MaterialInfo. +/// is stored in MaterialEntry. -Phase MaterialInfoTable::game_phase(const Position& pos) { +Phase MaterialTable::game_phase(const Position& pos) { Value npm = pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK);