// Path: src/main/java/de/mpii/gsm/taxonomy/Taxonomy.java
// public interface Taxonomy {
// 	
// 	public void load(String fileName) throws Exception;
// 	
// 	public void load(Configuration conf, String taxonomyURI) throws IOException, ClassNotFoundException;
// 	
// 	public void load(int[] p);
// 	
// 	/**
// 	 * @param child Item from the taxonomy
// 	 * @return parent id
// 	 */
// 	public int getParent(int item);
// 	
// 	/**
// 	 * @param child Item from the taxonomy
// 	 * @return true/false
// 	 */
// 	public boolean hasParent(int item);
// 	
// 	/**
// 	 * @param child
// 	 * @return
// 	 */
// 	public int getDepth(int item);
// 	
// 	
// 	/**
// 	 * @param item
// 	 * @return
// 	 */
// 	public int getRoot(int item);
// 	
// 	
// 	/**
// 	 * @param item1
// 	 * @param item2
// 	 * @return
// 	 */
// 	public int getCommonParent(int item1, int item2);
// 	
// 	public boolean isParent(int parent, int child);
// 	
// 	public boolean isGeneralizationOf(int item1, int item2);
// 
// 
// 	public int maxDepth();
// 	
// 	public int[] getParents();
// 
// }
// 
// Path: src/main/java/de/mpii/gsm/writer/GsmWriter.java
// public interface GsmWriter {
// 	void write(int[] sequence, long count) throws IOException, InterruptedException;
// }
// 
// Path: src/main/java/de/mpii/gsm/utils/PrimitiveUtils.java
// public final class PrimitiveUtils {
// 
//     /**
//      * Combines the two given int values into a single long value.
//      * 
//      * @param l
//      * @param r
//      * @return 
//      */
//     public static long combine(int l, int r) {
//         return ((long) l << 32) | ((long) r & 0xFFFFFFFFL);
//     }
// 
//     /**
//      * Extracts int value corresponding to left-most 32 bits of given long value.
//      * 
//      * @param c
//      * @return 
//      */
//     public static int getLeft(long c) {
//         return (int) (c >> 32);
//     }
// 
//     /**
//      * Extracts int value corresponding to right-most 32 bits of given long value.
//      * 
//      * @param c
//      * @return 
//      */
//     public static int getRight(long c) {
//         return (int) c;
//     }
// }


import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.bytes.ByteArrayList;
import org.apache.mahout.math.map.OpenIntIntHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Map;
import de.mpii.gsm.taxonomy.Taxonomy;
import de.mpii.gsm.writer.GsmWriter;
import de.mpii.gsm.utils.PrimitiveUtils;
		int[] inputTransaction = new int[length];
		System.arraycopy(transaction, fromIndex, inputTransaction, 0, length);
		inputTransactions.add(inputTransaction);

		tempSet.clear();

		for (int i = fromIndex; i < toIndex; ++i) {
			assert transaction[i] <= endItem;
			if (transaction[i] < 0) {
				continue;
			}
			int itemId = transaction[i];
			if (beginItem <= transaction[i]) { // pivot item(s)

				pivotItems.addItem(itemId, transactionId, support, i, i);

				
			}
			itemId = transaction[i];
			tempSet.add(itemId);
			while (taxonomy.hasParent(itemId)) {
				itemId = taxonomy.getParent(itemId);
				tempSet.add(itemId);
			}
		}
		for (int itemId : tempSet) {
			globallyFrequentItems.adjustOrPutValue(itemId, +support, +support);
		}
	}

// Path: src/main/java/de/mpii/gsm/taxonomy/Taxonomy.java
// public interface Taxonomy {
// 	
// 	public void load(String fileName) throws Exception;
// 	
// 	public void load(Configuration conf, String taxonomyURI) throws IOException, ClassNotFoundException;
// 	
// 	public void load(int[] p);
// 	
// 	/**
// 	 * @param child Item from the taxonomy
// 	 * @return parent id
// 	 */
// 	public int getParent(int item);
// 	
// 	/**
// 	 * @param child Item from the taxonomy
// 	 * @return true/false
// 	 */
// 	public boolean hasParent(int item);
// 	
// 	/**
// 	 * @param child
// 	 * @return
// 	 */
// 	public int getDepth(int item);
// 	
// 	
// 	/**
// 	 * @param item
// 	 * @return
// 	 */
// 	public int getRoot(int item);
// 	
// 	
// 	/**
// 	 * @param item1
// 	 * @param item2
// 	 * @return
// 	 */
// 	public int getCommonParent(int item1, int item2);
// 	
// 	public boolean isParent(int parent, int child);
// 	
// 	public boolean isGeneralizationOf(int item1, int item2);
// 
// 
// 	public int maxDepth();
// 	
// 	public int[] getParents();
// 
// }
// 
// Path: src/main/java/de/mpii/gsm/writer/GsmWriter.java
// public interface GsmWriter {
// 	void write(int[] sequence, long count) throws IOException, InterruptedException;
// }
// 
// Path: src/main/java/de/mpii/gsm/utils/PrimitiveUtils.java
// public final class PrimitiveUtils {
// 
//     /**
//      * Combines the two given int values into a single long value.
//      * 
//      * @param l
//      * @param r
//      * @return 
//      */
//     public static long combine(int l, int r) {
//         return ((long) l << 32) | ((long) r & 0xFFFFFFFFL);
//     }
// 
//     /**
//      * Extracts int value corresponding to left-most 32 bits of given long value.
//      * 
//      * @param c
//      * @return 
//      */
//     public static int getLeft(long c) {
//         return (int) (c >> 32);
//     }
// 
//     /**
//      * Extracts int value corresponding to right-most 32 bits of given long value.
//      * 
//      * @param c
//      * @return 
//      */
//     public static int getRight(long c) {
//         return (int) c;
//     }
// }


// Path: src/main/java/de/mpii/gsm/localmining/PSM.java
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.bytes.ByteArrayList;
import org.apache.mahout.math.map.OpenIntIntHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Map;
import de.mpii.gsm.taxonomy.Taxonomy;
import de.mpii.gsm.writer.GsmWriter;
import de.mpii.gsm.utils.PrimitiveUtils;

		int[] inputTransaction = new int[length];
		System.arraycopy(transaction, fromIndex, inputTransaction, 0, length);
		inputTransactions.add(inputTransaction);

		tempSet.clear();

		for (int i = fromIndex; i < toIndex; ++i) {
			assert transaction[i] <= endItem;
			if (transaction[i] < 0) {
				continue;
			}
			int itemId = transaction[i];
			if (beginItem <= transaction[i]) { // pivot item(s)

				pivotItems.addItem(itemId, transactionId, support, i, i);

				
			}
			itemId = transaction[i];
			tempSet.add(itemId);
			while (taxonomy.hasParent(itemId)) {
				itemId = taxonomy.getParent(itemId);
				tempSet.add(itemId);
			}
		}
		for (int itemId : tempSet) {
			globallyFrequentItems.adjustOrPutValue(itemId, +support, +support);
		}
	}

	public void mine(GsmWriter writer) throws IOException, InterruptedException {