kdtree_euclid = KDTree()
kdtree_euclid.setDistanceFunction(EuclideanDistance()) # only Euclidean Distance function
tree_algorithms.append(kdtree_euclid)
ball = BallTree()
ball.setDistanceFunction(EuclideanDistance()) # only Euclidean Distance function
tree_algorithms.append(ball)
cover = CoverTree()
cover.setDistanceFunction(EuclideanDistance())  # only Euclidean Distance function
tree_algorithms.append(cover)
data.setClassIndex(data.numAttributes() - 1)
for num in range(1,30,2):
   file.write(str(num))
   for algoknn in tree_algorithms :
      log.write("---------------------------------\nK: " + str(num) + ", Search Algorithm: " + algoknn.__class__.__name__ + "\n")
      algo = IBk()
      algo.setNearestNeighbourSearchAlgorithm(algoknn)
      algo.setKNN(num)
      x = time.time()
      algo.buildClassifier(data)
      log.write("Time to build classifier: " + str(time.time() - x) + "\n")
      evaluation = Evaluation(data)
      output = PlainText()  # plain text output for predictions
      output.setHeader(data)
      buffer = StringBuffer() # buffer to use
      output.setBuffer(buffer)
      attRange = Range()                  # no additional attributes output
      outputDistribution = Boolean(False) # we don't want distribution
      x = time.time()
      #evaluation.evaluateModel(algo, data, [output, attRange, outputDistribution])
      evaluation.crossValidateModel(algo, data, 10, rand, [output, attRange, outputDistribution])
      log.write("Time to evaluate model: " + str(time.time() - x) + "\n")
ball = BallTree()
ball.setDistanceFunction(
    EuclideanDistance())  # only Euclidean Distance function
tree_algorithms.append(ball)
cover = CoverTree()
cover.setDistanceFunction(
    EuclideanDistance())  # only Euclidean Distance function
tree_algorithms.append(cover)
data.setClassIndex(data.numAttributes() - 1)
for num in range(1, 30, 2):
    file.write(str(num))
    for algoknn in tree_algorithms:
        log.write("---------------------------------\nK: " + str(num) +
                  ", Search Algorithm: " + algoknn.__class__.__name__ + "\n")
        algo = IBk()
        algo.setNearestNeighbourSearchAlgorithm(algoknn)
        algo.setKNN(num)
        x = time.time()
        algo.buildClassifier(data)
        log.write("Time to build classifier: " + str(time.time() - x) + "\n")
        evaluation = Evaluation(data)
        output = PlainText()  # plain text output for predictions
        output.setHeader(data)
        buffer = StringBuffer()  # buffer to use
        output.setBuffer(buffer)
        attRange = Range()  # no additional attributes output
        outputDistribution = Boolean(False)  # we don't want distribution
        x = time.time()
        #evaluation.evaluateModel(algo, data, [output, attRange, outputDistribution])
        evaluation.crossValidateModel(algo, data, 10, rand,
                                      [output, attRange, outputDistribution])