static void splitfloat_update_bounds(WSplitFloat *split, bool recursive) { WSplit *tl=split->ssplit.tl, *br=split->ssplit.br; WSplit *node=(WSplit*)split; int tl_max_w, br_max_w, tl_max_h, br_max_h; int tl_min_w, br_min_w, tl_min_h, br_min_h; if(recursive){ split_update_bounds(tl, recursive); split_update_bounds(br, recursive); } tl_max_w=splitfloat_get_max(split, SPLIT_HORIZONTAL, tl); br_max_w=splitfloat_get_max(split, SPLIT_HORIZONTAL, br); tl_max_h=splitfloat_get_max(split, SPLIT_VERTICAL, tl); br_max_h=splitfloat_get_max(split, SPLIT_VERTICAL, br); tl_min_w=splitfloat_get_min(split, SPLIT_HORIZONTAL, tl); br_min_w=splitfloat_get_min(split, SPLIT_HORIZONTAL, br); tl_min_h=splitfloat_get_min(split, SPLIT_VERTICAL, tl); br_min_h=splitfloat_get_min(split, SPLIT_VERTICAL, br); if(split->ssplit.dir==SPLIT_HORIZONTAL){ node->max_w=infadd(tl_max_w, br_max_w); node->min_w=MINOF(tl_min_w, br_min_w); node->unused_w=0; node->min_h=MAXOF(tl_min_h, br_min_h); node->max_h=MAXOF(MINOF(tl_max_h, br_max_h), node->min_h); node->unused_h=MINOF(tl->unused_h, br->unused_h); }else{ node->max_h=infadd(tl_max_h, br_max_h); node->min_h=MINOF(tl_min_h, br_min_h); node->unused_h=0; node->min_w=MAXOF(tl_min_w, br_min_w); node->max_w=MAXOF(MINOF(tl_max_w, br_max_w), node->min_w); node->unused_w=MINOF(tl->unused_w, br->unused_w); } }
static void affinealign_fill_table(AffinealignDPentry **dptable, const char *u, GtUword ulen, const char *v, GtUword vlen, int matchcost, int mismatchcost, int gap_opening, int gap_extension) { GtUword i, j, Rvalue, Dvalue, Ivalue, minvalue; int rcost; gt_assert(dptable && u && v); /*gt_assert(ulen && vlen);*/ for (i = 0; i <= ulen; i++) { for (j = 0; j <= vlen; j++) { if (!i && !j) { dptable[0][0].Rdist = 0; dptable[0][0].Ddist = gap_opening; dptable[0][0].Idist = gap_opening; } else { /* compute A_affine(i,j,R) */ if (!i || !j) dptable[i][j].Rdist = ULONG_MAX; else { rcost = (u[i-1] == v[j-1]) ? matchcost : mismatchcost; Rvalue = infadd(dptable[i-1][j-1].Rdist, rcost); Dvalue = infadd(dptable[i-1][j-1].Ddist, rcost); Ivalue = infadd(dptable[i-1][j-1].Idist, rcost); minvalue = MIN3(Rvalue, Dvalue, Ivalue); gt_assert(minvalue != ULONG_MAX); dptable[i][j].Rdist = minvalue; /* set backtracing edge */ if (Rvalue == minvalue) dptable[i][j].Redge = Affine_R; else if (Dvalue == minvalue) dptable[i][j].Redge = Affine_D; else /* Ivalue == minvalue */ dptable[i][j].Redge = Affine_I; } /* compute A_affine(i,j,D) */ if (!i) dptable[i][j].Ddist = ULONG_MAX; else { Rvalue = infadd(dptable[i-1][j].Rdist, gap_opening + gap_extension); Dvalue = infadd(dptable[i-1][j].Ddist, gap_extension); Ivalue = infadd(dptable[i-1][j].Idist, gap_opening + gap_extension); minvalue = MIN3(Rvalue, Dvalue, Ivalue); gt_assert(minvalue != ULONG_MAX); dptable[i][j].Ddist = minvalue; /* set backtracing edge */ if (Rvalue == minvalue) dptable[i][j].Dedge = Affine_R; else if (Dvalue == minvalue) dptable[i][j].Dedge = Affine_D; else /* Ivalue == minvalue */ dptable[i][j].Dedge = Affine_I; } /* compute A_affine(i,j,I) */ if (!j) dptable[i][j].Idist = ULONG_MAX; else { Rvalue = infadd(dptable[i][j-1].Rdist, gap_opening + gap_extension); Dvalue = infadd(dptable[i][j-1].Ddist, gap_opening + gap_extension); Ivalue = infadd(dptable[i][j-1].Idist, gap_extension); minvalue = MIN3(Rvalue, Dvalue, Ivalue); gt_assert(minvalue != ULONG_MAX); dptable[i][j].Idist = minvalue; /* set backtracing edge */ if (Rvalue == minvalue) dptable[i][j].Iedge = Affine_R; else if (Dvalue == minvalue) dptable[i][j].Iedge = Affine_D; else /* Ivalue == minvalue */ dptable[i][j].Iedge = Affine_I; } } } } }
static int splitfloat_get_max(WSplitFloat *split, int dir, WSplit *other) { return infadd((dir==SPLIT_VERTICAL ? other->max_h : other->max_w), splitfloat_get_handle(split, dir, other)); }