/*
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
// Pointers table to access mobility tables through piece type
const Score* MobilityBonus[8] = { 0, 0, KnightMobilityBonus, BishopMobilityBonus,
- RookMobilityBonus, QueenMobilityBonus, 0, 0 };
+ RookMobilityBonus, QueenMobilityBonus, 0, 0 };
// Outpost bonuses for knights and bishops, indexed by square (from white's
// point of view).
// ThreatBonus[][] contains bonus according to which piece type
// attacks which one.
- #define Z make_score(0, 0)
+ #define Z S(0, 0)
const Score ThreatBonus[8][8] = {
{ Z, Z, Z, Z, Z, Z, Z, Z }, // not used
// in init_safety().
Value SafetyTable[100];
- // Pawn and material hash tables, indexed by the current thread id
- PawnInfoTable* PawnTable[8] = {0, 0, 0, 0, 0, 0, 0, 0};
- MaterialInfoTable* MaterialTable[8] = {0, 0, 0, 0, 0, 0, 0, 0};
+ // Pawn and material hash tables, indexed by the current thread id.
+ // Note that they will be initialized at 0 being global variables.
+ 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));
} // namespace
-/// quick_evaluate() does a very approximate evaluation of the current position.
-/// It currently considers only material and piece square table scores. Perhaps
-/// we should add scores from the pawn and material hash tables?
-
-Value quick_evaluate(const Position &pos) {
-
- assert(pos.is_ok());
-
- static const ScaleFactor sf[2] = {SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL};
-
- Value v = scale_by_game_phase(pos.value(), MaterialInfoTable::game_phase(pos), sf);
- return (pos.side_to_move() == WHITE ? v : -v);
-}
-
-
/// init_eval() initializes various tables used by the evaluation function
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];
// capturing a single attacking piece can therefore result in a score
// change far bigger than the value of the captured piece.
Score v = apply_weight(make_score(SafetyTable[attackUnits], 0), WeightKingSafety[Us]);
-
ei.value -= Sign[Us] * v;
-
- if (Us == pos.side_to_move())
- ei.futilityMargin += mg_value(v);
+ ei.futilityMargin[Us] += mg_value(v);
}
}