if ((ti = T[i] & 0xff) < (t0 = T[0] & 0xff) || (T[i] == T[0] && flag != 0)) { if (flag == 0) { ++bucketB[BUCKET_BSTAR(ti, t0)]; SA[--m] = i; } else { ++bucketB[BUCKET_B(ti, t0)]; ++bucketB[BUCKET_B(ti, ti1)]; } while (0 <= --i && (T[i] & 0xff) >= (T[i + 1] & 0xff)); if (0 <= i) { ++bucketB[BUCKET_BSTAR(T[i] & 0xff, T[i + 1] & 0xff)]; SA[--m] = i; for (--i; 0 <= i && (ti = T[i] & 0xff) <= (ti1 = T[i + 1] & 0xff); --i) { ++bucketB[BUCKET_B(ti, ti1)]; t = i + bucketA[c0]; bucketA[c0] = i + j; i = t + bucketB[BUCKET_B(c0, c0)]; for (c1 = c0 + 1; c1 < 256; ++c1) { j += bucketB[BUCKET_BSTAR(c0, c1)]; bucketB[(c0 << 8) | c1] = j; i += bucketB[BUCKET_B(c0, c1)]; c0 = T[t] & 0xff; c1 = T[t + 1] & 0xff; SA[--bucketB[BUCKET_BSTAR(c0, c1)]] = i; SA[--bucketB[BUCKET_BSTAR(c0, c1)]] = m - 1;
/** * Performs a Burrows Wheeler Transform on the input array. * @return the index of the first character of the input array within the output array */ public int bwt() { final int[] SA = this.SA; final byte[] T = this.T; final int n = this.n; final int[] bucketA = new int[BUCKET_A_SIZE]; final int[] bucketB = new int[BUCKET_B_SIZE]; if (n == 0) { return 0; } if (n == 1) { SA[0] = T[0]; return 0; } int m = sortTypeBstar(bucketA, bucketB); if (0 < m) { return constructBWT(bucketA, bucketB); } return 0; } }
ssMergeBackward(pa, buf, bufoffset, first, middle, last, depth); ssMergeCheckEqual(pa, depth, first); ssMergeCheckEqual(pa, depth, last); ssMergeForward(pa, buf, bufoffset, first, middle, last, depth); ssMergeCheckEqual(pa, depth, first); ssMergeCheckEqual(pa, depth, last); len = half, half >>= 1) { if (ssCompare(pa + getIDX(SA[middle + m + half]), pa + getIDX(SA[middle - m - half - 1]), depth) < 0) { m += half + 1; half -= (len & 1) ^ 1; ssBlockSwap(SA, middle - m, SA, middle, m); i = j = middle; next = 0; ssMergeCheckEqual(pa, depth, first); ssMergeCheckEqual(pa, depth, middle); if ((check & 2) != 0) { ssMergeCheckEqual(pa, depth, last);
for (i = bucketB[BUCKET_BSTAR(c1, c1 + 1)], j = bucketA[c1 + 1], t = 0, c2 = -1; i <= j; --j) { } else { if (0 <= c2) { bucketB[BUCKET_B(c2, c1)] = t; SA[t = bucketB[BUCKET_B(c2 = c0, c1)] - 1] = s;
for (ssize = 0, limit = trLog(last - first);;) { if (limit < 0) { if (limit == -1) { PartitionResult result = trPartition(isa, isaD - 1, isaN, first, last, last - 1); a = result.first; b = result.last; if (a - first <= last - b) { if (1 < a - first) { stack[ssize++] = new StackEntry(isaD, b, last, trLog(last - b)); last = a; limit = trLog(a - first); } else if (1 < last - b) { first = b; limit = trLog(last - b); } else { if (ssize == 0) { stack[ssize++] = new StackEntry(isaD, first, a, trLog(a - first)); first = b; limit = trLog(last - b); } else if (1 < a - first) { last = a; limit = trLog(a - first); } else { if (ssize == 0) { a = stack[--ssize].b; b = stack[ssize].c; trCopy(isa, isaN, first, a, b, last, isaD - isa);
for (ssize = 0, limit = trLog(last - first);;) { if (last - first <= INSERTIONSORT_THRESHOLD) { if (1 < last - first) { trInsertionSort(isa, isaD, isaN, first, last); lsUpdateGroup(isa, first, last); } else if (last - first == 1) { SA[first] = -1; trHeapSort(isa, isaD, isaN, first, last - first); for (a = last - 1; first < a; a = b) { for (x = trGetC(isa, isaD, isaN, SA[a]), b = a - 1; first <= b && trGetC(isa, isaD, isaN, SA[b]) == x; --b) { SA[b] = ~SA[b]; lsUpdateGroup(isa, first, last); if (ssize == 0) { return; a = trPivot(isa, isaD, isaN, first, last); swapElements(SA, first, SA, a); v = trGetC(isa, isaD, isaN, SA[first]); while (b < last && (x = trGetC(isa, isaD, isaN, SA[b])) == v) { ++b; while (++b < last && (x = trGetC(isa, isaD, isaN, SA[b])) <= v) { if (x == v) { swapElements(SA, b, SA, a);
private void trSort(final int isa, final int n, final int depth) { final int[] SA = this.SA; int first = 0, last; int t; if (-n < SA[0]) { TRBudget budget = new TRBudget(n, trLog(n) * 2 / 3 + 1); do { if ((t = SA[first]) < 0) { first -= t; } else { last = SA[isa + t] + 1; if (1 < last - first) { trIntroSort(isa, isa + depth, isa + n, first, last, budget, n); if (budget.chance == 0) { /* Switch to Larsson-Sadakane sorting algorithm */ if (0 < first) { SA[0] = -first; } lsSort(isa, n, depth); break; } } first = last; } } while (first < n); } }
Bzip2DivSufSort divSufSort = new Bzip2DivSufSort(block, bwtBlock, blockLength); int bwtStartPointer = divSufSort.bwt();
lsIntroSort(isa, isaD, isa + n, first, last); first = last;
for (ssize = 0, limit = trLog(last - first);;) { if (limit < 0) { if (limit == -1) { PartitionResult result = trPartition(isa, isaD - 1, isaN, first, last, last - 1); a = result.first; b = result.last; if (a - first <= last - b) { if (1 < a - first) { stack[ssize++] = new StackEntry(isaD, b, last, trLog(last - b)); last = a; limit = trLog(a - first); } else if (1 < last - b) { first = b; limit = trLog(last - b); } else { if (ssize == 0) { stack[ssize++] = new StackEntry(isaD, first, a, trLog(a - first)); first = b; limit = trLog(last - b); } else if (1 < a - first) { last = a; limit = trLog(a - first); } else { if (ssize == 0) { a = stack[--ssize].b; b = stack[ssize].c; trCopy(isa, isaN, first, a, b, last, isaD - isa);
for (ssize = 0, limit = trLog(last - first);;) { if (last - first <= INSERTIONSORT_THRESHOLD) { if (1 < last - first) { trInsertionSort(isa, isaD, isaN, first, last); lsUpdateGroup(isa, first, last); } else if (last - first == 1) { SA[first] = -1; trHeapSort(isa, isaD, isaN, first, last - first); for (a = last - 1; first < a; a = b) { for (x = trGetC(isa, isaD, isaN, SA[a]), b = a - 1; first <= b && trGetC(isa, isaD, isaN, SA[b]) == x; --b) { SA[b] = ~SA[b]; lsUpdateGroup(isa, first, last); if (ssize == 0) { return; a = trPivot(isa, isaD, isaN, first, last); swapElements(SA, first, SA, a); v = trGetC(isa, isaD, isaN, SA[first]); while (b < last && (x = trGetC(isa, isaD, isaN, SA[b])) == v) { ++b; while (++b < last && (x = trGetC(isa, isaD, isaN, SA[b])) <= v) { if (x == v) { swapElements(SA, b, SA, a);
private void trSort(final int isa, final int n, final int depth) { final int[] SA = this.SA; int first = 0, last; int t; if (-n < SA[0]) { TRBudget budget = new TRBudget(n, trLog(n) * 2 / 3 + 1); do { if ((t = SA[first]) < 0) { first -= t; } else { last = SA[isa + t] + 1; if (1 < last - first) { trIntroSort(isa, isa + depth, isa + n, first, last, budget, n); if (budget.chance == 0) { /* Switch to Larsson-Sadakane sorting algorithm */ if (0 < first) { SA[0] = -first; } lsSort(isa, n, depth); break; } } first = last; } } while (first < n); } }
Bzip2DivSufSort divSufSort = new Bzip2DivSufSort(block, bwtBlock, blockLength); int bwtStartPointer = divSufSort.bwt();
for (i = bucketB[BUCKET_BSTAR(c1, c1 + 1)], j = bucketA[c1 + 1], t = 0, c2 = -1; i <= j; --j) { } else { if (0 <= c2) { bucketB[BUCKET_B(c2, c1)] = t; SA[t = bucketB[BUCKET_B(c2 = c0, c1)] - 1] = s;
lsIntroSort(isa, isaD, isa + n, first, last); first = last;
for (ssize = 0, limit = trLog(last - first);;) { if (limit < 0) { if (limit == -1) { PartitionResult result = trPartition(isa, isaD - 1, isaN, first, last, last - 1); a = result.first; b = result.last; if (a - first <= last - b) { if (1 < a - first) { stack[ssize++] = new StackEntry(isaD, b, last, trLog(last - b)); last = a; limit = trLog(a - first); } else if (1 < last - b) { first = b; limit = trLog(last - b); } else { if (ssize == 0) { stack[ssize++] = new StackEntry(isaD, first, a, trLog(a - first)); first = b; limit = trLog(last - b); } else if (1 < a - first) { last = a; limit = trLog(a - first); } else { if (ssize == 0) { a = stack[--ssize].b; b = stack[ssize].c; trCopy(isa, isaN, first, a, b, last, isaD - isa);
for (ssize = 0, limit = trLog(last - first);;) { if (last - first <= INSERTIONSORT_THRESHOLD) { if (1 < last - first) { trInsertionSort(isa, isaD, isaN, first, last); lsUpdateGroup(isa, first, last); } else if (last - first == 1) { SA[first] = -1; trHeapSort(isa, isaD, isaN, first, last - first); for (a = last - 1; first < a; a = b) { for (x = trGetC(isa, isaD, isaN, SA[a]), b = a - 1; first <= b && trGetC(isa, isaD, isaN, SA[b]) == x; --b) { SA[b] = ~SA[b]; lsUpdateGroup(isa, first, last); if (ssize == 0) { return; a = trPivot(isa, isaD, isaN, first, last); swapElements(SA, first, SA, a); v = trGetC(isa, isaD, isaN, SA[first]); while (b < last && (x = trGetC(isa, isaD, isaN, SA[b])) == v) { ++b; while (++b < last && (x = trGetC(isa, isaD, isaN, SA[b])) <= v) { if (x == v) { swapElements(SA, b, SA, a);
ssMergeBackward(pa, buf, bufoffset, first, middle, last, depth); ssMergeCheckEqual(pa, depth, first); ssMergeCheckEqual(pa, depth, last); ssMergeForward(pa, buf, bufoffset, first, middle, last, depth); ssMergeCheckEqual(pa, depth, first); ssMergeCheckEqual(pa, depth, last); len = half, half >>= 1) { if (ssCompare(pa + getIDX(SA[middle + m + half]), pa + getIDX(SA[middle - m - half - 1]), depth) < 0) { m += half + 1; half -= (len & 1) ^ 1; ssBlockSwap(SA, middle - m, SA, middle, m); i = j = middle; next = 0; ssMergeCheckEqual(pa, depth, first); ssMergeCheckEqual(pa, depth, middle); if ((check & 2) != 0) { ssMergeCheckEqual(pa, depth, last);