| |
| |
| |
|
|
| import { logNormalCdf } from './lognormalFit'; |
|
|
| |
| |
| |
| |
| export function computeFitQuality( |
| noise: number[], |
| tau: number, |
| mu: number, |
| sigma: number |
| ): { maxDiff: number; rmse: number; maxDiffIdx: number } { |
| const nNoise = noise.length; |
| if (nNoise < 1) return { maxDiff: NaN, rmse: NaN, maxDiffIdx: -1 }; |
| const F_tau = logNormalCdf(tau, mu, sigma); |
| const cdfTrunc = (x: number) => |
| x <= 0 ? 0 : x >= tau ? 1 : logNormalCdf(x, mu, sigma) / F_tau; |
|
|
| let maxDiff = 0; |
| let maxDiffIdx = 0; |
| let sumSqDiff = 0; |
| for (let i = 0; i < nNoise; i++) { |
| const x = noise[i]!; |
| const ecdf = (i + 1) / nNoise; |
| const cdf = cdfTrunc(x); |
| const diff = cdf - ecdf; |
| if (Math.abs(diff) > maxDiff) { |
| maxDiff = Math.abs(diff); |
| maxDiffIdx = i; |
| } |
| sumSqDiff += diff * diff; |
| } |
| const rmse = Math.sqrt(sumSqDiff / nNoise); |
| return { maxDiff, rmse, maxDiffIdx }; |
| } |
|
|