X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmaterial.cpp;h=d13b309192039e1ad600d04317bf9d725f632ccf;hp=27a88f86e67527c5d8851af6d4af9fb5583183cd;hb=304deb5e833baf47c147e93377f5c7ef582ab822;hpb=14df99130f53a2a5f57260eb830b4c0029bd4e99 diff --git a/src/material.cpp b/src/material.cpp index 27a88f86..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 @@ -84,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 @@ -107,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 @@ -203,13 +193,13 @@ 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 + 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 + mi->factor[BLACK] = (uint8_t) (npm_w == npm_b || npm_b < RookValueMidgame ? 0 : NoPawnsSF[std::min(pos.piece_count(BLACK, BISHOP), 2)]); } @@ -231,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); @@ -254,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) @@ -262,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]; @@ -272,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);