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); }
private void Agree(float value, TinyFingerprintSchema first, int index, TinyFingerprintSchema second) { EncodeWavelet(value, first, index); EncodeWavelet(value, second, index); }