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), });