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);
        }
Exemple #2
0
        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);
        }