public ByteTreeSearchBenchmarks() { var comparator = new Comparator(); var brancher = new Brancher(); var evaluator = new Evaluator(); var stateTransitions = new StateTransitions(); _serial = new SerialAlfaBetaSearch <ByteNode, sbyte, sbyte>( evaluator, brancher, comparator, stateTransitions, sbyte.MaxValue, sbyte.MinValue); _serialTree = TreeGenerator.ReadTree(); _dynamic = new DynamicTreeSplitting <AlfaBetaByteNode, sbyte, sbyte>( evaluator, brancher, comparator, stateTransitions ); _dynamicTree = TreeGenerator.ReadAlfaBetaTree(); _cts = new CancellationTokenSource(); }
public static AlfaBetaByteNode ParseAlfaBetaTree(string tree, byte branchingFactor) { var bytes = tree.Split(' '); var depth = -1; var sum = 0; while (sum < bytes.Length) { depth++; sum += (int)Math.Pow(branchingFactor, depth); } if (sum != bytes.Length) { throw new ArgumentException("Tree of unequal depth"); } var queue = new Queue <AlfaBetaByteNode>(); var startDequeue = false; var bottomLevel = (int)Math.Pow(branchingFactor, depth); for (var i = bytes.Length - 1; i >= 0; i--) { AlfaBetaByteNode node; if (queue.Count == bottomLevel) { startDequeue = true; } if (startDequeue) { var children = new AlfaBetaByteNode[branchingFactor]; for (var j = 0; j < branchingFactor; j++) { children[j] = queue.Dequeue(); } node = new AlfaBetaByteNode(sbyte.Parse(bytes[i]), !children[0].IsMaxPlayer, children); } else { var children = new AlfaBetaByteNode[0]; node = new AlfaBetaByteNode(sbyte.Parse(bytes[i]), depth % 2 == 0, children); } queue.Enqueue(node); } return(queue.Dequeue()); }