Advertisement
Guest User

KataGo.cs

a guest
Jul 12th, 2023
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.17 KB | None | 0 0
  1. using System.Diagnostics;
  2.  
  3. namespace TempAPI.KataGo
  4. {
  5. public class KataGo
  6. {
  7. public Process? process;
  8. public StreamReader? reader;
  9. public StreamReader? errorReader;
  10. public StreamWriter? writer;
  11.  
  12. private int lastMaxVisits = 0;
  13.  
  14. private void Start()
  15. {
  16. if (G.Log) Console.WriteLine("KataGo.Start");
  17.  
  18. process = new Process();
  19. process.StartInfo.FileName = @"Resources\KataGo\katago.exe";
  20. process.StartInfo.Arguments = @"gtp -model Resources\KataGo\b18c384nbt-uec.bin.gz";
  21. process.StartInfo.RedirectStandardOutput = true;
  22. process.StartInfo.RedirectStandardError = true;
  23. process.StartInfo.RedirectStandardInput = true;
  24. process.StartInfo.UseShellExecute = false;
  25. process.Start();
  26.  
  27. reader = process.StandardOutput;
  28. errorReader = process.StandardError;
  29. writer = process.StandardInput;
  30.  
  31. string line;
  32. do
  33. {
  34. line = ReadError();
  35. Console.WriteLine(line);
  36. } while (!line.Contains("GTP ready"));
  37. }
  38.  
  39. public void ClearBoard()
  40. {
  41. if (G.Log) Console.WriteLine("KataGo.ClearBoard");
  42.  
  43. Write("clear_board");
  44. ClearReader();
  45. Write("clear_cache");
  46. ClearReader();
  47. }
  48.  
  49. public void Restart()
  50. {
  51. if (G.Log) Console.WriteLine("KataGo.Restart");
  52.  
  53. if (process != null) Write("quit");
  54. Start();
  55. }
  56.  
  57. public void SetBoardsize(int boardsize)
  58. {
  59. if (G.Log) Console.WriteLine("KataGo.SetBoardsize " + boardsize);
  60.  
  61. Write("boardsize " + boardsize);
  62. ClearReader();
  63. }
  64.  
  65. public void SetRuleset(string ruleset)
  66. {
  67. if (G.Log) Console.WriteLine("KataGo.SetRuleset " + ruleset);
  68.  
  69. Write("kata-set-rules " + ruleset);
  70. ClearReader();
  71. }
  72.  
  73. public void SetKomi(float komi)
  74. {
  75. if (G.Log) Console.WriteLine("KataGo.SetKomi " + komi);
  76.  
  77. Write("komi " + komi);
  78. ClearReader();
  79. }
  80.  
  81. public void SetHandicap(int handicap)
  82. {
  83. if (G.Log) Console.WriteLine("KataGo.SetHandicap " + handicap);
  84.  
  85. Write("fixed_handicap " + handicap);
  86. ClearReader();
  87. }
  88.  
  89. public MoveSuggestion AnalyzeMove(string color, string coord)
  90. {
  91. if (G.Log) Console.WriteLine("KataGo.AnalyzeMove " + color + " " + coord);
  92.  
  93. int maxVisits = 100;
  94. if (lastMaxVisits != maxVisits)
  95. {
  96. lastMaxVisits = maxVisits;
  97. Write("kata-set-param maxVisits " + maxVisits);
  98. ClearReader();
  99. }
  100.  
  101. Write("kata-genmove_analyze " + color + " allow " + color + " " + coord + " 1");
  102. Read(); // Ignore '= '
  103. string[] analysis = Read().Split(" ");
  104. ClearReader();
  105.  
  106. Write("undo");
  107. ClearReader();
  108.  
  109. MoveSuggestion suggestion = new(
  110. color,
  111. coord,
  112. analysis[4],
  113. analysis[8],
  114. analysis[14]
  115. );
  116. return suggestion;
  117. }
  118.  
  119. public List<MoveSuggestion> Analyze(string color, int maxVisits, float minVisitsPerc, float maxVisitDiffPerc)
  120. {
  121. if (G.Log) Console.WriteLine("KataGo.Analyze " + color + " " + maxVisits + " " + minVisitsPerc + " " + maxVisitDiffPerc);
  122.  
  123. if (lastMaxVisits != maxVisits)
  124. {
  125. lastMaxVisits = maxVisits;
  126. Write("kata-set-param maxVisits " + maxVisits);
  127. ClearReader();
  128. }
  129.  
  130. Write("kata-genmove_analyze " + color);
  131. Read(); // Ignore '= '
  132. string[] analysis = Read().Split(" ");
  133. ClearReader();
  134.  
  135. Write("undo");
  136. ClearReader();
  137.  
  138. List<MoveSuggestion> suggestions = new();
  139. MoveSuggestion? suggestion = null;
  140. for (int i = 0; i < analysis.Length; i++)
  141. {
  142. string element = analysis[i];
  143. if (element == "move")
  144. {
  145. suggestion.SetMove(color, analysis[i + 1]);
  146. }
  147. else if (element == "visits")
  148. {
  149. suggestion.SetVisits(analysis[i + 1]);
  150. }
  151. else if (element == "winrate")
  152. {
  153. suggestion.SetWinrate(analysis[i + 1]);
  154. }
  155. else if (element == "scoreLead")
  156. {
  157. suggestion.SetScoreLead(analysis[i + 1]);
  158. }
  159.  
  160. if (element == "info" || i == analysis.Length - 1)
  161. {
  162. if (suggestion != null)
  163. {
  164. suggestions.Add(suggestion);
  165. }
  166. suggestion = new MoveSuggestion();
  167. }
  168. }
  169.  
  170. int highestVisits = 0;
  171. foreach (MoveSuggestion moveSuggestion in suggestions)
  172. {
  173. if (highestVisits < moveSuggestion.visits)
  174. {
  175. highestVisits = moveSuggestion.visits;
  176. }
  177. }
  178. int maxVisitDiff = (int)Math.Round(maxVisitDiffPerc / 100.0 * Math.Max(maxVisits, highestVisits));
  179. int minVisits = (int)Math.Round(minVisitsPerc / 100.0 * maxVisits);
  180.  
  181. List<MoveSuggestion> filteredSuggestions = new();
  182. int lastSuggestionVisits = int.MaxValue;
  183. foreach (MoveSuggestion moveSuggestion in suggestions)
  184. {
  185. if (filteredSuggestions.Count > 0 &&
  186. filteredSuggestions[^1].move.coord != "pass" &&
  187. (moveSuggestion.visits < minVisits ||
  188. lastSuggestionVisits - moveSuggestion.visits > maxVisitDiff))
  189. {
  190. break;
  191. }
  192. filteredSuggestions.Add(moveSuggestion);
  193. if (lastSuggestionVisits > moveSuggestion.visits)
  194. {
  195. lastSuggestionVisits = moveSuggestion.visits;
  196. }
  197. }
  198.  
  199. return filteredSuggestions;
  200. }
  201.  
  202. public void Play(string color, string coord)
  203. {
  204. if (G.Log) Console.WriteLine("KataGo.Play " + color + " " + coord);
  205.  
  206. Write("play " + color + " " + coord);
  207. ClearReader();
  208. }
  209.  
  210. public void PlayRange(Moves moves)
  211. {
  212. if (G.Log) Console.WriteLine("KataGo.PlayRange " + moves);
  213.  
  214. foreach (Move move in moves.moves)
  215. {
  216. Play(move.color, move.coord);
  217. }
  218. }
  219.  
  220. public string SGF(bool shouldWriteFile)
  221. {
  222. if (G.Log) Console.WriteLine("KataGo.SGF " + shouldWriteFile);
  223.  
  224. Write("printsgf");
  225. string sgfStr = Read()[2..];
  226. ClearReader();
  227.  
  228. if (shouldWriteFile)
  229. {
  230. StreamWriter sgfWriter = new(File.Create("SGFs\\" +
  231. DateTime.Now.ToString("dd-MM_HH-mm-ss") +
  232. ".sgf"));
  233. sgfWriter.Write(sgfStr);
  234. sgfWriter.Close();
  235. }
  236.  
  237. return sgfStr;
  238. }
  239.  
  240. private string Read()
  241. {
  242. string line;
  243. while ((line = reader.ReadLine()) == null) { }
  244. return line;
  245. }
  246.  
  247. private string ReadError()
  248. {
  249. string line;
  250. while ((line = errorReader.ReadLine()) == null) { }
  251. return line;
  252. }
  253.  
  254. private void ClearReader()
  255. {
  256. while (reader.ReadLine() != "") { }
  257. }
  258.  
  259. private void Write(string command)
  260. {
  261. writer.WriteLine(command);
  262. writer.Flush();
  263. }
  264. }
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement