public Build ( MetricDB original, Index refs, int k ) : void | ||
original | MetricDB | |
refs | Index | |
k | int | |
return | void |
public void Build(MetricDB db, Index refs, int K=7, int maxcand=1024, SequenceBuilder seq_builder=null) { var knrfp = new KnrFP (); knrfp.Build (db, refs, K); this.Build (db, knrfp, maxcand, seq_builder); }
public void Build(MetricDB db, int symbolsPerHash, int neighborhoodExpansion, Random rand) { this.DB = db; int n = db.Count; this.SymbolsPerHash = symbolsPerHash; // very small values, i.e., 2, 3, 4 this.NeighborhoodExpansion = neighborhoodExpansion; // neighborhoodExpansion >= symbolsPerHash var numrefs = (int)(Math.Pow(n, 1.0 / this.SymbolsPerHash)); this.CountSymbolBits = countBits(numrefs); var refs = new SampleSpace("", db, numrefs, rand); var sat = new SAT_Distal (); sat.Build (refs, new Random ()); this.R = sat; var G = new KnrFP (); G.Build (db, this.R, this.SymbolsPerHash); var knrcopy = new int[this.SymbolsPerHash]; this.hashTable = new Dictionary<long, List<int>> (); for (int objID = 0; objID < n; ++objID) { var knr = G [objID] as int[]; knr.CopyTo (knrcopy, 0); var hash = this.EncodeKnr (knrcopy); // EncodeKnr destroys the reference order List<int> L; if (!this.hashTable.TryGetValue(hash, out L)) { L = new List<int>(); this.hashTable.Add(hash, L); } L.Add (objID); } double avg_len = 0; double avg_len_sq = 0; foreach (var list in this.hashTable.Values) { avg_len += list.Count; avg_len_sq += list.Count * list.Count; } avg_len /= this.hashTable.Count; avg_len_sq /= this.hashTable.Count; Console.WriteLine ("=== created hash table with {0} keys, items: {1}, popcount mean: {2}, popcount stddev: {3}", this.hashTable.Count, n, avg_len, Math.Sqrt(avg_len_sq - avg_len * avg_len)); }