// Learn more about F# at http://docs.microsoft.com/dotnet/fsharp open System open type System.Console open ParasitemiaCore.KdTree type Point (x : float32, y : float32) = interface I2DCoords with member this.X = x member this.Y = y override this.ToString () = sprintf "(%.1f, %.1f)" x y let kdTree () = let min = -1_000. let max = +1_000. let windowSize = 10. let nbPoints = 1_000_000 let n = 1_000_000 let rng = Random 42 let nextNumber (min : float) (max : float) (rng : Random) = (rng.NextDouble () * (max + abs min)) + min |> float32 let points = [ for i = 1 to nbPoints do let x = nextNumber min max rng let y = nextNumber min max rng Point (x, y) ] let sw = System.Diagnostics.Stopwatch () sw.Start () let tree = Tree.BuildTree points sw.Stop () WriteLine (sprintf "Time to build = %A ms" sw.ElapsedMilliseconds) let rng = Random 42 sw.Restart () let mutable nbFound = 0 for i = 1 to n do let minX = nextNumber min (max - windowSize) rng let minY = nextNumber min (max - windowSize) rng nbFound <- nbFound + (tree.SearchOld { minX = minX; maxX = minX + float32 windowSize; minY = minY; maxY = minY + float32 windowSize } |> List.length) sw.Stop () WriteLine (sprintf "New: nb found: %i. Time to search = %A ms" nbFound sw.ElapsedMilliseconds) let rng = Random 42 sw.Restart () let mutable nbFound = 0 for i = 1 to n do let minX = nextNumber min (max - windowSize) rng let minY = nextNumber min (max - windowSize) rng nbFound <- nbFound + (tree.Search { minX = minX; maxX = minX + float32 windowSize; minY = minY; maxY = minY + float32 windowSize }).Count sw.Stop () WriteLine (sprintf "New: nb found: %i. Time to search = %A ms" nbFound sw.ElapsedMilliseconds) [] let main argv = kdTree () 0