Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 11.96 KB | None | 0 0
  1. diff -Naur stockfish-201-ja/src/evaluate.cpp stockfish-201-verbose/src/evaluate.cpp
  2. --- stockfish-201-ja/src/evaluate.cpp   2011-01-03 22:49:30.000000000 -0800
  3. +++ stockfish-201-verbose/src/evaluate.cpp  2011-02-23 12:23:51.702721001 -0800
  4. @@ -23,6 +23,8 @@
  5.  ////
  6.  
  7.  #include <cassert>
  8. +#include <iostream>
  9. +#include <iomanip>
  10.  
  11.  #include "bitcount.h"
  12.  #include "evaluate.h"
  13. @@ -225,7 +227,7 @@
  14.    PawnInfoTable* PawnTable[MAX_THREADS];
  15.  
  16.    // Function prototypes
  17. -  template<bool HasPopCnt>
  18. +  template<bool HasPopCnt, bool Verbose>
  19.    Value do_evaluate(const Position& pos, Value& margin);
  20.  
  21.    template<Color Us, bool HasPopCnt>
  22. @@ -235,6 +237,9 @@
  23.    Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility);
  24.  
  25.    template<Color Us, bool HasPopCnt>
  26. +  Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility, Score breakdown[7]);
  27. +
  28. +  template<Color Us, bool HasPopCnt>
  29.    Score evaluate_king(const Position& pos, EvalInfo& ei, Value margins[]);
  30.  
  31.    template<Color Us>
  32. @@ -274,18 +279,53 @@
  33.  /// between them based on the remaining material.
  34.  Value evaluate(const Position& pos, Value& margin) {
  35.  
  36. -    return CpuHasPOPCNT ? do_evaluate<true>(pos, margin)
  37. -                        : do_evaluate<false>(pos, margin);
  38. +    return CpuHasPOPCNT ? do_evaluate<true, false>(pos, margin)
  39. +                        : do_evaluate<false, false>(pos, margin);
  40. +}
  41. +
  42. +Value evaluate_verbose(const Position& pos, Value& margin) {
  43. +
  44. +    return CpuHasPOPCNT ? do_evaluate<true, true>(pos, margin)
  45. +                        : do_evaluate<false, true>(pos, margin);
  46.  }
  47.  
  48.  namespace {
  49.  
  50. -template<bool HasPopCnt>
  51. +void display_eval_table_header() {
  52. +    std::cout << std::setw(20) << "Eval term" << " |    White    |    Black    |     Total     \n";
  53. +    std::cout <<             "                     |   MG    EG  |   MG    EG  |   MG     EG   \n";
  54. +    std::cout << std::showpoint << std::showpos << std::fixed << std::setprecision(2);
  55. +}
  56. +void display_eval_table_hline() {
  57. +    std::cout <<             "---------------------+-------------+-------------+---------------\n";
  58. +}
  59. +double human_value(Value v) { return double(v)/double(PawnValueMidgame); }
  60. +void display_eval_table_row(const char *name, Score term) {
  61. +    std::cout << std::setw(20) << name << " |   ---   --- |   ---   --- | "
  62. +              << std::setw(6) << human_value(mg_value(term)) << " "
  63. +              << std::setw(6) << human_value(eg_value(term)) << " "
  64. +              << std::endl;
  65. +}
  66. +void display_eval_table_row(const char *name, Score term_w, Score term_b) {
  67. +    std::cout << std::setw(20) << name << " | "
  68. +              << std::noshowpos
  69. +              << std::setw(5) << human_value(mg_value(term_w)) << " "
  70. +              << std::setw(5) << human_value(eg_value(term_w)) << " | "
  71. +              << std::setw(5) << human_value(mg_value(term_b)) << " "
  72. +              << std::setw(5) << human_value(eg_value(term_b)) << " | "
  73. +              << std::showpos
  74. +              << std::setw(6) << human_value(mg_value(term_w-term_b)) << " "
  75. +              << std::setw(6) << human_value(eg_value(term_w-term_b)) << " "
  76. +              << std::endl;
  77. +}
  78. +
  79. +template<bool HasPopCnt, bool Verbose>
  80.  Value do_evaluate(const Position& pos, Value& margin) {
  81.  
  82.    EvalInfo ei;
  83.    Value margins[2];
  84.    Score mobilityWhite, mobilityBlack;
  85. +  Score term_w, term_b;
  86.  
  87.    assert(pos.is_ok());
  88.    assert(pos.thread() >= 0 && pos.thread() < MAX_THREADS);
  89. @@ -308,46 +348,89 @@
  90.    if (mi->specialized_eval_exists())
  91.    {
  92.        margin = VALUE_ZERO;
  93. -      return mi->evaluate(pos);
  94. +      Value eval = mi->evaluate(pos);
  95. +      if (Verbose) std::cout << "Specialized endgame evaluation: "
  96. +                             << std::setw(6) << std::setprecision(2) << std::showpos << human_value(eval)/double(PawnValueMidgame);
  97. +      return eval;
  98.    }
  99.  
  100.    // Probe the pawn hash table
  101.    ei.pi = PawnTable[pos.thread()]->get_pawn_info(pos);
  102.    bonus += apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]);
  103.  
  104. +  if (Verbose)
  105. +  {
  106. +      display_eval_table_header();
  107. +      display_eval_table_hline();
  108. +      display_eval_table_row("Material, PST, Tempo", pos.value());
  109. +      display_eval_table_row("Material imbalance", mi->material_value());
  110. +      display_eval_table_row("Pawns", apply_weight(ei.pi->pawns_value(), Weights[PawnStructure]));
  111. +  }
  112. +
  113.    // Initialize attack and king safety bitboards
  114.    init_eval_info<WHITE, HasPopCnt>(pos, ei);
  115.    init_eval_info<BLACK, HasPopCnt>(pos, ei);
  116.  
  117.    // Evaluate pieces and mobility
  118. -  bonus +=  evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei, mobilityWhite)
  119. -          - evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei, mobilityBlack);
  120. +  if (Verbose)
  121. +  {
  122. +      Score breakdown_w[7], breakdown_b[7];
  123. +      bonus +=  evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei, mobilityWhite, breakdown_w)
  124. +              - evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei, mobilityBlack, breakdown_b);
  125. +      display_eval_table_row("Knights", breakdown_w[KNIGHT], breakdown_b[KNIGHT]);
  126. +      display_eval_table_row("Bishops", breakdown_w[BISHOP], breakdown_b[BISHOP]);
  127. +      display_eval_table_row("Rooks",   breakdown_w[ROOK],   breakdown_b[ROOK]);
  128. +      display_eval_table_row("Queens",  breakdown_w[QUEEN],  breakdown_b[QUEEN]);
  129. +      display_eval_table_row("Mobility",
  130. +          apply_weight(mobilityWhite, Weights[Mobility]),
  131. +          apply_weight(mobilityBlack, Weights[Mobility]));
  132. +  }
  133. +  else
  134. +  {
  135. +      bonus +=  evaluate_pieces_of_color<WHITE, HasPopCnt>(pos, ei, mobilityWhite)
  136. +              - evaluate_pieces_of_color<BLACK, HasPopCnt>(pos, ei, mobilityBlack);
  137. +  }
  138.  
  139.    bonus += apply_weight(mobilityWhite - mobilityBlack, Weights[Mobility]);
  140.  
  141.    // Evaluate kings after all other pieces because we need complete attack
  142.    // information when computing the king safety evaluation.
  143. -  bonus +=  evaluate_king<WHITE, HasPopCnt>(pos, ei, margins)
  144. -          - evaluate_king<BLACK, HasPopCnt>(pos, ei, margins);
  145. +  term_w = evaluate_king<WHITE, HasPopCnt>(pos, ei, margins);
  146. +  term_b = evaluate_king<BLACK, HasPopCnt>(pos, ei, margins);
  147. +  bonus += term_w - term_b; if (Verbose) display_eval_table_row("King safety", term_w, term_b);
  148.  
  149.    // Evaluate tactical threats, we need full attack information including king
  150. -  bonus +=  evaluate_threats<WHITE>(pos, ei)
  151. -          - evaluate_threats<BLACK>(pos, ei);
  152. +  term_w = evaluate_threats<WHITE>(pos, ei);
  153. +  term_b = evaluate_threats<BLACK>(pos, ei);
  154. +  bonus += term_w - term_b; if (Verbose) display_eval_table_row("Threats", term_w, term_b);
  155.  
  156.    // Evaluate passed pawns, we need full attack information including king
  157. -  bonus +=  evaluate_passed_pawns<WHITE>(pos, ei)
  158. -          - evaluate_passed_pawns<BLACK>(pos, ei);
  159. +  term_w = evaluate_passed_pawns<WHITE>(pos, ei);
  160. +  term_b = evaluate_passed_pawns<BLACK>(pos, ei);
  161. +  bonus += term_w - term_b; if (Verbose) display_eval_table_row("Passed pawns", term_w, term_b);
  162.  
  163.    // If one side has only a king, check whether exists any unstoppable passed pawn
  164.    if (!pos.non_pawn_material(WHITE) || !pos.non_pawn_material(BLACK))
  165. -      bonus += evaluate_unstoppable_pawns<HasPopCnt>(pos, ei);
  166. +  {
  167. +      Score term_t = evaluate_unstoppable_pawns<HasPopCnt>(pos, ei);
  168. +      bonus += term_t; if (Verbose) display_eval_table_row("Unstoppable pawns", term_t);
  169. +  }
  170. +  else if (Verbose) display_eval_table_row("Unstoppable pawns", make_score(0, 0));
  171.  
  172.    // Evaluate space for both sides, only in middle-game.
  173.    if (mi->space_weight())
  174.    {
  175. -      int s = evaluate_space<WHITE, HasPopCnt>(pos, ei) - evaluate_space<BLACK, HasPopCnt>(pos, ei);
  176. -      bonus += apply_weight(make_score(s * mi->space_weight(), 0), Weights[Space]);
  177. +      int s_w = evaluate_space<WHITE, HasPopCnt>(pos, ei);
  178. +      int s_b = evaluate_space<BLACK, HasPopCnt>(pos, ei);
  179. +      bonus += apply_weight(make_score((s_w-s_b) * mi->space_weight(), 0), Weights[Space]);
  180. +      if (Verbose)
  181. +      {
  182. +          display_eval_table_row("Space",
  183. +              apply_weight(make_score(s_w * mi->space_weight(), make_score(0, 0)), Weights[Space]),
  184. +              apply_weight(make_score(s_b * mi->space_weight(), make_score(0, 0)), Weights[Space]));
  185. +      }
  186.    }
  187. +  else if (Verbose) display_eval_table_row("Space", make_score(0, 0), make_score(0, 0));
  188.  
  189.    // Scale winning side if position is more drawish that what it appears
  190.    ScaleFactor sf = eg_value(bonus) > VALUE_DRAW ? mi->scale_factor(pos, WHITE)
  191. @@ -378,6 +461,19 @@
  192.    // Interpolate between the middle game and the endgame score
  193.    margin = margins[pos.side_to_move()];
  194.    Value v = scale_by_game_phase(bonus, phase, sf);
  195. +
  196. +  if (Verbose)
  197. +  {
  198. +      display_eval_table_hline();
  199. +      display_eval_table_row("Total", bonus);
  200. +      std::cout  << "Uncertainty margin: White: " << std::setw(6) << human_value(margins[WHITE]) << ", Black: " << human_value(margins[BLACK])
  201. +                 << "\nScaling: " << std::noshowpos
  202. +                 << std::setw(6) << 100.0 * phase/128.0 << "% MG, "
  203. +                 << std::setw(6) << 100.0 * (1.0 - phase/128.0) << "% * "
  204. +                 << std::setw(6) << (100.0 * sf) / SCALE_FACTOR_NORMAL << "% EG.\n"
  205. +                 << "Total evaluation: " << human_value(v) << std::endl;
  206. +  }
  207. +
  208.    return pos.side_to_move() == WHITE ? v : -v;
  209.  }
  210.  
  211. @@ -680,6 +776,29 @@
  212.  
  213.      // Sum up all attacked squares
  214.      ei.attackedBy[Us][0] =   ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
  215. +                           | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
  216. +                           | ei.attackedBy[Us][QUEEN]  | ei.attackedBy[Us][KING];
  217. +    return bonus;
  218. +  }
  219. +
  220. +  template<Color Us, bool HasPopCnt>
  221. +  Score evaluate_pieces_of_color(const Position& pos, EvalInfo& ei, Score& mobility, Score breakdown[7]) {
  222. +
  223. +    const Color Them = (Us == WHITE ? BLACK : WHITE);
  224. +
  225. +    Score bonus = mobility = SCORE_ZERO;
  226. +
  227. +    // Do not include in mobility squares protected by enemy pawns or occupied by our pieces
  228. +    const Bitboard mobilityArea = ~(ei.attackedBy[Them][PAWN] | pos.pieces_of_color(Us));
  229. +
  230. +    breakdown[KNIGHT] = evaluate_pieces<KNIGHT, Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
  231. +    breakdown[BISHOP] = evaluate_pieces<BISHOP, Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
  232. +    breakdown[ROOK]   = evaluate_pieces<ROOK,   Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
  233. +    breakdown[QUEEN]  = evaluate_pieces<QUEEN,  Us, HasPopCnt>(pos, ei, mobility, mobilityArea);
  234. +    bonus += breakdown[KNIGHT] + breakdown[BISHOP] + breakdown[ROOK] + breakdown[QUEEN];
  235. +
  236. +    // Sum up all attacked squares
  237. +    ei.attackedBy[Us][0] =   ei.attackedBy[Us][PAWN]   | ei.attackedBy[Us][KNIGHT]
  238.                             | ei.attackedBy[Us][BISHOP] | ei.attackedBy[Us][ROOK]
  239.                             | ei.attackedBy[Us][QUEEN]  | ei.attackedBy[Us][KING];
  240.      return bonus;
  241. diff -Naur stockfish-201-ja/src/evaluate.h stockfish-201-verbose/src/evaluate.h
  242. --- stockfish-201-ja/src/evaluate.h 2011-01-01 11:31:54.000000000 -0800
  243. +++ stockfish-201-verbose/src/evaluate.h    2011-02-23 11:24:06.237999006 -0800
  244. @@ -27,6 +27,7 @@
  245.  class Position;
  246.  
  247.  extern Value evaluate(const Position& pos, Value& margin);
  248. +extern Value evaluate_verbose(const Position& pos, Value& margin);
  249.  extern void init_eval(int threads);
  250.  extern void quit_eval();
  251.  extern void read_evaluation_uci_options(Color sideToMove);
  252. diff -Naur stockfish-201-ja/src/uci.cpp stockfish-201-verbose/src/uci.cpp
  253. --- stockfish-201-ja/src/uci.cpp    2011-01-03 22:48:24.000000000 -0800
  254. +++ stockfish-201-verbose/src/uci.cpp   2011-02-23 11:25:14.247999006 -0800
  255. @@ -107,9 +107,7 @@
  256.    else if (token == "eval")
  257.    {
  258.        Value evalMargin;
  259. -      cout << "Incremental mg: "   << mg_value(pos.value())
  260. -           << "\nIncremental eg: " << eg_value(pos.value())
  261. -           << "\nFull eval: "      << evaluate(pos, evalMargin) << endl;
  262. +      (void) evaluate_verbose(pos, evalMargin);
  263.    }
  264.    else if (token == "key")
  265.        cout << "key: " << hex << pos.get_key()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement