Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }