Beispiel #1
0
        private Tuple <TinyFingerprintSchema, TinyFingerprintSchema> GenerateVectors(double similarityIndex, int topWavelets, int length)
        {
            var random = new Random();

            var first  = new TinyFingerprintSchema(length);
            var second = new TinyFingerprintSchema(length);
            var unique = new HashSet <int>();

            for (int i = 0; i < topWavelets; ++i)
            {
                int index = random.Next(length / 2);
                if (unique.Contains(2 * index) || unique.Contains(2 * index + 1))
                {
                    i--;
                    continue;
                }

                unique.Add(2 * index);
                unique.Add(2 * index + 1);

                float value = random.NextDouble() > 0.5 ? -1 : 1;
                if (random.NextDouble() > similarityIndex)
                {
                    Disagree(value, first, index, second);
                }
                else
                {
                    Agree(value, first, index, second);
                }
            }

            return(Tuple.Create(first, second));
        }
 private static void EncodeWavelet(float value, TinyFingerprintSchema array, int index)
 {
     if (value > 0)
     {
         array.SetTrueAt(index * 2);
     }
     else if (value < 0)
     {
         array.SetTrueAt(index * 2 + 1);
     }
 }
        /// <summary>
        ///   Encode the integer representation of the fingerprint into a Boolean array
        /// </summary>
        /// <param name = "concatenated">Concatenated fingerprint (frames concatenated)</param>
        /// <param name = "indexes">Sorted indexes with the first one with the highest value in array</param>
        /// <param name = "topWavelets">Number of top wavelets to encode</param>
        /// <returns>Encoded fingerprint</returns>
        public IEncodedFingerprintSchema EncodeFingerprint(float[] concatenated, ushort[] indexes, int topWavelets)
        {
            TinyFingerprintSchema schema = new TinyFingerprintSchema(concatenated.Length * 2);

            for (int i = 0; i < topWavelets; i++)
            {
                int   index = indexes[i];
                float value = concatenated[i];
                if (value > 0)
                {
                    schema.SetTrueAt(index * 2);
                }
                else if (value < 0)
                {
                    schema.SetTrueAt((index * 2) + 1);
                }
            }

            return(schema);
        }
        public static Tuple <TinyFingerprintSchema, TinyFingerprintSchema> GenerateSimilarFingerprints(Random random, double similarityIndex, int topWavelets, int length)
        {
            var first              = new TinyFingerprintSchema(length);
            var second             = new TinyFingerprintSchema(length);
            var indexesTopWavelets = Enumerable.Range(0, length / 2)
                                     .OrderBy(x => random.NextDouble())
                                     .Take(topWavelets);

            foreach (int index in indexesTopWavelets)
            {
                float value = random.NextDouble() > 0.5 ? -1 : 1;
                if (random.NextDouble() > similarityIndex)
                {
                    Disagree(value, first, index, second);
                }
                else
                {
                    Agree(value, first, index, second);
                }
            }

            return(Tuple.Create(first, second));
        }
 private static void Disagree(float value, TinyFingerprintSchema first, int index, TinyFingerprintSchema second)
 {
     EncodeWavelet(value, first, index);
     EncodeWavelet(-1 * value, second, index);
 }
Beispiel #6
0
 private void Agree(float value, TinyFingerprintSchema first, int index, TinyFingerprintSchema second)
 {
     EncodeWavelet(value, first, index);
     EncodeWavelet(value, second, index);
 }