package ca.pfv.spmf.algorithms.sequentialpatterns.fournier2008_seqdim.multidimensionalsequentialpatterns; /* 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.text.DecimalFormat; import ca.pfv.spmf.algorithms.sequentialpatterns.fournier2008_seqdim.AlgoFournierViger08; import ca.pfv.spmf.algorithms.sequentialpatterns.fournier2008_seqdim.Sequence; import ca.pfv.spmf.algorithms.sequentialpatterns.fournier2008_seqdim.multidimensionalpatterns.MDPattern; /** * Implementation of a "MultiDimensional-Sequence" used by the SeqDim algorithm (Pinto et al., 2001). * <br/><br/> * An MD-Sequence is associated to a MD-Database. * <br/><br/> * An MD-Sequence has two parts: an mdpattern (the values for each dimension) and a sequence. * * @see MDSequenceDatabase * @see MDPattern * @see Sequence * @see AlgoSeqDim * @see AlgoFournierViger08 * @author Philippe Fournier-Viger */ public class MDSequence { // the sequence private final Sequence sequence; // the mdpattern private final MDPattern mdpattern; // the id of this md-sequence private final int id; // the support of this sequence private int support = 0; /** * Constructor * @param id the id of the md-sequence * @param mdpattern the md-pattern in this md-sequence * @param sequence the sequence in this md-sequence */ public MDSequence(int id, MDPattern mdpattern, Sequence sequence){ // save the parameters this.id = id; this.sequence = sequence; this.mdpattern = mdpattern; // we set the same id for the sequence and mdpattern sequence.setID(id); mdpattern.setID(id); } /** * Get the sequence in this md-sequence * @return a Sequence */ public Sequence getSequence() { return sequence; } /** * Get the MDPattern in this md-sequence * @return a MDPattern */ public MDPattern getMdpattern() { return mdpattern; } /** * Get the ID of this md-sequence * @return an integer */ public int getId() { return id; } /** * Get the support of this MD-sequence as a percentage (double) * @param databaseSize the database size * @return the support as a double */ public double getRelativeSupport(int databaseSize) { // System.out.println("((( " + transactioncount); return ((double)support) / ((double) databaseSize); } /** * Get the support of this MD-sequence as an integer (mdsequence count) * @return the support as an integer */ public int getAbsoluteSupport(){ return support; } /** * Get the support of this MD-sequence as a percentage with five * decimals (String) * @param databaseSize the database size * @return the support as a double */ public String getFormattedRelativeSupport(int databaseSize) { // calculate the support double supportAsDouble = ((double)support) / ((double) databaseSize); // Convert to a string with two decimals DecimalFormat format = new DecimalFormat(); format.setMinimumFractionDigits(0); format.setMaximumFractionDigits(5); return format.format(supportAsDouble); } /** * Print a String representation of this MD-Sequence to System.out */ public void print(){ // print the id System.out.print("MDSequence " + id + ": "); // print the md-pattern mdpattern.print(); // print the sequence sequence.print(); } /** * Get a String representation of this MD-Sequence to System.out * @return a String */ public String toString(){ // create a string with the id, String out = "MDSequence " + id + ": "; // the md pattern, out += mdpattern.toString(); // and the sequence out += sequence.toString(); return out; } /** * Set the support of this MDSequence * @param transactioncount the support as an integer value (as asequence count). */ public void setSupport(int transactioncount) { this.support = transactioncount; } /** * Check if this md-sequence strictly contains a given md-sequence. * @param sequence2 the given md-sequence * @return true if it strictly contains the given md-sequence, otherwise false. */ boolean strictlyContains(MDSequence sequence2) { // check if the md patterns contains the other one int patternContains = getMdpattern().strictlyContains(sequence2.getMdpattern()); // check if the sequence contains the other one int sequenceContains = getSequence().strictlyContains(sequence2.getSequence()); // if they are equals return false if(patternContains == 2 && sequenceContains ==2){ return false; // EQUALS } // if it strictly contains the given pattern if(patternContains != 0 && sequenceContains != 0){ return true; } // otherwise they are different and the given md-seq. is not // strictly contained. return false; } /** * Check if this md-sequence contains a given md-sequence. * @param sequence2 the given md-sequence * @return true if it contains the given md-sequence, otherwise false. */ boolean contains(MDSequence sequence2) { // check if the md patterns contains the other one int patternContains = getMdpattern().strictlyContains(sequence2.getMdpattern()); // check if the sequence contains the other one int sequenceContains = getSequence().strictlyContains(sequence2.getSequence()); // if it contains the given pattern if(patternContains != 0 && sequenceContains != 0){ return true; } // otherwise return false return false; } }