int m16_mine (FIM16 *fim)
{                               /* --- find frequent item sets */
  int   r, i;                   /* error status, buffers */
  SUPP  s;                      /* support of current prefix */
  BITTA m;                      /* mask after item filtering, bit */

  assert(fim);                  /* check the function argument */
  if (fim->ttw <= 0) return 0;  /* if the machine is empty, abort */
  s = isr_supp(fim->report);    /* get min. support for perfect exts. */
  m = fim->tor;                 /* and bitwise or of all transactions */
  if (fim->wgts[m] >= s) {      /* if there is only one transaction, */
    fim->wgts[m] = 0;           /* remove it from the 16 items mach. */
    for (i = 0; (unsigned int)(1 << i) <= (unsigned int)m; i++)
      if (m & (1 << i))         /* all items are perfect extensions */
        isr_addpex(fim->report, fim->map[i]);
    i = hibit[m]; fim->ends[i] = fim->btas[i];
    fim->ttw = 0; fim->tor = 0; /* clear 16 items machine */
    return 0;                   /* and abort the function */
  }
  count(fim, i = hibit[m]+1);   /* count the support of all items */
  m = filter(fim, i, s);        /* remove infreq. and perf. exts. */
  r = (fim->dir > 0)            /* find freq. item sets recursively */
    ? rec_pos(fim, i, m) : rec_neg(fim, i, m);
  fim->ttw = 0; fim->tor = 0;   /* clear the total transaction weight */
  return (r) ? r : m;           /* return error status or mask */
}  /* m16_mine() */
Exemplo n.º 2
0
void main()
{
    int size=0;
    order_node *pre,*in;
    pre=(order_node*)malloc(sizeof(order_node));
    in=(order_node*)malloc(sizeof(order_node));
    tree_node *root;
    printf("Enter data in pre order(-999 to end)\n");
    create_order(pre);
    printf("Enter data in in-order(-999 to end)\n");
    create_order(in);
    size = get_size(in);
    root=create_tree(in,pre,size);
    printf("\nData in tree in preorder rec\n");
    rec_pre(root);
    printf("\nData in tree in inorder rec\n");
    rec_in(root);
    printf("\nData in tree in posorder rec\n");
    rec_pos(root);
    printf("\nData in tree in preorder nrec\n");
    nrec_pre(root);
    printf("\nData in tree in inorder nrec\n");
    nrec_in(root);
    printf("\nData in tree in posorder nrec\n");
    nrec_pos(root);
    printf("\n\nPress Enter to exit...");
    getch();
}
static int rec_pos (FIM16 *fim, int n, BITTA mask)
{                               /* --- find frequent item sets */
  int   i, r;                   /* loop variable, error status */
  SUPP  s;                      /* item support */
  BITTA m;                      /* filtering mask */

  assert(fim && (n >= 0));      /* check the function arguments */
  /* The item mask needs to be checked, because items 0,1,2 may have  */
  /* been identified as perfect extensions in higher recursion levels.*/
  if ((mask & 1)                /* if item 0 is frequent */
  &&  (fim->supps[0] >= fim->smin)) {
    r = isr_add(fim->report, fim->map[0], fim->supps[0]);
    if (r < 0) return -1;       /* add item 0 to the reporter */
    if (r > 0) {                /* if item 0 needs processing */
      if (isr_report(fim->report) < 0)
        return -1;              /* report the current item set */
      isr_remove(fim->report,1);/* remove the item 0 again */
    }                           /* from the item set reporter */
  }
  if ((mask & 2)                /* if item 1 is frequent */
  &&  (fim->supps[1] >= fim->smin)) {
    r = isr_add(fim->report, fim->map[1], fim->supps[1]);
    if (r < 0) return -1;       /* add item 1 to the reporter */
    if (r > 0) {                /* if item 1 needs processing, */
      if ((mask & 1)            /* if item 0 is frequent given 1 */
      &&  (fim->wgts[3] >= fim->smin)) {
        if (fim->wgts[3] >= fim->supps[1])
          isr_addpex(fim->report, fim->map[0]);
        else {                  /* check for a perfect extension */
          r = isr_add(fim->report, fim->map[0], fim->wgts[3]);
          if (r < 0) return -1; /* add item 0 to the reporter */
          if (r > 0) {          /* if item 0 needs processing */
            if (isr_report(fim->report) < 0)
              return -1;        /* report the current item set */
            isr_remove(fim->report, 1);
          }                     /* remove the item 0 again */
        }                       /* from the item set reporter */
      }
      if (isr_report(fim->report) < 0)
        return -1;              /* report the current item set */
      isr_remove(fim->report,1);/* remove the item 1 again */
    }                           /* from the item set reporter */
  }
  if (n <= 2) {                 /* if only two items to process */
    memset(fim->wgts+1, 0, 3*sizeof(SUPP));
    memset(fim->supps,  0, 2*sizeof(SUPP));
    memcpy(fim->ends, fim->btas, 2*sizeof(BITTA*));
    return 0;                   /* clear counters for items 0 and 1 */
  }                             /* and clear the transaction lists */
  if ((mask & 4)                /* if item 2 is frequent */
  &&  (fim->supps[2] >= fim->smin)) {
    r = isr_add(fim->report, fim->map[2], fim->supps[2]);
    if (r < 0) return -1;       /* add item 2 to the reporter */
    if (r > 0) {                /* if  item 2 needs processing, */
      m = 0;                    /* project/count for items 0 and 1 */
      fim->wgts[3]  = fim->wgts[7];
      fim->wgts[2]  = fim->wgts[6];
      fim->wgts[1]  = fim->wgts[5];
      fim->supps[0] = s = fim->wgts[3] +fim->wgts[1];
      if      (s >= fim->supps[2]) isr_addpex(fim->report, fim->map[0]);
      else if (s >= fim->smin)     m = (BITTA)(m | (mask & 1));
      fim->supps[1] = s = fim->wgts[3] +fim->wgts[2];
      if      (s >= fim->supps[2]) isr_addpex(fim->report, fim->map[1]);
      else if (s >= fim->smin)     m = (BITTA)(m | (mask & 2));
      r = rec_pos(fim, 2, m);   /* perfect extension items and then */
      if (r < 0) return -1;     /* find freq. item sets recursively */
      if (isr_report(fim->report) < 0)
        return -1;              /* report the current item set */
      isr_remove(fim->report,1);/* remove the item 2 again */
    }                           /* from the item set reporter */
  }
  if (n <= 3) {                 /* if only two items to process */
    memset(fim->wgts+1, 0, 7*sizeof(SUPP));  /* clear weights, */
    memset(fim->supps,  0, 3*sizeof(SUPP));  /* support and lists */
    memcpy(fim->ends, fim->btas, 3*sizeof(BITTA*));
    return 0;                   /* clear counters for items 0, 1, 2 */
  }                             /* and clear the transaction lists */
  if ((mask & 8)                /* if item 3 is frequent */
  &&  (fim->supps[3] >= fim->smin)) {
    r = isr_add(fim->report, fim->map[3], fim->supps[3]);
    if (r < 0) return -1;       /* add item 3 to the reporter */
    if (r > 0) {                /* if  item 3 needs processing, */
      m = 0;                    /* project/count for items 0 and 1 */
      fim->wgts[4]  = fim->wgts[12];
      fim->wgts[3]  = fim->wgts[11] +(fim->wgts[7] = fim->wgts[15]);
      fim->wgts[2]  = fim->wgts[10] +(fim->wgts[6] = fim->wgts[14]);
      fim->wgts[1]  = fim->wgts[ 9] +(fim->wgts[5] = fim->wgts[13]);
      fim->supps[0] = s = fim->wgts[3] +fim->wgts[1];
      if      (s >= fim->supps[3]) isr_addpex(fim->report, fim->map[0]);
      else if (s >= fim->smin)     m = (BITTA)(m | (mask & 1));
      fim->supps[1] = s = fim->wgts[3] +fim->wgts[2];
      if      (s >= fim->supps[3]) isr_addpex(fim->report, fim->map[1]);
      else if (s >= fim->smin)     m = (BITTA)(m | (mask & 2));
      fim->supps[2] = s = fim->wgts[7] +fim->wgts[6]
                        + fim->wgts[5] +fim->wgts[4];
      if      (s >= fim->supps[3]) isr_addpex(fim->report, fim->map[2]);
      else if (s >= fim->smin)     m = (BITTA)(m | (mask & 4));
      r = rec_pos(fim, 3, m);   /* perfect extension items and then */
      if (r < 0) return -1;     /* find freq. item sets recursively */
      if (isr_report(fim->report) < 0)
        return -1;              /* report the current item set */
      isr_remove(fim->report,1);/* remove the item 3 again */
    }                           /* from the item set reporter */
  }
  memset(fim->wgts+1, 0, 15*sizeof(SUPP));  /* clear weights, */
  memset(fim->supps,  0,  4*sizeof(SUPP));  /* support and lists */
  memcpy(fim->ends, fim->btas, 4*sizeof(BITTA*));

  for (i = 4; i < n; i++) {     /* traverse the (remaining) items */
    s = fim->supps[i];          /* get the support of the item and */
    if (s < fim->smin) continue;/* skip infrequent/eliminated items */
    r = isr_add(fim->report, fim->map[i], s);
    if (r <  0) return -1;      /* add item i to the reporter */
    if (r <= 0) {               /* check if item i needs processing, */
      clear(fim, i); continue;} /* otherwise delete its transactions */
    assert(mask & (1 << i));    /* item must not be excluded */
    if (fim->ends[i]-fim->btas[i] <= 1){ /* if only one transaction, */
      fim->ends[i] = fim->btas[i]; /* add all items as perfect exts. */
      fim->wgts[m = *fim->btas[i]] = 0;
      for (r = 0; (unsigned int)(1 << r) <= (unsigned int)m; r++)
        if (m & (1 << r)) isr_addpex(fim->report, fim->map[r]); }
    else {                      /* if more than one transaction */
      project(fim,i,mask, fim); /* project database to item i */
      count(fim, i);            /* count the support of all items */
      m = filter (fim, i, s);   /* remove infrequent items and */
      r = rec_pos(fim, i, m);   /* perfect extension items and then */
      if (r < 0) return -1;     /* find freq. item sets recursively */
    }                           /* and check for a recursion error */
    if (isr_report(fim->report) < 0)
      return -1;                /* report the current item set */
    isr_remove(fim->report, 1); /* remove the item i again */
  }                             /* from the item set reporter */
  return 0;                     /* return 'ok' */
}  /* rec_pos() */