X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmaterial.cpp;h=7369bca9e3c42762f778a2a75292b0c7744efd50;hp=ce63e8b5b2df17b95d3fde7abb074c86801db7fa;hb=6482ce2bb2cb2c2450008afb58c7ef2e04d56841;hpb=48e39c5c8e671a37f09732d4a55d93d5e2d38550 diff --git a/src/material.cpp b/src/material.cpp index ce63e8b5..7369bca9 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" @@ -49,13 +50,13 @@ namespace { // Endgame evaluation and scaling functions accessed direcly and not through // the function maps because correspond to more then one material hash key. - Endgame EvaluateKmmKm[] = { Endgame(WHITE), Endgame(BLACK) }; - Endgame EvaluateKXK[] = { Endgame(WHITE), Endgame(BLACK) }; + Endgame EvaluateKmmKm[] = { Endgame(WHITE), Endgame(BLACK) }; + Endgame EvaluateKXK[] = { Endgame(WHITE), Endgame(BLACK) }; - Endgame ScaleKBPsK[] = { Endgame(WHITE), Endgame(BLACK) }; - Endgame ScaleKQKRPs[] = { Endgame(WHITE), Endgame(BLACK) }; - Endgame ScaleKPsK[] = { Endgame(WHITE), Endgame(BLACK) }; - Endgame ScaleKPKP[] = { Endgame(WHITE), Endgame(BLACK) }; + Endgame ScaleKBPsK[] = { Endgame(WHITE), Endgame(BLACK) }; + Endgame ScaleKQKRPs[] = { Endgame(WHITE), Endgame(BLACK) }; + Endgame ScaleKPsK[] = { Endgame(WHITE), Endgame(BLACK) }; + Endgame ScaleKPKP[] = { Endgame(WHITE), Endgame(BLACK) }; // Helper templates used to detect a given material distribution template bool is_KXK(const Position& pos) { @@ -89,15 +90,15 @@ void MaterialInfoTable::init() { Base::init(); if (!funcs) funcs = new Endgames( MaterialInfoTable::~MaterialInfoTable() { delete funcs; } -/// MaterialInfoTable::get_material_info() takes a position object as input, +/// MaterialInfoTable::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 { +MaterialInfo* MaterialInfoTable::material_info(const Position& pos) const { - Key key = pos.get_material_key(); + Key key = pos.material_key(); MaterialInfo* mi = probe(key); // If mi->key matches the position's material hash key, it means that we @@ -142,7 +143,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 +203,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,7 +231,7 @@ 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; } @@ -253,7 +254,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 +262,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];