Browse Source

Implement the 8 metrics for the new version

Kirk Trombley 3 years ago
parent
commit
4ad70b776f
1 changed files with 78 additions and 0 deletions
  1. 78 0
      metrics.js

+ 78 - 0
metrics.js

@@ -0,0 +1,78 @@
+const rawMetrics = (() => {
+  const RMS = {
+    name: "RMS Deviation (σ)",
+    display: p => String.raw`
+      \sigma\left(${p}\right) = \sqrt{I\left(${p}\right) - 2\vec{q}\cdot\vec{\mu}\left(${p}\right) + \left|\left|\vec{q}\right|\right|^2}
+    `,
+    evaluate: (data, target) => math.sqrt(data.inertia - 2 * vectorDot(data.mu.vector, target.vector) + target.sqMag),
+  };
+
+  const meanOfAngle = {
+    name: "Mean of Angular Difference (Θ)",
+    display: p => String.raw`
+      \Theta\left(${p}\right) = \cos^{-1}\left( \hat{q}\cdot\vec{\nu}\left(${p}\right) \right)
+    `,
+    evaluate: (data, target) => rad2deg * Math.acos(vectorDot(data.nu.vector, target.unit)),
+  };
+
+  const angleOfMean = {
+    name: "Angular Difference of Mean (θ)",
+    display: p => String.raw`
+      \theta\left(${p}\right) = \cos^{-1}\left( \hat{q}\cdot\hat{\mu}\left(${p}\right) \right)
+    `,
+    evaluate: (data, target) => rad2deg * Math.acos(vectorDot(data.mu.unit, target.unit)),
+  };
+
+  const hue = {
+    name: "Hue Difference of Mean (ϕ)",
+    display: p => String.raw`
+      \phi\left(${p}\right) = \angle \left(\vec{q}_{\perp}, \vec{\mu}\left(${p}\right)_{\perp} \right)
+    `,
+    evaluate: (data, target) => angleDiff(data.mu.hue, target.hue),
+  }
+
+  const euclidean = {
+    name: "Euclidean Distance to Mean (δ)",
+    display: p => String.raw`
+      \delta\left(${p}\right) = \left|\left| \vec{q} - \vec{\mu}\left(${p}\right) \right|\right|
+    `,
+    evaluate: (data, target) => vectorDist(data.mu.vector, target.vector),
+  };
+
+  const chebyshev = {
+    name: "Chebyshev Distance to Mean (Ч)",
+    display: p => String.raw`
+      Ч\left(${p}\right) = \max_{i} \left| \vec{\mu}\left(${p}\right)_i - \vec{q}_i \right|
+    `,
+    evaluate: (data, target) => Math.max(...data.mu.vector.map((x, i) => Math.abs(x - target.vector[i]))),
+  };
+
+  const inertia = {
+    name: "Inertia (I)",
+    display: p => String.raw`
+      I\left(${p}\right) = \frac{1}{\left|${p}\right|} \sum_{p\in ${p}}{\left|\left|\vec{p}\right|\right|^2}
+    `,
+    evaluate: data => data.inertia,
+  };
+  
+  const size = {
+    name: "Size (N)",
+    display: p => String.raw`
+      N\left(${p}\right) = \left|${p}\right|
+    `,
+    evaluate: data => data.size,
+  };
+
+  return [RMS, meanOfAngle, angleOfMean, hue, euclidean, chebyshev, inertia, size];
+})();
+
+const applyMetrics = (data, target)  => ({
+  sigma: rawMetrics[0].evaluate(data, target),
+  bigTheta: rawMetrics[1].evaluate(data, target),
+  theta: rawMetrics[2].evaluate(data, target),
+  phi: rawMetrics[3].evaluate(data, target),
+  delta: rawMetrics[4].evaluate(data, target),
+  ch: rawMetrics[5].evaluate(data, target),
+  inertia: rawMetrics[6].evaluate(data),
+  size: rawMetrics[7].evaluate(data),
+});