From: Steinar H. Gunderson Date: Sat, 19 Nov 2016 11:04:21 +0000 (+0100) Subject: Send back a prettyprinted version of the move on hash probe. X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=4455f354f7b3ea7446c6c26dcb2837ca2b7be06f;ds=inline Send back a prettyprinted version of the move on hash probe. --- diff --git a/src/client.cpp b/src/client.cpp index 6049495a..a5787905 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -15,7 +15,7 @@ using namespace hashprobe; std::string FormatMove(const HashProbeMove &move) { if (move.from_sq().empty()) return "MOVE_NONE"; - return move.from_sq() + move.to_sq() + move.promotion(); + return move.pretty(); } int main(int argc, char** argv) { diff --git a/src/hashprobe.h b/src/hashprobe.h index 67b283f5..999266d5 100644 --- a/src/hashprobe.h +++ b/src/hashprobe.h @@ -18,7 +18,7 @@ public: hashprobe::HashProbeResponse *response); private: - void FillMove(Move move, hashprobe::HashProbeMove* decoded); + void FillMove(Position* pos, Move move, hashprobe::HashProbeMove* decoded); void ProbeMove(Position* pos, std::deque* setup_states, bool invert, hashprobe::HashProbeLine* response); void FillValue(Value value, hashprobe::HashProbeScore* score); }; diff --git a/src/hashprobe.proto b/src/hashprobe.proto index bb34806d..175cd773 100644 --- a/src/hashprobe.proto +++ b/src/hashprobe.proto @@ -30,6 +30,8 @@ message HashProbeMove { string from_sq = 1; // a1, a2, etc. string to_sq = 2; string promotion = 3; // Q, R, etc. + + string pretty = 4; // e.g. Rxf6+ } message HashProbeScore { enum ScoreType { diff --git a/src/main.cpp b/src/main.cpp index 76aca51d..5eb1b1f0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -62,7 +62,7 @@ Status HashProbeImpl::Probe(ServerContext* context, MoveList moves(pos); for (const ExtMove* em = moves.begin(); em != moves.end(); ++em) { HashProbeLine *line = response->add_line(); - FillMove(em->move, line->mutable_move()); + FillMove(&pos, em->move, line->mutable_move()); setup_states->push_back(StateInfo()); pos.do_move(em->move, setup_states->back(), pos.gives_check(em->move)); ProbeMove(&pos, setup_states.get(), !invert, line); @@ -72,7 +72,7 @@ Status HashProbeImpl::Probe(ServerContext* context, return Status::OK; } -void HashProbeImpl::FillMove(Move move, HashProbeMove* decoded) { +void HashProbeImpl::FillMove(Position *pos, Move move, HashProbeMove* decoded) { if (!is_ok(move)) return; Square from = from_sq(move); @@ -88,6 +88,73 @@ void HashProbeImpl::FillMove(Move move, HashProbeMove* decoded) { if (type_of(move) == PROMOTION) { decoded->set_promotion(std::string() + " PNBRQK"[promotion_type(move)]); } + + Piece moved_piece = pos->moved_piece(move); + std::string pretty; + if (type_of(move) == CASTLING) { + if (to > from) { + pretty = "O-O"; + } else { + pretty = "O-O-O"; + } + } else if (type_of(moved_piece) == PAWN) { + if (type_of(move) == ENPASSANT || pos->piece_on(to) != NO_PIECE) { + // Capture. + pretty = char('a' + file_of(from)); + pretty += "x"; + } + pretty += UCI::square(to); + if (type_of(move) == PROMOTION) { + pretty += "="; + pretty += " PNBRQK"[promotion_type(move)]; + } + } else { + pretty = " PNBRQK"[type_of(moved_piece)]; + Bitboard attackers = pos->attackers_to(to) & pos->pieces(color_of(moved_piece), type_of(moved_piece)); + if (more_than_one(attackers)) { + // Remove all illegal moves to disambiguate. + Bitboard att_copy = attackers; + while (att_copy) { + Square s = pop_lsb(&att_copy); + Move m = make_move(s, to); + if (!pos->pseudo_legal(m) || !pos->legal(m)) { + attackers &= ~SquareBB[s]; + } + } + } + if (more_than_one(attackers)) { + // Disambiguate by file if possible. + Bitboard attackers_this_file = attackers & file_bb(file_of(from)); + if (attackers != attackers_this_file) { + pretty += char('a' + file_of(from)); + attackers = attackers_this_file; + } + if (more_than_one(attackers)) { + // Still ambiguous, so need to disambiguate by rank. + pretty += char('1' + rank_of(from)); + } + } + + if (type_of(move) == ENPASSANT || pos->piece_on(to) != NO_PIECE) { + pretty += "x"; + } + + pretty += UCI::square(to); + } + + if (pos->gives_check(move)) { + // Check if mate. + StateInfo si; + pos->do_move(move, si, true); + if (MoveList(*pos).size() > 0) { + pretty += "+"; + } else { + pretty += "#"; + } + pos->undo_move(move); + } + + decoded->set_pretty(pretty); } void HashProbeImpl::ProbeMove(Position* pos, std::deque* setup_states, bool invert, HashProbeLine* response) { @@ -122,7 +189,7 @@ void HashProbeImpl::ProbeMove(Position* pos, std::deque* setup_states while (found && is_ok(entry->move()) && pos->pseudo_legal(entry->move()) && pos->legal(entry->move())) { - FillMove(entry->move(), response->add_pv()); + FillMove(pos, entry->move(), response->add_pv()); if (seen.count(pos->key())) break; pv.push(entry->move()); seen.insert(pos->key());