void EnsureSwapAnalyzerExistence() { if (!BoardAnalysisPipeline.Any(a => a is SwapAnalyzer)) { BoardAnalysisPipeline.Add(new SwapAnalyzer(FindCleanestWin, false)); } }
public void AddBoardAnalyzer(IBoardAnalyzer analyzer) { BoardAnalysisPipeline.Add(analyzer); }
bool Analyze(List <Board> boards, Action <ThoughtProgress> progress = null) { int winLength = 0; foreach (var analyzer in BoardAnalysisPipeline.Where(a => !a.IsKnowledgeDependent)) { var chunk = new List <Board>(); boards.RemoveAll(b => analyzer.Analyze(Knowledge, b), (removed) => { chunk.Add(removed); if (chunk.Count > 100) { if (progress != null) { progress(new ThoughtProgress() { BoardsRemoved = chunk.ToList(), WinLength = winLength }); } chunk.Clear(); } }); if (chunk.Count > 0) { if (progress != null) { progress(new ThoughtProgress() { BoardsRemoved = chunk.ToList(), WinLength = winLength }); } } } var knowledgeDependentAnalyzers = BoardAnalysisPipeline.Where(a => a.IsKnowledgeDependent).ToList(); while (boards.Count > 0) { winLength++; var count = boards.Count; foreach (var analyzer in knowledgeDependentAnalyzers) { boards.RemoveAll(b => analyzer.Analyze(Knowledge, b), (removed) => { if (progress != null) { progress(new ThoughtProgress() { BoardsRemoved = removed.EnList(), WinLength = winLength }); } }); } if (boards.Count == count) { foreach (var b in boards) { Knowledge[b.Template.Value][b.ColorCount].AddLoss(b); } var g = Knowledge.GraphKnowledge.Graph; var nearlyColorable = Enumerable.Range(0, Knowledge.GraphKnowledge.LineGraph.N).All(e => boards.Any(b => ColoringAnalyzer.ColorableWithoutEdge(Knowledge, b, e))); if (nearlyColorable) { FixerWonAllNearlyColorableBoards = false; BreakerWonBoard = boards.FirstOrDefault(b => g.DegreeCondition(b) && ColoringAnalyzer.ColorableWithoutEdge(Knowledge, b, 0)); if (BreakerWonBoard == null) { BreakerWonBoard = boards.First(b => ColoringAnalyzer.ColorableWithoutEdge(Knowledge, b, 0)); } } return(false); } } return(true); }