// Path: modules/java/src/hdbscan/Hdbscan.java
// public class Hdbscan{
// 	static {
// 		System.loadLibrary("hdbscan_java");
// 	};
// 
// 	private int[] labels;
// 	
// 	 /**
// 	  * Initialise hdbscan*
// 	  *
// 	  * @param minPoints
// 	  */
// 	private native void initHdbscan(int minPoints);
// 		
// 	/**
// 	 * 
// 	 * @param dataset
// 	 * @return
// 	 */
// 	private native int[] runImpl(double[][] dataset);
// 
// 	/**
// 	 * 
// 	 * @param minPoints
// 	 * @return
// 	 */
// 	private native int[] reRunImpl(int minPoints);
// 	
// 	/**
// 	 * Call this method to clean up C allocated memory
// 	 * 
// 	 */ 
// 	public native void cleanHdbscan();
// 	
// 	/**
// 	 * 
// 	 * @param minPoints
// 	 */
// 	public Hdbscan(int minPoints){
// 		initHdbscan(minPoints);
// 	}
// 	
// 	/**
// 	 * 
// 	 * @param dataset
// 	 */
// 	public void run(double[][] dataset){
// 		labels = runImpl(dataset);
// 	}
// 	
// 	/**
// 	 * 
// 	 * @param minPts
// 	 */
// 	public void reRun(int minPts){
// 		labels = reRunImpl(minPts);
// 	}
// 	
// 	/**
// 	 * 
// 	 * @return
// 	 */
// 	public int[] getLabels(){
// 		return this.labels;
// 	}
// 	
// 	/**
// 	 * 
// 	 * @return
// 	 */
// 	public HashMap<Integer, ArrayList<Integer>> getClusterMap(){
// 		HashMap<Integer, ArrayList<Integer>> table = new HashMap<Integer, ArrayList<Integer>>();
// 		
// 		if(labels == null || labels.length == 0){
// 			return null;
// 		}
// 		
// 		for(int i = 0; i < labels.length; i++){
// 			Integer key = labels[i];
// 			ArrayList<Integer> list = table.get(key);
// 			
// 			if(list == null){
// 				list = new ArrayList<Integer>();
// 				list.add(i);
// 				table.put(key, list);
// 			} else{
// 				
// 				list.add(i);
// 			}
// 		}
// 		
// 		return table;
// 	}
// 	
// }


import java.util.ArrayList;
import java.util.HashMap;
import hdbscan.Hdbscan;
			else if (lineContents.length != numAttributes)
				System.err.println("Line " + lineIndex + " of data set has incorrect number of attributes.");

			double[] attributes = new double[numAttributes];
			for (int i = 0; i < numAttributes; i++) {
				try {
					// If an exception occurs, the attribute will remain 0:
					attributes[i] = Double.parseDouble(lineContents[i].trim());
				} catch (NumberFormatException nfe) {
					System.err.println("Illegal value on line " + lineIndex + " of data set: " + lineContents[i]);
				}
			}

			dataSet.add(attributes);
			line = reader.readLine();
		}

		reader.close();
		double[][] finalDataSet = new double[dataSet.size()][numAttributes];

		for (int i = 0; i < dataSet.size(); i++) {
			finalDataSet[i] = dataSet.get(i);
		}

		return finalDataSet;
	}

	public static void main(String[] args) {

		double mydata[][] = readInDataSet("example_data_set.csv", ",");
// Path: modules/java/src/hdbscan/Hdbscan.java
// public class Hdbscan{
// 	static {
// 		System.loadLibrary("hdbscan_java");
// 	};
// 
// 	private int[] labels;
// 	
// 	 /**
// 	  * Initialise hdbscan*
// 	  *
// 	  * @param minPoints
// 	  */
// 	private native void initHdbscan(int minPoints);
// 		
// 	/**
// 	 * 
// 	 * @param dataset
// 	 * @return
// 	 */
// 	private native int[] runImpl(double[][] dataset);
// 
// 	/**
// 	 * 
// 	 * @param minPoints
// 	 * @return
// 	 */
// 	private native int[] reRunImpl(int minPoints);
// 	
// 	/**
// 	 * Call this method to clean up C allocated memory
// 	 * 
// 	 */ 
// 	public native void cleanHdbscan();
// 	
// 	/**
// 	 * 
// 	 * @param minPoints
// 	 */
// 	public Hdbscan(int minPoints){
// 		initHdbscan(minPoints);
// 	}
// 	
// 	/**
// 	 * 
// 	 * @param dataset
// 	 */
// 	public void run(double[][] dataset){
// 		labels = runImpl(dataset);
// 	}
// 	
// 	/**
// 	 * 
// 	 * @param minPts
// 	 */
// 	public void reRun(int minPts){
// 		labels = reRunImpl(minPts);
// 	}
// 	
// 	/**
// 	 * 
// 	 * @return
// 	 */
// 	public int[] getLabels(){
// 		return this.labels;
// 	}
// 	
// 	/**
// 	 * 
// 	 * @return
// 	 */
// 	public HashMap<Integer, ArrayList<Integer>> getClusterMap(){
// 		HashMap<Integer, ArrayList<Integer>> table = new HashMap<Integer, ArrayList<Integer>>();
// 		
// 		if(labels == null || labels.length == 0){
// 			return null;
// 		}
// 		
// 		for(int i = 0; i < labels.length; i++){
// 			Integer key = labels[i];
// 			ArrayList<Integer> list = table.get(key);
// 			
// 			if(list == null){
// 				list = new ArrayList<Integer>();
// 				list.add(i);
// 				table.put(key, list);
// 			} else{
// 				
// 				list.add(i);
// 			}
// 		}
// 		
// 		return table;
// 	}
// 	
// }


// Path: modules/java/sample/JavaSample.java
import java.util.ArrayList;
import java.util.HashMap;
import hdbscan.Hdbscan;

			else if (lineContents.length != numAttributes)
				System.err.println("Line " + lineIndex + " of data set has incorrect number of attributes.");

			double[] attributes = new double[numAttributes];
			for (int i = 0; i < numAttributes; i++) {
				try {
					// If an exception occurs, the attribute will remain 0:
					attributes[i] = Double.parseDouble(lineContents[i].trim());
				} catch (NumberFormatException nfe) {
					System.err.println("Illegal value on line " + lineIndex + " of data set: " + lineContents[i]);
				}
			}

			dataSet.add(attributes);
			line = reader.readLine();
		}

		reader.close();
		double[][] finalDataSet = new double[dataSet.size()][numAttributes];

		for (int i = 0; i < dataSet.size(); i++) {
			finalDataSet[i] = dataSet.get(i);
		}

		return finalDataSet;
	}

	public static void main(String[] args) {

		double mydata[][] = readInDataSet("example_data_set.csv", ",");
		Hdbscan sc = new Hdbscan(3);