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()));
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;
}
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;
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) {
}
}
- 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;
}
};