public override Node DeepClone() { BracketNode clone = new BracketNode(CompetitorA.DeepClone(), CompetitorB.DeepClone()); if (BestCompetitor == CompetitorA) { clone.BestCompetitor = clone.CompetitorA; } else if (BestCompetitor == CompetitorB) { clone.BestCompetitor = clone.CompetitorB; } return(clone); }
public async override Task <LeafNode> BestNodeAsync(Tournament <T> tournament, IAsyncComparator <T> comparator, CancellationToken cancellationToken) { if (BestCompetitor == null) { Debug.Assert(tournament.NextWinnerStepsMax > 0); Debug.Assert(tournament.NextWinnerStepsMax - tournament.NextWinnerStepsDone > 0); cancellationToken.ThrowIfCancellationRequested(); T itemA = (await CompetitorA.BestNodeAsync(tournament, comparator, cancellationToken)).Item; cancellationToken.ThrowIfCancellationRequested(); T itemB = (await CompetitorB.BestNodeAsync(tournament, comparator, cancellationToken)).Item; cancellationToken.ThrowIfCancellationRequested(); BestCompetitor = (await comparator.CompareAsync(itemA, itemB, cancellationToken)) > 0 ? CompetitorA : CompetitorB; tournament.NextWinnerStepsDone++; Debug.Assert(tournament.NextWinnerStepsDone <= tournament.NextWinnerStepsMax); tournament.GlobalStepsDone++; Debug.Assert(tournament.GlobalStepsDone <= tournament.GlobalStepsMax); } return(await BestCompetitor.BestNodeAsync(tournament, comparator, cancellationToken)); }
public override int CountUnanswered() { return((BestCompetitor == null ? 1 : 0) + CompetitorA.CountUnanswered() + CompetitorB.CountUnanswered()); }
public override void ForEachLeafNode(Action <LeafNode> action) { CompetitorA.ForEachLeafNode(action); CompetitorB.ForEachLeafNode(action); }