X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=153e6eaeb987e5e77ba2f8dadd135b7413711ad9;hp=85ac0dab77c2373c7c292f7c478c1681b2a23518;hb=ddccb5355cabb7d1a9bf2c0fe3c51b3da0234260;hpb=6933f05f4b1b7b1bd2c072029bf5a06cbeac5b0b diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 85ac0dab..153e6eae 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.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-2014 Marco Costalba, Joona Kiiski, Tord Romstad + Copyright (C) 2008-2015 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 // For std::memset #include #include @@ -26,7 +27,6 @@ #include "evaluate.h" #include "material.h" #include "pawns.h" -#include "thread.h" namespace { @@ -91,7 +91,7 @@ namespace { // Evaluation weights, indexed by evaluation term enum { Mobility, PawnStructure, PassedPawns, Space, KingSafety }; const struct Weight { int mg, eg; } Weights[] = { - {289, 344}, {233, 201}, {221, 273}, {46, 0}, {318, 0} + {289, 344}, {233, 201}, {221, 273}, {46, 0}, {322, 0} }; #define V(v) Value(v) @@ -186,19 +186,19 @@ namespace { // index to KingDanger[]. // // KingAttackWeights[PieceType] contains king attack weights by piece type - const int KingAttackWeights[] = { 0, 0, 2, 2, 3, 5 }; + const int KingAttackWeights[] = { 0, 0, 7, 5, 4, 1 }; // Bonuses for enemy's safe checks - const int QueenContactCheck = 24; - const int RookContactCheck = 16; - const int QueenCheck = 12; - const int RookCheck = 8; - const int BishopCheck = 2; - const int KnightCheck = 3; + const int QueenContactCheck = 89; + const int RookContactCheck = 71; + const int QueenCheck = 50; + const int RookCheck = 37; + const int BishopCheck = 6; + const int KnightCheck = 14; // KingDanger[attackUnits] contains the actual king danger weighted // scores, indexed by a calculated integer number. - Score KingDanger[128]; + Score KingDanger[512]; // apply_weight() weighs score 's' by weight 'w' trying to prevent overflow Score apply_weight(Score s, const Weight& w) { @@ -411,11 +411,12 @@ namespace { // number and types of the enemy's attacking pieces, the number of // attacked and undefended squares around our king and the quality of // the pawn shelter (current 'score' value). - attackUnits = std::min(20, (ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) / 2) - + 3 * (ei.kingAdjacentZoneAttacksCount[Them] + popcount(undefended)) - + 2 * (ei.pinnedPieces[Us] != 0) - - mg_value(score) / 32 - - !pos.count(Them) * 15; + attackUnits = std::min(74, ei.kingAttackersCount[Them] * ei.kingAttackersWeight[Them]) + + 8 * ei.kingAdjacentZoneAttacksCount[Them] + + 25 * popcount(undefended) + + 11 * (ei.pinnedPieces[Us] != 0) + - mg_value(score) * 31 / 256 + - !pos.count(Them) * 60; // Analyse the enemy's safe queen contact checks. Firstly, find the // undefended squares around the king reachable by the enemy queen... @@ -475,7 +476,7 @@ namespace { // Finally, extract the king danger score from the KingDanger[] // array and subtract the score from evaluation. - score -= KingDanger[std::max(std::min(attackUnits, 99), 0)]; + score -= KingDanger[std::max(std::min(attackUnits, 399), 0)]; } if (Trace) @@ -533,7 +534,7 @@ namespace { b = weak & ~ei.attackedBy[Them][ALL_PIECES]; if (b) - score += more_than_one(b) ? Hanging * popcount(b) : Hanging; + score += Hanging * popcount(b); b = weak & ei.attackedBy[Us][KING]; if (b) @@ -635,10 +636,10 @@ namespace { // space evaluation is a simple bonus based on the number of safe squares // available for minor pieces on the central four files on ranks 2--4. Safe // squares one, two or three squares behind a friendly pawn are counted - // twice. Finally, the space bonus is scaled by a weight taken from the - // material hash table. The aim is to improve play on game opening. + // twice. Finally, the space bonus is multiplied by a weight. The aim is to + // improve play on game opening. template - Score evaluate_space(const Position& pos, const EvalInfo& ei, Score weight) { + Score evaluate_space(const Position& pos, const EvalInfo& ei) { const Color Them = (Us == WHITE ? BLACK : WHITE); @@ -659,7 +660,11 @@ namespace { assert(unsigned(safe >> (Us == WHITE ? 32 : 0)) == 0); // Count safe + (behind & safe) with a single popcount - return popcount((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe)) * weight; + int bonus = popcount((Us == WHITE ? safe << 32 : safe >> 32) | (behind & safe)); + int weight = pos.count(Us) + pos.count(Us) + + pos.count(Them) + pos.count(Them); + + return make_score(bonus * weight * weight, 0); } @@ -672,7 +677,6 @@ namespace { EvalInfo ei; Score score, mobility[2] = { SCORE_ZERO, SCORE_ZERO }; - Thread* thisThread = pos.this_thread(); // Initialize score by reading the incrementally updated scores included // in the position object (material + piece square tables). @@ -680,7 +684,7 @@ namespace { score = pos.psq_score(); // Probe the material hash table - ei.mi = Material::probe(pos, thisThread->materialTable, thisThread->endgames); + ei.mi = Material::probe(pos); score += ei.mi->imbalance(); // If we have a specialized evaluation function for the current material @@ -689,7 +693,7 @@ namespace { return ei.mi->evaluate(pos); // Probe the pawn hash table - ei.pi = Pawns::probe(pos, thisThread->pawnsTable); + ei.pi = Pawns::probe(pos); score += apply_weight(ei.pi->pawns_score(), Weights[PawnStructure]); // Initialize attack and king safety bitboards @@ -731,12 +735,10 @@ namespace { score -= int(relative_rank(BLACK, frontmost_sq(BLACK, b))) * Unstoppable; } - // Evaluate space for both sides, only in middlegame - if (ei.mi->space_weight()) + // Evaluate space for both sides, only during opening + if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 2 * QueenValueMg + 4 * RookValueMg + 2 * KnightValueMg) { - Score s = evaluate_space(pos, ei, ei.mi->space_weight()) - - evaluate_space(pos, ei, ei.mi->space_weight()); - + Score s = evaluate_space(pos, ei) - evaluate_space(pos, ei); score += apply_weight(s, Weights[Space]); } @@ -784,9 +786,8 @@ namespace { Tracing::write(PAWN, ei.pi->pawns_score()); Tracing::write(Tracing::MOBILITY, apply_weight(mobility[WHITE], Weights[Mobility]) , apply_weight(mobility[BLACK], Weights[Mobility])); - Score w = evaluate_space(pos, ei, ei.mi->space_weight()); - Score b = evaluate_space(pos, ei, ei.mi->space_weight()); - Tracing::write(Tracing::SPACE, apply_weight(w, Weights[Space]), apply_weight(b, Weights[Space])); + Tracing::write(Tracing::SPACE, apply_weight(evaluate_space(pos, ei), Weights[Space]) + , apply_weight(evaluate_space(pos, ei), Weights[Space])); Tracing::write(Tracing::TOTAL, score); Tracing::ei = ei; Tracing::sf = sf; @@ -890,13 +891,14 @@ namespace Eval { void init() { - const double MaxSlope = 30; + const double MaxSlope = 8.7; const double Peak = 1280; + double t = 0.0; - for (int t = 0, i = 1; i < 100; ++i) + for (int i = 1; i < 400; ++i) { - t = int(std::min(Peak, std::min(0.4 * i * i, t + MaxSlope))); - KingDanger[i] = apply_weight(make_score(t, 0), Weights[KingSafety]); + t = std::min(Peak, std::min(0.027 * i * i, t + MaxSlope)); + KingDanger[i] = apply_weight(make_score(int(t), 0), Weights[KingSafety]); } }