Return all candidate moves from the probe.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Fri, 18 Mar 2016 00:51:35 +0000 (01:51 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 24 Nov 2018 10:17:41 +0000 (11:17 +0100)
src/client.cpp
src/hashprobe.proto
src/main.cpp

index b3ec68f..b1eead5 100644 (file)
@@ -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> 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;
     }
index 393553e..a7efa8c 100644 (file)
@@ -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;
index 33a8f52..0e3e3ab 100644 (file)
@@ -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<LEGAL> 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;
        }
 };