Skip to content

Commit

Permalink
Temporary revert "Expose EvalInfo struct to search"
Browse files Browse the repository at this point in the history
It is not needed for the release and introduces
a slowdown, although very small.

Probably it will be readded after the release.

No functional change.
  • Loading branch information
mcostalba committed Apr 28, 2013
1 parent 1566357 commit 06b9140
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 73 deletions.
88 changes: 64 additions & 24 deletions src/evaluate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,53 @@

#include "bitcount.h"
#include "evaluate.h"
#include "material.h"
#include "pawns.h"
#include "thread.h"
#include "ucioption.h"

using namespace Eval;

namespace {

// Struct EvalInfo contains various information computed and collected
// by the evaluation functions.
struct EvalInfo {

// Pointers to material and pawn hash table entries
Material::Entry* mi;
Pawns::Entry* pi;

// attackedBy[color][piece type] is a bitboard representing all squares
// attacked by a given color and piece type, attackedBy[color][ALL_PIECES]
// contains all squares attacked by the given color.
Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];

// kingRing[color] is the zone around the king which is considered
// by the king safety evaluation. This consists of the squares directly
// adjacent to the king, and the three (or two, for a king on an edge file)
// squares two ranks in front of the king. For instance, if black's king
// is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8,
// f7, g7, h7, f6, g6 and h6.
Bitboard kingRing[COLOR_NB];

// kingAttackersCount[color] is the number of pieces of the given color
// which attack a square in the kingRing of the enemy king.
int kingAttackersCount[COLOR_NB];

// kingAttackersWeight[color] is the sum of the "weight" of the pieces of the
// given color which attack a square in the kingRing of the enemy king. The
// weights of the individual piece types are given by the variables
// QueenAttackWeight, RookAttackWeight, BishopAttackWeight and
// KnightAttackWeight in evaluate.cpp
int kingAttackersWeight[COLOR_NB];

// kingAdjacentZoneAttacksCount[color] is the number of attacks to squares
// directly adjacent to the king of the given color. Pieces which attack
// more than one square are counted multiple times. For instance, if black's
// king is on g8 and there's a white knight on g5, this knight adds
// 2 to kingAdjacentZoneAttacksCount[BLACK].
int kingAdjacentZoneAttacksCount[COLOR_NB];
};

// Evaluation grain size, must be a power of 2
const int GrainSize = 8;

Expand Down Expand Up @@ -200,27 +240,27 @@ namespace {

// Function prototypes
template<bool Trace>
Value do_evaluate(const Position& pos, Value& margin, Info& ei);
Value do_evaluate(const Position& pos, Value& margin);

template<Color Us>
void init_eval_info(const Position& pos, Info& ei);
void init_eval_info(const Position& pos, EvalInfo& ei);

template<Color Us, bool Trace>
Score evaluate_pieces_of_color(const Position& pos, Info& ei, Score& mobility);
Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility);

template<Color Us, bool Trace>
Score evaluate_king(const Position& pos, Info& ei, Value margins[]);
Score evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]);

template<Color Us>
Score evaluate_threats(const Position& pos, Info& ei);
Score evaluate_threats(const Position& pos, EvalInfo& ei);

template<Color Us>
int evaluate_space(const Position& pos, Info& ei);
int evaluate_space(const Position& pos, EvalInfo& ei);

template<Color Us>
Score evaluate_passed_pawns(const Position& pos, Info& ei);
Score evaluate_passed_pawns(const Position& pos, EvalInfo& ei);

Score evaluate_unstoppable_pawns(const Position& pos, Info& ei);
Score evaluate_unstoppable_pawns(const Position& pos, EvalInfo& ei);

