+ Value margin;
+ std::string totals;
+
+ 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);
+
+ totals = TraceStream.str();
+ TraceStream.str("");
+
+ TraceStream << std::setw(21) << "Eval term " << "| White | Black | Total \n"
+ << " | MG EG | MG EG | MG EG \n"
+ << "---------------------+-------------+-------------+---------------\n";
+
+ trace_row("Material, PST, Tempo", PST);
+ trace_row("Material imbalance", IMBALANCE);
+ trace_row("Pawns", PAWN);
+ trace_row("Knights", KNIGHT);
+ trace_row("Bishops", BISHOP);
+ trace_row("Rooks", ROOK);
+ trace_row("Queens", QUEEN);
+ trace_row("Mobility", MOBILITY);
+ trace_row("King safety", KING);
+ trace_row("Threats", THREAT);
+ trace_row("Passed pawns", PASSED);
+ trace_row("Unstoppable pawns", UNSTOPPABLE);
+ trace_row("Space", SPACE);
+
+ TraceStream << "---------------------+-------------+-------------+---------------\n";
+ trace_row("Total", TOTAL);
+ TraceStream << totals;
+
+ return TraceStream.str();
+ }
+
+} // namespace Eval
+
+
+namespace {
+
+template<bool Trace>
+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();