package ca.pfv.spmf.algorithms.sequentialpatterns.fournier2008_seqdim; /* This file is copyright (c) 2008-2013 Philippe Fournier-Viger * * This file is part of the SPMF DATA MINING SOFTWARE * (http://www.philippe-fournier-viger.com/spmf). * * SPMF is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * SPMF is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * You should have received a copy of the GNU General Public License along with * SPMF. If not, see <http://www.gnu.org/licenses/>. */ import java.util.HashSet; import java.util.Set; /** * This class is used by the Fournier08 algorithm and * represents * a pair of an (1) Item and (2) a time interval. * It is used for calculating the support * of items in a database. A pair also contains some other information too that * are needed by BIDE/PrefixSpan such as if the item was in an itemset * that is a prefix (cut at right) or if the item was in an itemset that is a postfix (cut a left). * * @see AlgoBIDEPlus * @see AlgoPrefixSpanMDSPM * @see AlgoFournierViger08 * @author Philippe Fournier-Viger */ class Pair{ // a timestamp (not used by prefixspan private final long timestamp; // indicate if the item is in an itemset that is cut at left private final boolean postfix; // indicate if the item is in an itemset that is cut at right private final boolean prefix; // an item private final ItemSimple item; // List of all the sequence IDs that contains this Pair . private Set<Integer> sequencesID = new HashSet<Integer>(); /** * Constructor * @param timestamp a timestamp * @param prefix true if the item was found in an itemset that is a prefix * @param postfix true if the item was found in an itemset that is a postfix * @param item the item */ Pair(long timestamp, boolean prefix, boolean postfix, ItemSimple item){ this.timestamp = timestamp; this.postfix = postfix; this.prefix = prefix; this.item = item; } /** * Constructor * @param prefix true if the item was found in an itemset that is a prefix * @param postfix true if the item was found in an itemset that is a postfix * @param item the item */ public Pair( boolean prefix, boolean postfix, ItemSimple item){ this.timestamp = 0; // not used by prefixspan this.postfix = postfix; this.prefix = prefix; this.item = item; } /** * Check if this pair is equal to another given Pair. * @param object a Pair * @return true if equal, otherwise false. */ public boolean equals(Object object){ // cast to Pair Pair paire = (Pair) object; // if they have the same timestamp, postfix and prefix boolean values, // and the same item ID, then return true. if((paire.timestamp == this.timestamp) && (paire.postfix == this.postfix) && (paire.prefix == this.prefix) && (paire.item.equals(this.item))){ return true; } // otherwise false return false; } /** * Get the hashcode for this pair * @return an int value */ public int hashCode() {// Ex: 127333,P,X,1 127333,N,Z,2 // create a StringBuilder StringBuilder r = new StringBuilder(); // make a string by appending the field variables values. r.append(timestamp); r.append((postfix ? 'P' : 'N')); // the letters here have no meanings. they are just used for the hashcode r.append((prefix ? 'X' : 'Z')); // the letters here have no meanings. they are just used for the hashcode r.append(item.getId()); // convert to string and use the hashcode method of the String class return r.toString().hashCode(); } /** * Get the timestamp for this Pair. * @return a long value */ public long getTimestamp() { return timestamp; } /** * Check if this Pair is for an item found in an itemset that is a postfix. * @return true, if yes, otherwise false */ public boolean isPostfix() { return postfix; } /** * Get the item. * @return an Item. */ public ItemSimple getItem() { return item; } /** * Get the number of sequences containing this Pair. * @return an int value. */ public int getCount() { return sequencesID.size(); } /** * Get the IDs of sequences containing this Pair. * @return a Set of Integer */ public Set<Integer> getSequencesID() { return sequencesID; } /** * Set the IDs of sequences containing this Pair. * @param sequencesID a Set of Integer */ public void setSequencesID(Set<Integer> sequencesID) { this.sequencesID = sequencesID; } /** * Check if this Pair is for an item found in an itemset that is a prefix. * @return true, if yes, otherwise false */ public boolean isPrefix() { return prefix; } }