private ConcurrentDictionary <IModelReference, ResultEntryAccumulator> GetSimilaritiesUsingBatchedStrategy(IEnumerable <HashedFingerprint> queryFingerprints, QueryConfiguration configuration, IModelService modelService) { var hashedFingerprints = queryFingerprints as List <HashedFingerprint> ?? queryFingerprints.ToList(); var allCandidates = modelService.ReadSubFingerprints(hashedFingerprints.Select(querySubfingerprint => querySubfingerprint.HashBins), configuration); var hammingSimilarities = new ConcurrentDictionary <IModelReference, ResultEntryAccumulator>(); Parallel.ForEach(hashedFingerprints, queryFingerprint => { var subFingerprints = allCandidates.Where(candidate => queryMath.IsCandidatePassingThresholdVotes(queryFingerprint, candidate, configuration.ThresholdVotes)); similarityUtility.AccumulateHammingSimilarity(subFingerprints, queryFingerprint, hammingSimilarities, configuration.FingerprintConfiguration.HashingConfig.NumberOfMinHashesPerTable); }); return(hammingSimilarities); }
private GroupedQueryResults GetSimilaritiesUsingBatchedStrategy(IEnumerable <HashedFingerprint> queryFingerprints, QueryConfiguration configuration, IModelService modelService) { var hashedFingerprints = queryFingerprints as List <HashedFingerprint> ?? queryFingerprints.ToList(); var allCandidates = modelService.ReadSubFingerprints(hashedFingerprints.Select(querySubfingerprint => querySubfingerprint.HashBins), configuration); var groupedResults = new GroupedQueryResults(hashedFingerprints); int hashesPerTable = configuration.FingerprintConfiguration.HashingConfig.NumberOfMinHashesPerTable; Parallel.ForEach(hashedFingerprints, queryFingerprint => { var subFingerprints = allCandidates.Where(candidate => queryMath.IsCandidatePassingThresholdVotes(queryFingerprint, candidate, configuration.ThresholdVotes)); foreach (var subFingerprint in subFingerprints) { int hammingSimilarity = similarityUtility.CalculateHammingSimilarity(queryFingerprint.HashBins, subFingerprint.Hashes, hashesPerTable); groupedResults.Add(queryFingerprint, subFingerprint, hammingSimilarity); } }); return(groupedResults); }