Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -Naur stockfish-201-ja/src/evaluate.cpp stockfish-201-verbose/src/evaluate.cpp
- --- stockfish-201-ja/src/evaluate.cpp 2011-01-03 22:49:30.000000000 -0800
- +++ stockfish-201-verbose/src/evaluate.cpp 2011-02-23 12:23:51.702721001 -0800
- @@ -23,6 +23,8 @@
- ////
- #include <cassert>
- +#include <iostream>
- +#include <iomanip>
- #include "bitcount.h"
- #include "evaluate.h"
- @@ -225,7 +227,7 @@
- PawnInfoTable* PawnTable[MAX_THREADS];
- // Function prototypes
- - template<bool HasPopCnt>
- + template<bool HasPopCnt, bool Verbose>
- Value do_evaluate(const Position& pos, Value& margin);
- template<Color Us, bool HasPopCnt>
- @@ -235,6 +237,9 @@
- Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility);
- template<Color Us, bool HasPopCnt>
- + Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility, Score breakdown[7]);
- +
- + template<Color Us, bool HasPopCnt>
- Score evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]);
- template<Color Us>
- @@ -274,18 +279,53 @@
- /// between them based on the remaining material.
- Value evaluate(const Position& pos, Value& margin) {
- - return CpuHasPOPCNT ? do_evaluate<true>(pos, margin)
- - : do_evaluate<false>(pos, margin);
- + return CpuHasPOPCNT ? do_evaluate<true, false>(pos, margin)
- + : do_evaluate<false, false>(pos, margin);
- +}
- +
- +Value evaluate_verbose(const Position& pos, Value& margin) {
- +
- + return CpuHasPOPCNT ? do_evaluate<true, true>(pos, margin)
- + : do_evaluate<false, true>(pos, margin);
- }
- namespace {
- -template<bool HasPopCnt>
- +void display_eval_table_header() {
- + std::cout << std::setw(20) << "Eval term" << " | White | Black | Total \n";
- + std::cout << " | MG EG | MG EG | MG EG \n";
- + std::cout << std::showpoint << std::showpos << std::fixed << std::setprecision(2);
- +}
- +void display_eval_table_hline() {
- + std::cout << "---------------------+-------------+-------------+---------------\n";
- +}
- +double human_value(Value v) { return double(v)/double(PawnValueMidgame); }
- +void display_eval_table_row(const char *name, Score term) {
- + std::cout << std::setw(20) << name << " | --- --- | --- --- | "
- + << std::setw(6) << human_value(mg_value(term)) << " "
- + << std::setw(6) << human_value(eg_value(term)) << " "
- + << std::endl;
- +}
- +void display_eval_table_row(const char *name, Score term_w, Score term_b) {
- + std::cout << std::setw(20) << name << " | "
- + << std::noshowpos
- + << std::setw(5) << human_value(mg_value(term_w)) << " "
- + << std::setw(5) << human_value(eg_value(term_w)) << " | "
- + << std::setw(5) << human_value(mg_value(term_b)) << " "
- + << std::setw(5) << human_value(eg_value(term_b)) << " | "
- + << std::showpos
- + << std::setw(6) << human_value(mg_value(term_w-term_b)) << " "
- + << std::setw(6) << human_value(eg_value(term_w-term_b)) << " "
- + << std::endl;
- +}
- +
- +template<bool HasPopCnt, bool Verbose>
- Value do_evaluate(const Position& pos, Value& margin) {
- EvalInfo ei;
- Value margins[2];
- Score mobilityWhite, mobilityBlack;
- + Score term_w, term_b;
- assert(pos.is_ok());
- assert(pos.thread() >= 0 && pos.thread() < MAX_THREADS);
- @@ -308,46 +348,89 @@
- if (mi->specialized_eval_exists())
- {
- margin = VALUE_ZERO;
- - return mi->evaluate(pos);
- + Value eval = mi->evaluate(pos);
- + if (Verbose) std::cout << "Specialized endgame evaluation: "
- + << std::setw(6) << std::setprecision(2) << std::showpos << human_value(eval)/double(PawnValueMidgame);
- + return eval;
- }
- // Probe the pawn hash table
- ei.pi = PawnTable[pos.thread()]->get_pawn_info(pos);
- bonus += apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]);
- + if (Verbose)
- + {
- + display_eval_table_header();
- + display_eval_table_hline();
- + display_eval_table_row("Material, PST, Tempo", pos.value());
- + display_eval_table_row("Material imbalance", mi->material_value());
- + display_eval_table_row("Pawns", apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]));
- + }
- +
- // Initialize attack and king safety bitboards
- init_eval_info<WHITE, HasPopCnt>(pos, ei);
- init_eval_info<BLACK, HasPopCnt>(pos, ei);
- // Evaluate pieces and mobility
- - bonus += evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei, mobilityWhite)
- - - evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei, mobilityBlack);
- + if (Verbose)
- + {
- + Score breakdown_w[7], breakdown_b[7];
- + bonus += evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei, mobilityWhite, breakdown_w)
- + - evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei, mobilityBlack, breakdown_b);
- + display_eval_table_row("Knights", breakdown_w[KNIGHT], breakdown_b[KNIGHT]);
- + display_eval_table_row("Bishops", breakdown_w[BISHOP], breakdown_b[BISHOP]);
- + display_eval_table_row("Rooks", breakdown_w[ROOK], breakdown_b[ROOK]);
- + display_eval_table_row("Queens", breakdown_w[QUEEN], breakdown_b[QUEEN]);
- + display_eval_table_row("Mobility",
- + apply_weight(mobilityWhite, Weights[Mobility]),
- + apply_weight(mobilityBlack, Weights[Mobility]));
- + }
- + else
- + {
- + bonus += evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei, mobilityWhite)
- + - evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei, mobilityBlack);
- + }
- bonus += apply_weight(mobilityWhite - mobilityBlack, Weights[Mobility]);
- // Evaluate kings after all other pieces because we need complete attack
- // information when computing the king safety evaluation.
- - bonus += evaluate_king<WHITE, HasPopCnt>(pos, ei, margins)
- - - evaluate_king<BLACK, HasPopCnt>(pos, ei, margins);
- + term_w = evaluate_king<WHITE, HasPopCnt>(pos, ei, margins);
- + term_b = evaluate_king<BLACK, HasPopCnt>(pos, ei, margins);
- + bonus += term_w - term_b; if (Verbose) display_eval_table_row("King safety", term_w, term_b);
- // Evaluate tactical threats, we need full attack information including king
- - bonus += evaluate_threats<WHITE>(pos, ei)
- - - evaluate_threats<BLACK>(pos, ei);
- + term_w = evaluate_threats<WHITE>(pos, ei);
- + term_b = evaluate_threats<BLACK>(pos, ei);
- + bonus += term_w - term_b; if (Verbose) display_eval_table_row("Threats", term_w, term_b);
- // Evaluate passed pawns, we need full attack information including king
- - bonus += evaluate_passed_pawns<WHITE>(pos, ei)
- - - evaluate_passed_pawns<BLACK>(pos, ei);
- + term_w = evaluate_passed_pawns<WHITE>(pos, ei);
- + term_b = evaluate_passed_pawns<BLACK>(pos, ei);
- + bonus += term_w - term_b; if (Verbose) display_eval_table_row("Passed pawns", term_w, term_b);
- // If one side has only a king, check whether exists any unstoppable passed pawn
- if (!pos.non_pawn_material(WHITE) || !pos.non_pawn_material(BLACK))
- - bonus += evaluate_unstoppable_pawns<HasPopCnt>(pos, ei);
- + {
- + Score term_t = evaluate_unstoppable_pawns<HasPopCnt>(pos, ei);
- + bonus += term_t; if (Verbose) display_eval_table_row("Unstoppable pawns", term_t);
- + }
- + else if (Verbose) display_eval_table_row("Unstoppable pawns", make_score(0, 0));
- // Evaluate space for both sides, only in middle-game.
- if (mi->space_weight())
- {
- - int s = evaluate_space<WHITE, HasPopCnt>(pos, ei) - evaluate_space<BLACK, HasPopCnt>(pos, ei);
- - bonus += apply_weight(make_score(s * mi->space_weight(), 0), Weights[Space]);
- + int s_w = evaluate_space<WHITE, HasPopCnt>(pos, ei);
- + int s_b = evaluate_space<BLACK, HasPopCnt>(pos, ei);
- + bonus += apply_weight(make_score((s_w-s_b) * mi->space_weight(), 0), Weights[Space]);
- + if (Verbose)
- + {
- + display_eval_table_row("Space",
- + apply_weight(make_score(s_w * mi->space_weight(), make_score(0, 0)), Weights[Space]),
- + apply_weight(make_score(s_b * mi->space_weight(), make_score(0, 0)), Weights[Space]));
- + }
- }
- + else if (Verbose) display_eval_table_row("Space", make_score(0, 0), make_score(0, 0));
- // Scale winning side if position is more drawish that what it appears
- ScaleFactor sf = eg_value(bonus) > VALUE_DRAW ? mi->scale_factor(pos, WHITE)
- @@ -378,6 +461,19 @@
- // Interpolate between the middle game and the endgame score
- margin = margins[pos.side_to_move()];
- Value v = scale_by_game_phase(bonus, phase, sf);
- +
- + if (Verbose)
- + {
- + display_eval_table_hline();
- + display_eval_table_row("Total", bonus);
- + std::cout << "Uncertainty margin: White: " << std::setw(6) << human_value(margins[WHITE]) << ", Black: " << human_value(margins[BLACK])
- + << "\nScaling: " << std::noshowpos
- + << std::setw(6) << 100.0 * phase/128.0 << "% MG, "
- + << std::setw(6) << 100.0 * (1.0 - phase/128.0) << "% * "
- + << std::setw(6) << (100.0 * sf) / SCALE_FACTOR_NORMAL << "% EG.\n"
- + << "Total evaluation: " << human_value(v) << std::endl;
- + }
- +
- return pos.side_to_move() == WHITE ? v : -v;
- }
- @@ -680,6 +776,29 @@
- // Sum up all attacked squares
- ei.attackedBy[Us][0] = ei.attackedBy[Us][PAWN] | ei.attackedBy[Us][KNIGHT]
- + | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
- + | ei.attackedBy[Us][QUEEN] | ei.attackedBy[Us][KING];
- + return bonus;
- + }
- +
- + template<Color Us, bool HasPopCnt>
- + Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility, Score breakdown[7]) {
- +
- + const Color Them = (Us == WHITE ? BLACK : WHITE);
- +
- + Score bonus = mobility = SCORE_ZERO;
- +
- + // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
- + const Bitboard mobilityArea = ~(ei.attackedBy[Them][PAWN] | pos.pieces_of_color(Us));
- +
- + breakdown[KNIGHT] = evaluate_pieces<KNIGHT, Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
- + breakdown[BISHOP] = evaluate_pieces<BISHOP, Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
- + breakdown[ROOK] = evaluate_pieces<ROOK, Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
- + breakdown[QUEEN] = evaluate_pieces<QUEEN, Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
- + bonus += breakdown[KNIGHT] + breakdown[BISHOP] + breakdown[ROOK] + breakdown[QUEEN];
- +
- + // Sum up all attacked squares
- + ei.attackedBy[Us][0] = ei.attackedBy[Us][PAWN] | ei.attackedBy[Us][KNIGHT]
- | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
- | ei.attackedBy[Us][QUEEN] | ei.attackedBy[Us][KING];
- return bonus;
- diff -Naur stockfish-201-ja/src/evaluate.h stockfish-201-verbose/src/evaluate.h
- --- stockfish-201-ja/src/evaluate.h 2011-01-01 11:31:54.000000000 -0800
- +++ stockfish-201-verbose/src/evaluate.h 2011-02-23 11:24:06.237999006 -0800
- @@ -27,6 +27,7 @@
- class Position;
- extern Value evaluate(const Position& pos, Value& margin);
- +extern Value evaluate_verbose(const Position& pos, Value& margin);
- extern void init_eval(int threads);
- extern void quit_eval();
- extern void read_evaluation_uci_options(Color sideToMove);
- diff -Naur stockfish-201-ja/src/uci.cpp stockfish-201-verbose/src/uci.cpp
- --- stockfish-201-ja/src/uci.cpp 2011-01-03 22:48:24.000000000 -0800
- +++ stockfish-201-verbose/src/uci.cpp 2011-02-23 11:25:14.247999006 -0800
- @@ -107,9 +107,7 @@
- else if (token == "eval")
- {
- Value evalMargin;
- - cout << "Incremental mg: " << mg_value(pos.value())
- - << "\nIncremental eg: " << eg_value(pos.value())
- - << "\nFull eval: " << evaluate(pos, evalMargin) << endl;
- + (void) evaluate_verbose(pos, evalMargin);
- }
- else if (token == "key")
- cout << "key: " << hex << pos.get_key()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement