private ConcurrentDictionary <IModelReference, ResultEntryAccumulator> GetSimilaritiesUsingNonBatchedStrategy(IEnumerable <HashedFingerprint> queryFingerprints, QueryConfiguration configuration, IModelService modelService) { var hammingSimilarities = new ConcurrentDictionary <IModelReference, ResultEntryAccumulator>(); foreach (var queryFingerprint in queryFingerprints) { var subFingerprints = modelService.ReadSubFingerprints(queryFingerprint.HashBins, configuration); similarityUtility.AccumulateHammingSimilarity(subFingerprints, queryFingerprint, hammingSimilarities); } return(hammingSimilarities); }
private ConcurrentDictionary <IModelReference, ResultEntryAccumulator> GetSimilaritiesUsingNonBatchedStrategy(IEnumerable <HashedFingerprint> queryFingerprints, QueryConfiguration configuration, IModelService modelService) { var hammingSimilarities = new ConcurrentDictionary <IModelReference, ResultEntryAccumulator>(); Parallel.ForEach(queryFingerprints, queryFingerprint => { var subFingerprints = modelService.ReadSubFingerprints(queryFingerprint.HashBins, configuration); similarityUtility.AccumulateHammingSimilarity(subFingerprints, queryFingerprint, hammingSimilarities, configuration.FingerprintConfiguration.HashingConfig.NumberOfMinHashesPerTable); }); return(hammingSimilarities); }
public void ShouldSumUpHammingDistanceAccrossTracks() { var hammingSimilarities = new ConcurrentDictionary <IModelReference, ResultEntryAccumulator>(); long[] hashes1 = GenericHashBuckets(); hashes1[0] = 0; long[] hashes2 = GenericHashBuckets(); long[] hashes3 = GenericHashBuckets(); similarityUtility.AccumulateHammingSimilarity( new List <SubFingerprintData> { new SubFingerprintData( hashes1, 1, 0d, new ModelReference <int>(1), new ModelReference <int>(1)), new SubFingerprintData( hashes2, 2, 1.48d, new ModelReference <int>(1), new ModelReference <int>(2)), new SubFingerprintData( hashes3, 3, 2.92d, new ModelReference <int>(2), new ModelReference <int>(2)) }, new HashedFingerprint(GenericSignature(), GenericHashBuckets(), 0, 0, Enumerable.Empty <string>()), hammingSimilarities); Assert.AreEqual(2, hammingSimilarities.Count); Assert.AreEqual(49, hammingSimilarities[new ModelReference <int>(1)].HammingSimilaritySum); Assert.AreEqual(100, hammingSimilarities[new ModelReference <int>(2)].HammingSimilaritySum); }
public void ShouldCalculateSimilaritiesCorrectly() { var hammingSimilarities = new ConcurrentDictionary <IModelReference, ResultEntryAccumulator>(); var totalCount = 10000; var countPerTrack = 10; var tracksCount = totalCount / countPerTrack; var subFingerprints = GetSubFingerprints(totalCount, countPerTrack); var queryFingerprint = new HashedFingerprint(new int[25], 0, 0, Enumerable.Empty <string>()); Parallel.ForEach(subFingerprints, subFingerprint => { var toCompare = new List <SubFingerprintData>(new[] { subFingerprint }); similarityUtility.AccumulateHammingSimilarity(toCompare, queryFingerprint, hammingSimilarities, 4); }); Assert.AreEqual(tracksCount, hammingSimilarities.Count); foreach (var pair in hammingSimilarities) { Assert.AreEqual(countPerTrack, pair.Value.Matches.Count); Assert.AreEqual(countPerTrack * 100, pair.Value.HammingSimilaritySum); Assert.AreEqual(100, pair.Value.BestMatch.HammingSimilarity); } }