public void Build(MetricDB DB, double alpha_stddev, int min_bs, int seed) { DynamicSequential idxDynamic; idxDynamic = new DynamicSequential (seed); idxDynamic.Build (DB); this.pivots_list = new List<int>(); this.pivots_idx = new int[DB.Count]; this.pivots_dist = new float[DB.Count]; // PivotGroup g = new PivotGroup(DB.Count); //Console.WriteLine ("Number of objects: {0}",idxDynamic.DOCS.Count); int I = 0; while(idxDynamic.DOCS.Count > 0){ var pidx = idxDynamic.GetRandom(); object piv = DB[pidx]; idxDynamic.Remove(pidx); this.pivots_list.Add(pidx); this.pivots_dist[pidx] = 0; this.pivots_idx[pidx] = pidx; double mean, stddev; IResult near, far; idxDynamic.SearchExtremesRange(piv, alpha_stddev, min_bs, out near, out far, out mean, out stddev); foreach (var pair in near){ this.pivots_idx[pair.docid] = pidx; this.pivots_dist[pair.docid] = (float)pair.dist; } foreach (var pair in far){ this.pivots_idx[pair.docid] = pidx; this.pivots_dist[pair.docid] = (float)-pair.dist; } if (I % 10 == 0) { Console.WriteLine("--- I {0}> remains: {1}, alpha_stddev: {2}, mean: {3}, stddev: {4}, pivot: {5}", I, idxDynamic.DOCS.Count, alpha_stddev, mean, stddev, pidx); double near_first, near_last, far_first, far_last; if (near.Count == 0) { near_first = -1; near_last = -1; } else { near_first = near.First.dist; near_last = near.Last.dist; } if (far.Count == 0) { far_last = far_first = -1; } else { far_first = -far.Last.dist; far_last = -far.First.dist; } Console.WriteLine("--- +++ first-near: {0}, last-near: {1}, first-far: {2}, last-far: {3}, near-count: {4}, far-count: {5}", near_first, near_last, far_first, far_last, near.Count, far.Count); Console.WriteLine("--- +++ normalized first-near: {0}, last-near: {1}, first-far: {2}, last-far: {3}, mean: {4}, stddev: {5}", near_first/far_last, near_last/far_last, far_first/far_last, far_last/far_last, mean/far_last, stddev/far_last); //} } ++I; idxDynamic.Remove(near); idxDynamic.Remove(far); //Console.WriteLine("Number of objects after: {0}",idxDynamic.DOCS.Count); } Console.WriteLine("Number of pivots per group: {0}", this.pivots_list.Count); }
protected override void SearchExtremes(DynamicSequential idx, List<ItemPair> items, object piv, double quantile, int min_bs, out IResult near, out IResult far, out DynamicSequential.Stats stats) { items.Clear(); idx.ComputeDistances (piv, items, out stats); DynamicSequential.SortByDistance(items); var n = idx.Count; min_bs = Math.Max ((int)(quantile * n), min_bs); near = new Result (min_bs); far = new Result (min_bs); idx.AppendKExtremes(near, far, items); }
protected override void SearchExtremes(DynamicSequential idx, List<ItemPair> items, object piv, double alpha_stddev, int min_bs, out IResult near, out IResult far, out DynamicSequential.Stats stats) { items.Clear(); idx.ComputeDistances (piv, items, out stats); // var radius = stats.min; // stats.stddev * alpha_stddev; near = new Result (min_bs); far = new Result (min_bs); // idx.DropCloseToMean (stats.mean - radius, stats.mean + radius, near, far, items); // if (near.Count == 0 && far.Count == 0 & min_bs > 0) { idx.AppendKExtremes(near, far, items); // } }
protected virtual void SearchExtremes(DynamicSequential idx, List<ItemPair> items, object piv, double alpha_stddev, int min_bs, out IResult near, out IResult far, out DynamicSequential.Stats stats) { throw new NotSupportedException(); }