static void resetsorted(GtBucketspec2 *bucketspec2) { unsigned int idx, idx2; for (idx = 0; idx<bucketspec2->numofchars; idx++) { bucketspec2->superbuckettab[idx].sorted = false; for (idx2 = 0; idx2<bucketspec2->numofchars; idx2++) { Seqpos startidx = getstartidx(bucketspec2,idx,idx2), endidx = getendidx(bucketspec2,idx,idx2); bucketspec2->subbuckettab[idx][idx2].sorted = (startidx < endidx) ? false : true; } } }
void gt_copysortsuffixes(const GtBucketspec2 *bucketspec2, Seqpos *suftab, Verboseinfo *verboseinfo) { Seqpos hardwork = 0, **targetptr; unsigned int idx, idxsource, source, second; #ifdef WITHSUFFIXES { const Seqpos *ptr; for (ptr = suftab; ptr < suftab + bucketspec2->partwidth; ptr++) { showsequenceatstartpos(stdout, ISDIRREVERSE(readmode) ? false : true, ISDIRCOMPLEMENT(readmode) ? true : false, encseq, *ptr); } } #endif targetptr = gt_malloc(sizeof(*targetptr) * bucketspec2->numofchars); for (idxsource = 0; idxsource<bucketspec2->numofchars; idxsource++) { source = bucketspec2->order[idxsource]; for (second = 0; second < bucketspec2->numofchars; second++) { if (!bucketspec2->subbuckettab[source][second].sorted && source != second) { gt_assert(bucketspec2->subbuckettab[source][second].hardworktodo); showverbose(verboseinfo,"hard work for %u %u",source,second); hardwork += getendidx(bucketspec2,source,second) - getstartidx(bucketspec2,source,second); bucketspec2->subbuckettab[source][second].sorted = true; } else { gt_assert(!bucketspec2->subbuckettab[source][second].hardworktodo); } } if (getstartidx(bucketspec2,source,0) < getstartidx(bucketspec2,source,source)) { for (idx = 0; idx < bucketspec2->numofchars; idx++) { targetptr[idx] = suftab + getstartidx(bucketspec2,idx,source); } forwardderive(bucketspec2, targetptr, source, suftab + getstartidx(bucketspec2,source,0)); } if (getendidx(bucketspec2,source,source) < getendidx(bucketspec2,source,bucketspec2->numofchars)) { for (idx = 0; idx < bucketspec2->numofchars; idx++) { targetptr[idx] = suftab + getendidx(bucketspec2,idx,source) - 1; } backwardderive(bucketspec2, targetptr, source, suftab + getendidx(bucketspec2,source,bucketspec2->numofchars) - 1); } for (idx = 0; idx < bucketspec2->numofchars; idx++) { bucketspec2->subbuckettab[idx][source].sorted = true; } bucketspec2->superbuckettab[source].sorted = true; } gt_free(targetptr); showverbose(verboseinfo,"hardwork = " FormatSeqpos " (%.2f)", PRINTSeqposcast(hardwork), (double) hardwork/getencseqtotallength(bucketspec2->encseq)); }
void gt_copysort_derivesorting(const GtBucketspec2 *bucketspec2, GtSuffixsortspace *suffixsortspace, GtLogger *logger) { GtUword hardwork = 0, *targetoffset; unsigned int idx, idxsource, source, second; #ifdef WITHSUFFIXES { GtUword idx; for (idx = 0; idx < bucketspec2->partwidth; idx++) { gt_encseq_showatstartpos( stdout, GT_ISDIRREVERSE(readmode) ? false : true, GT_ISDIRCOMPLEMENT(readmode) ? true : false, encseq, gt_suffixsortspace_getdirect(suffixsortspace,idx)); } } #endif targetoffset = gt_malloc(sizeof (*targetoffset) * bucketspec2->numofchars); for (idxsource = 0; idxsource<bucketspec2->numofchars; idxsource++) { source = bucketspec2->order[idxsource]; for (second = 0; second < bucketspec2->numofchars; second++) { if (!bucketspec2->subbuckettab[source][second].sorted && source != second) { gt_assert(bucketspec2->subbuckettab[source][second].hardworktodo); gt_logger_log(logger,"hard work for %u %u",source,second); hardwork += getendidx(bucketspec2,source,second) - getstartidx(bucketspec2,source,second); bucketspec2->subbuckettab[source][second].sorted = true; } else { gt_assert(!bucketspec2->subbuckettab[source][second].hardworktodo); } } if (getstartidx(bucketspec2,source,0) < getstartidx(bucketspec2,source,source)) { for (idx = 0; idx < bucketspec2->numofchars; idx++) { targetoffset[idx] = getstartidx(bucketspec2,idx,source); } forwardderive(bucketspec2, suffixsortspace, targetoffset, source, getstartidx(bucketspec2,source,0)); } if (getendidx(bucketspec2,source,source) < getendidx(bucketspec2,source,bucketspec2->numofchars)) { for (idx = 0; idx < bucketspec2->numofchars; idx++) { /* do not need to assert that getendidx(idx,source) > 0, as later the value stored in targetoffset is incremented */ targetoffset[idx] = getendidx(bucketspec2,idx,source) - 1; } gt_assert(getendidx(bucketspec2,source,bucketspec2->numofchars) > 0); backwardderive(bucketspec2, suffixsortspace, targetoffset, source, getendidx(bucketspec2,source,bucketspec2->numofchars) - 1); } for (idx = 0; idx < bucketspec2->numofchars; idx++) { bucketspec2->subbuckettab[idx][source].sorted = true; } bucketspec2->superbuckettab[source].sorted = true; } gt_free(targetoffset); gt_logger_log(logger,"hardwork = "GT_WU" (%.2f)", hardwork, (double) hardwork/gt_encseq_total_length(bucketspec2->encseq)); }