示例#1
0
  /**
   * Save a pattern of size > 1 to the output file.
   *
   * @param prefix the prefix
   * @param bitmap its bitmap
   * @throws IOException exception if error while writing to the file
   * @return true if pattern is subsumed
   */
  private boolean savePatternMultipleItems(PrefixVMSP prefix, Bitmap bitmap, int length)
      throws IOException {
    // CHANGED ------
    //    	System.out.println("prefix :" + prefix);
    //    	if(true == true) return false;
    // WE COMPARE WITH LARGER PATTERNS FOR SUPER-PATTERN CHECKING
    // #################
    // IMPORTANT STRATEGY  :   FROM LARGER TO SMALLER......
    // ##################
    for (int i = maxPatterns.size() - 1; i > length; i--) {
      for (PatternVMSP pPrime : maxPatterns.get(i)) {
        //    			System.out.println(pPrime.prefix.sumOfItems);
        // if the prefix pattern has a support higher or equal to the current pattern
        if (pPrime.prefix.sumOfOddItems + pPrime.prefix.sumOfEvenItems
            < prefix.sumOfOddItems + prefix.sumOfEvenItems) {
          break;
        }

        if (prefix.sumOfEvenItems <= pPrime.prefix.sumOfEvenItems
            && prefix.sumOfOddItems <= pPrime.prefix.sumOfOddItems
            && bitmap.getSupport() >= pPrime.support
            && strictlyContains(pPrime.prefix, prefix)) {
          return true;
        }
      }
    }

    //        System.out.println("  ADD : " + prefix);

    // WE COMPARE WITH SMALLER PATTERNS FOR SUB-PATTERN CHECKING
    for (int i = 1; i < length && i < maxPatterns.size(); i++) {
      // for each pattern already found of size i

      // IMPORTANT : WE USE A DESCENDNIG ITERATOR...
      // HOWEVER' WE COULD USE THIS FOR PRUNING...
      Iterator<PatternVMSP> iter =
          maxPatterns.get(i).descendingIterator(); // DESCENDING ITERATOR !!!!!!!!!!
      while (iter.hasNext()) {
        PatternVMSP pPrime = iter.next();

        // CAN DO THIS BECAUSE OF DESCENDING ORDER
        if (pPrime.prefix.sumOfOddItems + pPrime.prefix.sumOfEvenItems
            >= prefix.sumOfOddItems + prefix.sumOfEvenItems) {
          break;
        }

        if (prefix.sumOfEvenItems >= pPrime.prefix.sumOfEvenItems
            && prefix.sumOfOddItems >= pPrime.prefix.sumOfOddItems
            && bitmap.getSupport() <= pPrime.support
            && strictlyContains(prefix, pPrime.prefix)) {
          patternCount--; // DECREASE COUNT
          iter.remove();
        }
      }
    }

    // OTHERWISE THE NEW PATTERN IS NOT SUBSUMMED

    while (maxPatterns.size() - 1 < length) {
      maxPatterns.add(new TreeSet<PatternVMSP>());
    }

    TreeSet<PatternVMSP> patternsOfSizeM = maxPatterns.get(length);

    patternCount++; // INCREASE COUNT

    // Create the pattern
    PatternVMSP pattern = new PatternVMSP(prefix, bitmap.getSupport());
    // If the user wants to see the sequence identifiers, we need to keep the bitmap which stores
    // them
    if (outputSequenceIdentifiers) {
      pattern.bitmap = bitmap;
    }
    // save the pattern
    patternsOfSizeM.add(pattern);

    //        if(patternCount % 200 == 0) {
    //        	System.out.println(patternCount);
    //        }
    return false; // not subsumed

    //        StringBuilder r = new StringBuilder("");
    //        for (Itemset itemset : prefix.getItemsets()) {
    ////			r.append('(');
    //            for (Integer item : itemset.getItems()) {
    //                String string = item.toString();
    //                r.append(string);
    //                r.append(' ');
    //            }
    //            r.append("-1 ");
    //        }
    //
    //        r.append("SUP: ");
    //        r.append(bitmap.getSupport());
    //
    //        writer.write(r.toString());
    ////		System.out.println(r.toString());
    //        writer.newLine();

    // END CHANGED ------
  }
示例#2
0
  /**
   * Save a pattern of size 1 to the output file
   *
   * @param item the item
   * @param bitmap its bitmap
   * @param itemIsEven
   * @throws IOException exception if error while writing to the file
   * @return true if is subsumed
   */
  private boolean savePatternSingleItem(Integer item, Bitmap bitmap, boolean itemIsEven)
      throws IOException {
    //    	System.out.println("prefix :" + prefix);

    // FOR THE CASE OF SINGLE ITEM, WE DON'T NEED TO DO SUB-PATTERN CHECKING:
    // WE JUST NEED TO DO SUPER-PATTERN CHECKING
    // #################
    // IMPORTANT STRATEGY  :   FROM LARGER TO SMALLER......  AND IN ASCENDING SUPPORT ORDER
    // ##################
    if (itemIsEven) {
      for (int i = maxPatterns.size() - 1; i > 1; i--) {
        for (PatternVMSP pPrime : maxPatterns.get(i)) {

          if (pPrime.prefix.sumOfOddItems + pPrime.prefix.sumOfEvenItems < item) {
            break;
          }
          // if the pattern already found contains the single item
          if (pPrime.prefix.sumOfEvenItems > item && bitmap.getSupport() >= pPrime.support) {
            if (pPrime.prefix.containsItem(item)) {
              return true;
            }
          }
        }
      }
    } else {
      for (int i = maxPatterns.size() - 1; i > 1; i--) {
        for (PatternVMSP pPrime : maxPatterns.get(i)) {

          if (pPrime.prefix.sumOfOddItems + pPrime.prefix.sumOfEvenItems < item) {
            break;
          }
          // if the pattern already found contains the single item
          if (pPrime.prefix.sumOfOddItems > item && bitmap.getSupport() >= pPrime.support) {
            if (pPrime.prefix.containsItem(item)) {
              return true;
            }
          }
        }
      }
    }
    // OTHERWISE THE NEW PATTERN IS NOT SUBSUMMED
    patternCount++; // INCREASE COUNT
    PrefixVMSP prefix = new PrefixVMSP();
    prefix.addItemset(new Itemset(item));
    if (itemIsEven) {
      prefix.sumOfEvenItems = item;
      prefix.sumOfOddItems = 0;
    } else {
      prefix.sumOfEvenItems = 0;
      prefix.sumOfOddItems = item;
    }

    PatternVMSP pattern = new PatternVMSP(prefix, bitmap.getSupport());

    // If the user wants to see the sequence identifiers, we need to keep the bitmap which stores
    // them
    if (outputSequenceIdentifiers) {
      pattern.bitmap = bitmap;
    }
    // save the pattern
    //        System.out.println(" ADD: " + item);
    maxPatterns.get(1).add(pattern);

    return false;

    // END CHANGED ------
  }