Use float32 to reduce memory footprint.
[master-thesis.git] / Parasitemia / Parasitemia / MatchingEllipses.fs
index 2022c26..6e57199 100644 (file)
@@ -10,18 +10,20 @@ open Utils
 
 
 // Do not take in account matching score below this when two ellipses are matched.
-let matchingScoreThreshold1 = 0.6
+[<Literal>]
+let matchingScoreThreshold1 = 0.6f
 
-let scaleOverlapTest = 0.8
+[<Literal>]
+let scaleOverlapTest = 0.8f
 
-type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) =
+type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) =
     let mutable matchingScore = matchingScore
 
     member this.Ellipse = e
 
     member this.MatchingScore = matchingScore
 
-    member this.AddMatchingScore(score: float) =
+    member this.AddMatchingScore(score: float32) =
         matchingScore <- matchingScore + score
 
     member val Processed = false with get, set
@@ -32,14 +34,14 @@ type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) =
         member this.Y = this.Ellipse.Cy
 
 
-type MatchingEllipses (radiusMin: float) =
+type MatchingEllipses (radiusMin: float32) =
     let ellipses = List<EllipseScoreFlaggedKd>()
 
     // All ellipses with a score below this are removed.
-    let matchingScoreThreshold2 = 20. * radiusMin
+    let matchingScoreThreshold2 = 20.f * radiusMin
 
     member this.Add (e: Ellipse) =
-        ellipses.Add(EllipseScoreFlaggedKd(0.0, e))
+        ellipses.Add(EllipseScoreFlaggedKd(0.f, e))
 
     member this.Ellipses : Ellipse list =
         List.ofSeq ellipses |> List.map (fun e -> e.Ellipse)
@@ -58,17 +60,17 @@ type MatchingEllipses (radiusMin: float) =
             for e in ellipses do
                 e.Processed <- true
                 let areaE = e.Ellipse.Area
-                let window = { KdTree.minX = e.Ellipse.Cx - windowSize / 2.0
-                               KdTree.maxX = e.Ellipse.Cx + windowSize / 2.0
-                               KdTree.minY = e.Ellipse.Cy - windowSize / 2.0
-                               KdTree.maxY = e.Ellipse.Cy + windowSize / 2.0 }
+                let window = { KdTree.minX = e.Ellipse.Cx - windowSize / 2.f
+                               KdTree.maxX = e.Ellipse.Cx + windowSize / 2.f
+                               KdTree.minY = e.Ellipse.Cy - windowSize / 2.f
+                               KdTree.maxY = e.Ellipse.Cy + windowSize / 2.f }
                 for other in tree.Search window do
                     if not other.Processed
                     then
                         let areaOther = other.Ellipse.Area
                         match EEOver.EEOverlapArea e.Ellipse other.Ellipse with
                         | Some (commonArea, _, _) ->
-                            let matchingScore = 2.0 * commonArea / (areaE + areaOther)
+                            let matchingScore = 2.f * commonArea / (areaE + areaOther)
                             if matchingScore >= matchingScoreThreshold1
                             then
                                 other.AddMatchingScore(matchingScore * e.Ellipse.Perimeter)
@@ -79,7 +81,7 @@ type MatchingEllipses (radiusMin: float) =
             ellipses.Sort(fun e1 e2 -> e2.MatchingScore.CompareTo(e1.MatchingScore))
 
             // 4) Remove ellipses with a low score.
-            let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.0, 0.0, 0.0, 0.0, 0.0)),
+            let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.f, 0.f, 0.f, 0.f, 0.f)),
                                           { new IComparer<EllipseScoreFlaggedKd> with
                                                 member this.Compare(e1, e2) = e2.MatchingScore.CompareTo(e1.MatchingScore) }) |> abs
             let nbToRemove = ellipses.Count - i