Ejemplo n.º 1
0
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);
    }
}
Ejemplo n.º 2
0
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;
        }
      }
    }
  }
}
Ejemplo n.º 3
0
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));
}