public TMetric Search(TNode node, int depth, TMetric alfa, TMetric beta, TState state, CancellationToken cancellationToken) { _cancellationToken = cancellationToken; cancellationToken.Register(CancelOperation); _currentGenerationCounter = new CountdownEvent(1); _manualResetEvent = new ManualResetEvent(false); var localState = _stateTransitions.Copy(state); GoDown(node, localState, depth, node); _currentGenerationCounter.Signal(); _cancellationToken.ThrowIfCancellationRequested(); _manualResetEvent.WaitOne(); _cancellationToken.ThrowIfCancellationRequested(); // waiting for other threadpool tasks that are already scheduled _currentGenerationCounter.Wait(); return(node.Result); }
public void Branch(GameNode node, BoardMinified practiceBoard) { // todo - remove list to speed up perfomance var children = new List <GameNode> { Capacity = 16 }; node.ExpectedFinalizedFlag = 0; practiceBoard = _rules.FastForwardAvailableMoves(practiceBoard); var activeSetPtr = practiceBoard.ActivePlayer ? practiceBoard.Player1Pieces : practiceBoard.Player2Pieces; var childBitIndex = 0; for (var i = 0; i < BoardMinified.BufferSize; i++) { var piece = (PieceMinified)(*(activeSetPtr + i)); if (piece.IsEmpty()) { break; } foreach (var move in piece.GetAvailableMoves()) { if (move.IsNotNull) { var child = new GameNode(!practiceBoard.ActivePlayer); child.Move = new HistoryItemMinified(new Cell(piece.X, piece.Y), move, practiceBoard.ActivePlayer); // todo - remove - duplicated information child.Parent = node; children.Add(child); child.ChildAddressBit = 1 << childBitIndex; node.ExpectedFinalizedFlag += child.ChildAddressBit; childBitIndex++; } else { break; } } } foreach (var child in children) { var copy = _stateTransitions.Copy(practiceBoard); var localState = _stateTransitions.GoDown(copy, child); child.TerminationResult = _evaluator.Evaluate(localState); child.IsEvaluated = true; } node.Children = children.ToArray(); InsertionSort(node.Children, node.IsMaxPlayer); }