RCHowell / rchowell.github.io

https://rchowell.github.io
0 stars 0 forks source link

GTP Protobuf Definition #11

Open RCHowell opened 3 years ago

RCHowell commented 3 years ago

I'm starting a project which requires communicating with Go engines such as GnuGo and Katago. Engines communicate with a protocol called "Go Text Protocol". I'd prefer to use something more structured, so I've written protobuf definitions for a Go engine server and types. From here, it's easy to wrap the engines with a simple gRPC -> GTP translator.

/**
 * Author R. C. Howell 2020
 *
 * This package contains protobuf definitions for the Go Text Protocol 2.0 [1]. It is for use with gRPC
 * servers/controllers to communicate between applications and Go engines. You will find types have been adapted to
 * impose more structure on the protocol.
 *
 * [1] http://www.lysator.liu.se/~gunnar/gtp/
 */
syntax = "proto3";
package gtp;

option go_package = "github.com/rchowell/dandan/gtp";

message Vertex {
  int32 row = 1;
  string column = 2;
}

enum Color {
  EMPTY = 0;
  BLACK = 1;
  WHITE = 2;
}

message Move {
  Type type = 1;
  Color color = 2;
  Vertex vertex = 3;

  enum Type {
    PASS = 0;
    RESIGN = 1;
    PLACE = 2;
  }
}

message Game {
  int32 size = 1;
  float komi = 2;
  repeated Move moves = 3;
}

message Error {
  string message = 2;
}

message ProtocolVersionRequest {
  int32 id = 1;
}

message ProtocolVersionResponse {
  int32 id = 1;
  int32 version = 2;
}

message NameRequest {
  int32 id = 1;
}

message NameResponse {
  int32 id = 1;
  string name = 2;
}

message VersionRequest {
  int32 id = 1;
}

message VersionResponse {
  int32 id = 1;
  string version = 2;
}

message KnownCommandRequest {
  int32 id = 1;
  string command = 2;
}

message KnownCommandResponse {
  int32 id = 1;
  bool known = 2;
}

message ListCommandsRequest {
  int32 id = 1;
}

message ListCommandsResponse {
  int32 id = 1;
  repeated string commands = 2;
}

message QuitRequest {
  int32 id = 1;
}

message QuitResponse {
  int32 id = 1;
  Error error = 2;
}

message BoardSizeRequest {
  int32 id = 1;
  int32 size = 2;
}

message BoardSizeResponse {
  int32 id = 1;
  Error error = 2;
}

message ClearBoardRequest {
  int32 id = 1;
}

message ClearBoardResponse {
  int32 id = 1;
}

message KomiRequest {
  int32 id = 1;
  float komi = 2;
}

message KomiResponse {
  int32 id = 1;
  Error error = 2;
}

message PlayRequest {
  int32 id = 1;
  Move move = 2;
}

message PlayResponse {
  int32 id = 1;
  Error error = 2;
}

message GenMoveRequest {
  int32 id = 1;
  Color color = 2;
}

message GenMoveResponse {
  int32 id = 1;
  Move move = 2;
}

message UndoRequest {
  int32 id = 1;
}

message UndoResponse {
  int32 id = 1;
  Error error = 2;
}

service GTP {

  // Version of the GTP Protocol
  rpc ProtocolVersion (ProtocolVersionRequest) returns (ProtocolVersionResponse) {}

  // E.g. “GNU Go”, “GoLois”, “Many Faces of Go”. The name does not include any version information. Use `version`.
  rpc Name (NameRequest) returns (NameResponse) {}

  // E.g. “3.1.33”, “10.5”. Engines without a sense of version number return the empty string.
  rpc Version (VersionRequest) returns (VersionResponse) {}

  // Returns “true” if the command is known by the engine, “false” otherwise
  rpc KnownCommand (KnownCommandRequest) returns (KnownCommandResponse) {}

  // Lists all known commands, including required ones and private extensions.
  rpc ListCommands (ListCommandsRequest) returns (ListCommandsResponse) {}

  // The session is terminated and the connection is closed.
  rpc Quit (QuitRequest) returns (QuitResponse) {}

  // Changes the board size. If the engine cannot handle the new size, fails with the error message ”unacceptable size”.
  rpc BoardSize (BoardSizeRequest) returns (BoardSizeResponse) {}

  // Clears the board, captured stones are reset, and move history is reset
  rpc ClearBoard (ClearBoardRequest) returns (ClearBoardResponse) {}

  // Changes the Komi
  rpc Komi (KomiRequest) returns (KomiResponse) {}

  // Plays the given move
  rpc Play (PlayRequest) returns (PlayResponse) {}

  // Asks the engine to generate a move, it will play it, and will return what was played
  rpc GenMove (GenMoveRequest) returns (GenMoveResponse) {}

  // The board and captured stones are reset to the previous move
  rpc Undo(UndoRequest) returns(UndoResponse) {}

}
RCHowell commented 3 years ago

