/** * 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 ------ }
/** * 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 ------ }