Value interpolate(const Score& v, Phase ph, ScaleFactor sf);
Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight);
Expand All @@ -236,8 +276,8 @@ namespace Eval {
/// values, an endgame score and a middle game score, and interpolates
/// between them based on the remaining material.

Value evaluate(const Position& pos, Value& margin, Info* ei) {
return do_evaluate<false>(pos, margin, *ei);
Value evaluate(const Position& pos, Value& margin) {
return do_evaluate<false>(pos, margin);
}


Expand Down Expand Up @@ -273,15 +313,14 @@ namespace Eval {

Value margin;
std::string totals;
Info ei;

Search::RootColor = pos.side_to_move();

TraceStream.str("");
TraceStream << std::showpoint << std::showpos << std::fixed << std::setprecision(2);
memset(TracedScores, 0, 2 * 16 * sizeof(Score));

do_evaluate<true>(pos, margin, ei);
do_evaluate<true>(pos, margin);

totals = TraceStream.str();
TraceStream.str("");
Expand Down Expand Up @@ -317,10 +356,11 @@ namespace Eval {
namespace {

template<bool Trace>
Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
Value do_evaluate(const Position& pos, Value& margin) {

assert(!pos.checkers());

EvalInfo ei;
Value margins[COLOR_NB];
Score score, mobilityWhite, mobilityBlack;
Thread* th = pos.this_thread();
Expand Down Expand Up @@ -443,7 +483,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// pawn attacks. To be done at the beginning of the evaluation.

template<Color Us>
void init_eval_info(const Position& pos, Info& ei) {
void init_eval_info(const Position& pos, EvalInfo& ei) {

const Color Them = (Us == WHITE ? BLACK : WHITE);

Expand All @@ -466,7 +506,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// evaluate_outposts() evaluates bishop and knight outposts squares

template<PieceType Piece, Color Us>
Score evaluate_outposts(const Position& pos, Info& ei, Square s) {
Score evaluate_outposts(const Position& pos, EvalInfo& ei, Square s) {

const Color Them = (Us == WHITE ? BLACK : WHITE);

Expand All @@ -492,7 +532,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// evaluate_pieces<>() assigns bonuses and penalties to the pieces of a given color

template<PieceType Piece, Color Us, bool Trace>
Score evaluate_pieces(const Position& pos, Info& ei, Score& mobility, Bitboard mobilityArea) {
Score evaluate_pieces(const Position& pos, EvalInfo& ei, Score& mobility, Bitboard mobilityArea) {

Bitboard b;
Square s, ksq;
Expand Down Expand Up @@ -641,7 +681,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// and the type of attacked one.

template<Color Us>
Score evaluate_threats(const Position& pos, Info& ei) {
Score evaluate_threats(const Position& pos, EvalInfo& ei) {

const Color Them = (Us == WHITE ? BLACK : WHITE);

Expand Down Expand Up @@ -683,7 +723,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// pieces of a given color.

template<Color Us, bool Trace>
Score evaluate_pieces_of_color(const Position& pos, Info& ei, Score& mobility) {
Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility) {

const Color Them = (Us == WHITE ? BLACK : WHITE);

Expand All @@ -708,7 +748,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// evaluate_king<>() assigns bonuses and penalties to a king of a given color

template<Color Us, bool Trace>
Score evaluate_king(const Position& pos, Info& ei, Value margins[]) {
Score evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]) {

const Color Them = (Us == WHITE ? BLACK : WHITE);

Expand Down Expand Up @@ -821,7 +861,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// evaluate_passed_pawns<>() evaluates the passed pawns of the given color

template<Color Us>
Score evaluate_passed_pawns(const Position& pos, Info& ei) {
Score evaluate_passed_pawns(const Position& pos, EvalInfo& ei) {

const Color Them = (Us == WHITE ? BLACK : WHITE);

Expand Down Expand Up @@ -919,7 +959,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// evaluate_unstoppable_pawns() evaluates the unstoppable passed pawns for both sides, this is quite
// conservative and returns a winning score only when we are very sure that the pawn is winning.

Score evaluate_unstoppable_pawns(const Position& pos, Info& ei) {
Score evaluate_unstoppable_pawns(const Position& pos, EvalInfo& ei) {

Bitboard b, b2, blockers, supporters, queeningPath, candidates;
Square s, blockSq, queeningSquare;
Expand Down Expand Up @@ -1084,7 +1124,7 @@ Value do_evaluate(const Position& pos, Value& margin, Info& ei) {
// 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.
template<Color Us>
int evaluate_space(const Position& pos, Info& ei) {
int evaluate_space(const Position& pos, EvalInfo& ei) {

const Color Them = (Us == WHITE ? BLACK : WHITE);

Expand Down
44 changes: 1 addition & 43 deletions src/evaluate.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,56 +20,14 @@
#if !defined(EVALUATE_H_INCLUDED)
#define EVALUATE_H_INCLUDED

#include "material.h"
#include "pawns.h"
#include "types.h"

class Position;

namespace Eval {

// Struct Eval::Info contains various information computed and collected
// by the evaluation functions.
struct Info {

// Pointers to material and pawn hash table entries
Material::Entry* mi;
Pawns::Entry* pi;

// attackedBy[color][piece type] is a bitboard representing all squares
// attacked by a given color and piece type, attackedBy[color][ALL_PIECES]
// contains all squares attacked by the given color.
Bitboard attackedBy[COLOR_NB][PIECE_TYPE_NB];

// kingRing[color] is the zone around the king which is considered
// by the king safety evaluation. This consists of the squares directly
// adjacent to the king, and the three (or two, for a king on an edge file)
// squares two ranks in front of the king. For instance, if black's king
// is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8,
// f7, g7, h7, f6, g6 and h6.
Bitboard kingRing[COLOR_NB];

// kingAttackersCount[color] is the number of pieces of the given color
// which attack a square in the kingRing of the enemy king.
int kingAttackersCount[COLOR_NB];

// kingAttackersWeight[color] is the sum of the "weight" of the pieces of the
// given color which attack a square in the kingRing of the enemy king. The
// weights of the individual piece types are given by the variables
// QueenAttackWeight, RookAttackWeight, BishopAttackWeight and
// KnightAttackWeight in evaluate.cpp
int kingAttackersWeight[COLOR_NB];

// kingAdjacentZoneAttacksCount[color] is the number of attacks to squares
// directly adjacent to the king of the given color. Pieces which attack
// more than one square are counted multiple times. For instance, if black's
// king is on g8 and there's a white knight on g5, this knight adds
// 2 to kingAdjacentZoneAttacksCount[BLACK].
int kingAdjacentZoneAttacksCount[COLOR_NB];
};

extern void init();
extern Value evaluate(const Position& pos, Value& margin, Info* ei);
extern Value evaluate(const Position& pos, Value& margin);
extern std::string trace(const Position& pos);

}
Expand Down
8 changes: 4 additions & 4 deletions src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,7 @@ namespace {
// Never assume anything on values stored in TT
if ( (ss->staticEval = eval = tte->eval_value()) == VALUE_NONE
||(ss->evalMargin = tte->eval_margin()) == VALUE_NONE)
eval = ss->staticEval = evaluate(pos, ss->evalMargin, &ss->ei);
eval = ss->staticEval = evaluate(pos, ss->evalMargin);

// Can ttValue be used as a better position evaluation?
if (ttValue != VALUE_NONE)
Expand All @@ -603,7 +603,7 @@ namespace {
}
else
{
eval = ss->staticEval = evaluate(pos, ss->evalMargin, &ss->ei);
eval = ss->staticEval = evaluate(pos, ss->evalMargin);
TT.store(posKey, VALUE_NONE, BOUND_NONE, DEPTH_NONE, MOVE_NONE,
ss->staticEval, ss->evalMargin);
}
Expand Down Expand Up @@ -1178,10 +1178,10 @@ namespace {
// Never assume anything on values stored in TT
if ( (ss->staticEval = bestValue = tte->eval_value()) == VALUE_NONE
||(ss->evalMargin = tte->eval_margin()) == VALUE_NONE)
ss->staticEval = bestValue = evaluate(pos, ss->evalMargin, &ss->ei);
ss->staticEval = bestValue = evaluate(pos, ss->evalMargin);
}
else
ss->staticEval = bestValue = evaluate(pos, ss->evalMargin, &ss->ei);
ss->staticEval = bestValue = evaluate(pos, ss->evalMargin);

// Stand pat. Return immediately if static value is at least beta
if (bestValue >= beta)
Expand Down
2 changes: 0 additions & 2 deletions src/search.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
#include <stack>
#include <vector>

#include "evaluate.h"
#include "misc.h"
#include "position.h"
#include "types.h"
Expand All @@ -49,7 +48,6 @@ struct Stack {
Value evalMargin;
int skipNullMove;
int futilityMoveCount;
Eval::Info ei;
};


Expand Down

0 comments on commit 06b9140

Please sign in to comment.