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.util.ArrayList;
import java.util.List;
import ca.pfv.spmf.algorithms.sequentialpatterns.fournier2008_seqdim.AlgoFournierViger08;
/**
* A set of MDSequences organized by levels representing their size.
* Returned by the AlgoSeqDim algorithm.<br/>
* Level 0 = MDSequences of size 0 <br/>
* Level 1 = MDSequences of size 1 <br/>
* ...<br/>
* Level n = MDSequences of size n <br/>
* @see AlgoFournierViger08
* @author Philippe Fournier-Viger
*/
public class MDSequences {
// A list of list containing the MDSequences by size
// For example, the position i is the list of MDSequences of
// size i.
private final List<List<MDSequence>> levels = new ArrayList<List<MDSequence>>(); // itemset sorted by size
// the number of patterns stored in this structure
private int sequencesCount=0;
// a name given to the patterns
private final String name;
/**
* Constructor.
* @param name a name for the patterns that will be contained in this
* structure (String).
*/
public MDSequences(String name){
this.name = name;
levels.add(new ArrayList<MDSequence>()); // the level 0 is empty by default.
}
/**
* Print the patterns contained in this structure to System.out.
* @param sequenceCount the number of MDSequences in the MDSequences database.
*/
public void printPatterns(int sequenceCount){
// create a string buffer
System.out.println(" ------- " + name + " -------");
int levelCount=0;
// for each level
for(List<MDSequence> level : levels){
System.out.println(" L" + levelCount + " ");
// for each MDSequence
for(MDSequence sequence : level){
// print the MDSequence
System.out.print(" pattern " + sequence.getId() + ": ");
sequence.print();
// print its support
System.out.print("support : " + sequence.getFormattedRelativeSupport(sequenceCount));
System.out.print(" (" + sequence.getAbsoluteSupport() + "/" + sequenceCount + ") ");
System.out.println("");
}
levelCount++; // go to next level
}
System.out.println(" --------------------------------");
}
/**
* Get a String representation of this set of MDSequences.
* @param sequenceCount the number of MDSequences in the MDSequences database.
* @return a string
*/
public String toString(int sequenceCount){
// create a string buffer
StringBuilder out = new StringBuilder(" ------- " + name + " -------");
int levelCount=0;
// for each level
for(List<MDSequence> level : levels){
out.append(" L" + levelCount + "\n");
// for each MDSequence
for(MDSequence sequence : level){
// print the MDSequence
out.append(" pattern " + sequence.getId() + ": \n");
out.append(sequence.toString());
// print its support
out.append("support : " + sequence.getFormattedRelativeSupport(sequenceCount));
out.append(" (" + sequence.getAbsoluteSupport() + "/" + sequenceCount + ") \n");
}
levelCount++; // go to next level
}
out.append(" --------------------------------");
return out.toString();
}
/**
* Add a MD-sequence to this structure
* @param sequence the MDSequence
* @param k the size of the MDSequence
*/
public void addSequence(MDSequence sequence, int k){
// for each level in this structure
while(levels.size() <= k){
// if there is no list for this level, then create one
levels.add(new ArrayList<MDSequence>());
}
// add the pattern to this level
levels.get(k).add(sequence);
// increase the number of patterns found.
sequencesCount++;
}
/**
* Get MDSequences of size k.
* @param k the size
* @return a list of MDSequence objects
*/
public List<MDSequence> getLevel(int k){
return levels.get(k);
}
/**
* Get the number of MDSequences stored in this structure.
* @return an integer
*/
public int size() {
return sequencesCount;
}
/**
* Get the size of the largest MD-Sequence stored in this structure.
* @return an int value.
*/
public List<List<MDSequence>> getLevels() {
return levels;
}
/**
* Recalculate the number of MDSequences stored in this structure.
*/
public void recalculateSize() {
// reset the count
sequencesCount =0;
// do a for loop over each level
for(List<MDSequence> level : levels){
// add the number of pattern for this level to the sum
sequencesCount += level.size();
}
}
}