+// 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)
+
+[<EntryPoint>]
+let main argv =
+ kdTree ()
+ 0
\ No newline at end of file