public void startBenchmark(){
		System.out.println("Starting TarsosLSH benchmark with " + dataset.size() + " random vectors");
		System.out.println("   Four close neighbours have been added to 100 vectors (100+4x100=500).");
		System.out.println("   The results of LSH are compared with a linear search.");
		System.out.println("   The first four results of LSH and linear are compared.");
		
		
		//determine the radius for hash bins automatically
		System.out.println("Radius for Euclidean distance.");
		int radiusEuclidean = (int) LSH.determineRadius(dataset, new EuclideanDistance(), 20);
		System.out.println("\nRadius for City block distance.");
		int radiusCityBlock = (int) LSH.determineRadius(dataset, new CityBlockDistance(), 20);

		HashFamily[] families = {
				new EuclidianHashFamily(radiusEuclidean,dimensions),
				new CityBlockHashFamily(radiusCityBlock,dimensions), 
				new CosineHashFamily(dimensions)};
		
		for(HashFamily family:families){			
			int[] numberOfHashes = {2,4,8};
			if(family instanceof CosineHashFamily){
				numberOfHashes[0] *= 8;
				numberOfHashes[1] *= 8;
				numberOfHashes[2] *= 8;
			}
				
			int[] numberOfHashTables = {2,4,8,16};
			
			LSH lsh = new LSH(dataset,family);
			System.out.println("\n--" + family.getClass().getName());
			System.out.printf("%10s%15s%10s%10s%10s%10s%10s%10s\n","#hashes","#hashTables","Correct","Touched","linear","LSH","Precision","Recall");
			for(int i = 0; i < numberOfHashes.length ; i++){
				for(int j = 0 ; j < numberOfHashTables.length ; j++){	
					lsh.buildIndex( numberOfHashes[i], numberOfHashTables[j]);
					lsh.benchmark(numberOfNeighbours,family.createDistanceMeasure());	
				}
			}
		}
	}