public EPListRandomPivotsPriorized(MetricDB DB, int seed, int num_pivs)
{
var n = DB.Count;
this.Items = new ItemPair[n];
var pivs = new List<EPivot> (32);
var rand = new Random (seed);
var pivsel = new PivotSelectorRandom (n, rand);
var piv = pivsel.NextPivot ();
var pivOBJ = DB [piv];
for (int objID = 0; objID < n; ++objID) {
var d = DB.Dist(pivOBJ, DB[objID]);
this.Items[objID] = new ItemPair(0, d);
}
double mean, variance;
this.Statistics (out mean, out variance);
pivs.Add(new EPivot(piv, Math.Sqrt(variance), mean, 0, 0, 0, 0));
var item_cmp = new Comparison<ItemPair>((x,y) => {
var diff_x = Math.Abs (x.Dist - pivs[x.ObjID].mean);
var diff_y = Math.Abs (y.Dist - pivs[y.ObjID].mean);
return diff_x.CompareTo(diff_y);
});
var queue = new SkipList2<int> (0.5, (x,y) => item_cmp (this.Items [x], this.Items [y]));
for (int objID = 0; objID < n; ++objID) {
queue.Add(objID, null);
}
var max_review = 2 * n / num_pivs;
var list = new List<int> ();
for (int i = 0; i < num_pivs; ++i) {
Console.WriteLine("XXXXXX BEGIN {0} i: {1}", this, i);
piv = pivsel.NextPivot();
double piv_mean, piv_variance, qrad;
PivotSelector.EstimatePivotStatistics(DB, rand, DB[piv], 256, out piv_mean, out piv_variance, out qrad);
var pivID = pivs.Count;
pivs.Add(new EPivot(piv, Math.Sqrt(piv_variance), mean, 0, 0, 0, 0));
list.Clear();
for (int s = 0; s < max_review; ++s) {
var objID = queue.RemoveFirst();
var d = DB.Dist(DB[objID], pivOBJ);
var new_item = new ItemPair(pivID, d);
if (item_cmp(new_item, this.Items[objID]) > 0) {
this.Items[objID] = new_item;
}
list.Add (objID);
}
foreach (var objID in list) {
queue.Add(objID, null);
}
Console.WriteLine("XXXXXX END {0} i: {1}", this, i);
}
this.Pivs = pivs.ToArray ();
Console.WriteLine("Number of pivots per group: {0}", this.Pivs.Length);
}