package ca.pfv.spmf.algorithms.sequentialpatterns.prefixSpan_AGP.items;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
import java.util.Map;
/**Inspired in SPMF Implementation of a sequence.
* A sequence is defined as a list of itemsets and can have an identifier.
*
* Copyright Antonio Gomariz PeƱalver 2013
*
* 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/>.
*
* @author agomariz
*/
public class Sequence {
/**
* Counter that has the total items contained in the sequence.
*/
private int numberOfItems = 0;
/**
* Itemsets that compose the sequence
*/
private final List<Itemset> itemsets = new ArrayList<Itemset>();
/**
* Sequence identifier
*/
private int id;
/**
* Standard constructor for a sequence
* @param id The sequence identifier
*/
public Sequence(int id) {
this.id = id;
}
/**
* It adds an itemset in the last position of the sequence
* @param itemset the itemset to add
*/
public void addItemset(Itemset itemset) {
itemsets.add(itemset);
numberOfItems += itemset.size();
}
/**
* It adds an item to the last itemset of the sequence
* @param item the item to add
*/
public void addItem(Item item){
itemsets.get(size()-1).addItem(item);
numberOfItems++;
}
/**
* It adds an item in the specified itemset of the sequence
* @param indexItemset Itemset index where we want to insert the item
* @param item The item that we want to insert
*/
public void addItem(int indexItemset, Item item){
itemsets.get(indexItemset).addItem(item);
numberOfItems++;
}
/**
* It adds an item in the specified item position of the specified itemset of the sequence
* @param indexItemset Itemset index where we want to insert the item
* @param indexItem Item index where we want to insert the item
* @param item The item that we want to insert
*/
public void addItem(int indexItemset, int indexItem, Item item){
itemsets.get(indexItemset).addItem(indexItem,item);
numberOfItems++;
}
/**
* It removes the specified itemset from the sequence
* @param indexItemset Itemset index of itemset that we want to remove
* @return the itemset removed
*/
public Itemset remove(int indexItemset){
Itemset itemset= itemsets.remove(indexItemset);
numberOfItems-=itemset.size();
return itemset;
}
/**
* It removes the specified item from the specified itemset in the sequence
* @param indexItemset Itemset index from where we want to remove the item
* @param indexItem Item index that we want to remove
* @return the item that was removed
*/
public Item remove(int indexItemset, int indexItem){
numberOfItems--;
return itemsets.get(indexItem).removeItem(indexItem);
}
/**
* It removes the specified item from the specified itemset in the sequence
* @param indexItemset Itemset index from where we want to remove the item
* @param item Item that we want to remove
*/
public void remove(int indexItemset, Item item){
itemsets.get(indexItemset).removeItem(item);
numberOfItems--;
}
/**
* It clones a sequence
* @return the clone sequence
*/
public Sequence cloneSequence() {
Sequence sequence = new Sequence(getId());
for (Itemset itemset : itemsets) {
sequence.addItemset(itemset.cloneItemset());
}
return sequence;
}
/**
* Get the string representation of this sequence
* @return the string representation
*/
@Override
public String toString() {
StringBuilder r = new StringBuilder("");
for (Itemset itemset : itemsets) {
r.append("{t=");
r.append(itemset.getTimestamp());
r.append(", ");
for (Item item : itemset.getItems()) {
String string = item.toString();
r.append(string);
r.append(' ');
}
r.append('}');
}
return r.append(" ").toString();
}
/**
* It returns the sequence ID
* @return the sequence id
*/
public int getId() {
return id;
}
/**
* It gets the list of itemsets in this sequence
* @return the list of itemsets
*/
public List<Itemset> getItemsets() {
return itemsets;
}
/**
* It gets the itemset of this sequence at a given index position
* @param index the itemset index in which we are interested in
* @return the itemset
*/
public Itemset get(int index) {
return itemsets.get(index);
}
/**
* It returns the number of itemsets that the sequence has
* @return the number of itemsets
*/
public int size() {
return itemsets.size();
}
/**
* It returns the number of items that the sequence has
* @return the number of items.
*/
public int length() {
return numberOfItems;
}
/**
* It returns the time length of the sequence, i.e. the timestamp of the
* last itemset minus the timestamp of the first itemset
* @return the timelength
*/
public long getTimeLength() {
return itemsets.get(itemsets.size() - 1).getTimestamp() - itemsets.get(0).getTimestamp();
}
/**
* It clones a sequence withoud copying the non-frequent items
* @param mapSequenceID Association between aun item and their appearances in the database
* @param relativeMinSup Minimum relative support
* @return the clone
*/
public Sequence cloneSequenceMinusItems(Map<Item, BitSet> mapSequenceID, double relativeMinSup) {
Sequence sequence = new Sequence(getId());
for (Itemset itemset : itemsets) {
Itemset newItemset = itemset.cloneItemSetMinusItems(mapSequenceID);
if (newItemset.size() != 0) {
sequence.addItemset(newItemset);
}
}
return sequence;
}
/**
* Sequence ID setter
* @param id
*/
public void setID(int id) {
this.id = id;
}
}