Files
2026-05-07 03:23:56 +00:00

56 lines
1.9 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Threading.Tasks;
using GameOfLife.Entities;
using GameOfLife.IO;
namespace GameOfLife.Search
{
public class LibrarySearcher
{
private readonly PatternLibrary _patternLibrary;
private Dictionary<Cell, List<Pattern>> _cellPatterns;
public LibrarySearcher(PatternLibrary patternLibrary)
{
_patternLibrary = patternLibrary;
var cellPatterns =
from patternProjections in _patternLibrary.PatternProjections
from projection in patternProjections.Item2
from cell in projection
group projection by cell into cellGroups
select cellGroups;
_cellPatterns = cellPatterns.ToDictionary(t => t.Key, t => t.ToList());
}
//public IEnumerable<Tuple<PatternMetadata, Pattern[]>> MatchLibraryPatternsLookup(IEnumerable<Cell> cells)
//{
// var pattern = cells.ToPattern();
//}
public IEnumerable<Tuple<PatternMetadata, Pattern[]>> MatchLibraryPatterns(IEnumerable<Cell> cells)
{
var inputCells = cells.ToPattern();
var matches = new ConcurrentBag<Tuple<PatternMetadata, Pattern[]>>();
Parallel.ForEach(_patternLibrary.PatternProjections, tuple =>
{
var patternMetadata = tuple.Item1;
var projections = tuple.Item2;
var foundPatterns = inputCells.FindPatterns_Serial(projections).ToArray();
if (foundPatterns.Any())
matches.Add(Tuple.Create(patternMetadata, foundPatterns.ToArray()));
}
);
return matches;
}
}
}