metrics.js 2.6 KB

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