/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
- Copyright (C) 2008-2009 Marco Costalba
+ Copyright (C) 2008-2010 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
const int AttackWeight[] = { 0, 0, KnightAttackWeight, BishopAttackWeight, RookAttackWeight, QueenAttackWeight };
- // Bonuses for safe checks, initialized from UCI options
- int QueenContactCheckBonus, DiscoveredCheckBonus;
- int QueenCheckBonus, RookCheckBonus, BishopCheckBonus, KnightCheckBonus;
+ // Bonuses for safe checks
+ const int QueenContactCheckBonus = 3;
+ const int DiscoveredCheckBonus = 3;
+ const int QueenCheckBonus = 2;
+ const int RookCheckBonus = 1;
+ const int BishopCheckBonus = 1;
+ const int KnightCheckBonus = 1;
// Scan for queen contact mates?
const bool QueenContactMates = true;
- // Bonus for having a mate threat, initialized from UCI options
- int MateThreatBonus;
+ // Bonus for having a mate threat
+ const int MateThreatBonus = 3;
// InitKingDanger[] contains bonuses based on the position of the defending
// king.
// Pawn and material hash tables, indexed by the current thread id.
// Note that they will be initialized at 0 being global variables.
- MaterialInfoTable* MaterialTable[THREAD_MAX];
- PawnInfoTable* PawnTable[THREAD_MAX];
+ MaterialInfoTable* MaterialTable[MAX_THREADS];
+ PawnInfoTable* PawnTable[MAX_THREADS];
// Sizes of pawn and material hash tables
const int PawnTableSize = 16384;
Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) {
assert(pos.is_ok());
- assert(threadID >= 0 && threadID < THREAD_MAX);
+ assert(threadID >= 0 && threadID < MAX_THREADS);
assert(!pos.is_check());
memset(&ei, 0, sizeof(EvalInfo));
void init_eval(int threads) {
- assert(threads <= THREAD_MAX);
+ assert(threads <= MAX_THREADS);
- for (int i = 0; i < THREAD_MAX; i++)
+ for (int i = 0; i < MAX_THREADS; i++)
{
if (i >= threads)
{
void quit_eval() {
- for (int i = 0; i < THREAD_MAX; i++)
+ for (int i = 0; i < MAX_THREADS; i++)
{
delete PawnTable[i];
delete MaterialTable[i];
}
- // evaluate_passed_pawns() evaluates the passed pawns of the given color
+ // evaluate_passed_pawns_of_color() evaluates the passed pawns of the given color
template<Color Us>
void evaluate_passed_pawns_of_color(const Position& pos, int movesToGo[], Square pawnToGo[], EvalInfo& ei) {
qsq = relative_square(Us, make_square(square_file(s), RANK_8));
d = square_distance(s, qsq)
- square_distance(theirKingSq, qsq)
- + (Us != pos.side_to_move());
+ + int(Us != pos.side_to_move());
if (d < 0)
{
void init_safety() {
- QueenContactCheckBonus = get_option_value_int("Queen Contact Check Bonus");
- QueenCheckBonus = get_option_value_int("Queen Check Bonus");
- RookCheckBonus = get_option_value_int("Rook Check Bonus");
- BishopCheckBonus = get_option_value_int("Bishop Check Bonus");
- KnightCheckBonus = get_option_value_int("Knight Check Bonus");
- DiscoveredCheckBonus = get_option_value_int("Discovered Check Bonus");
- MateThreatBonus = get_option_value_int("Mate Threat Bonus");
-
- int maxSlope = get_option_value_int("King Safety Max Slope");
- int peak = get_option_value_int("King Safety Max Value") * 256 / 100;
- double a = get_option_value_int("King Safety Coefficient") / 100.0;
- double b = get_option_value_int("King Safety X Intercept");
- bool quad = (get_option_value_string("King Safety Curve") == "Quadratic");
- bool linear = (get_option_value_string("King Safety Curve") == "Linear");
+ int maxSlope = 30;
+ int peak = 0x500;
+ double a = 0.4;
+ double b = 0.0;
for (int i = 0; i < 100; i++)
{
if (i < b)
SafetyTable[i] = Value(0);
- else if (quad)
+ else
SafetyTable[i] = Value((int)(a * (i - b) * (i - b)));
- else if (linear)
- SafetyTable[i] = Value((int)(100 * a * (i - b)));
}
- for (int i = 0; i < 100; i++)
+ for (int i = 1; i < 100; i++)
{
- if (SafetyTable[i+1] - SafetyTable[i] > maxSlope)
- for (int j = i + 1; j < 100; j++)
- SafetyTable[j] = SafetyTable[j-1] + Value(maxSlope);
+ if (SafetyTable[i] - SafetyTable[i - 1] > maxSlope)
+ SafetyTable[i] = SafetyTable[i - 1] + Value(maxSlope);
if (SafetyTable[i] > Value(peak))
SafetyTable[i] = Value(peak);