From: Steinar H. Gunderson Date: Fri, 18 Mar 2016 00:51:35 +0000 (+0100) Subject: Return all candidate moves from the probe. X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=4c1a8ff9da057987e34936af8743a4d179a472dc;hp=ef014e110098db03e9380f09bd2e92cf02bf760d Return all candidate moves from the probe. --- diff --git a/src/client.cpp b/src/client.cpp index b3ec68f8..b1eead58 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -12,6 +12,16 @@ using grpc::Channel; using grpc::ClientContext; using grpc::Status; +std::string FormatMove(Move move) { + if (move == MOVE_NULL) { + return "Null-move"; + } else if (move == MOVE_NONE) { + return "MOVE_NONE"; + } else { + return UCI::square(from_sq(move)) + UCI::square(to_sq(move)); + } +} + int main(int argc, char** argv) { std::shared_ptr channel(grpc::CreateChannel( "localhost:50051", grpc::InsecureChannelCredentials())); @@ -34,31 +44,28 @@ int main(int argc, char** argv) { Status status = stub->Probe(&context, request, &response); if (status.ok()) { - std::cout << response.found() << " "; - if (Move(response.move()) == MOVE_NULL) { - std::cout << "Null-move "; - } else if (Move(response.move()) == MOVE_NONE) { - std::cout << "MOVE_NONE "; - } else { - std::cout << UCI::square(from_sq(Move(response.move()))) - << UCI::square(to_sq(Move(response.move()))) << " "; + for (const HashProbeMove &hpmove : response.move()) { + std::cout << FormatMove(Move(hpmove.move())) << " "; + std::cout << hpmove.found() << " "; + std::cout << FormatMove(Move(hpmove.pv_move())) << " "; + switch (hpmove.bound()) { + case HashProbeMove::BOUND_NONE: + std::cout << "?"; + break; + case HashProbeMove::BOUND_EXACT: + std::cout << "=="; + break; + case HashProbeMove::BOUND_UPPER: + std::cout << "<="; + break; + case HashProbeMove::BOUND_LOWER: + std::cout << ">="; + break; + } + std::cout << " " << UCI::value(Value(hpmove.value())) << " "; + std::cout << hpmove.depth() << std::endl; } - switch (response.bound()) { - case HashProbeResponse::BOUND_NONE: - std::cout << "?"; - break; - case HashProbeResponse::BOUND_EXACT: - std::cout << "=="; - break; - case HashProbeResponse::BOUND_UPPER: - std::cout << "<="; - break; - case HashProbeResponse::BOUND_LOWER: - std::cout << ">="; - break; - } - std::cout << " " << UCI::value(Value(response.value())) << " "; - std::cout << response.depth() << std::endl; + std::cout << "END" << std::endl; } else { std::cout << "ERROR" << std::endl; } diff --git a/src/hashprobe.proto b/src/hashprobe.proto index 393553e9..a7efa8ce 100644 --- a/src/hashprobe.proto +++ b/src/hashprobe.proto @@ -3,8 +3,13 @@ message HashProbeRequest { string fen = 1; } message HashProbeResponse { + repeated HashProbeMove move = 1; +} +message HashProbeMove { + int32 move = 7; // See types.h + bool found = 1; - int32 move = 2; // See types.h + int32 pv_move = 2; // See types.h int32 value = 3; // Dynamic eval (may be inexact, see the "bound" field) int32 eval = 4; // Static eval int32 depth = 5; diff --git a/src/main.cpp b/src/main.cpp index 33a8f523..0e3e3abb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -49,15 +49,33 @@ public: if (!pos.pos_is_ok()) { return Status(StatusCode::INVALID_ARGUMENT, "Invalid FEN"); } + + bool invert = (pos.side_to_move() == BLACK); + + HashProbeMove *root_move = response->add_move(); + root_move->set_move(MOVE_NONE); + ProbeMove(pos.key(), invert, root_move); + + MoveList moves(pos); + for (const ExtMove* em = moves.begin(); em != moves.end(); ++em) { + HashProbeMove *move = response->add_move(); + move->set_move(em->move); + ProbeMove(pos.key_after(em->move), !invert, move); + } + + return Status::OK; + } + + void ProbeMove(const int64_t key, bool invert, HashProbeMove* response) { bool found; - TTEntry *entry = TT.probe(pos.key(), found); + TTEntry *entry = TT.probe(key, found); response->set_found(found); if (found) { Value value = entry->value(); Value eval = entry->eval(); Bound bound = entry->bound(); - if (pos.side_to_move() == BLACK) { + if (invert) { value = -value; eval = -eval; if (bound == BOUND_UPPER) { @@ -67,13 +85,12 @@ public: } } - response->set_move(entry->move()); + response->set_pv_move(entry->move()); response->set_depth(entry->depth()); response->set_eval(eval); response->set_value(value); - response->set_bound(HashProbeResponse::ValueBound(bound)); + response->set_bound(HashProbeMove::ValueBound(bound)); } - return Status::OK; } };