// Seeded Lloyd clustering with every fitting control explicit.
import aner.ml
import aner.tensor
import aner.metrics

let features: Tensor = [[0.0], [2.0], [10.0], [12.0]]
let reference_groups: Tensor = [[10.0], [10.0], [20.0], [20.0]]
let model = ml.fit_kmeans(features: features, clusters: 2,
    max_iterations: 100, tolerance: 0.0, seed: 42)
let repeated = ml.fit_kmeans(features: features, clusters: 2,
    max_iterations: 100, tolerance: 0.0, seed: 42)
let assigned = model.labels()
let centers = model.centers()
let predicted = model.predict(input: [[1.0], [11.0]])

print(tensor.rows(centers))
print(tensor.cols(centers))
print(model.converged())
print(model.iterations() >= 1 && model.iterations() <= 100)
print(model.inertia())
print(metrics.adjusted_rand_index(predicted: assigned, actual: reference_groups))
print(tensor.value(predicted, 0, 0) != tensor.value(predicted, 1, 0))
print(tensor.value(centers, 0, 0) == tensor.value(repeated.centers(), 0, 0))
print(tensor.value(centers, 1, 0) == tensor.value(repeated.centers(), 1, 0))

// A requested cluster count need not become an occupied-cluster count.
let duplicates = ml.fit_kmeans(features: [[5.0], [5.0]], clusters: 2,
    max_iterations: 3, tolerance: 0.0, seed: 42)
print(tensor.value(duplicates.labels(), 0, 0))
print(tensor.value(duplicates.labels(), 1, 0))
print(duplicates.inertia())
