metrics.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const metrics = {
  2. sigma: { // RMS
  3. displayName: p => String.raw`\sigma\left(${p}\right)`,
  4. displayBody: p => String.raw`
  5. \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. bigTheta: { // mean of angle
  10. displayName: p => String.raw`\Theta\left(${p}\right)`,
  11. displayBody: p => String.raw`
  12. \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. theta: { // angle of mean
  17. displayName: p => String.raw`\theta\left(${p}\right)`,
  18. displayBody: p => String.raw`
  19. \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. phi: { // hue angle
  24. displayName: p => String.raw`\phi\left(${p}\right)`,
  25. displayBody: p => String.raw`
  26. \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. delta: { // euclidean
  31. displayName: p => String.raw`\delta\left(${p}\right)`,
  32. displayBody: p => String.raw`
  33. \left|\left| \vec{q} - \vec{\mu}\left(${p}\right) \right|\right|
  34. `,
  35. evaluate: (data, target) => vectorDist(data.mu.vector, target.vector),
  36. },
  37. ch: { // chebyshev
  38. displayName: p => String.raw`Ч\left(${p}\right)`,
  39. displayBody: p => String.raw`
  40. \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. inertia: {
  45. displayName: p => String.raw`I\left(${p}\right)`,
  46. displayBody: p => String.raw`
  47. \frac{1}{\left|${p}\right|} \sum_{p\in ${p}}{\left|\left|\vec{p}\right|\right|^2}
  48. `,
  49. evaluate: data => data.inertia,
  50. },
  51. size: {
  52. displayName: p => String.raw`N\left(${p}\right)`,
  53. displayBody: p => String.raw`\left|${p}\right|`,
  54. evaluate: data => data.size,
  55. }
  56. };
  57. const applyMetrics = (data, target) => Object.fromEntries(
  58. Object.entries(metrics).map(([name, metric]) => [name, metric.evaluate(data, target)])
  59. );