metrics.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. const rawMetrics = (() => {
  2. const RMS = {
  3. name: "RMS Deviation (σ)",
  4. display: p => String.raw`
  5. \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}
  6. `,
  7. evaluate: (data, target) => math.sqrt(data.inertia - 2 * vectorDot(data.mu.vector, target.vector) + target.sqMag),
  8. };
  9. const meanOfAngle = {
  10. name: "Mean of Angular Difference (Θ)",
  11. display: p => String.raw`
  12. \Theta\left(${p}\right) = \cos^{-1}\left( \hat{q}\cdot\vec{\nu}\left(${p}\right) \right)
  13. `,
  14. evaluate: (data, target) => rad2deg * Math.acos(vectorDot(data.nu, target.unit)),
  15. };
  16. const angleOfMean = {
  17. name: "Angular Difference of Mean (θ)",
  18. display: p => String.raw`
  19. \theta\left(${p}\right) = \cos^{-1}\left( \hat{q}\cdot\hat{\mu}\left(${p}\right) \right)
  20. `,
  21. evaluate: (data, target) => rad2deg * Math.acos(vectorDot(data.mu.unit, target.unit)),
  22. };
  23. const hue = {
  24. name: "Hue Difference of Mean (ϕ)",
  25. display: p => String.raw`
  26. \phi\left(${p}\right) = \angle \left(\vec{q}_{\perp}, \vec{\mu}\left(${p}\right)_{\perp} \right)
  27. `,
  28. evaluate: (data, target) => angleDiff(data.mu.hue, target.hue),
  29. }
  30. const euclidean = {
  31. name: "Euclidean Distance to Mean (δ)",
  32. display: p => String.raw`
  33. \delta\left(${p}\right) = \left|\left| \vec{q} - \vec{\mu}\left(${p}\right) \right|\right|
  34. `,
  35. evaluate: (data, target) => vectorDist(data.mu.vector, target.vector),
  36. };
  37. const chebyshev = {
  38. name: "Chebyshev Distance to Mean (Ч)",
  39. display: p => String.raw`
  40. Ч\left(${p}\right) = \max_{i} \left| \vec{\mu}\left(${p}\right)_i - \vec{q}_i \right|
  41. `,
  42. evaluate: (data, target) => Math.max(...data.mu.vector.map((x, i) => Math.abs(x - target.vector[i]))),
  43. };
  44. const inertia = {
  45. name: "Inertia (I)",
  46. display: p => String.raw`
  47. I\left(${p}\right) = \frac{1}{\left|${p}\right|} \sum_{p\in ${p}}{\left|\left|\vec{p}\right|\right|^2}
  48. `,
  49. evaluate: data => data.inertia,
  50. };
  51. const size = {
  52. name: "Size (N)",
  53. display: p => String.raw`
  54. N\left(${p}\right) = \left|${p}\right|
  55. `,
  56. evaluate: data => data.size,
  57. };
  58. return [RMS, meanOfAngle, angleOfMean, hue, euclidean, chebyshev, inertia, size];
  59. })();
  60. const applyMetrics = (data, target) => ({
  61. sigma: rawMetrics[0].evaluate(data, target),
  62. bigTheta: rawMetrics[1].evaluate(data, target),
  63. theta: rawMetrics[2].evaluate(data, target),
  64. phi: rawMetrics[3].evaluate(data, target),
  65. delta: rawMetrics[4].evaluate(data, target),
  66. ch: rawMetrics[5].evaluate(data, target),
  67. inertia: rawMetrics[6].evaluate(data),
  68. size: rawMetrics[7].evaluate(data),
  69. });