public void Build(IList<int> sequence, int alphabet_size, int t = 16,
BitmapFromList rowbuilder = null, BitmapFromBitStream lenbuilder = null)
{
if (rowbuilder == null) {
rowbuilder = BitmapBuilders.GetSArray ();
}
if (lenbuilder == null) {
lenbuilder = BitmapBuilders.GetGGMN_wt (12);
}
var invindex = new IList<int>[alphabet_size];
for (int i = 0; i < alphabet_size; i++) {
invindex [i] = new List<int> ();
}
int pos = 0;
foreach (var c in sequence) {
invindex [c].Add (pos);
pos++;
}
pos = 0;
this.N = sequence.Count;
this.InvIndex = new Bitmap[alphabet_size];
var lens = new BitStream32 ();
for (int i = 0; i < alphabet_size; i++) {
if (i % 1000 == 0) {
if (i % 10000 == 0) {
Console.WriteLine ();
Console.Write ("*** InvIndexXLBSeq {0}/{1}", i, alphabet_size);
} else {
Console.Write (", {0}", i);
}
}
this.InvIndex [i] = rowbuilder (invindex [i]);
lens.Write (true);
lens.Write (false, invindex [i].Count);
invindex [i] = null;
}
lens.Write (true);
Console.WriteLine ();
Console.WriteLine ("done, now saving permutation and the Len bitmap");
this.Lens = lenbuilder (new FakeBitmap (lens));
var p = new ListGen_MRRR ();
p.Build (this.GetNotIdxPERM (), t, null);
Console.WriteLine ("done");
this.Perm = p;
}