bool gt_lcpintervalfindcharchildintv_simple(const GtEncseq *encseq, GtReadmode readmode, GtUword totallength, const ESASuffixptr *suftab, Simplelcpinterval *itv, GtUchar cc, GtUword offset, GtUword left, GtUword right) { GtUword pos; pos = ESASUFFIXPTRGET(suftab,left) + offset; if (cc < SEQUENCE(encseq,pos)) { return false; } pos = ESASUFFIXPTRGET(suftab,right) + offset; if (cc > SEQUENCE(encseq,pos)) { return false; } itv->left = lcpintervalfindfirst(encseq, readmode, totallength, suftab, cc, offset, left, right); if (itv->left == ULONG_MAX) { return false; } itv->right = lcpintervalfindlast(encseq, readmode, totallength, suftab, cc, offset, itv->left + 1, right); if (itv->right == ULONG_MAX) { itv->right = itv->left; } return true; }
static GtUword lcpintervalfindlast(const GtEncseq *encseq, GtReadmode readmode, GtUword totallength, const ESASuffixptr *suftab, GtUchar cc, GtUword offset, GtUword left, GtUword right) { GtUword found = ULONG_MAX; while (left <= right) { GtUword mid = left + GT_DIV2(right - left + 1); GtUword pos = ESASUFFIXPTRGET(suftab,mid) + offset; GtUchar midcc = SEQUENCE(encseq,pos); if (cc < midcc) { if (mid == 0) { break; } right = mid - 1; } else { if (cc == midcc) { found = mid; } left = mid + 1; } } return found; }
static unsigned long lcpintervalfindrightbound(const GtEncseq *encseq, GtReadmode readmode, unsigned long totallength, const ESASuffixptr *suftab, GtUchar cc, unsigned long offset, unsigned long left, unsigned long right) { unsigned long pos, mid; GtUchar midcc; while (right > left+1) { mid = GT_DIV2(left+right); pos = ESASUFFIXPTRGET(suftab,mid) + offset; midcc = SEQUENCE(encseq,pos); if (cc < midcc) { right = mid; } else { left = mid; } } return left; }
bool gt_lcpintervalfindcharchildintv(const GtEncseq *encseq, GtReadmode readmode, unsigned long totallength, const ESASuffixptr *suftab, Simplelcpinterval *itv, GtUchar cc, unsigned long offset, unsigned long left, unsigned long right) { GtUchar leftcc, rightcc; unsigned long pos, rightbound, leftbound = left; pos = ESASUFFIXPTRGET(suftab,right) + offset; rightcc = SEQUENCE(encseq,pos); while (true) { pos = ESASUFFIXPTRGET(suftab,leftbound) + offset; leftcc = SEQUENCE(encseq,pos); if (leftcc == rightcc) { break; } rightbound = lcpintervalfindrightbound(encseq,readmode, totallength,suftab,leftcc, offset,leftbound,right); if (leftcc == cc) { itv->left = leftbound; itv->right = rightbound; return true; } if (leftcc > cc) { return false; } leftbound = rightbound+1; } if (leftcc == cc) { itv->left = leftbound; itv->right = right; return true; } return false; }
void gt_lcpintervalsplitwithoutspecial(GtArrayBoundswithchar *bwci, const GtEncseq *encseq, GtReadmode readmode, unsigned long totallength, const ESASuffixptr *suftab, unsigned long parentoffset, unsigned long parentleft, unsigned long parentright) { GtUchar leftcc, rightcc; unsigned long rightbound = 0, leftbound = parentleft; /* call gt_lcpintervalextendlcp and verify if interval can be extended by some character */ bwci->nextfreeBoundswithchar = 0; rightcc = SEQUENCE(encseq,ESASUFFIXPTRGET(suftab,parentright) + parentoffset); while (true) { leftcc = SEQUENCE(encseq,ESASUFFIXPTRGET(suftab,leftbound) + parentoffset); gt_assert(bwci->nextfreeBoundswithchar < bwci->allocatedBoundswithchar); if (ISSPECIAL(leftcc)) { ADDPREVIOUSRBOUND(rightbound); ADDCURRENTLBOUND(rightbound+1); return; } ADDPREVIOUSRBOUND(leftbound-1); ADDCURRENTLBOUND(leftbound); ADDCURRENTINCHAR(leftcc); if (leftcc == rightcc) { break; } rightbound = lcpintervalfindrightbound(encseq,readmode,totallength,suftab, leftcc,parentoffset, leftbound,parentright); leftbound = rightbound+1; } gt_assert(bwci->nextfreeBoundswithchar < bwci->allocatedBoundswithchar); ADDPREVIOUSRBOUND(parentright); ADDCURRENTLBOUND(parentright+1); }
GtUchar gt_lcpintervalextendlcp(const GtEncseq *encseq, GtReadmode readmode, const ESASuffixptr *suftab, unsigned long totallength, GtUchar alphasize, unsigned long parentoffset, unsigned long parentleft, unsigned long parentright) { GtUchar ccl, ccr; ccl = SEQUENCE(encseq,ESASUFFIXPTRGET(suftab,parentleft) + parentoffset); ccr = SEQUENCE(encseq,ESASUFFIXPTRGET(suftab,parentright) + parentoffset); if (ccl != ccr || ISSPECIAL(ccl)) { return alphasize; } gt_assert(ccl < alphasize); return ccl; }
main(int ac, char **av) { int i; FILE *ifp; char line[LINE_SIZE]; prog = av[0]; flt_scale = (double)1.0; flags = 0; d_path = NULL; process_options(ac, av); if (flags & VERBOSE) fprintf(ofp, "-- TPC %s Parameter Substitution (Version %d.%d.%d%s)\n", NAME, VERSION, RELEASE, MODIFICATION, PATCH); setup(); if (!(flags & DFLT)) /* perturb the RNG */ { if (!(flags & SEED)) rndm = (long)((unsigned)time(NULL) * DSS_PROC); if (rndm < 0) rndm += 2147483647; Seed[0].value = rndm; for (i=1; i <= QUERIES_PER_SET; i++) { Seed[0].value = NextRand(Seed[0].value); Seed[i].value = Seed[0].value; } printf("-- using %ld as a seed to the RNG\n", rndm); } else printf("-- using default substitutions\n"); if (flags & INIT) /* init stream with ifile */ { ifp = fopen(ifile, "r"); OPEN_CHECK(ifp, ifile); while (fgets(line, LINE_SIZE, ifp) != NULL) fprintf(stdout, "%s", line); } if (snum >= 0) if (optind < ac) for (i=optind; i < ac; i++) { char qname[10]; sprintf(qname, "%d", SEQUENCE(snum, atoi(av[i]))); qsub(qname, flags); } else for (i=1; i <= QUERIES_PER_SET; i++) { char qname[10]; sprintf(qname, "%d", SEQUENCE(snum, i)); qsub(qname, flags); } else if (optind < ac) for (i=optind; i < ac; i++) qsub(av[i], flags); else for (i=1; i <= QUERIES_PER_SET; i++) { char qname[10]; sprintf(qname, "%d", i); qsub(qname, flags); } if (flags & TERMINATE) /* terminate stream with tfile */ { ifp = fopen(tfile, "r"); if (ifp == NULL) OPEN_CHECK(ifp, tfile); while (fgets(line, LINE_SIZE, ifp) != NULL) fprintf(stdout, "%s", line); } return(0); }