| | 1 | | using BenchmarkDotNet.Attributes; |
| | 2 | | using BenchmarkDotNet.Running; |
| | 3 | | using Rudim.Board; |
| | 4 | | using Rudim.CLI; |
| | 5 | | using Rudim.Common; |
| | 6 | | using Rudim.Perft; |
| | 7 | | using System.Collections.Generic; |
| | 8 | | using System.Diagnostics.CodeAnalysis; |
| | 9 | | using System.Threading; |
| | 10 | |
|
| | 11 | | namespace Rudim |
| | 12 | | { |
| | 13 | | class Program |
| | 14 | | { |
| | 15 | | static void Main(string[] args) |
| | 16 | | { |
| 0 | 17 | | if (args.Length >= 1 && args[0] == "--benchmark") |
| | 18 | | { |
| 0 | 19 | | BenchmarkRunner.Run<Benchmark>(); |
| | 20 | | } |
| 0 | 21 | | else if (args.Length >= 1 && args[0] == "--perft") |
| | 22 | | { |
| | 23 | |
|
| 0 | 24 | | List<PerftData> data = new List<PerftData> { |
| 0 | 25 | | new(0, 1, Helpers.StartingFEN), |
| 0 | 26 | | new(1, 20, Helpers.StartingFEN), |
| 0 | 27 | | new(2, 400, Helpers.StartingFEN), |
| 0 | 28 | | new(3, 8_902, Helpers.StartingFEN), |
| 0 | 29 | | new(4, 197_281, Helpers.StartingFEN), |
| 0 | 30 | | new(5, 4_865_609, Helpers.StartingFEN), |
| 0 | 31 | | new(6, 119_060_324, Helpers.StartingFEN), |
| 0 | 32 | | new(1, 48, Helpers.KiwiPeteFEN), |
| 0 | 33 | | new(2, 2_039, Helpers.KiwiPeteFEN), |
| 0 | 34 | | new(3, 97_862, Helpers.KiwiPeteFEN), |
| 0 | 35 | | new(4, 4_085_603, Helpers.KiwiPeteFEN), |
| 0 | 36 | | new(5, 193_690_690, Helpers.KiwiPeteFEN), |
| 0 | 37 | | new(1, 14, Helpers.EndgameFEN), |
| 0 | 38 | | new(2, 191, Helpers.EndgameFEN), |
| 0 | 39 | | new(3, 2_812, Helpers.EndgameFEN), |
| 0 | 40 | | new(4, 43_238, Helpers.EndgameFEN), |
| 0 | 41 | | new(5, 674_624, Helpers.EndgameFEN), |
| 0 | 42 | | new(6, 11_030_083, Helpers.EndgameFEN), |
| 0 | 43 | | new(7, 178_633_661, Helpers.EndgameFEN), |
| 0 | 44 | | }; |
| 0 | 45 | | foreach (PerftData item in data) |
| | 46 | | { |
| 0 | 47 | | PerftTest.Perft(item.Depth, item.Nodes, item.Position); |
| | 48 | | } |
| | 49 | | } |
| | 50 | | else |
| | 51 | | { |
| 0 | 52 | | CliClient.Run(); |
| | 53 | | } |
| 0 | 54 | | } |
| | 55 | | } |
| | 56 | |
|
| | 57 | | [ExcludeFromCodeCoverage] |
| | 58 | | internal class PerftData |
| | 59 | | { |
| | 60 | | public int Depth { get; set; } |
| | 61 | |
|
| | 62 | | public ulong Nodes { get; set; } |
| | 63 | |
|
| | 64 | | public string Position { get; set; } |
| | 65 | |
|
| | 66 | | public PerftData(int depth, ulong nodes, string position) |
| | 67 | | { |
| | 68 | | Depth = depth; |
| | 69 | | Nodes = nodes; |
| | 70 | | Position = position; |
| | 71 | |
|
| | 72 | | } |
| | 73 | | } |
| | 74 | |
|
| | 75 | | [ExcludeFromCodeCoverage] |
| | 76 | | [MemoryDiagnoser] |
| | 77 | | public class Benchmark |
| | 78 | | { |
| | 79 | | [Benchmark] |
| | 80 | | [ArgumentsSource(nameof(GenerateBenchmarks))] |
| | 81 | | public void BenchmarkBestMove(BoardState boardState, int depth, CancellationToken cancellationToken) |
| | 82 | | { |
| | 83 | | Global.Reset(); |
| | 84 | | bool debugMode = false; |
| | 85 | | boardState.FindBestMove(depth, cancellationToken, ref debugMode); |
| | 86 | | } |
| | 87 | |
|
| | 88 | | public IEnumerable<object[]> GenerateBenchmarks() |
| | 89 | | { |
| | 90 | | yield return [BoardState.ParseFEN(Helpers.AdvancedMoveFEN), 6, new CancellationToken(false)]; |
| | 91 | | yield return [BoardState.ParseFEN(Helpers.AdvancedMoveFEN), 7, new CancellationToken(false)]; |
| | 92 | | yield return [BoardState.ParseFEN(Helpers.StartingFEN), 6, new CancellationToken(false)]; |
| | 93 | | yield return [BoardState.ParseFEN(Helpers.StartingFEN), 7, new CancellationToken(false)]; |
| | 94 | | yield return [BoardState.ParseFEN(Helpers.EndgameFEN), 6, new CancellationToken(false)]; |
| | 95 | | yield return [BoardState.ParseFEN(Helpers.EndgameFEN), 7, new CancellationToken(false)]; |
| | 96 | | yield return [BoardState.ParseFEN(Helpers.KiwiPeteFEN), 6, new CancellationToken(false)]; |
| | 97 | | yield return [BoardState.ParseFEN(Helpers.KiwiPeteFEN), 7, new CancellationToken(false)]; |
| | 98 | | } |
| | 99 | | } |
| | 100 | | } |