anchor.diff:      let selectNearestPoint origin points =
           points |> Array.minBy (distance origin)
   
  +    let getNewClusters samples centroids = 
  +        samples |> Array.groupBy (fun sample -> selectNearestPoint sample.Vector centroids) 
  +
       let getNewCentroid cluster =
           let oldCentroid , samples  = cluster       
           let vectors = samples |> Array.map(fun sample -> sample.Vector)
           vectors 
               |> Array.reduce (Array.map2 (+)) 
               |> Array.map (fun x -> x / float samples.Length)
  +
  +    let doneThreshold = 0.001;
  +    let checkKeepGoing (centroids : float [][]) (newCentroids : float[][]) dimensionRanges =
  +        (centroids, newCentroids)
  +        ||> Seq.map2 (Seq.map2 (-))
  +        |> Seq.map (Seq.map2 (fun range delta -> abs (delta / range)) dimensionRanges)
  +        |> Seq.collect (id)
  +        |> Seq.exists (fun delta -> delta >= doneThreshold)
  +       
   
       let displayCluster cluster =
           printfn ""
  
positive.code:     printfn "All done."; System.Console.ReadKey() |> ignore
      0
  
  
negative.code:             printf "%s" ((fst grp).PadRight(18))
              printfn "%d" (snd grp |> Array.length) )
  
  
      let dimMins, dimRanges, dimMaxs = getMinsRangesAndMaxsOfDimensions vectors
      let randomCentroids = getRandomCentroids classCount dimMins dimMaxs
  
      let mutable keepGoing = true
      let mutable centroids = randomCentroids
      let mutable count = 0
  
      while keepGoing do
          printfn ""
          let clusters  = getNewClusters samples centroids
          clusters |> Array.iter displayCluster
          let newCentroids = clusters |> Array.map getNewCentroid
          keepGoing <- checkKeepGoing centroids newCentroids dimRanges
          centroids <- newCentroids
          count <- count + 1
          printfn "Completed cycle:  %d" count
  