int testencodedsequence(const GtStrArray *filenametab, const Encodedsequence *encseq, Readmode readmode, unsigned long scantrials, unsigned long multicharcmptrials, GtError *err) { bool fwd = ISDIRREVERSE(readmode) ? false : true, complement = ISDIRCOMPLEMENT(readmode) ? true : false; if (hasfastspecialrangeenumerator(encseq)) { checkextractunitatpos(encseq,fwd,complement); if (multicharcmptrials > 0) { testmulticharactercompare(encseq,readmode,multicharcmptrials); } } if (!complement) { checkextractspecialbits(encseq,fwd); } if (scantrials > 0) { testscanatpos(encseq,readmode,scantrials); } return testfullscan(filenametab,encseq,readmode,err); }
static void testmulticharactercompare(const Encodedsequence *encseq, Readmode readmode, unsigned long multicharcmptrials) { Encodedsequencescanstate *esr1, *esr2; Seqpos pos1, pos2, totallength; unsigned long trial; bool fwd = ISDIRREVERSE(readmode) ? false : true, complement = ISDIRCOMPLEMENT(readmode) ? true : false; esr1 = newEncodedsequencescanstate(); esr2 = newEncodedsequencescanstate(); totallength = getencseqtotallength(encseq); srand48(42349421); (void) multicharactercompare_withtest(encseq,fwd,complement,esr1,0,esr2,0); (void) multicharactercompare_withtest(encseq,fwd,complement,esr1,0,esr2, totallength-1); (void) multicharactercompare_withtest(encseq,fwd,complement,esr1, totallength-1,esr2,0); (void) multicharactercompare_withtest(encseq,fwd,complement,esr1, totallength-1,esr2,totallength-1); for (trial = 0; trial < multicharcmptrials; trial++) { pos1 = (Seqpos) (drand48() * (double) totallength); pos2 = (Seqpos) (drand48() * (double) totallength); (void) multicharactercompare_withtest(encseq,fwd,complement, esr1,pos1,esr2,pos2); } freeEncodedsequencescanstate(&esr1); freeEncodedsequencescanstate(&esr2); }
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)); }