package net.seninp.jmotif.sax.bitmap;
import java.util.HashMap;
import java.util.Map;
import net.seninp.jmotif.sax.SAXProcessor;
import net.seninp.jmotif.sax.TSProcessor;
/**
* A container for shingled data FOR MANY TIMESERIES. Accepts a time series label and its SAX
* decomposition.
*
* @author psenin
*
*/
public class Shingles {
/** This maps a timeseries label to the ordered vector of frequencies. */
private Map<String, int[]> shingles;
/** This maps a shingle to its index in the vector. */
private HashMap<String, Integer> indexTable;
/**
* Constructor. Creates all the data structures.
*
* @param alphabetSize the expected alphabet size.
* @param shingleSize the expected shingle size.
*/
public Shingles(int alphabetSize, int shingleSize) {
// init data structures
shingles = new HashMap<String, int[]>();
indexTable = new HashMap<String, Integer>();
// build all shingles index
String[] alphabet = new String[alphabetSize];
for (int i = 0; i < alphabetSize; i++) {
alphabet[i] = String.valueOf(TSProcessor.ALPHABET[i]);
}
// and make an index table
String[] allStrings = SAXProcessor.getAllPermutations(alphabet, shingleSize);
for (int i = 0; i < allStrings.length; i++) {
indexTable.put(allStrings[i], i);
}
}
/**
* Returns the index table of shingles.
*
* @return the mapping of a shingle substring to the vector index.
*/
public HashMap<String, Integer> getShinglesIndex() {
return this.indexTable;
}
/**
* Adds a shingled time series to the table -- the user responsible for the proper ordering of the
* frequencies.
*
* @param key the shingle array label.
* @param counts the counts array.
*/
public void addShingledSeries(String key, int[] counts) {
shingles.put(key, counts);
}
/**
* Adds a shingled series assuring the proper index.
*
* @param key the timeseries key (i.e., label).
* @param shingledSeries a shingled timeseries in a map of <shingle, index> entries.
*/
public void addShingledSeries(String key, Map<String, Integer> shingledSeries) {
// allocate the weights array corresponding to the time series
int[] counts = new int[this.indexTable.size()];
// fill in the counts
for (String str : shingledSeries.keySet()) {
Integer idx = this.indexTable.get(str);
if (null == idx) {
throw new IndexOutOfBoundsException("the requested shingle " + str + " doesn't exist!");
}
counts[idx] = shingledSeries.get(str);
}
shingles.put(key, counts);
}
/**
* Get a shingles frequency array for the key (i.e., timeseries label).
*
* @param key the timeseries key.
* @return shingle frequency array.
*/
public int[] get(String key) {
return shingles.get(key);
}
/**
* Get shingles.
*
* @return returns the table of shingles <ts label, shingle frequency array>.
*/
public Map<String, int[]> getShingles() {
return this.shingles;
}
}