In practice, I've changed a few names for clarity

Komi -> SetKomi
BoardSize -> SetBoardSize
KnownCommand -> IsKnownCommand
RCHowell commented 3 years ago

Here is an example game where I used the above definitions with some serializing/deserializing to have the engine play itself.

id:1 name:"GNU Go"
id:2 version:"3.8"
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . . . . . . 8
 7 . . + . . . + . . 7
 6 . . . . . X . . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . + . . . + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . . . . . . 8
 7 . . + . . . + . . 7
 6 . . . . . X . . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . . + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . . . . . . 8
 7 . . + . . . + . . 7
 6 . . . . . X . . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . . . . . . 8
 7 . . + . . . O . . 7
 6 . . . . . X . . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . . . . . . 8
 7 . . + . . . O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . . . . . . 8
 7 . . + . . O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . . . . . . 8
 7 . . + . X O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . O . . . . 8
 7 . . + . X O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . . O . . . . 8
 7 . . + X X O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . + X X O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . . . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . O . . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O . . 7
 6 . . . . . X X . . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O . . 7
 6 . . . . . X X O . 6
 5 . . . . + . . . . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O . . 7
 6 . . . . . X X O . 6
 5 . . . . + . . X . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . . . . + . . X . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . . O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . . . . + . . X . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . . X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . . . . + . . X . 5
 4 . . . . . . . . . 4
 3 . . O . . X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . . . . + . . X . 5
 4 . . . . . . . . . 4
 3 . . O X . X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . . . . + . . X . 5
 4 . . . O . . . . . 4
 3 . . O X . X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . . . . + . . X . 5
 4 . . . O . . . . . 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . O . . + . . X . 5
 4 . . . O . . . . . 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . O . . + X . X . 5
 4 . . . O . . . . . 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . O . . + X . X O 5
 4 . . . O . . . . . 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O . 6
 5 . O . . + X . X O 5
 4 . . . O . . . . X 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . . O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X . X O 5
 4 . . . O . . . . X 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X . X O 5
 4 . . . O . . . . X 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X . X O 5
 4 . . . O . . . O X 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X X X O 5
 4 . . . O . . . O X 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . . . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X X X O 5
 4 . . . O . . . O X 4
 3 . . O X X X + . . 3
 2 . . O X O X . . . 2     WHITE (O) has captured 0 stones
 1 . . . O . . . . . 1     BLACK (X) has captured 0 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X X X O 5
 4 . . . O . . . O X 4
 3 . . O X X X + . . 3
 2 . . O X . X . . . 2     WHITE (O) has captured 0 stones
 1 . . . O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X X X O 5
 4 . . . O . . . O X 4
 3 . . O X X X + . . 3
 2 . . O X . X . . . 2     WHITE (O) has captured 0 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X X X O 5
 4 . . . O . . . O X 4
 3 . . O X X X + . . 3
 2 . . O X . X . X . 2     WHITE (O) has captured 0 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . . . . . X X O O 6
 5 . O . . + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . X . . . X X O O 6
 5 . O . . + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . X . . . X X O O 6
 5 . O O . + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . X . . . X X O O 6
 5 . O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . . X X X O O O . 7
 6 . X O . . X X O O 6
 5 . O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . X X X X O O O . 7
 6 . X O . . X X O O 6
 5 . O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 . X X X X O O O . 7
 6 O X O . . X X O O 6
 5 . O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O . . X X O O 6
 5 . O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . . . . . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O . . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . . . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O . . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O . . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O . . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O O . . O . 4
 3 . . O X X X + . O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O O . . O . 4
 3 . . O X X X + X O 3
 2 . . O X . X . X . 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O O . . O . 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O O . X O . 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X + X X X O 5
 4 . . . O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . . O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . . . . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . . O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . . O . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . . O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O . 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . . X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . . O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . . O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X . O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O . . . 9
 8 . . X O O . . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O . . . 9
 8 . . X O O O . . . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O . . . 9
 8 . . X O O O . X . 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O . . . 9
 8 . . X O O O . X O 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O . X . 9
 8 . . X O O O . X O 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O O X . 9
 8 . . X O O O . X O 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O . X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O O X . 9
 8 . . X O O O . X O 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O X X O O 4
 3 . . O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O O X . 9
 8 . . X O O O . X O 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O X X O O 4
 3 . O O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O O X . 9
 8 . . X O O O . X O 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O X X O O 4
 3 . O O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= 
   A B C D E F G H J
 9 . . X X X O O X . 9
 8 . . X O O O . X O 8
 7 X X X X X O O O . 7
 6 O X O X . X X O O 6
 5 O O O X X X X X O 5
 4 . . O O O X X O O 4
 3 . O O X X X + X O 3
 2 . . O X . X . X O 2     WHITE (O) has captured 1 stones
 1 . . O O X . X O O 1     BLACK (X) has captured 1 stones
   A B C D E F G H J
= B+2.0
Stopping Engine