Add an ellipse benchmark + unit test (WIP)
[master-thesis.git] / Parasitemia / ParasitemiaCore / Types.fs
index c1a635d..f13043c 100644 (file)
@@ -8,6 +8,7 @@ open Emgu.CV
 open Emgu.CV.Structure
 
 open Const
+open UnitsOfMeasure
 
 type Points = HashSet<Point>
 
@@ -36,15 +37,28 @@ type Ellipse (cx : float32, cy : float32, a : float32, b : float32, alpha : floa
         this.CutAnHorizontalLine 0.f || this.CutAnHorizontalLine height
 
     member this.Scale (factor : float32) : Ellipse =
-        Ellipse(this.Cx, this.Cy, this.A * factor, this.B * factor, alpha)
+        Ellipse (this.Cx, this.Cy, this.A * factor, this.B * factor, alpha)
 
     // Approximation of Ramanujan.
     member this.Perimeter =
         PI * (3.f * (this.A + this.B) - sqrt ((3.f * this.A + this.B) * (this.A + 3.f * this.B)))
 
     override this.ToString () =
-        sprintf "(cx: %f, cy: %f, a: %f, b: %f, alpha: %f)" this.Cx this.Cy this.A this.B this.Alpha
+        $"{{Ellipse: cx = %f{this.Cx}, cy = %f{this.Cy}, a = %f{this.A}, b = %f{this.B}, alpha = %f{this.Alpha}}}"
 
+    override this.Equals (other : obj) =
+        match other with
+        | :? Ellipse as otherEllipse ->
+            otherEllipse.Cx = this.Cx &&
+            otherEllipse.Cy = this.Cy &&
+            otherEllipse.A = this.A &&
+            otherEllipse.B = this.B &&
+            otherEllipse.Alpha = this.Alpha
+        | _ -> false
+
+    override this.GetHashCode () = HashCode.Combine (this.Cx, this.Cy, this.A, this.B, this.Alpha)
+
+[<Struct>]
 type CellClass = HealthyRBC | InfectedRBC | Peculiar
 
 type Cell =
@@ -71,16 +85,16 @@ type MaybeBuilder () =
 
     member this.TryFinally (body, compensation) =
         try
-            this.ReturnFrom(body())
+            this.ReturnFrom (body ())
         finally
-            compensation()
+            compensation ()
 
     member this.Using (disposable : 'a when 'a :> IDisposable, body) =
         let body' = fun () -> body disposable
-        this.TryFinally(body', fun () ->
+        this.TryFinally (body', fun () ->
             match disposable with
             | null -> ()
-            | disp -> disp.Dispose())
+            | disp -> disp.Dispose ())
 
     member this.Zero () =
         None
@@ -88,7 +102,7 @@ type MaybeBuilder () =
     member this.Return x =
         Some x
 
-let maybe = MaybeBuilder()
+let maybe = MaybeBuilder ()
 
 type Result<'a> =
     | Success of 'a
@@ -102,4 +116,11 @@ type ResultBuilder () =
 
     member this.ReturnFrom (x) = x
 
-let result = ResultBuilder()
\ No newline at end of file
+let result = ResultBuilder ()
+
+type AnalysisResult =
+    {
+        Cells : Cell list
+        RBCSize_μm : float<μm>
+        RBCSize_px : float32
+    }
\ No newline at end of file