public int Select(int symbol, int rank)
{
var coderstream = new BitStream32 ();
this.Coder.Encode (coderstream, symbol);
int numbits = (int)coderstream.CountBits;
var symnode = this.Alphabet [symbol];
//if (symnode == null || symnode.Count < rank) {
if (symnode == null || rank == 0) {
return -1;
}
WT_Inner node = symnode.Parent as WT_Inner;
for (--numbits; numbits >= 0; numbits--) {
bool b = coderstream [numbits];
if (b) {
rank = node.B.Select1 (rank) + 1;
} else {
rank = node.B.Select0 (rank) + 1;
}
node = node.Parent as WT_Inner;
}
return rank - 1;
}