@visactor/vutils 1.0.27 → 1.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.zh-CN.md CHANGED
@@ -10,3 +10,20 @@ normalQuantile(0.975); // 约 1.95996398454
10
10
  回归区间的 `alpha` 表示显著性水平,置信度为 `1-alpha`,默认 `alpha=0.05`。区间通过下尾概率计算临界值,避免 `1-alpha/2` 在 `alpha` 极小时舍入为 1。
11
11
 
12
12
  `alpha=0` 时,正标准误产生无限区间,零标准误产生退化区间;`alpha=1` 产生退化区间。非有限 `alpha` 或超出 `[0,1]` 的值产生 NaN 区间端点。
13
+
14
+ ## LOWESS 回归
15
+
16
+ `regressionLowess` 保留历史默认参数 `span=0.3`、`iterations=2`;仅省略的参数使用默认值,显式 `iterations=0` 仍表示不做稳健重加权。默认使用全部有效观测;数值稳定性、最近邻选择以及同一模型下 `predict`、`evaluateGrid`、`fitted` 和置信区间均值一致性的修复继续保留。
17
+
18
+ 需要对齐 statsmodels 默认参数的调用方,应显式指定 `span=2/3`、`iterations=3`。StatPlots 已显式传入这些参数,不依赖 VUtils 的默认选择。
19
+
20
+ ```ts
21
+ import { regressionLowess } from '@visactor/vutils';
22
+
23
+ const data = [0, 1, 2, 3, 4].map(x => ({ x, y: x + Math.sin(x) }));
24
+ const model = regressionLowess(data); // span=0.3、iterations=2
25
+ const statsmodelsModel = regressionLowess(data, undefined, undefined, {
26
+ span: 2 / 3,
27
+ iterations: 3
28
+ });
29
+ ```
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
2
+ * 局部线性 LOWESS。默认全量观测,保留历史参数 span=0.3、iterations=2。
3
3
  * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
4
4
  * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
5
5
  */
@@ -7,13 +7,13 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const regression_solver_1 = require("./regression-solver"), median_1 = require("./median"), regression_utils_1 = require("./regression-utils");
8
8
 
9
9
  /**
10
- * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
10
+ * 局部线性 LOWESS。默认全量观测,保留历史参数 span=0.3、iterations=2。
11
11
  * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
12
12
  * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
13
13
  */
14
14
  function regressionLowess(data, x = (d => d.x), y = (d => d.y), options = {}) {
15
15
  var _a, _b, _c, _d, _e;
16
- const span = null !== (_a = options.span) && void 0 !== _a ? _a : 2 / 3, degree = null !== (_b = options.degree) && void 0 !== _b ? _b : 1, iterations = null !== (_c = options.iterations) && void 0 !== _c ? _c : 3, delta = null !== (_d = options.delta) && void 0 !== _d ? _d : 0, alpha = null !== (_e = options.alpha) && void 0 !== _e ? _e : .05;
16
+ const span = null !== (_a = options.span) && void 0 !== _a ? _a : .3, degree = null !== (_b = options.degree) && void 0 !== _b ? _b : 1, iterations = null !== (_c = options.iterations) && void 0 !== _c ? _c : 2, delta = null !== (_d = options.delta) && void 0 !== _d ? _d : 0, alpha = null !== (_e = options.alpha) && void 0 !== _e ? _e : .05;
17
17
  if (!(span > 0 && span <= 1) || !Number.isInteger(iterations) || iterations < 0 || !Number.isFinite(delta) || delta < 0 || 0 !== degree && 1 !== degree || null != options.maxSamples && (!Number.isInteger(options.maxSamples) || options.maxSamples < 2)) throw new RangeError("Invalid LOWESS span, degree, iterations, delta or maxSamples");
18
18
  let pts = (0, regression_solver_1.regressionPoints)(data, x, y).sort(((a, b) => a.x - b.x || a.y - b.y));
19
19
  if (null != options.maxSamples && pts.length > options.maxSamples) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-lowess.ts"],"names":[],"mappings":"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","file":"regression-lowess.js","sourcesContent":["import { regressionPoints, regressionGrid, regressionBasis, normalizeRegression } from './regression-solver';\nimport { median } from './median';\nimport {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} from './regression-utils';\n\n/**\n * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。\n * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。\n * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。\n */\nexport function regressionLowess(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: {\n span?: number;\n degree?: 1 | 0;\n iterations?: number;\n alpha?: number;\n maxSamples?: number;\n delta?: number;\n } = {}\n) {\n const span = options.span ?? 2 / 3;\n const degree = options.degree ?? 1;\n const iterations = options.iterations ?? 3;\n const delta = options.delta ?? 0;\n const alpha = options.alpha ?? 0.05;\n if (\n !(span > 0 && span <= 1) ||\n !Number.isInteger(iterations) ||\n iterations < 0 ||\n !Number.isFinite(delta) ||\n delta < 0 ||\n (degree !== 0 && degree !== 1) ||\n (options.maxSamples != null && (!Number.isInteger(options.maxSamples) || options.maxSamples < 2))\n ) {\n throw new RangeError('Invalid LOWESS span, degree, iterations, delta or maxSamples');\n }\n let pts = regressionPoints(data, x, y).sort((a, b) => a.x - b.x || a.y - b.y);\n if (options.maxSamples != null && pts.length > options.maxSamples) {\n const full = pts;\n const count = options.maxSamples;\n pts = Array.from({ length: count }, (_, i) => full[Math.floor((i * (full.length - 1)) / (count - 1))]);\n }\n const n = pts.length;\n const ptsX = pts.map(p => p.x);\n const ptsY = pts.map(p => p.y);\n const basis = regressionBasis(pts);\n const normalizedX = ptsX.map(v => normalizeRegression(v, basis.xCenter, basis.xScale));\n const normalizedY = ptsY.map(v => normalizeRegression(v, basis.yCenter, basis.yScale));\n const count = Math.min(n, Math.max(2, Math.floor(span * n + 1e-10)));\n let robustWeights: number[] | undefined;\n\n function exact(x0: number) {\n if (!n) {\n return 0;\n }\n const query = normalizeRegression(x0, basis.xCenter, basis.xScale);\n // 找到连续的最近邻窗口;相等距离选择较小的 x(ties 的 y 已排序)。\n let left = 0;\n let right = n - count;\n while (left < right) {\n const mid = (left + right) >>> 1;\n const lowerDistance = x0 - ptsX[mid];\n const upperDistance = ptsX[mid + count] - x0;\n if (\n Number.isFinite(lowerDistance) && Number.isFinite(upperDistance)\n ? lowerDistance > upperDistance\n : query - normalizedX[mid] > normalizedX[mid + count] - query\n ) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n let start = left;\n let end = left + count;\n if (ptsX[start] === ptsX[end - 1]) {\n while (start > 0 && ptsX[start - 1] === ptsX[start]) {\n start--;\n }\n while (end < n && ptsX[end] === ptsX[start]) {\n end++;\n }\n }\n const rawRadius = Math.max(Math.abs(ptsX[start] - x0), Math.abs(ptsX[end - 1] - x0));\n const scaled = !Number.isFinite(rawRadius);\n const radius = scaled\n ? Math.max(Math.abs(normalizedX[start] - query), Math.abs(normalizedX[end - 1] - query))\n : rawRadius;\n // 局部响应坐标不能由远处、未参与该邻域的观测决定精度。\n let yMin = Infinity;\n let yMax = -Infinity;\n for (let i = start; i < end; i++) {\n yMin = Math.min(yMin, ptsY[i]);\n yMax = Math.max(yMax, ptsY[i]);\n }\n const yCenter = yMin / 2 + yMax / 2;\n const yScale = Math.max(Math.abs(yMin - yCenter), Math.abs(yMax - yCenter)) || 1;\n let sw = 0;\n let sx = 0;\n let sy = 0;\n let sxx = 0;\n let sxy = 0;\n for (let i = start; i < end; i++) {\n const z = radius === 0 ? 0 : (scaled ? normalizedX[i] - query : ptsX[i] - x0) / radius;\n const u = Math.abs(z);\n const t = u >= 1 ? 0 : 1 - u * u * u;\n const w = t * t * t * (robustWeights ? robustWeights[i] : 1);\n sw += w;\n sx += w * z;\n const response = normalizeRegression(ptsY[i], yCenter, yScale);\n sy += w * response;\n sxx += w * z * z;\n sxy += w * z * response;\n }\n if (sw === 0) {\n // 核边界零权重时使用最近有效观测的加权常数;等距离取均值。\n let distance = Infinity;\n let weight = 0;\n let value = 0;\n for (let i = 0; i < n; i++) {\n const w = robustWeights ? robustWeights[i] : 1;\n if (w === 0) {\n continue;\n }\n const d = Math.abs(scaled ? normalizedX[i] - query : ptsX[i] - x0);\n if (d < distance) {\n distance = d;\n weight = w;\n value = ptsY[i];\n } else if (d === distance) {\n value = value * (weight / (weight + w)) + ptsY[i] * (w / (weight + w));\n weight += w;\n }\n }\n if (weight === 0) {\n throw new RangeError('LOWESS has no effective local observations');\n }\n return value;\n }\n const mx = sx / sw;\n const my = sy / sw;\n const variance = sxx / sw - mx * mx;\n const slope = degree === 0 || variance <= Number.EPSILON * 32 ? 0 : (sxy / sw - mx * my) / variance;\n return yCenter + yScale * (my - slope * mx);\n }\n\n // delta 不删除观测。只减少局部回归求值位置,全部残差参与重加权。\n const anchors: number[] = [];\n for (let i = 0; i < n; ) {\n anchors.push(i);\n if (i === n - 1) {\n break;\n }\n let next = i + 1;\n if (delta > 0) {\n while (next + 1 < n && ptsX[next + 1] - ptsX[i] <= delta) {\n next++;\n }\n }\n // 重复 x 一起使用同一预测;端点不能丢失。\n while (next + 1 < n && ptsX[next + 1] === ptsX[next]) {\n next++;\n }\n i = next;\n }\n let fits = new Array<number>(n);\n function fitObservations() {\n const out = new Array<number>(n);\n for (let a = 0; a < anchors.length; a++) {\n const index = anchors[a];\n out[index] = exact(ptsX[index]);\n if (a === 0) {\n continue;\n }\n const previous = anchors[a - 1];\n const rawWidth = ptsX[index] - ptsX[previous];\n const width = Number.isFinite(rawWidth) ? rawWidth : normalizedX[index] - normalizedX[previous];\n for (let i = previous + 1; i < index; i++) {\n const t =\n width === 0\n ? 0\n : (Number.isFinite(rawWidth) ? ptsX[i] - ptsX[previous] : normalizedX[i] - normalizedX[previous]) / width;\n out[i] = out[previous] * (1 - t) + out[index] * t;\n }\n }\n return out;\n }\n for (let iteration = 0; iteration <= iterations; iteration++) {\n fits = fitObservations();\n if (iteration === iterations) {\n break;\n }\n const residuals = fits.map((v, i) => {\n const residual = ptsY[i] - v;\n return Number.isFinite(residual)\n ? Math.abs(residual / basis.yScale)\n : Math.abs(normalizedY[i] - normalizeRegression(v, basis.yCenter, basis.yScale));\n });\n const med = median(residuals.slice());\n const currentFits = fits;\n robustWeights = residuals.map((r, i) => {\n if (med === 0) {\n const tolerance = Number.EPSILON * 64 * (Math.max(Math.abs(ptsY[i]), Math.abs(currentFits[i])) / basis.yScale);\n return r <= tolerance ? 1 : 0;\n }\n const u = r / (6 * med);\n return u >= 1 ? 0 : (1 - u * u) ** 2;\n });\n }\n function predictSingle(x0: number): number {\n if (delta === 0 || n < 2 || x0 < ptsX[0] || x0 > ptsX[n - 1]) {\n return exact(x0);\n }\n let lo = 0;\n let hi = n - 1;\n while (hi - lo > 1) {\n const mid = (lo + hi) >>> 1;\n if (ptsX[mid] <= x0) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n if (ptsX[hi] === ptsX[lo]) {\n return fits[lo];\n }\n const width = ptsX[hi] - ptsX[lo];\n const t = Number.isFinite(width)\n ? (x0 - ptsX[lo]) / width\n : (normalizeRegression(x0, basis.xCenter, basis.xScale) - normalizedX[lo]) / (normalizedX[hi] - normalizedX[lo]);\n return fits[lo] * (1 - t) + fits[hi] * t;\n }\n function predict(x0: number | number[]) {\n return Array.isArray(x0) ? x0.map(predictSingle) : predictSingle(x0);\n }\n function evaluateGrid(N: number) {\n return regressionGrid(ptsX[0], ptsX[n - 1], N, predictSingle);\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n\n // use data x-range (already sorted)\n const min = ptsX[0];\n const max = ptsX[n - 1];\n\n if (min === undefined || max === undefined || min === Infinity || max === -Infinity) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, (xx: number) => predictSingle(xx));\n if (comps.n === 0) {\n return out;\n }\n\n const z = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const v = predictSingle(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - meanHalfWidth,\n upper: v + meanHalfWidth,\n predLower: v - predHalfWidth,\n predUpper: v + predHalfWidth\n });\n }\n return out;\n }\n\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n const yh = predictSingle(px);\n const errs = stdErrorsAt(px, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n out.push({\n x: px,\n mean: yh,\n lower: yh - meanHalfWidth,\n upper: yh + meanHalfWidth,\n predLower: yh - predHalfWidth,\n predUpper: yh + predHalfWidth\n });\n }\n return out;\n }\n\n return {\n predict,\n evaluate: predict,\n evaluateGrid,\n confidenceInterval,\n // 节点值按 x 排序,重复观测仍保持其统计权重。\n fitted: pts.map((p, i) => ({ x: p.x, y: fits[i] }))\n };\n}\nexport default regressionLowess;\n"]}
1
+ {"version":3,"sources":["../src/common/regression-lowess.ts"],"names":[],"mappings":"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","file":"regression-lowess.js","sourcesContent":["import { regressionPoints, regressionGrid, regressionBasis, normalizeRegression } from './regression-solver';\nimport { median } from './median';\nimport {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} from './regression-utils';\n\n/**\n * 局部线性 LOWESS。默认全量观测,保留历史参数 span=0.3、iterations=2。\n * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。\n * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。\n */\nexport function regressionLowess(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: {\n span?: number;\n degree?: 1 | 0;\n iterations?: number;\n alpha?: number;\n maxSamples?: number;\n delta?: number;\n } = {}\n) {\n const span = options.span ?? 0.3;\n const degree = options.degree ?? 1;\n const iterations = options.iterations ?? 2;\n const delta = options.delta ?? 0;\n const alpha = options.alpha ?? 0.05;\n if (\n !(span > 0 && span <= 1) ||\n !Number.isInteger(iterations) ||\n iterations < 0 ||\n !Number.isFinite(delta) ||\n delta < 0 ||\n (degree !== 0 && degree !== 1) ||\n (options.maxSamples != null && (!Number.isInteger(options.maxSamples) || options.maxSamples < 2))\n ) {\n throw new RangeError('Invalid LOWESS span, degree, iterations, delta or maxSamples');\n }\n let pts = regressionPoints(data, x, y).sort((a, b) => a.x - b.x || a.y - b.y);\n if (options.maxSamples != null && pts.length > options.maxSamples) {\n const full = pts;\n const count = options.maxSamples;\n pts = Array.from({ length: count }, (_, i) => full[Math.floor((i * (full.length - 1)) / (count - 1))]);\n }\n const n = pts.length;\n const ptsX = pts.map(p => p.x);\n const ptsY = pts.map(p => p.y);\n const basis = regressionBasis(pts);\n const normalizedX = ptsX.map(v => normalizeRegression(v, basis.xCenter, basis.xScale));\n const normalizedY = ptsY.map(v => normalizeRegression(v, basis.yCenter, basis.yScale));\n const count = Math.min(n, Math.max(2, Math.floor(span * n + 1e-10)));\n let robustWeights: number[] | undefined;\n\n function exact(x0: number) {\n if (!n) {\n return 0;\n }\n const query = normalizeRegression(x0, basis.xCenter, basis.xScale);\n // 找到连续的最近邻窗口;相等距离选择较小的 x(ties 的 y 已排序)。\n let left = 0;\n let right = n - count;\n while (left < right) {\n const mid = (left + right) >>> 1;\n const lowerDistance = x0 - ptsX[mid];\n const upperDistance = ptsX[mid + count] - x0;\n if (\n Number.isFinite(lowerDistance) && Number.isFinite(upperDistance)\n ? lowerDistance > upperDistance\n : query - normalizedX[mid] > normalizedX[mid + count] - query\n ) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n let start = left;\n let end = left + count;\n if (ptsX[start] === ptsX[end - 1]) {\n while (start > 0 && ptsX[start - 1] === ptsX[start]) {\n start--;\n }\n while (end < n && ptsX[end] === ptsX[start]) {\n end++;\n }\n }\n const rawRadius = Math.max(Math.abs(ptsX[start] - x0), Math.abs(ptsX[end - 1] - x0));\n const scaled = !Number.isFinite(rawRadius);\n const radius = scaled\n ? Math.max(Math.abs(normalizedX[start] - query), Math.abs(normalizedX[end - 1] - query))\n : rawRadius;\n // 局部响应坐标不能由远处、未参与该邻域的观测决定精度。\n let yMin = Infinity;\n let yMax = -Infinity;\n for (let i = start; i < end; i++) {\n yMin = Math.min(yMin, ptsY[i]);\n yMax = Math.max(yMax, ptsY[i]);\n }\n const yCenter = yMin / 2 + yMax / 2;\n const yScale = Math.max(Math.abs(yMin - yCenter), Math.abs(yMax - yCenter)) || 1;\n let sw = 0;\n let sx = 0;\n let sy = 0;\n let sxx = 0;\n let sxy = 0;\n for (let i = start; i < end; i++) {\n const z = radius === 0 ? 0 : (scaled ? normalizedX[i] - query : ptsX[i] - x0) / radius;\n const u = Math.abs(z);\n const t = u >= 1 ? 0 : 1 - u * u * u;\n const w = t * t * t * (robustWeights ? robustWeights[i] : 1);\n sw += w;\n sx += w * z;\n const response = normalizeRegression(ptsY[i], yCenter, yScale);\n sy += w * response;\n sxx += w * z * z;\n sxy += w * z * response;\n }\n if (sw === 0) {\n // 核边界零权重时使用最近有效观测的加权常数;等距离取均值。\n let distance = Infinity;\n let weight = 0;\n let value = 0;\n for (let i = 0; i < n; i++) {\n const w = robustWeights ? robustWeights[i] : 1;\n if (w === 0) {\n continue;\n }\n const d = Math.abs(scaled ? normalizedX[i] - query : ptsX[i] - x0);\n if (d < distance) {\n distance = d;\n weight = w;\n value = ptsY[i];\n } else if (d === distance) {\n value = value * (weight / (weight + w)) + ptsY[i] * (w / (weight + w));\n weight += w;\n }\n }\n if (weight === 0) {\n throw new RangeError('LOWESS has no effective local observations');\n }\n return value;\n }\n const mx = sx / sw;\n const my = sy / sw;\n const variance = sxx / sw - mx * mx;\n const slope = degree === 0 || variance <= Number.EPSILON * 32 ? 0 : (sxy / sw - mx * my) / variance;\n return yCenter + yScale * (my - slope * mx);\n }\n\n // delta 不删除观测。只减少局部回归求值位置,全部残差参与重加权。\n const anchors: number[] = [];\n for (let i = 0; i < n; ) {\n anchors.push(i);\n if (i === n - 1) {\n break;\n }\n let next = i + 1;\n if (delta > 0) {\n while (next + 1 < n && ptsX[next + 1] - ptsX[i] <= delta) {\n next++;\n }\n }\n // 重复 x 一起使用同一预测;端点不能丢失。\n while (next + 1 < n && ptsX[next + 1] === ptsX[next]) {\n next++;\n }\n i = next;\n }\n let fits = new Array<number>(n);\n function fitObservations() {\n const out = new Array<number>(n);\n for (let a = 0; a < anchors.length; a++) {\n const index = anchors[a];\n out[index] = exact(ptsX[index]);\n if (a === 0) {\n continue;\n }\n const previous = anchors[a - 1];\n const rawWidth = ptsX[index] - ptsX[previous];\n const width = Number.isFinite(rawWidth) ? rawWidth : normalizedX[index] - normalizedX[previous];\n for (let i = previous + 1; i < index; i++) {\n const t =\n width === 0\n ? 0\n : (Number.isFinite(rawWidth) ? ptsX[i] - ptsX[previous] : normalizedX[i] - normalizedX[previous]) / width;\n out[i] = out[previous] * (1 - t) + out[index] * t;\n }\n }\n return out;\n }\n for (let iteration = 0; iteration <= iterations; iteration++) {\n fits = fitObservations();\n if (iteration === iterations) {\n break;\n }\n const residuals = fits.map((v, i) => {\n const residual = ptsY[i] - v;\n return Number.isFinite(residual)\n ? Math.abs(residual / basis.yScale)\n : Math.abs(normalizedY[i] - normalizeRegression(v, basis.yCenter, basis.yScale));\n });\n const med = median(residuals.slice());\n const currentFits = fits;\n robustWeights = residuals.map((r, i) => {\n if (med === 0) {\n const tolerance = Number.EPSILON * 64 * (Math.max(Math.abs(ptsY[i]), Math.abs(currentFits[i])) / basis.yScale);\n return r <= tolerance ? 1 : 0;\n }\n const u = r / (6 * med);\n return u >= 1 ? 0 : (1 - u * u) ** 2;\n });\n }\n function predictSingle(x0: number): number {\n if (delta === 0 || n < 2 || x0 < ptsX[0] || x0 > ptsX[n - 1]) {\n return exact(x0);\n }\n let lo = 0;\n let hi = n - 1;\n while (hi - lo > 1) {\n const mid = (lo + hi) >>> 1;\n if (ptsX[mid] <= x0) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n if (ptsX[hi] === ptsX[lo]) {\n return fits[lo];\n }\n const width = ptsX[hi] - ptsX[lo];\n const t = Number.isFinite(width)\n ? (x0 - ptsX[lo]) / width\n : (normalizeRegression(x0, basis.xCenter, basis.xScale) - normalizedX[lo]) / (normalizedX[hi] - normalizedX[lo]);\n return fits[lo] * (1 - t) + fits[hi] * t;\n }\n function predict(x0: number | number[]) {\n return Array.isArray(x0) ? x0.map(predictSingle) : predictSingle(x0);\n }\n function evaluateGrid(N: number) {\n return regressionGrid(ptsX[0], ptsX[n - 1], N, predictSingle);\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n\n // use data x-range (already sorted)\n const min = ptsX[0];\n const max = ptsX[n - 1];\n\n if (min === undefined || max === undefined || min === Infinity || max === -Infinity) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, (xx: number) => predictSingle(xx));\n if (comps.n === 0) {\n return out;\n }\n\n const z = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const v = predictSingle(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - meanHalfWidth,\n upper: v + meanHalfWidth,\n predLower: v - predHalfWidth,\n predUpper: v + predHalfWidth\n });\n }\n return out;\n }\n\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n const yh = predictSingle(px);\n const errs = stdErrorsAt(px, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n out.push({\n x: px,\n mean: yh,\n lower: yh - meanHalfWidth,\n upper: yh + meanHalfWidth,\n predLower: yh - predHalfWidth,\n predUpper: yh + predHalfWidth\n });\n }\n return out;\n }\n\n return {\n predict,\n evaluate: predict,\n evaluateGrid,\n confidenceInterval,\n // 节点值按 x 排序,重复观测仍保持其统计权重。\n fitted: pts.map((p, i) => ({ x: p.x, y: fits[i] }))\n };\n}\nexport default regressionLowess;\n"]}
package/dist/index.js CHANGED
@@ -2778,15 +2778,15 @@
2778
2778
  }
2779
2779
 
2780
2780
  /**
2781
- * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
2781
+ * 局部线性 LOWESS。默认全量观测,保留历史参数 span=0.3、iterations=2。
2782
2782
  * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
2783
2783
  * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
2784
2784
  */
2785
2785
  function regressionLowess(data, x = d => d.x, y = d => d.y, options = {}) {
2786
2786
  var _a, _b, _c, _d, _e;
2787
- const span = (_a = options.span) !== null && _a !== void 0 ? _a : 2 / 3;
2787
+ const span = (_a = options.span) !== null && _a !== void 0 ? _a : 0.3;
2788
2788
  const degree = (_b = options.degree) !== null && _b !== void 0 ? _b : 1;
2789
- const iterations = (_c = options.iterations) !== null && _c !== void 0 ? _c : 3;
2789
+ const iterations = (_c = options.iterations) !== null && _c !== void 0 ? _c : 2;
2790
2790
  const delta = (_d = options.delta) !== null && _d !== void 0 ? _d : 0;
2791
2791
  const alpha = (_e = options.alpha) !== null && _e !== void 0 ? _e : 0.05;
2792
2792
  if (!(span > 0 && span <= 1) ||
package/dist/index.min.js CHANGED
@@ -125,4 +125,4 @@ function Kr(t,e,n,r,u,i,s){const o=n.fx,a=Zt(n.fxprime,e);let D=o,l=o,h=a,c=0;fu
125
125
  * url: https://github.com/benfred/fmin/blob/master/src/nelderMead.js
126
126
  * License: https://github.com/benfred/fmin/blob/master/LICENSE
127
127
  * @license
128
- */,t.generateCeil=Br,t.generateCount=vr,t.generateStepInterval=(t,{floor:e,offset:n,field:r,count:u})=>{const i=Math.floor(t);if(!Number.isFinite(i)||i<=0)return null;if(i<=1)return{floor:e,offset:n,ceil:Br(e,n)};const s=vr(e,u),o=r?t=>r(t)%i==0:t=>s(0,t)%i==0,a=t=>{if(!Number.isNaN(+t))for(e(t);!o(t);)t.setTime(+t-1),e(t);return t},D=(t,e)=>{if(!Number.isNaN(+t))if(i<0)for(;++e<=0;)for(n(t,-1);!o(t);)n(t,-1);else for(;--e>=0;)for(n(t,1);!o(t);)n(t,1);return t};return{floor:a,offset:D,ceil:Br(a,D)}},t.get=C,t.getAABBFromPoints=function(t){return Ce=1/0,Ee=1/0,Me=-1/0,be=-1/0,t.forEach((t=>{Ce>t.x&&(Ce=t.x),Me<t.x&&(Me=t.x),Ee>t.y&&(Ee=t.y),be<t.y&&(be=t.y)})),{x1:Ce,y1:Ee,x2:Me,y2:be}},t.getAngleByPoint=function(t,e){return Math.atan2(e.y-t.y,e.x-t.x)},t.getCenter=Rr,t.getContainerSize=function(t,e=0,n=0){if(!t)return{width:e,height:n};let r;try{r=null===window||void 0===window?void 0:window.getComputedStyle}catch(t){r=()=>({})}const u=r(t);if(/^(\d*\.?\d+)(px)$/.exec(u.width)){const r=parseFloat(u.width)-parseFloat(u.paddingLeft)-parseFloat(u.paddingRight)||t.clientWidth-1,i=parseFloat(u.height)-parseFloat(u.paddingTop)-parseFloat(u.paddingBottom)||t.clientHeight-1;return{width:r<=0?e:r,height:i<=0?n:i}}return{width:e,height:n}},t.getContextFont=Je,t.getDecimalPlaces=Kt,t.getElementAbsolutePosition=wr,t.getElementRelativePosition=function(t,e){const n=wr(t),r=wr(e);return{x:n.x-r.x,y:n.y-r.y}},t.getFormatFromValue=function(t,e){const n=ot(t),r=n[Cn(e)]()+1,u=n[En(e)](),i=n[Mn(e)](),s=n[bn(e)](),o=n[Bn(e)](),a=0===n[vn(e)](),D=a&&0===o,l=D&&0===s,h=l&&0===i,c=h&&1===u;return c&&1===r?"YYYY":c?"YYYY-MM":h?"YYYY-MM-DD":l?"HH":D?"HH:mm":a?"HH:mm:ss":"HH:mm:ss SSS"},t.getIntersectPoint=function(t,e,n,r){if(!ce(t,e,n,r))return!1;const u=[0,0],i=[0,0],s=[0,0];if(he(u,e,t),he(i,r,n),Jt(u,i))return!0;he(s,n,t);const o=$t(s,i)/$t(u,i);return o>=0&&o<=1&&[t[0]+u[0]*o,t[1]+u[1]*o]},t.getIntervalOptions=(t,e)=>"year"===t&&e?{floor:In,offset:Rn,count:Un,field:On}:"month"===t&&e?{floor:Wn,offset:zn,count:Yn,field:Gn}:"day"===t&&e?{floor:Jn,offset:Qn,count:Kn,field:tr}:"hour"===t&&e?{floor:ir,offset:sr,count:rr,field:or}:"minute"===t&&e?{floor:cr,offset:fr,count:lr,field:Fr}:"second"===t&&e?{floor:yr,offset:xr,count:gr,field:Cr}:"year"===t?{floor:_n,offset:Nn,count:Ln,field:kn}:"month"===t?{floor:Pn,offset:Hn,count:jn,field:qn}:"day"===t?{floor:Vn,offset:$n,count:Xn,field:Zn}:"hour"===t?{floor:er,offset:nr,count:rr,field:ur}:"minute"===t?{floor:ar,offset:Dr,count:lr,field:hr}:"second"===t?{floor:dr,offset:mr,count:gr,field:pr}:{floor:Er,offset:Mr,count:br},t.getOBBFromLine=function(t,e,n){return Be=e.x-t.x,ve=e.y-t.y,we=ve,Ae=-Be,_e=Se=Math.sqrt(we*we+Ae*Ae),Ne=n,we/=Se,Ae/=Se,Te=n/2,Be=Te*we,ve=Te*Ae,{point1:{x:t.x+Be,y:t.y+ve},point2:{x:t.x-Be,y:t.y-ve},point3:{x:e.x+Be,y:e.y+ve},point4:{x:e.x-Be,y:e.y-ve},width:_e,height:Ne,left:Math.min(t.x,e.x)-Math.abs(Be),top:Math.min(t.y,e.y)-Math.abs(ve)}},t.getRectIntersect=function(t,e,n){if(null===t)return e;if(null===e)return t;const{x11:r,x12:u,y11:i,y12:s,x21:o,x22:a,y21:D,y22:l}=Fe(t,e,n);return r>=a||u<=o||i>=l||s<=D?{x1:0,y1:0,x2:0,y2:0}:{x1:Math.max(r,o),y1:Math.max(i,D),x2:Math.min(u,a),y2:Math.min(s,l)}},t.getScale=t=>t.offsetWidth>0?Ar(t):Sr(t),t.getScaleX=Ar,t.getScaleY=Sr,t.getScrollLeft=t=>{var e,n,r;return t===(null===(e=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===e?void 0:e.body)?(null===(r=null===(n=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===n?void 0:n.documentElement)||void 0===r?void 0:r.scrollLeft)||t.scrollLeft:"html"===t.tagName.toLowerCase()?0:t.scrollLeft},t.getScrollTop=t=>{var e,n,r;return t===(null===(e=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===e?void 0:e.body)?(null===(r=null===(n=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===n?void 0:n.documentElement)||void 0===r?void 0:r.scrollTop)||t.scrollTop:"html"===t.tagName.toLowerCase()?0:t.scrollTop},t.getTimeFormatter=function(t,e){return n=>{const r=ot(n),u=r[xn(e)](),i=r[Cn(e)]()+1,s=Math.floor((i-1)/3)+1,o=r[En(e)](),a=r["get"+(e?"UTC":"")+"Day"](),D=r[Mn(e)](),l=(D-1)%12+1,h=r[bn(e)](),c=r[Bn(e)](),f=r[vn(e)]();return(t||"").replace(/YYYY/g,K(u+"",4,"0","left")).replace(/yyyy/g,u+"").replace(/yy/g,u%100+"").replace(/Q/g,s+"").replace(/MM/g,K(i,2,"0","left")).replace(/M/g,i+"").replace(/dd/g,K(o,2,"0","left")).replace(/d/g,o+"").replace(/e/g,a+"").replace(/HH/g,K(D,2,"0","left")).replace(/H/g,D+"").replace(/hh/g,K(l+"",2,"0","left")).replace(/h/g,l+"").replace(/mm/g,K(h,2,"0","left")).replace(/m/g,h+"").replace(/ss/g,K(c,2,"0","left")).replace(/s/g,c+"").replace(/SSS/g,K(f,3,"0","left")).replace(/S/g,f+"")}},t.getter=ct,t.halfPi=Rt,t.has=(t,e)=>null!=t&&E.call(t,e),t.hasParentElement=function(t,e){let n=t.parentNode;for(;null!==n;){if(n===e)return!0;n=n.parentNode}return!1},t.hexToRgb=mn,t.hourCount=rr,t.hourField=ur,t.hourFloor=er,t.hourOffset=nr,t.hoursGetterName=Mn,t.hoursSetterName=function(t){return t?"setUTCHours":"setHours"},t.hslToRgb=rn,t.interpolateDate=function(t,e){const n=t.valueOf(),r=e.valueOf(),u=new Date;return t=>(u.setTime(n*(1-t)+r*t),u)},t.interpolateNumber=rt,t.interpolateNumberRound=function(t,e){return function(n){return Math.round(t*(1-n)+e*n)}},t.interpolateRgb=pn,t.interpolateString=function(t,e){let n,r,u,i=ut.lastIndex=it.lastIndex=0,s=-1;const o=[],a=[];for(t+="",e+="";(n=ut.exec(t))&&(r=it.exec(e));)(u=r.index)>i&&(u=e.slice(i,u),o[s]?o[s]+=u:o[++s]=u),(n=n[0])===(r=r[0])?o[s]?o[s]+=r:o[++s]=r:(o[++s]=null,a.push({i:s,x:rt(n,r)})),i=it.lastIndex;return i<e.length&&(u=e.slice(i),o[s]?o[s]+=u:o[++s]=u),o.length<2?a[0]?function(t){return function(e){return t(e)+""}}(a[0].x):function(t){return function(){return t}}(e):(e=a.length,function(t){for(let n,r=0;r<e;++r)o[(n=a[r]).i]=n.x(t);return o.join("")})},t.intersectionArea=function(t,e){const n=function(t){const e=[];for(let n=0;n<t.length;++n)for(let r=n+1;r<t.length;++r){const u=Ir(t[n],t[r]);for(let t=0;t<u.length;++t){const i=u[t];i.parentIndex=[n,r],e.push(i)}}return e}(t),r=n.filter((function(e){return Lr(e,t)}));let u=0,i=0;const s=[];if(r.length>1){const e=Rr(r);for(let t=0;t<r.length;++t){const n=r[t];n.angle=Math.atan2(n.x-e.x,n.y-e.y)}r.sort((function(t,e){return e.angle-t.angle}));let n=r[r.length-1];for(let e=0;e<r.length;++e){const o=r[e];i+=(n.x+o.x)*(o.y-n.y);const a={x:(o.x+n.x)/2,y:(o.y+n.y)/2};let D=null;for(let e=0;e<o.parentIndex.length;++e)if(n.parentIndex.indexOf(o.parentIndex[e])>-1){const r=t[o.parentIndex[e]],u=Math.atan2(o.x-r.x,o.y-r.y),i=Math.atan2(n.x-r.x,n.y-r.y);let s=i-u;s<0&&(s+=2*Math.PI);const l=i-s/2;let h=ee.distancePP(a,{x:r.x+r.radius*Math.sin(l),y:r.y+r.radius*Math.cos(l)});h>2*r.radius&&(h=2*r.radius),(null===D||D.width>h)&&(D={circle:r,width:h,p1:o,p2:n})}null!==D&&(s.push(D),u+=kr(D.circle.radius,D.width),n=o)}}else{let e=t[0];for(let n=1;n<t.length;++n)t[n].radius<e.radius&&(e=t[n]);let n=!1;for(let r=0;r<t.length;++r)if(ee.distancePP(t[r],e)>Math.abs(e.radius-t[r].radius)){n=!0;break}n?u=i=0:(u=e.radius*e.radius*Math.PI,s.push({circle:e,p1:{x:e.x,y:e.y+e.radius},p2:{x:e.x-Nr,y:e.y+e.radius},width:2*e.radius}))}return i/=2,e&&(e.area=u+i,e.arcArea=u,e.polygonArea=i,e.arcs=s,e.innerPoints=r,e.intersectionPoints=n),u+i},t.isArray=f,t.isArrayLike=F,t.isBase64=t=>new RegExp(/^data:image\/(?:gif|png|jpeg|bmp|webp|svg\+xml)(?:;charset=utf-8)?;base64,(?:[A-Za-z0-9]|[+/])+={0,2}/g).test(t),t.isBoolean=i,t.isDate=d,t.isEmpty=function(t){if(o(t))return!0;if(F(t))return!t.length;const e=(t=>({}.toString.call(t).replace(/^\[object /,"").replace(/]$/,"")))(t);if("Map"===e||"Set"===e)return!t.size;if(function(t){const e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||y)}(t))return!Object.keys(t).length;for(const e in t)if(x.call(t,e))return!1;return!0},t.isEqual=function t(e,n,r){if(e===n)return!0;if(typeof e!=typeof n)return!1;if(null==e||null==n)return!1;if(Number.isNaN(e)&&Number.isNaN(n))return!0;if(w(e)!==w(n))return!1;if(s(e))return!!(null==r?void 0:r.skipFunction);if("object"!=typeof e)return!1;if(f(e)){if(e.length!==n.length)return!1;for(let u=e.length-1;u>=0;u--)if(!t(e[u],n[u],r))return!1;return!0}if(!h(e))return!1;const u=A(e),i=A(n);if(u.length!==i.length)return!1;u.sort(),i.sort();for(let t=u.length-1;t>=0;t--)if(u[t]!=i[t])return!1;for(let i=u.length-1;i>=0;i--){const s=u[i];if(!t(e[s],n[s],r))return!1}return!0},t.isFunction=s,t.isGreater=function(t,e,n,r){return t>e&&!J(t,e,n,r)},t.isHTMLElement=function(t){try{return t instanceof Element}catch(e){const n=["children","innerHTML","classList","setAttribute","tagName","getBoundingClientRect"],r=Object.keys(t);return n.every((t=>r.includes(t)))}},t.isIntersect=ce,t.isLess=function(t,e,n,r){return t<e&&!J(t,e,n,r)},t.isNil=o,t.isNull=t=>null===t,t.isNumber=m,t.isNumberClose=J,t.isNumeric=t=>"string"==typeof t&&(!isNaN(Number(t))&&!isNaN(parseFloat(t))),t.isObject=D,t.isObjectLike=l,t.isPlainObject=h,t.isPointInLine=Ye,t.isPointInPolygon=function(t,e){if(!t)return!1;if(!e)return!1;const n="Feature"===(r=e).type?r.geometry:r;var r;const u=n.type,i=e.bbox;let s=n.coordinates;if(i&&!0===de(t,{x1:i[0],x2:i[1],y1:i[1],y2:i[3]},!0))return!1;"Polygon"===u&&(s=[s]);let o=!1;for(let e=0;e<s.length;++e)for(let n=0;n<s[e].length;++n){if(ze(s[e][n].map((t=>({x:t[0],y:t[1]}))),t.x,t.y))return o=!0,o}return o},t.isRectIntersect=function(t,e,n){if(t&&e){if(!n)return!(t.x1>e.x2||t.x2<e.x1||t.y1>e.y2||t.y2<e.y1);const{x11:r,x12:u,y11:i,y12:s,x21:o,x22:a,y21:D,y22:l}=Fe(t,e,!0);return!(r>a||u<o||i>l||s<D)}return!0},t.isRegExp=p,t.isRotateAABBIntersect=xe,t.isShallowEqual=function(t,e){if(S(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;if(f(t)!==f(e))return!1;if(T(t)!==T(e))return!1;let n=!0;return Object.keys(t).forEach((r=>!!S(t[r],e[r])||(n=!1,n))),n},t.isString=c,t.isType=u,t.isUndefined=t=>void 0===t,t.isValid=a,t.isValidNumber=g,t.isValidUrl=t=>new RegExp(/^(http(s)?:\/\/)\w+[^\s]+(\.[^\s]+){1,}$/).test(t),t.kde=function(t,e={}){const n=void 0===e.standardDeviation?"population":e.standardDeviation,r=void 0===e.bandwidthAdjust?1:e.bandwidthAdjust;if("sample"!==n&&"population"!==n)throw new RangeError("standardDeviation must be sample or population");if(!Number.isFinite(r)||r<=0)throw new RangeError("bandwidthAdjust must be finite and positive");const u=t.length,i=e.kernel||At;let s=e.bandwidth;if(!s||s<=0){const r=function(t,e){const n=t.length;if(n<2)return 0;const r=wt(t),u=[];let i=0,s=1;for(let e=0;e<n;e++){const n=t[e]-r;u.push(n),i=Math.max(i,Math.abs(n))}if(i===1/0){s=Math.abs(r);for(const e of t)s=Math.max(s,Math.abs(e));i=0;for(let e=0;e<n;e++)u[e]=t[e]/s-r/s,i=Math.max(i,Math.abs(u[e]))}if(0===i)return 0;for(let t=0;t<n;t++)u[t]/=i;const o="population"===e?(n-1)/n:1;return Math.sqrt(z(u)*o)*i*s}(t,n)||0,i=e.bandwidthMethod||"scott";s="silverman"===i?Tt(u,r,1):St(u,r,1)}if(s*=r,!s||s<=0){const e=e=>{const n=[];if(e<=0)return n;let r=1/0,i=-1/0;for(let e=0;e<u;e++){const n=t[e];n<r&&(r=n),n>i&&(i=n)}if(r===1/0||i===-1/0){for(let t=0;t<e;t++)n.push({x:0,y:0});return n}for(let t=0;t<e;t++)n.push({x:r,y:0});return n};return{bandwidth:0,kernel:i,evaluate:t=>{if(Array.isArray(t)){const e=[];for(let n=0;n<t.length;n++)e.push(0);return e}return 0},evaluateGrid:e}}const o=1/u/s;function a(e){let n=0;for(let r=0;r<u;r++)n+=i((e-t[r])/s);return n*o}return{bandwidth:s,kernel:i,evaluate:function(t){if(Array.isArray(t)){const e=[];for(let n=0;n<t.length;n++)e.push(a(t[n]));return e}return a(t)},evaluateGrid(e){const n=[];if(e<=0)return n;let r=1/0,i=-1/0;for(let e=0;e<u;e++){const n=t[e];n<r&&(r=n),n>i&&(i=n)}if(r===1/0||i===-1/0)return n;if(r===i){for(let t=0;t<e;t++)n.push({x:r,y:a(r)});return n}const s=(i-r)/(e-1);for(let t=0;t<e;t++){const u=t===e-1?i:r+s*t;n.push({x:u,y:a(u)})}return n}}},t.keys=_,t.last=k,t.lengthFromPointToLine=Vt,t.lineIntersectPolygon=We,t.lowerCamelCaseToMiddle=t=>t.replace(/([A-Z])/g,"-$1").toLowerCase(),t.lowerFirst=function(t){return t.charAt(0).toLowerCase()+t.substring(1)},t.max=qt,t.maxInArray=(t,e)=>{var n;if(0===t.length)return;let r=t[0];for(let u=1;u<t.length;u++){const i=t[u];(null!==(n=null==e?void 0:e(i,r))&&void 0!==n?n:i-r)>0&&(r=i)}return r},t.mean=wt,t.median=Y,t.memoize=t=>{let e=null,n=null;return(...r)=>(e&&r.every(((t,n)=>t===e[n]))||(e=r,n=t(...r)),n)},t.merge=function(t,...e){let n=-1;const r=e.length;for(;++n<r;){M(t,e[n],!0)}return t},t.mergeAABB=function(t){const e=[];return function t(n,r){const u=[];r.forEach((t=>{let e;(e=Le(n,t)).length>1?u.push(t):n=e[0]})),e.push(n),u.length&&t(u[0],u.slice(1))}(t[0],t.slice(1)),e},t.millisecondsCount=br,t.millisecondsFloor=Er,t.millisecondsGetterName=vn,t.millisecondsOffset=Mr,t.millisecondsSetterName=function(t){return t?"setUTCMilliseconds":"setMilliseconds"},t.min=Wt,t.minInArray=(t,e)=>{var n;if(0===t.length)return;let r=t[0];for(let u=1;u<t.length;u++){const i=t[u];(null!==(n=null==e?void 0:e(i,r))&&void 0!==n?n:i-r)<0&&(r=i)}return r},t.minuteCount=lr,t.minuteField=hr,t.minuteFloor=ar,t.minuteOffset=Dr,t.minutesGetterName=bn,t.minutesSetterName=function(t){return t?"setUTCMinutes":"setMinutes"},t.mixin=function(t,e,n=!0){if(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,Object.getOwnPropertyNames){const r=Object.getOwnPropertyNames(e);for(let u=0;u<r.length;u++){const i=r[u];"constructor"!==i&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i])}}else N(t,e,n)},t.monthCount=jn,t.monthField=qn,t.monthFloor=Pn,t.monthGetterName=Cn,t.monthOffset=Hn,t.monthSetterName=function(t){return t?"setUTCMonth":"setMonth"},t.nelderMead=function(t,e,n){const r=(n=n||{}).maxIterations||200*e.length,u=n.nonZeroDelta||1.05,i=n.zeroDelta||.001,s=n.minErrorDelta||1e-6,o=n.minErrorDelta||1e-5,a=void 0!==n.rho?n.rho:1,D=void 0!==n.chi?n.chi:2,l=void 0!==n.psi?n.psi:-.5,h=void 0!==n.sigma?n.sigma:.5;let c;const f=e.length,F=new Array(f+1);F[0]=e,F[0].fx=t(e),F[0].id=0;for(let n=0;n<f;++n){const r=e.slice();r[n]=r[n]?r[n]*u:i,F[n+1]=r,F[n+1].fx=t(r),F[n+1].id=n+1}function d(t){for(let e=0;e<t.length;e++)F[f][e]=t[e];F[f].fx=t.fx}const m=function(t,e){return t.fx-e.fx},g=e.slice(),p=e.slice(),y=e.slice(),x=e.slice();for(let e=0;e<r;++e){if(F.sort(m),n.history){const t=F.map((function(t){const e=t.slice();return e.fx=t.fx,e.id=t.id,e}));t.sort((function(t,e){return t.id-e.id})),n.history.push({x:F[0].slice(),fx:F[0].fx,simplex:t})}c=0;for(let t=0;t<f;++t)c=Math.max(c,Math.abs(F[0][t]-F[1][t]));if(Math.abs(F[0].fx-F[f].fx)<s&&c<o)break;for(let t=0;t<f;++t){g[t]=0;for(let e=0;e<f;++e)g[t]+=F[e][t];g[t]/=f}const e=F[f];if(Qr(p,1+a,g,-a,e),p.fx=t(p),p.fx<F[0].fx)Qr(x,1+D,g,-D,e),x.fx=t(x),x.fx<p.fx?d(x):d(p);else if(p.fx>=F[f-1].fx){let n=!1;if(p.fx>e.fx?(Qr(y,1+l,g,-l,e),y.fx=t(y),y.fx<e.fx?d(y):n=!0):(Qr(y,1-l*a,g,l*a,e),y.fx=t(y),y.fx<p.fx?d(y):n=!0),n){if(h>=1)break;for(let e=1;e<F.length;++e)Qr(F[e],1-h,F[0],h,F[e]),F[e].fx=t(F[e])}}else d(p)}return F.sort(m),{fx:F[0].fx,x:F[0]}},t.norm2=Zr,t.normalQuantile=O,t.normalTransform=function(t,e,n,r,u,i,s,o){const a=e.a,D=e.b,l=e.c,h=e.d,c=e.e,f=e.f,F=jt(s),d=zt(s);let m,g;o?(m=o[0],g=o[1]):(m=n,g=r);const p=m-n,y=g-r,x=a*F+l*d,C=D*F+h*d,E=l*F-a*d,M=h*F-D*d;t.a=u*x,t.b=u*C,t.c=i*E,t.d=i*M,t.e=c+a*m+l*g-x*p-E*y,t.f=f+D*m+h*g-C*p-M*y},t.normalizeAngle=De,t.normalizePadding=function(t){if(g(t))return[t,t,t,t];if(f(t)){const e=t.length;if(1===e){const e=t[0];return[e,e,e,e]}if(2===e){const[e,n]=t;return[e,n,e,n]}if(3===e){const[e,n,r]=t;return[e,n,r,n]}if(4===e)return t}if(D(t)){const{top:e=0,right:n=0,bottom:r=0,left:u=0}=t;return[e,n,r,u]}return[0,0,0,0]},t.numberSpecifierReg=qr,t.obbSeparation=(t,e)=>{const n=[{x:Math.cos(t.angle),y:Math.sin(t.angle)},{x:-Math.sin(t.angle),y:Math.cos(t.angle)},{x:Math.cos(e.angle),y:Math.sin(t.angle)},{x:-Math.sin(e.angle),y:Math.cos(t.angle)}];function r(t,e,n){const r=t.getRotatedCorners().map((t=>t.x*e+t.y*n));return{min:Math.min(...r),max:Math.max(...r)}}let u=0;for(const i of n){const n=r(t,i.x,i.y),s=r(e,i.x,i.y);let o;o=n.max<s.min?s.min-n.max:s.max<n.min?n.min-s.max:0,u=Math.max(u,o)}return u},t.ordinaryLeastSquares=function(t,e,n,r){const u=r-t*t;if(Math.abs(u)<Number.EPSILON)return{a:e,b:0};const i=(n-t*e)/u;return{a:e-i*t,b:i}},t.pad=K,t.parseUint8ToImageData=(t,e,n)=>{const r=new Uint8ClampedArray(t),u=new Uint8ClampedArray(t.length);for(let t=n-1;t>=0;t--)for(let i=0;i<e;i++){const s=t*e*4+4*i,o=(n-t)*e*4+4*i;u[o]=r[s],u[o+1]=r[s+1],u[o+2]=r[s+2],u[o+3]=r[s+3]}return new ImageData(u,e,n)},t.pi=It,t.pi2=Ot,t.pick=function(t,e){if(!t||!h(t))return t;const n={};return e.forEach((e=>{v.call(t,e)&&(n[e]=t[e])})),n},t.pickWithout=function(t,e){if(!t||!h(t))return t;const n={};return Object.keys(t).forEach((r=>{const u=t[r];let i=!1;e.forEach((t=>{(c(t)&&t===r||t instanceof RegExp&&r.match(t))&&(i=!0)})),i||(n[r]=u)})),n},t.pointAt=function(t,e,n,r,u){let i=n,s=r;return"number"==typeof t&&"number"==typeof n&&(i=(1-u)*t+u*n),"number"==typeof e&&"number"==typeof r&&(s=(1-u)*e+u*r),{x:i,y:s}},t.pointBetweenLine=He,t.pointInAABB=function(t,e){return de(t,e,!1)},t.pointInLine=Re,t.pointInOBB=function(t,e){return ke.x=(e.point1.x+e.point2.x)/2,ke.y=(e.point1.y+e.point2.y)/2,Ie.x=(e.point3.x+e.point4.x)/2,Ie.y=(e.point3.y+e.point4.y)/2,Re(t,ke,Ie,e.height)},t.pointInRect=de,t.polarToCartesian=function(t,e,n){return e?{x:t.x+e*Math.cos(n),y:t.y+e*Math.sin(n)}:{x:t.x,y:t.y}},t.polygonContainPoint=ze,t.polygonIntersectPolygon=function(t,e){for(let n=0;n<e.length;n++){if(ze(t,e[n].x,e[n].y))return!0;if(n>0&&We(e[n-1].x,e[n-1].y,e[n].x,e[n].y,t))return!0}return!1},t.pow=Gt,t.precisionAdd=function(t,e){return Qt(t+e,10**Math.max(Kt(t),Kt(e)))},t.precisionSub=function(t,e){return Qt(t-e,10**Math.max(Kt(t),Kt(e)))},t.quantileSorted=U,t.rSquared=vt,t.radianToDegree=ue,t.randomLCG=ht,t.range=function(t,e,n){a(e)||(e=t,t=0),a(n)||(n=1);let r=-1;const u=0|Math.max(0,Math.ceil((e-t)/n)),i=new Array(u);for(;++r<u;)i[r]=t+r*n;return i},t.rectInsideAnotherRect=function(e,n,r){if(!e||!n)return t.InnerBBox.NONE;const{x11:u,x12:i,y11:s,y12:o,x21:a,x22:D,y21:l,y22:h}=Fe(e,n,r);return u>a&&i<D&&s>l&&o<h?t.InnerBBox.BBOX1:a>u&&D<i&&l>s&&h<o?t.InnerBBox.BBOX2:t.InnerBBox.NONE},t.regressionBootstrap=function(t,e){var n;const r="linear"===e.method?1:null!==(n=e.degree)&&void 0!==n?n:NaN;if("linear"!==e.method&&"polynomial"!==e.method||!Number.isInteger(r)||r<1||!t.length||t.some((t=>!Number.isFinite(t.x)||!Number.isFinite(t.y)))||e.grid.some((t=>!Number.isFinite(t)))||!(e.level>0&&e.level<1)||!Number.isInteger(e.resamples)||e.resamples<1||!Number.isInteger(e.seed)||e.seed<0||e.seed>4294967295)throw new RangeError("Invalid paired regression bootstrap inputs");if(t.length<=r+1)throw new RangeError("Regression bootstrap requires positive residual degrees of freedom");const u=t.slice().sort(((t,e)=>t.x-e.x||t.y-e.y)),i=mt(u);if(gt(u,r,i).rank<r+1)throw new RangeError("Original regression design is rank deficient");const s=ht(e.seed),o=new Array(u.length),a=e.grid.map((()=>new Array(e.resamples)));for(let t=0;t<e.resamples;t++){for(let t=0;t<o.length;t++)o[t]=u[Math.floor(s()*u.length)];const n=gt(o,r,i);for(let r=0;r<e.grid.length;r++){const u=pt(n,e.grid[r]);if(!Number.isFinite(u))throw new RangeError("Regression bootstrap prediction is not finite");a[r][t]=u}}const D=(1-e.level)/2;return e.grid.map(((t,e)=>(a[e].sort(((t,e)=>t-e)),{x:t,lower:U(a[e],D),upper:U(a[e],1-D)})))},t.regressionLinear=function(t,e=(t=>t.x),n=(t=>t.y),r){var u;const i=null!==(u=null==r?void 0:r.alpha)&&void 0!==u?u:.05,s=Ft(t,e,n),o=gt(s,1),a=yt(o),D=a[0],l=a[1],h=t=>pt(o,t),c=Mt(t,e,n,h);let f=0;return s.forEach(((t,e)=>{f+=(t.y-f)/(e+1)})),{coef:{a:D,b:l},rank:o.rank,predict:h,rSquared:vt(t,e,n,f,h),evaluateGrid:function(t){return xt(c.min,c.max,t,h)},confidenceInterval:function(t=50){const e=[];if(0===c.n||t<=0)return e;const n=Ct(i);if(c.min===c.max){const r=h(c.min),u=bt(c.min,c),i=Et(n,u.seMean),s=Et(n,u.sePred);for(let n=0;n<t;n++)e.push({x:c.min,mean:r,lower:r-i,upper:r+i,predLower:r-s,predUpper:r+s});return e}const r=(c.max-c.min)/(t-1);for(let u=0;u<t;u++){const i=u===t-1?c.max:c.min+r*u,s=h(i),o=bt(i,c),a=Et(n,o.seMean),D=Et(n,o.sePred);e.push({x:i,mean:s,lower:s-a,upper:s+a,predLower:s-D,predUpper:s+D})}return e}}},t.regressionLogistic=function(t,e=(t=>t.x),n=(t=>t.y),r){var u,i,s;const o=null!==(u=null==r?void 0:r.maxIteration)&&void 0!==u?u:25,a=null!==(i=null==r?void 0:r.tol)&&void 0!==i?i:1e-6,D=null!==(s=null==r?void 0:r.alpha)&&void 0!==s?s:.05,l=[],h=[];Bt(t,e,n,((t,e)=>{l.push(t),h.push(e?1:0)}));const c=l.length;if(0===c)return{coef:[0,0],predict:t=>0,evaluateGrid:t=>[],confidenceInterval:(t=50)=>[]};let f=0,F=0;for(let t=0;t<o;t++){const t=new Array(c);let e=!0;for(let e=0;e<c;e++){const n=f+F*l[e],r=1/(1+Math.exp(-n));t[e]=r}let n=0,r=0,u=0,i=0,s=0;for(let e=0;e<c;e++){const o=t[e]*(1-t[e]),a=h[e]-t[e];n+=a,r+=a*l[e],u+=o,i+=o*l[e],s+=o*l[e]*l[e]}const o=u*s-i*i;if(Math.abs(o)<1e-12)break;const D=(s*n-i*r)/o,d=(-i*n+u*r)/o;if(f+=D,F+=d,(Math.abs(D)>a||Math.abs(d)>a)&&(e=!1),e)break}const d=t=>{const e=f+F*t;return 1/(1+Math.exp(-e))};return{coef:[f,F],predict:d,evaluateGrid:function(r){const u=[];if(r<=0)return u;let i=1/0,s=-1/0;if(Bt(t,e,n,(t=>{t<i&&(i=t),t>s&&(s=t)})),i===1/0||s===-1/0)return u;if(i===s){const t=d(i);for(let e=0;e<r;e++)u.push({x:i,y:t});return u}const o=(s-i)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?s:i+o*t;u.push({x:e,y:d(e)})}return u},confidenceInterval:function(r=50){const u=[];if(r<=0)return u;const i=Mt(t,e,n,d);if(0===i.n)return u;const s=Ct(D);if(i.min===i.max){const t=d(i.min),e=bt(i.min,i),n=Et(s,e.seMean),o=Et(s,e.sePred);for(let e=0;e<r;e++)u.push({x:i.min,mean:t,lower:t-n,upper:t+n,predLower:t-o,predUpper:t+o});return u}const o=(i.max-i.min)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?i.max:i.min+o*t,n=d(e),a=bt(e,i),D=Et(s,a.seMean),l=Et(s,a.sePred);u.push({x:e,mean:n,lower:n-D,upper:n+D,predLower:n-l,predUpper:n+l})}return u}}},t.regressionLowess=function(t,e=(t=>t.x),n=(t=>t.y),r={}){var u,i,s,o,a;const D=null!==(u=r.span)&&void 0!==u?u:2/3,l=null!==(i=r.degree)&&void 0!==i?i:1,h=null!==(s=r.iterations)&&void 0!==s?s:3,c=null!==(o=r.delta)&&void 0!==o?o:0,f=null!==(a=r.alpha)&&void 0!==a?a:.05;if(!(D>0&&D<=1)||!Number.isInteger(h)||h<0||!Number.isFinite(c)||c<0||0!==l&&1!==l||null!=r.maxSamples&&(!Number.isInteger(r.maxSamples)||r.maxSamples<2))throw new RangeError("Invalid LOWESS span, degree, iterations, delta or maxSamples");let F=Ft(t,e,n).sort(((t,e)=>t.x-e.x||t.y-e.y));if(null!=r.maxSamples&&F.length>r.maxSamples){const t=F,e=r.maxSamples;F=Array.from({length:e},((n,r)=>t[Math.floor(r*(t.length-1)/(e-1))]))}const d=F.length,m=F.map((t=>t.x)),g=F.map((t=>t.y)),p=mt(F),y=m.map((t=>dt(t,p.xCenter,p.xScale))),x=g.map((t=>dt(t,p.yCenter,p.yScale))),C=Math.min(d,Math.max(2,Math.floor(D*d+1e-10)));let E;function M(t){if(!d)return 0;const e=dt(t,p.xCenter,p.xScale);let n=0,r=d-C;for(;n<r;){const u=n+r>>>1,i=t-m[u],s=m[u+C]-t;(Number.isFinite(i)&&Number.isFinite(s)?i>s:e-y[u]>y[u+C]-e)?n=u+1:r=u}let u=n,i=n+C;if(m[u]===m[i-1]){for(;u>0&&m[u-1]===m[u];)u--;for(;i<d&&m[i]===m[u];)i++}const s=Math.max(Math.abs(m[u]-t),Math.abs(m[i-1]-t)),o=!Number.isFinite(s),a=o?Math.max(Math.abs(y[u]-e),Math.abs(y[i-1]-e)):s;let D=1/0,h=-1/0;for(let t=u;t<i;t++)D=Math.min(D,g[t]),h=Math.max(h,g[t]);const c=D/2+h/2,f=Math.max(Math.abs(D-c),Math.abs(h-c))||1;let F=0,x=0,M=0,b=0,B=0;for(let n=u;n<i;n++){const r=0===a?0:(o?y[n]-e:m[n]-t)/a,u=Math.abs(r),i=u>=1?0:1-u*u*u,s=i*i*i*(E?E[n]:1);F+=s,x+=s*r;const D=dt(g[n],c,f);M+=s*D,b+=s*r*r,B+=s*r*D}if(0===F){let n=1/0,r=0,u=0;for(let i=0;i<d;i++){const s=E?E[i]:1;if(0===s)continue;const a=Math.abs(o?y[i]-e:m[i]-t);a<n?(n=a,r=s,u=g[i]):a===n&&(u=u*(r/(r+s))+g[i]*(s/(r+s)),r+=s)}if(0===r)throw new RangeError("LOWESS has no effective local observations");return u}const v=x/F,w=M/F,A=b/F-v*v;return c+f*(w-(0===l||A<=32*Number.EPSILON?0:(B/F-v*w)/A)*v)}const b=[];for(let t=0;t<d&&(b.push(t),t!==d-1);){let e=t+1;if(c>0)for(;e+1<d&&m[e+1]-m[t]<=c;)e++;for(;e+1<d&&m[e+1]===m[e];)e++;t=e}let B=new Array(d);function v(){const t=new Array(d);for(let e=0;e<b.length;e++){const n=b[e];if(t[n]=M(m[n]),0===e)continue;const r=b[e-1],u=m[n]-m[r],i=Number.isFinite(u)?u:y[n]-y[r];for(let e=r+1;e<n;e++){const s=0===i?0:(Number.isFinite(u)?m[e]-m[r]:y[e]-y[r])/i;t[e]=t[r]*(1-s)+t[n]*s}}return t}for(let t=0;t<=h&&(B=v(),t!==h);t++){const t=B.map(((t,e)=>{const n=g[e]-t;return Number.isFinite(n)?Math.abs(n/p.yScale):Math.abs(x[e]-dt(t,p.yCenter,p.yScale))})),e=Y(t.slice()),n=B;E=t.map(((t,r)=>{if(0===e){return t<=64*Number.EPSILON*(Math.max(Math.abs(g[r]),Math.abs(n[r]))/p.yScale)?1:0}const u=t/(6*e);return u>=1?0:(1-u*u)**2}))}function w(t){if(0===c||d<2||t<m[0]||t>m[d-1])return M(t);let e=0,n=d-1;for(;n-e>1;){const r=e+n>>>1;m[r]<=t?e=r:n=r}if(m[n]===m[e])return B[e];const r=m[n]-m[e],u=Number.isFinite(r)?(t-m[e])/r:(dt(t,p.xCenter,p.xScale)-y[e])/(y[n]-y[e]);return B[e]*(1-u)+B[n]*u}function A(t){return Array.isArray(t)?t.map(w):w(t)}return{predict:A,evaluate:A,evaluateGrid:function(t){return xt(m[0],m[d-1],t,w)},confidenceInterval:function(r=50){const u=[];if(r<=0)return u;if(0===d)return u;const i=m[0],s=m[d-1];if(void 0===i||void 0===s||i===1/0||s===-1/0)return u;const o=Mt(t,e,n,(t=>w(t)));if(0===o.n)return u;const a=Ct(f);if(o.min===o.max){const t=w(o.min),e=bt(o.min,o),n=Et(a,e.seMean),i=Et(a,e.sePred);for(let e=0;e<r;e++)u.push({x:o.min,mean:t,lower:t-n,upper:t+n,predLower:t-i,predUpper:t+i});return u}const D=(s-i)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?s:i+D*t,n=w(e),l=bt(e,o),h=Et(a,l.seMean),c=Et(a,l.sePred);u.push({x:e,mean:n,lower:n-h,upper:n+h,predLower:n-c,predUpper:n+c})}return u},fitted:F.map(((t,e)=>({x:t.x,y:B[e]})))}},t.regressionPolynomial=function(t,e=(t=>t.x),n=(t=>t.y),r={}){var u,i;const s=null!==(u=r.degree)&&void 0!==u?u:0;if(!Number.isInteger(s)||s<0)throw new RangeError("Polynomial degree must be an nonnegative integer");const o=null!==(i=r.alpha)&&void 0!==i?i:.05,a=Ft(t,e,n),D=gt(a,s),l=yt(D),h=t=>pt(D,t);return{degree:s,rank:D.rank,coef:l,predict:h,rSquared:vt(t,e,n,(()=>{let r=0,u=0;return Bt(t,e,n,((t,e)=>{r+=e,u++})),0===u?0:r/u})(),h),evaluateGrid(t){let e=1/0,n=-1/0;return a.forEach((t=>{e=Math.min(e,t.x),n=Math.max(n,t.x)})),xt(e,n,t,h)},confidenceInterval(r=50){const u=[];if(r<=0)return u;const i=Mt(t,e,n,h);if(0===i.n)return u;const s=Ct(o);if(i.min===i.max){const t=h(i.min),e=bt(i.min,i),n=Et(s,e.seMean),o=Et(s,e.sePred);for(let e=0;e<r;e++)u.push({x:i.min,mean:t,lower:t-n,upper:t+n,predLower:t-o,predUpper:t+o});return u}const a=(i.max-i.min)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?i.max:i.min+a*t,n=h(e),o=bt(e,i),D=Et(s,o.seMean),l=Et(s,o.sePred);u.push({x:e,mean:n,lower:n-D,upper:n+D,predLower:n-l,predUpper:n+l})}return u}}},t.rgbToHex=gn,t.rgbToHsl=un,t.rotatePoint=ge,t.scale=Jr,t.scott=St,t.secondCount=gr,t.secondField=pr,t.secondFloor=dr,t.secondOffset=mr,t.secondsGetterName=Bn,t.secondsSetterName=function(t){return t?"setUTCSeconds":"setSeconds"},t.seedRandom=function(t){return parseFloat("0."+Math.sin(t).toString().substring(6))},t.shuffleArray=function(t,e=Math.random){let n,r,u=t.length;for(;u;)n=Math.floor(e()*u),r=t[--u],t[u]=t[n],t[n]=r;return t},t.silverman=Tt,t.simpleField=t=>t?"string"==typeof t||"number"==typeof t?()=>t:s(t)?t:e=>e[t.field]:null,t.sin=zt,t.span=t=>t.length<=1?0:k(t)-t[0],t.sqrt=Yt,t.stringWidth=function(t,e=!0){if("string"!=typeof t||0===t.length)return 0;if(0===(t=Ve(t)).length)return 0;t=t.replace(Ze()," ");const n=e?1:2;let r=0;for(const e of t){const t=e.codePointAt(0);if(t<=31||t>=127&&t<=159)continue;if(t>=768&&t<=879)continue;switch(Xe(e)){case"F":case"W":r+=2;break;case"A":r+=n;break;default:r+=1}}return r},t.styleStringToObject=(t="")=>{const e={};return t.split(";").forEach((t=>{if(t){const n=t.split(":");if(2===n.length){const t=n[0].trim(),r=n[1].trim();t&&r&&(e[t]=r)}}})),e},t.substitute=function(t,e){return t&&e?t.replace(/\\?\{([^{}]+)\}/g,((t,n)=>"\\"===t.charAt(0)?t.slice(1):void 0===e[n]?"":e[n])):t},t.tau=Ut,t.throttle=function(t,e,n){let r=!0,u=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return D(n)&&(r="leading"in n?!!n.leading:r,u="trailing"in n?!!n.trailing:u),nt(t,e,{leading:r,trailing:u,maxWait:e})},t.tickStep=function(t,e,n){const r=Math.abs(e-t)/Math.max(0,n);let u=Math.pow(10,Math.floor(Math.log(r)/Math.LN10));const i=r/u;return i>=G?u*=10:i>=V?u*=5:i>=$&&(u*=2),e<t?-u:u},t.toCamelCase=function(t){return t.replace(/-([a-z])/g,((t,e)=>e.toUpperCase()))},t.toDate=ot,t.toNumber=R,t.toPercent=(t,e)=>o(t)?e:c(t)?e*parseFloat(t)/100:t,t.toValidNumber=function(t){if(g(t))return t;const e=+t;return g(e)?e:0},t.transformBounds=function(t,e,n,r,u,i,s){if(!(Pt(r)<=kt||Pt(u)<=kt)){if(1!==r&&t.scaleX(r),1!==u&&t.scaleY(u),isFinite(i)&&Math.abs(i)>kt){let e=0,n=0;void 0!==s&&(e=s[0],n=s[1]),t.rotate(i,e,n)}t.translate(e,n)}},t.transformBoundsWithMatrix=Ke,t.truncate=(t,e,n="right",r)=>{const u=o(r)?"…":r,i=t+"",s=i.length,a=Math.max(0,e-u.length);return s<=e?i:"left"===n?u+i.slice(s-a):"center"===n?i.slice(0,Math.ceil(a/2))+u+i.slice(s-Math.floor(a/2)):i.slice(0,a)+u},t.unionAABB=Le,t.uniqArray=function(t){return t&&f(t)?Array.from(new Set(L(t))):t},t.upperFirst=function(t){return t.charAt(0).toUpperCase()+t.substring(1)},t.utcDayCount=Kn,t.utcDayField=tr,t.utcDayFloor=Jn,t.utcDayOffset=Qn,t.utcHourField=or,t.utcHourFloor=ir,t.utcHourOffset=sr,t.utcMinuteField=Fr,t.utcMinuteFloor=cr,t.utcMinuteOffset=fr,t.utcMonthCount=Yn,t.utcMonthField=Gn,t.utcMonthFloor=Wn,t.utcMonthOffset=zn,t.utcSecondField=Cr,t.utcSecondFloor=yr,t.utcSecondOffset=xr,t.utcYearCount=Un,t.utcYearField=On,t.utcYearFloor=In,t.utcYearOffset=Rn,t.uuid=(t,e)=>{const n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),r=[];let u;if(e=e||n.length,t)for(u=0;u<t;u++)r[u]=n[0|Math.random()*e];else{let t;for(r[8]=r[13]=r[18]=r[23]="-",r[14]="4",u=0;u<36;u++)r[u]||(t=0|16*Math.random(),r[u]=n[19===u?3&t|8:t])}return r.join("")},t.variance=z,t.visitPoints=Bt,t.weightedSum=Qr,t.yearCount=Ln,t.yearField=kn,t.yearFloor=_n,t.yearOffset=Nn,t.zero=t=>0,t.zeros=Xr,t.zerosM=function(t,e){return Xr(t).map((function(){return Xr(e)}))}}));
128
+ */,t.generateCeil=Br,t.generateCount=vr,t.generateStepInterval=(t,{floor:e,offset:n,field:r,count:u})=>{const i=Math.floor(t);if(!Number.isFinite(i)||i<=0)return null;if(i<=1)return{floor:e,offset:n,ceil:Br(e,n)};const s=vr(e,u),o=r?t=>r(t)%i==0:t=>s(0,t)%i==0,a=t=>{if(!Number.isNaN(+t))for(e(t);!o(t);)t.setTime(+t-1),e(t);return t},D=(t,e)=>{if(!Number.isNaN(+t))if(i<0)for(;++e<=0;)for(n(t,-1);!o(t);)n(t,-1);else for(;--e>=0;)for(n(t,1);!o(t);)n(t,1);return t};return{floor:a,offset:D,ceil:Br(a,D)}},t.get=C,t.getAABBFromPoints=function(t){return Ce=1/0,Ee=1/0,Me=-1/0,be=-1/0,t.forEach((t=>{Ce>t.x&&(Ce=t.x),Me<t.x&&(Me=t.x),Ee>t.y&&(Ee=t.y),be<t.y&&(be=t.y)})),{x1:Ce,y1:Ee,x2:Me,y2:be}},t.getAngleByPoint=function(t,e){return Math.atan2(e.y-t.y,e.x-t.x)},t.getCenter=Rr,t.getContainerSize=function(t,e=0,n=0){if(!t)return{width:e,height:n};let r;try{r=null===window||void 0===window?void 0:window.getComputedStyle}catch(t){r=()=>({})}const u=r(t);if(/^(\d*\.?\d+)(px)$/.exec(u.width)){const r=parseFloat(u.width)-parseFloat(u.paddingLeft)-parseFloat(u.paddingRight)||t.clientWidth-1,i=parseFloat(u.height)-parseFloat(u.paddingTop)-parseFloat(u.paddingBottom)||t.clientHeight-1;return{width:r<=0?e:r,height:i<=0?n:i}}return{width:e,height:n}},t.getContextFont=Je,t.getDecimalPlaces=Kt,t.getElementAbsolutePosition=wr,t.getElementRelativePosition=function(t,e){const n=wr(t),r=wr(e);return{x:n.x-r.x,y:n.y-r.y}},t.getFormatFromValue=function(t,e){const n=ot(t),r=n[Cn(e)]()+1,u=n[En(e)](),i=n[Mn(e)](),s=n[bn(e)](),o=n[Bn(e)](),a=0===n[vn(e)](),D=a&&0===o,l=D&&0===s,h=l&&0===i,c=h&&1===u;return c&&1===r?"YYYY":c?"YYYY-MM":h?"YYYY-MM-DD":l?"HH":D?"HH:mm":a?"HH:mm:ss":"HH:mm:ss SSS"},t.getIntersectPoint=function(t,e,n,r){if(!ce(t,e,n,r))return!1;const u=[0,0],i=[0,0],s=[0,0];if(he(u,e,t),he(i,r,n),Jt(u,i))return!0;he(s,n,t);const o=$t(s,i)/$t(u,i);return o>=0&&o<=1&&[t[0]+u[0]*o,t[1]+u[1]*o]},t.getIntervalOptions=(t,e)=>"year"===t&&e?{floor:In,offset:Rn,count:Un,field:On}:"month"===t&&e?{floor:Wn,offset:zn,count:Yn,field:Gn}:"day"===t&&e?{floor:Jn,offset:Qn,count:Kn,field:tr}:"hour"===t&&e?{floor:ir,offset:sr,count:rr,field:or}:"minute"===t&&e?{floor:cr,offset:fr,count:lr,field:Fr}:"second"===t&&e?{floor:yr,offset:xr,count:gr,field:Cr}:"year"===t?{floor:_n,offset:Nn,count:Ln,field:kn}:"month"===t?{floor:Pn,offset:Hn,count:jn,field:qn}:"day"===t?{floor:Vn,offset:$n,count:Xn,field:Zn}:"hour"===t?{floor:er,offset:nr,count:rr,field:ur}:"minute"===t?{floor:ar,offset:Dr,count:lr,field:hr}:"second"===t?{floor:dr,offset:mr,count:gr,field:pr}:{floor:Er,offset:Mr,count:br},t.getOBBFromLine=function(t,e,n){return Be=e.x-t.x,ve=e.y-t.y,we=ve,Ae=-Be,_e=Se=Math.sqrt(we*we+Ae*Ae),Ne=n,we/=Se,Ae/=Se,Te=n/2,Be=Te*we,ve=Te*Ae,{point1:{x:t.x+Be,y:t.y+ve},point2:{x:t.x-Be,y:t.y-ve},point3:{x:e.x+Be,y:e.y+ve},point4:{x:e.x-Be,y:e.y-ve},width:_e,height:Ne,left:Math.min(t.x,e.x)-Math.abs(Be),top:Math.min(t.y,e.y)-Math.abs(ve)}},t.getRectIntersect=function(t,e,n){if(null===t)return e;if(null===e)return t;const{x11:r,x12:u,y11:i,y12:s,x21:o,x22:a,y21:D,y22:l}=Fe(t,e,n);return r>=a||u<=o||i>=l||s<=D?{x1:0,y1:0,x2:0,y2:0}:{x1:Math.max(r,o),y1:Math.max(i,D),x2:Math.min(u,a),y2:Math.min(s,l)}},t.getScale=t=>t.offsetWidth>0?Ar(t):Sr(t),t.getScaleX=Ar,t.getScaleY=Sr,t.getScrollLeft=t=>{var e,n,r;return t===(null===(e=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===e?void 0:e.body)?(null===(r=null===(n=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===n?void 0:n.documentElement)||void 0===r?void 0:r.scrollLeft)||t.scrollLeft:"html"===t.tagName.toLowerCase()?0:t.scrollLeft},t.getScrollTop=t=>{var e,n,r;return t===(null===(e=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===e?void 0:e.body)?(null===(r=null===(n=null===globalThis||void 0===globalThis?void 0:globalThis.document)||void 0===n?void 0:n.documentElement)||void 0===r?void 0:r.scrollTop)||t.scrollTop:"html"===t.tagName.toLowerCase()?0:t.scrollTop},t.getTimeFormatter=function(t,e){return n=>{const r=ot(n),u=r[xn(e)](),i=r[Cn(e)]()+1,s=Math.floor((i-1)/3)+1,o=r[En(e)](),a=r["get"+(e?"UTC":"")+"Day"](),D=r[Mn(e)](),l=(D-1)%12+1,h=r[bn(e)](),c=r[Bn(e)](),f=r[vn(e)]();return(t||"").replace(/YYYY/g,K(u+"",4,"0","left")).replace(/yyyy/g,u+"").replace(/yy/g,u%100+"").replace(/Q/g,s+"").replace(/MM/g,K(i,2,"0","left")).replace(/M/g,i+"").replace(/dd/g,K(o,2,"0","left")).replace(/d/g,o+"").replace(/e/g,a+"").replace(/HH/g,K(D,2,"0","left")).replace(/H/g,D+"").replace(/hh/g,K(l+"",2,"0","left")).replace(/h/g,l+"").replace(/mm/g,K(h,2,"0","left")).replace(/m/g,h+"").replace(/ss/g,K(c,2,"0","left")).replace(/s/g,c+"").replace(/SSS/g,K(f,3,"0","left")).replace(/S/g,f+"")}},t.getter=ct,t.halfPi=Rt,t.has=(t,e)=>null!=t&&E.call(t,e),t.hasParentElement=function(t,e){let n=t.parentNode;for(;null!==n;){if(n===e)return!0;n=n.parentNode}return!1},t.hexToRgb=mn,t.hourCount=rr,t.hourField=ur,t.hourFloor=er,t.hourOffset=nr,t.hoursGetterName=Mn,t.hoursSetterName=function(t){return t?"setUTCHours":"setHours"},t.hslToRgb=rn,t.interpolateDate=function(t,e){const n=t.valueOf(),r=e.valueOf(),u=new Date;return t=>(u.setTime(n*(1-t)+r*t),u)},t.interpolateNumber=rt,t.interpolateNumberRound=function(t,e){return function(n){return Math.round(t*(1-n)+e*n)}},t.interpolateRgb=pn,t.interpolateString=function(t,e){let n,r,u,i=ut.lastIndex=it.lastIndex=0,s=-1;const o=[],a=[];for(t+="",e+="";(n=ut.exec(t))&&(r=it.exec(e));)(u=r.index)>i&&(u=e.slice(i,u),o[s]?o[s]+=u:o[++s]=u),(n=n[0])===(r=r[0])?o[s]?o[s]+=r:o[++s]=r:(o[++s]=null,a.push({i:s,x:rt(n,r)})),i=it.lastIndex;return i<e.length&&(u=e.slice(i),o[s]?o[s]+=u:o[++s]=u),o.length<2?a[0]?function(t){return function(e){return t(e)+""}}(a[0].x):function(t){return function(){return t}}(e):(e=a.length,function(t){for(let n,r=0;r<e;++r)o[(n=a[r]).i]=n.x(t);return o.join("")})},t.intersectionArea=function(t,e){const n=function(t){const e=[];for(let n=0;n<t.length;++n)for(let r=n+1;r<t.length;++r){const u=Ir(t[n],t[r]);for(let t=0;t<u.length;++t){const i=u[t];i.parentIndex=[n,r],e.push(i)}}return e}(t),r=n.filter((function(e){return Lr(e,t)}));let u=0,i=0;const s=[];if(r.length>1){const e=Rr(r);for(let t=0;t<r.length;++t){const n=r[t];n.angle=Math.atan2(n.x-e.x,n.y-e.y)}r.sort((function(t,e){return e.angle-t.angle}));let n=r[r.length-1];for(let e=0;e<r.length;++e){const o=r[e];i+=(n.x+o.x)*(o.y-n.y);const a={x:(o.x+n.x)/2,y:(o.y+n.y)/2};let D=null;for(let e=0;e<o.parentIndex.length;++e)if(n.parentIndex.indexOf(o.parentIndex[e])>-1){const r=t[o.parentIndex[e]],u=Math.atan2(o.x-r.x,o.y-r.y),i=Math.atan2(n.x-r.x,n.y-r.y);let s=i-u;s<0&&(s+=2*Math.PI);const l=i-s/2;let h=ee.distancePP(a,{x:r.x+r.radius*Math.sin(l),y:r.y+r.radius*Math.cos(l)});h>2*r.radius&&(h=2*r.radius),(null===D||D.width>h)&&(D={circle:r,width:h,p1:o,p2:n})}null!==D&&(s.push(D),u+=kr(D.circle.radius,D.width),n=o)}}else{let e=t[0];for(let n=1;n<t.length;++n)t[n].radius<e.radius&&(e=t[n]);let n=!1;for(let r=0;r<t.length;++r)if(ee.distancePP(t[r],e)>Math.abs(e.radius-t[r].radius)){n=!0;break}n?u=i=0:(u=e.radius*e.radius*Math.PI,s.push({circle:e,p1:{x:e.x,y:e.y+e.radius},p2:{x:e.x-Nr,y:e.y+e.radius},width:2*e.radius}))}return i/=2,e&&(e.area=u+i,e.arcArea=u,e.polygonArea=i,e.arcs=s,e.innerPoints=r,e.intersectionPoints=n),u+i},t.isArray=f,t.isArrayLike=F,t.isBase64=t=>new RegExp(/^data:image\/(?:gif|png|jpeg|bmp|webp|svg\+xml)(?:;charset=utf-8)?;base64,(?:[A-Za-z0-9]|[+/])+={0,2}/g).test(t),t.isBoolean=i,t.isDate=d,t.isEmpty=function(t){if(o(t))return!0;if(F(t))return!t.length;const e=(t=>({}.toString.call(t).replace(/^\[object /,"").replace(/]$/,"")))(t);if("Map"===e||"Set"===e)return!t.size;if(function(t){const e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||y)}(t))return!Object.keys(t).length;for(const e in t)if(x.call(t,e))return!1;return!0},t.isEqual=function t(e,n,r){if(e===n)return!0;if(typeof e!=typeof n)return!1;if(null==e||null==n)return!1;if(Number.isNaN(e)&&Number.isNaN(n))return!0;if(w(e)!==w(n))return!1;if(s(e))return!!(null==r?void 0:r.skipFunction);if("object"!=typeof e)return!1;if(f(e)){if(e.length!==n.length)return!1;for(let u=e.length-1;u>=0;u--)if(!t(e[u],n[u],r))return!1;return!0}if(!h(e))return!1;const u=A(e),i=A(n);if(u.length!==i.length)return!1;u.sort(),i.sort();for(let t=u.length-1;t>=0;t--)if(u[t]!=i[t])return!1;for(let i=u.length-1;i>=0;i--){const s=u[i];if(!t(e[s],n[s],r))return!1}return!0},t.isFunction=s,t.isGreater=function(t,e,n,r){return t>e&&!J(t,e,n,r)},t.isHTMLElement=function(t){try{return t instanceof Element}catch(e){const n=["children","innerHTML","classList","setAttribute","tagName","getBoundingClientRect"],r=Object.keys(t);return n.every((t=>r.includes(t)))}},t.isIntersect=ce,t.isLess=function(t,e,n,r){return t<e&&!J(t,e,n,r)},t.isNil=o,t.isNull=t=>null===t,t.isNumber=m,t.isNumberClose=J,t.isNumeric=t=>"string"==typeof t&&(!isNaN(Number(t))&&!isNaN(parseFloat(t))),t.isObject=D,t.isObjectLike=l,t.isPlainObject=h,t.isPointInLine=Ye,t.isPointInPolygon=function(t,e){if(!t)return!1;if(!e)return!1;const n="Feature"===(r=e).type?r.geometry:r;var r;const u=n.type,i=e.bbox;let s=n.coordinates;if(i&&!0===de(t,{x1:i[0],x2:i[1],y1:i[1],y2:i[3]},!0))return!1;"Polygon"===u&&(s=[s]);let o=!1;for(let e=0;e<s.length;++e)for(let n=0;n<s[e].length;++n){if(ze(s[e][n].map((t=>({x:t[0],y:t[1]}))),t.x,t.y))return o=!0,o}return o},t.isRectIntersect=function(t,e,n){if(t&&e){if(!n)return!(t.x1>e.x2||t.x2<e.x1||t.y1>e.y2||t.y2<e.y1);const{x11:r,x12:u,y11:i,y12:s,x21:o,x22:a,y21:D,y22:l}=Fe(t,e,!0);return!(r>a||u<o||i>l||s<D)}return!0},t.isRegExp=p,t.isRotateAABBIntersect=xe,t.isShallowEqual=function(t,e){if(S(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;if(f(t)!==f(e))return!1;if(T(t)!==T(e))return!1;let n=!0;return Object.keys(t).forEach((r=>!!S(t[r],e[r])||(n=!1,n))),n},t.isString=c,t.isType=u,t.isUndefined=t=>void 0===t,t.isValid=a,t.isValidNumber=g,t.isValidUrl=t=>new RegExp(/^(http(s)?:\/\/)\w+[^\s]+(\.[^\s]+){1,}$/).test(t),t.kde=function(t,e={}){const n=void 0===e.standardDeviation?"population":e.standardDeviation,r=void 0===e.bandwidthAdjust?1:e.bandwidthAdjust;if("sample"!==n&&"population"!==n)throw new RangeError("standardDeviation must be sample or population");if(!Number.isFinite(r)||r<=0)throw new RangeError("bandwidthAdjust must be finite and positive");const u=t.length,i=e.kernel||At;let s=e.bandwidth;if(!s||s<=0){const r=function(t,e){const n=t.length;if(n<2)return 0;const r=wt(t),u=[];let i=0,s=1;for(let e=0;e<n;e++){const n=t[e]-r;u.push(n),i=Math.max(i,Math.abs(n))}if(i===1/0){s=Math.abs(r);for(const e of t)s=Math.max(s,Math.abs(e));i=0;for(let e=0;e<n;e++)u[e]=t[e]/s-r/s,i=Math.max(i,Math.abs(u[e]))}if(0===i)return 0;for(let t=0;t<n;t++)u[t]/=i;const o="population"===e?(n-1)/n:1;return Math.sqrt(z(u)*o)*i*s}(t,n)||0,i=e.bandwidthMethod||"scott";s="silverman"===i?Tt(u,r,1):St(u,r,1)}if(s*=r,!s||s<=0){const e=e=>{const n=[];if(e<=0)return n;let r=1/0,i=-1/0;for(let e=0;e<u;e++){const n=t[e];n<r&&(r=n),n>i&&(i=n)}if(r===1/0||i===-1/0){for(let t=0;t<e;t++)n.push({x:0,y:0});return n}for(let t=0;t<e;t++)n.push({x:r,y:0});return n};return{bandwidth:0,kernel:i,evaluate:t=>{if(Array.isArray(t)){const e=[];for(let n=0;n<t.length;n++)e.push(0);return e}return 0},evaluateGrid:e}}const o=1/u/s;function a(e){let n=0;for(let r=0;r<u;r++)n+=i((e-t[r])/s);return n*o}return{bandwidth:s,kernel:i,evaluate:function(t){if(Array.isArray(t)){const e=[];for(let n=0;n<t.length;n++)e.push(a(t[n]));return e}return a(t)},evaluateGrid(e){const n=[];if(e<=0)return n;let r=1/0,i=-1/0;for(let e=0;e<u;e++){const n=t[e];n<r&&(r=n),n>i&&(i=n)}if(r===1/0||i===-1/0)return n;if(r===i){for(let t=0;t<e;t++)n.push({x:r,y:a(r)});return n}const s=(i-r)/(e-1);for(let t=0;t<e;t++){const u=t===e-1?i:r+s*t;n.push({x:u,y:a(u)})}return n}}},t.keys=_,t.last=k,t.lengthFromPointToLine=Vt,t.lineIntersectPolygon=We,t.lowerCamelCaseToMiddle=t=>t.replace(/([A-Z])/g,"-$1").toLowerCase(),t.lowerFirst=function(t){return t.charAt(0).toLowerCase()+t.substring(1)},t.max=qt,t.maxInArray=(t,e)=>{var n;if(0===t.length)return;let r=t[0];for(let u=1;u<t.length;u++){const i=t[u];(null!==(n=null==e?void 0:e(i,r))&&void 0!==n?n:i-r)>0&&(r=i)}return r},t.mean=wt,t.median=Y,t.memoize=t=>{let e=null,n=null;return(...r)=>(e&&r.every(((t,n)=>t===e[n]))||(e=r,n=t(...r)),n)},t.merge=function(t,...e){let n=-1;const r=e.length;for(;++n<r;){M(t,e[n],!0)}return t},t.mergeAABB=function(t){const e=[];return function t(n,r){const u=[];r.forEach((t=>{let e;(e=Le(n,t)).length>1?u.push(t):n=e[0]})),e.push(n),u.length&&t(u[0],u.slice(1))}(t[0],t.slice(1)),e},t.millisecondsCount=br,t.millisecondsFloor=Er,t.millisecondsGetterName=vn,t.millisecondsOffset=Mr,t.millisecondsSetterName=function(t){return t?"setUTCMilliseconds":"setMilliseconds"},t.min=Wt,t.minInArray=(t,e)=>{var n;if(0===t.length)return;let r=t[0];for(let u=1;u<t.length;u++){const i=t[u];(null!==(n=null==e?void 0:e(i,r))&&void 0!==n?n:i-r)<0&&(r=i)}return r},t.minuteCount=lr,t.minuteField=hr,t.minuteFloor=ar,t.minuteOffset=Dr,t.minutesGetterName=bn,t.minutesSetterName=function(t){return t?"setUTCMinutes":"setMinutes"},t.mixin=function(t,e,n=!0){if(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,Object.getOwnPropertyNames){const r=Object.getOwnPropertyNames(e);for(let u=0;u<r.length;u++){const i=r[u];"constructor"!==i&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i])}}else N(t,e,n)},t.monthCount=jn,t.monthField=qn,t.monthFloor=Pn,t.monthGetterName=Cn,t.monthOffset=Hn,t.monthSetterName=function(t){return t?"setUTCMonth":"setMonth"},t.nelderMead=function(t,e,n){const r=(n=n||{}).maxIterations||200*e.length,u=n.nonZeroDelta||1.05,i=n.zeroDelta||.001,s=n.minErrorDelta||1e-6,o=n.minErrorDelta||1e-5,a=void 0!==n.rho?n.rho:1,D=void 0!==n.chi?n.chi:2,l=void 0!==n.psi?n.psi:-.5,h=void 0!==n.sigma?n.sigma:.5;let c;const f=e.length,F=new Array(f+1);F[0]=e,F[0].fx=t(e),F[0].id=0;for(let n=0;n<f;++n){const r=e.slice();r[n]=r[n]?r[n]*u:i,F[n+1]=r,F[n+1].fx=t(r),F[n+1].id=n+1}function d(t){for(let e=0;e<t.length;e++)F[f][e]=t[e];F[f].fx=t.fx}const m=function(t,e){return t.fx-e.fx},g=e.slice(),p=e.slice(),y=e.slice(),x=e.slice();for(let e=0;e<r;++e){if(F.sort(m),n.history){const t=F.map((function(t){const e=t.slice();return e.fx=t.fx,e.id=t.id,e}));t.sort((function(t,e){return t.id-e.id})),n.history.push({x:F[0].slice(),fx:F[0].fx,simplex:t})}c=0;for(let t=0;t<f;++t)c=Math.max(c,Math.abs(F[0][t]-F[1][t]));if(Math.abs(F[0].fx-F[f].fx)<s&&c<o)break;for(let t=0;t<f;++t){g[t]=0;for(let e=0;e<f;++e)g[t]+=F[e][t];g[t]/=f}const e=F[f];if(Qr(p,1+a,g,-a,e),p.fx=t(p),p.fx<F[0].fx)Qr(x,1+D,g,-D,e),x.fx=t(x),x.fx<p.fx?d(x):d(p);else if(p.fx>=F[f-1].fx){let n=!1;if(p.fx>e.fx?(Qr(y,1+l,g,-l,e),y.fx=t(y),y.fx<e.fx?d(y):n=!0):(Qr(y,1-l*a,g,l*a,e),y.fx=t(y),y.fx<p.fx?d(y):n=!0),n){if(h>=1)break;for(let e=1;e<F.length;++e)Qr(F[e],1-h,F[0],h,F[e]),F[e].fx=t(F[e])}}else d(p)}return F.sort(m),{fx:F[0].fx,x:F[0]}},t.norm2=Zr,t.normalQuantile=O,t.normalTransform=function(t,e,n,r,u,i,s,o){const a=e.a,D=e.b,l=e.c,h=e.d,c=e.e,f=e.f,F=jt(s),d=zt(s);let m,g;o?(m=o[0],g=o[1]):(m=n,g=r);const p=m-n,y=g-r,x=a*F+l*d,C=D*F+h*d,E=l*F-a*d,M=h*F-D*d;t.a=u*x,t.b=u*C,t.c=i*E,t.d=i*M,t.e=c+a*m+l*g-x*p-E*y,t.f=f+D*m+h*g-C*p-M*y},t.normalizeAngle=De,t.normalizePadding=function(t){if(g(t))return[t,t,t,t];if(f(t)){const e=t.length;if(1===e){const e=t[0];return[e,e,e,e]}if(2===e){const[e,n]=t;return[e,n,e,n]}if(3===e){const[e,n,r]=t;return[e,n,r,n]}if(4===e)return t}if(D(t)){const{top:e=0,right:n=0,bottom:r=0,left:u=0}=t;return[e,n,r,u]}return[0,0,0,0]},t.numberSpecifierReg=qr,t.obbSeparation=(t,e)=>{const n=[{x:Math.cos(t.angle),y:Math.sin(t.angle)},{x:-Math.sin(t.angle),y:Math.cos(t.angle)},{x:Math.cos(e.angle),y:Math.sin(t.angle)},{x:-Math.sin(e.angle),y:Math.cos(t.angle)}];function r(t,e,n){const r=t.getRotatedCorners().map((t=>t.x*e+t.y*n));return{min:Math.min(...r),max:Math.max(...r)}}let u=0;for(const i of n){const n=r(t,i.x,i.y),s=r(e,i.x,i.y);let o;o=n.max<s.min?s.min-n.max:s.max<n.min?n.min-s.max:0,u=Math.max(u,o)}return u},t.ordinaryLeastSquares=function(t,e,n,r){const u=r-t*t;if(Math.abs(u)<Number.EPSILON)return{a:e,b:0};const i=(n-t*e)/u;return{a:e-i*t,b:i}},t.pad=K,t.parseUint8ToImageData=(t,e,n)=>{const r=new Uint8ClampedArray(t),u=new Uint8ClampedArray(t.length);for(let t=n-1;t>=0;t--)for(let i=0;i<e;i++){const s=t*e*4+4*i,o=(n-t)*e*4+4*i;u[o]=r[s],u[o+1]=r[s+1],u[o+2]=r[s+2],u[o+3]=r[s+3]}return new ImageData(u,e,n)},t.pi=It,t.pi2=Ot,t.pick=function(t,e){if(!t||!h(t))return t;const n={};return e.forEach((e=>{v.call(t,e)&&(n[e]=t[e])})),n},t.pickWithout=function(t,e){if(!t||!h(t))return t;const n={};return Object.keys(t).forEach((r=>{const u=t[r];let i=!1;e.forEach((t=>{(c(t)&&t===r||t instanceof RegExp&&r.match(t))&&(i=!0)})),i||(n[r]=u)})),n},t.pointAt=function(t,e,n,r,u){let i=n,s=r;return"number"==typeof t&&"number"==typeof n&&(i=(1-u)*t+u*n),"number"==typeof e&&"number"==typeof r&&(s=(1-u)*e+u*r),{x:i,y:s}},t.pointBetweenLine=He,t.pointInAABB=function(t,e){return de(t,e,!1)},t.pointInLine=Re,t.pointInOBB=function(t,e){return ke.x=(e.point1.x+e.point2.x)/2,ke.y=(e.point1.y+e.point2.y)/2,Ie.x=(e.point3.x+e.point4.x)/2,Ie.y=(e.point3.y+e.point4.y)/2,Re(t,ke,Ie,e.height)},t.pointInRect=de,t.polarToCartesian=function(t,e,n){return e?{x:t.x+e*Math.cos(n),y:t.y+e*Math.sin(n)}:{x:t.x,y:t.y}},t.polygonContainPoint=ze,t.polygonIntersectPolygon=function(t,e){for(let n=0;n<e.length;n++){if(ze(t,e[n].x,e[n].y))return!0;if(n>0&&We(e[n-1].x,e[n-1].y,e[n].x,e[n].y,t))return!0}return!1},t.pow=Gt,t.precisionAdd=function(t,e){return Qt(t+e,10**Math.max(Kt(t),Kt(e)))},t.precisionSub=function(t,e){return Qt(t-e,10**Math.max(Kt(t),Kt(e)))},t.quantileSorted=U,t.rSquared=vt,t.radianToDegree=ue,t.randomLCG=ht,t.range=function(t,e,n){a(e)||(e=t,t=0),a(n)||(n=1);let r=-1;const u=0|Math.max(0,Math.ceil((e-t)/n)),i=new Array(u);for(;++r<u;)i[r]=t+r*n;return i},t.rectInsideAnotherRect=function(e,n,r){if(!e||!n)return t.InnerBBox.NONE;const{x11:u,x12:i,y11:s,y12:o,x21:a,x22:D,y21:l,y22:h}=Fe(e,n,r);return u>a&&i<D&&s>l&&o<h?t.InnerBBox.BBOX1:a>u&&D<i&&l>s&&h<o?t.InnerBBox.BBOX2:t.InnerBBox.NONE},t.regressionBootstrap=function(t,e){var n;const r="linear"===e.method?1:null!==(n=e.degree)&&void 0!==n?n:NaN;if("linear"!==e.method&&"polynomial"!==e.method||!Number.isInteger(r)||r<1||!t.length||t.some((t=>!Number.isFinite(t.x)||!Number.isFinite(t.y)))||e.grid.some((t=>!Number.isFinite(t)))||!(e.level>0&&e.level<1)||!Number.isInteger(e.resamples)||e.resamples<1||!Number.isInteger(e.seed)||e.seed<0||e.seed>4294967295)throw new RangeError("Invalid paired regression bootstrap inputs");if(t.length<=r+1)throw new RangeError("Regression bootstrap requires positive residual degrees of freedom");const u=t.slice().sort(((t,e)=>t.x-e.x||t.y-e.y)),i=mt(u);if(gt(u,r,i).rank<r+1)throw new RangeError("Original regression design is rank deficient");const s=ht(e.seed),o=new Array(u.length),a=e.grid.map((()=>new Array(e.resamples)));for(let t=0;t<e.resamples;t++){for(let t=0;t<o.length;t++)o[t]=u[Math.floor(s()*u.length)];const n=gt(o,r,i);for(let r=0;r<e.grid.length;r++){const u=pt(n,e.grid[r]);if(!Number.isFinite(u))throw new RangeError("Regression bootstrap prediction is not finite");a[r][t]=u}}const D=(1-e.level)/2;return e.grid.map(((t,e)=>(a[e].sort(((t,e)=>t-e)),{x:t,lower:U(a[e],D),upper:U(a[e],1-D)})))},t.regressionLinear=function(t,e=(t=>t.x),n=(t=>t.y),r){var u;const i=null!==(u=null==r?void 0:r.alpha)&&void 0!==u?u:.05,s=Ft(t,e,n),o=gt(s,1),a=yt(o),D=a[0],l=a[1],h=t=>pt(o,t),c=Mt(t,e,n,h);let f=0;return s.forEach(((t,e)=>{f+=(t.y-f)/(e+1)})),{coef:{a:D,b:l},rank:o.rank,predict:h,rSquared:vt(t,e,n,f,h),evaluateGrid:function(t){return xt(c.min,c.max,t,h)},confidenceInterval:function(t=50){const e=[];if(0===c.n||t<=0)return e;const n=Ct(i);if(c.min===c.max){const r=h(c.min),u=bt(c.min,c),i=Et(n,u.seMean),s=Et(n,u.sePred);for(let n=0;n<t;n++)e.push({x:c.min,mean:r,lower:r-i,upper:r+i,predLower:r-s,predUpper:r+s});return e}const r=(c.max-c.min)/(t-1);for(let u=0;u<t;u++){const i=u===t-1?c.max:c.min+r*u,s=h(i),o=bt(i,c),a=Et(n,o.seMean),D=Et(n,o.sePred);e.push({x:i,mean:s,lower:s-a,upper:s+a,predLower:s-D,predUpper:s+D})}return e}}},t.regressionLogistic=function(t,e=(t=>t.x),n=(t=>t.y),r){var u,i,s;const o=null!==(u=null==r?void 0:r.maxIteration)&&void 0!==u?u:25,a=null!==(i=null==r?void 0:r.tol)&&void 0!==i?i:1e-6,D=null!==(s=null==r?void 0:r.alpha)&&void 0!==s?s:.05,l=[],h=[];Bt(t,e,n,((t,e)=>{l.push(t),h.push(e?1:0)}));const c=l.length;if(0===c)return{coef:[0,0],predict:t=>0,evaluateGrid:t=>[],confidenceInterval:(t=50)=>[]};let f=0,F=0;for(let t=0;t<o;t++){const t=new Array(c);let e=!0;for(let e=0;e<c;e++){const n=f+F*l[e],r=1/(1+Math.exp(-n));t[e]=r}let n=0,r=0,u=0,i=0,s=0;for(let e=0;e<c;e++){const o=t[e]*(1-t[e]),a=h[e]-t[e];n+=a,r+=a*l[e],u+=o,i+=o*l[e],s+=o*l[e]*l[e]}const o=u*s-i*i;if(Math.abs(o)<1e-12)break;const D=(s*n-i*r)/o,d=(-i*n+u*r)/o;if(f+=D,F+=d,(Math.abs(D)>a||Math.abs(d)>a)&&(e=!1),e)break}const d=t=>{const e=f+F*t;return 1/(1+Math.exp(-e))};return{coef:[f,F],predict:d,evaluateGrid:function(r){const u=[];if(r<=0)return u;let i=1/0,s=-1/0;if(Bt(t,e,n,(t=>{t<i&&(i=t),t>s&&(s=t)})),i===1/0||s===-1/0)return u;if(i===s){const t=d(i);for(let e=0;e<r;e++)u.push({x:i,y:t});return u}const o=(s-i)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?s:i+o*t;u.push({x:e,y:d(e)})}return u},confidenceInterval:function(r=50){const u=[];if(r<=0)return u;const i=Mt(t,e,n,d);if(0===i.n)return u;const s=Ct(D);if(i.min===i.max){const t=d(i.min),e=bt(i.min,i),n=Et(s,e.seMean),o=Et(s,e.sePred);for(let e=0;e<r;e++)u.push({x:i.min,mean:t,lower:t-n,upper:t+n,predLower:t-o,predUpper:t+o});return u}const o=(i.max-i.min)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?i.max:i.min+o*t,n=d(e),a=bt(e,i),D=Et(s,a.seMean),l=Et(s,a.sePred);u.push({x:e,mean:n,lower:n-D,upper:n+D,predLower:n-l,predUpper:n+l})}return u}}},t.regressionLowess=function(t,e=(t=>t.x),n=(t=>t.y),r={}){var u,i,s,o,a;const D=null!==(u=r.span)&&void 0!==u?u:.3,l=null!==(i=r.degree)&&void 0!==i?i:1,h=null!==(s=r.iterations)&&void 0!==s?s:2,c=null!==(o=r.delta)&&void 0!==o?o:0,f=null!==(a=r.alpha)&&void 0!==a?a:.05;if(!(D>0&&D<=1)||!Number.isInteger(h)||h<0||!Number.isFinite(c)||c<0||0!==l&&1!==l||null!=r.maxSamples&&(!Number.isInteger(r.maxSamples)||r.maxSamples<2))throw new RangeError("Invalid LOWESS span, degree, iterations, delta or maxSamples");let F=Ft(t,e,n).sort(((t,e)=>t.x-e.x||t.y-e.y));if(null!=r.maxSamples&&F.length>r.maxSamples){const t=F,e=r.maxSamples;F=Array.from({length:e},((n,r)=>t[Math.floor(r*(t.length-1)/(e-1))]))}const d=F.length,m=F.map((t=>t.x)),g=F.map((t=>t.y)),p=mt(F),y=m.map((t=>dt(t,p.xCenter,p.xScale))),x=g.map((t=>dt(t,p.yCenter,p.yScale))),C=Math.min(d,Math.max(2,Math.floor(D*d+1e-10)));let E;function M(t){if(!d)return 0;const e=dt(t,p.xCenter,p.xScale);let n=0,r=d-C;for(;n<r;){const u=n+r>>>1,i=t-m[u],s=m[u+C]-t;(Number.isFinite(i)&&Number.isFinite(s)?i>s:e-y[u]>y[u+C]-e)?n=u+1:r=u}let u=n,i=n+C;if(m[u]===m[i-1]){for(;u>0&&m[u-1]===m[u];)u--;for(;i<d&&m[i]===m[u];)i++}const s=Math.max(Math.abs(m[u]-t),Math.abs(m[i-1]-t)),o=!Number.isFinite(s),a=o?Math.max(Math.abs(y[u]-e),Math.abs(y[i-1]-e)):s;let D=1/0,h=-1/0;for(let t=u;t<i;t++)D=Math.min(D,g[t]),h=Math.max(h,g[t]);const c=D/2+h/2,f=Math.max(Math.abs(D-c),Math.abs(h-c))||1;let F=0,x=0,M=0,b=0,B=0;for(let n=u;n<i;n++){const r=0===a?0:(o?y[n]-e:m[n]-t)/a,u=Math.abs(r),i=u>=1?0:1-u*u*u,s=i*i*i*(E?E[n]:1);F+=s,x+=s*r;const D=dt(g[n],c,f);M+=s*D,b+=s*r*r,B+=s*r*D}if(0===F){let n=1/0,r=0,u=0;for(let i=0;i<d;i++){const s=E?E[i]:1;if(0===s)continue;const a=Math.abs(o?y[i]-e:m[i]-t);a<n?(n=a,r=s,u=g[i]):a===n&&(u=u*(r/(r+s))+g[i]*(s/(r+s)),r+=s)}if(0===r)throw new RangeError("LOWESS has no effective local observations");return u}const v=x/F,w=M/F,A=b/F-v*v;return c+f*(w-(0===l||A<=32*Number.EPSILON?0:(B/F-v*w)/A)*v)}const b=[];for(let t=0;t<d&&(b.push(t),t!==d-1);){let e=t+1;if(c>0)for(;e+1<d&&m[e+1]-m[t]<=c;)e++;for(;e+1<d&&m[e+1]===m[e];)e++;t=e}let B=new Array(d);function v(){const t=new Array(d);for(let e=0;e<b.length;e++){const n=b[e];if(t[n]=M(m[n]),0===e)continue;const r=b[e-1],u=m[n]-m[r],i=Number.isFinite(u)?u:y[n]-y[r];for(let e=r+1;e<n;e++){const s=0===i?0:(Number.isFinite(u)?m[e]-m[r]:y[e]-y[r])/i;t[e]=t[r]*(1-s)+t[n]*s}}return t}for(let t=0;t<=h&&(B=v(),t!==h);t++){const t=B.map(((t,e)=>{const n=g[e]-t;return Number.isFinite(n)?Math.abs(n/p.yScale):Math.abs(x[e]-dt(t,p.yCenter,p.yScale))})),e=Y(t.slice()),n=B;E=t.map(((t,r)=>{if(0===e){return t<=64*Number.EPSILON*(Math.max(Math.abs(g[r]),Math.abs(n[r]))/p.yScale)?1:0}const u=t/(6*e);return u>=1?0:(1-u*u)**2}))}function w(t){if(0===c||d<2||t<m[0]||t>m[d-1])return M(t);let e=0,n=d-1;for(;n-e>1;){const r=e+n>>>1;m[r]<=t?e=r:n=r}if(m[n]===m[e])return B[e];const r=m[n]-m[e],u=Number.isFinite(r)?(t-m[e])/r:(dt(t,p.xCenter,p.xScale)-y[e])/(y[n]-y[e]);return B[e]*(1-u)+B[n]*u}function A(t){return Array.isArray(t)?t.map(w):w(t)}return{predict:A,evaluate:A,evaluateGrid:function(t){return xt(m[0],m[d-1],t,w)},confidenceInterval:function(r=50){const u=[];if(r<=0)return u;if(0===d)return u;const i=m[0],s=m[d-1];if(void 0===i||void 0===s||i===1/0||s===-1/0)return u;const o=Mt(t,e,n,(t=>w(t)));if(0===o.n)return u;const a=Ct(f);if(o.min===o.max){const t=w(o.min),e=bt(o.min,o),n=Et(a,e.seMean),i=Et(a,e.sePred);for(let e=0;e<r;e++)u.push({x:o.min,mean:t,lower:t-n,upper:t+n,predLower:t-i,predUpper:t+i});return u}const D=(s-i)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?s:i+D*t,n=w(e),l=bt(e,o),h=Et(a,l.seMean),c=Et(a,l.sePred);u.push({x:e,mean:n,lower:n-h,upper:n+h,predLower:n-c,predUpper:n+c})}return u},fitted:F.map(((t,e)=>({x:t.x,y:B[e]})))}},t.regressionPolynomial=function(t,e=(t=>t.x),n=(t=>t.y),r={}){var u,i;const s=null!==(u=r.degree)&&void 0!==u?u:0;if(!Number.isInteger(s)||s<0)throw new RangeError("Polynomial degree must be an nonnegative integer");const o=null!==(i=r.alpha)&&void 0!==i?i:.05,a=Ft(t,e,n),D=gt(a,s),l=yt(D),h=t=>pt(D,t);return{degree:s,rank:D.rank,coef:l,predict:h,rSquared:vt(t,e,n,(()=>{let r=0,u=0;return Bt(t,e,n,((t,e)=>{r+=e,u++})),0===u?0:r/u})(),h),evaluateGrid(t){let e=1/0,n=-1/0;return a.forEach((t=>{e=Math.min(e,t.x),n=Math.max(n,t.x)})),xt(e,n,t,h)},confidenceInterval(r=50){const u=[];if(r<=0)return u;const i=Mt(t,e,n,h);if(0===i.n)return u;const s=Ct(o);if(i.min===i.max){const t=h(i.min),e=bt(i.min,i),n=Et(s,e.seMean),o=Et(s,e.sePred);for(let e=0;e<r;e++)u.push({x:i.min,mean:t,lower:t-n,upper:t+n,predLower:t-o,predUpper:t+o});return u}const a=(i.max-i.min)/(r-1);for(let t=0;t<r;t++){const e=t===r-1?i.max:i.min+a*t,n=h(e),o=bt(e,i),D=Et(s,o.seMean),l=Et(s,o.sePred);u.push({x:e,mean:n,lower:n-D,upper:n+D,predLower:n-l,predUpper:n+l})}return u}}},t.rgbToHex=gn,t.rgbToHsl=un,t.rotatePoint=ge,t.scale=Jr,t.scott=St,t.secondCount=gr,t.secondField=pr,t.secondFloor=dr,t.secondOffset=mr,t.secondsGetterName=Bn,t.secondsSetterName=function(t){return t?"setUTCSeconds":"setSeconds"},t.seedRandom=function(t){return parseFloat("0."+Math.sin(t).toString().substring(6))},t.shuffleArray=function(t,e=Math.random){let n,r,u=t.length;for(;u;)n=Math.floor(e()*u),r=t[--u],t[u]=t[n],t[n]=r;return t},t.silverman=Tt,t.simpleField=t=>t?"string"==typeof t||"number"==typeof t?()=>t:s(t)?t:e=>e[t.field]:null,t.sin=zt,t.span=t=>t.length<=1?0:k(t)-t[0],t.sqrt=Yt,t.stringWidth=function(t,e=!0){if("string"!=typeof t||0===t.length)return 0;if(0===(t=Ve(t)).length)return 0;t=t.replace(Ze()," ");const n=e?1:2;let r=0;for(const e of t){const t=e.codePointAt(0);if(t<=31||t>=127&&t<=159)continue;if(t>=768&&t<=879)continue;switch(Xe(e)){case"F":case"W":r+=2;break;case"A":r+=n;break;default:r+=1}}return r},t.styleStringToObject=(t="")=>{const e={};return t.split(";").forEach((t=>{if(t){const n=t.split(":");if(2===n.length){const t=n[0].trim(),r=n[1].trim();t&&r&&(e[t]=r)}}})),e},t.substitute=function(t,e){return t&&e?t.replace(/\\?\{([^{}]+)\}/g,((t,n)=>"\\"===t.charAt(0)?t.slice(1):void 0===e[n]?"":e[n])):t},t.tau=Ut,t.throttle=function(t,e,n){let r=!0,u=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return D(n)&&(r="leading"in n?!!n.leading:r,u="trailing"in n?!!n.trailing:u),nt(t,e,{leading:r,trailing:u,maxWait:e})},t.tickStep=function(t,e,n){const r=Math.abs(e-t)/Math.max(0,n);let u=Math.pow(10,Math.floor(Math.log(r)/Math.LN10));const i=r/u;return i>=G?u*=10:i>=V?u*=5:i>=$&&(u*=2),e<t?-u:u},t.toCamelCase=function(t){return t.replace(/-([a-z])/g,((t,e)=>e.toUpperCase()))},t.toDate=ot,t.toNumber=R,t.toPercent=(t,e)=>o(t)?e:c(t)?e*parseFloat(t)/100:t,t.toValidNumber=function(t){if(g(t))return t;const e=+t;return g(e)?e:0},t.transformBounds=function(t,e,n,r,u,i,s){if(!(Pt(r)<=kt||Pt(u)<=kt)){if(1!==r&&t.scaleX(r),1!==u&&t.scaleY(u),isFinite(i)&&Math.abs(i)>kt){let e=0,n=0;void 0!==s&&(e=s[0],n=s[1]),t.rotate(i,e,n)}t.translate(e,n)}},t.transformBoundsWithMatrix=Ke,t.truncate=(t,e,n="right",r)=>{const u=o(r)?"…":r,i=t+"",s=i.length,a=Math.max(0,e-u.length);return s<=e?i:"left"===n?u+i.slice(s-a):"center"===n?i.slice(0,Math.ceil(a/2))+u+i.slice(s-Math.floor(a/2)):i.slice(0,a)+u},t.unionAABB=Le,t.uniqArray=function(t){return t&&f(t)?Array.from(new Set(L(t))):t},t.upperFirst=function(t){return t.charAt(0).toUpperCase()+t.substring(1)},t.utcDayCount=Kn,t.utcDayField=tr,t.utcDayFloor=Jn,t.utcDayOffset=Qn,t.utcHourField=or,t.utcHourFloor=ir,t.utcHourOffset=sr,t.utcMinuteField=Fr,t.utcMinuteFloor=cr,t.utcMinuteOffset=fr,t.utcMonthCount=Yn,t.utcMonthField=Gn,t.utcMonthFloor=Wn,t.utcMonthOffset=zn,t.utcSecondField=Cr,t.utcSecondFloor=yr,t.utcSecondOffset=xr,t.utcYearCount=Un,t.utcYearField=On,t.utcYearFloor=In,t.utcYearOffset=Rn,t.uuid=(t,e)=>{const n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),r=[];let u;if(e=e||n.length,t)for(u=0;u<t;u++)r[u]=n[0|Math.random()*e];else{let t;for(r[8]=r[13]=r[18]=r[23]="-",r[14]="4",u=0;u<36;u++)r[u]||(t=0|16*Math.random(),r[u]=n[19===u?3&t|8:t])}return r.join("")},t.variance=z,t.visitPoints=Bt,t.weightedSum=Qr,t.yearCount=Ln,t.yearField=kn,t.yearFloor=_n,t.yearOffset=Nn,t.zero=t=>0,t.zeros=Xr,t.zerosM=function(t,e){return Xr(t).map((function(){return Xr(e)}))}}));
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
2
+ * 局部线性 LOWESS。默认全量观测,保留历史参数 span=0.3、iterations=2。
3
3
  * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
4
4
  * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
5
5
  */
@@ -5,12 +5,12 @@ import { median } from "./median";
5
5
  import { computeLinearCIComponents, confidenceCriticalValue, confidenceHalfWidth, stdErrorsAt } from "./regression-utils";
6
6
 
7
7
  /**
8
- * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
8
+ * 局部线性 LOWESS。默认全量观测,保留历史参数 span=0.3、iterations=2。
9
9
  * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
10
10
  * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
11
11
  */ export function regressionLowess(data, x = (d => d.x), y = (d => d.y), options = {}) {
12
12
  var _a, _b, _c, _d, _e;
13
- const span = null !== (_a = options.span) && void 0 !== _a ? _a : 2 / 3, degree = null !== (_b = options.degree) && void 0 !== _b ? _b : 1, iterations = null !== (_c = options.iterations) && void 0 !== _c ? _c : 3, delta = null !== (_d = options.delta) && void 0 !== _d ? _d : 0, alpha = null !== (_e = options.alpha) && void 0 !== _e ? _e : .05;
13
+ const span = null !== (_a = options.span) && void 0 !== _a ? _a : .3, degree = null !== (_b = options.degree) && void 0 !== _b ? _b : 1, iterations = null !== (_c = options.iterations) && void 0 !== _c ? _c : 2, delta = null !== (_d = options.delta) && void 0 !== _d ? _d : 0, alpha = null !== (_e = options.alpha) && void 0 !== _e ? _e : .05;
14
14
  if (!(span > 0 && span <= 1) || !Number.isInteger(iterations) || iterations < 0 || !Number.isFinite(delta) || delta < 0 || 0 !== degree && 1 !== degree || null != options.maxSamples && (!Number.isInteger(options.maxSamples) || options.maxSamples < 2)) throw new RangeError("Invalid LOWESS span, degree, iterations, delta or maxSamples");
15
15
  let pts = regressionPoints(data, x, y).sort(((a, b) => a.x - b.x || a.y - b.y));
16
16
  if (null != options.maxSamples && pts.length > options.maxSamples) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-lowess.ts"],"names":[],"mappings":"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","file":"regression-lowess.js","sourcesContent":["import { regressionPoints, regressionGrid, regressionBasis, normalizeRegression } from './regression-solver';\nimport { median } from './median';\nimport {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} from './regression-utils';\n\n/**\n * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。\n * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。\n * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。\n */\nexport function regressionLowess(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: {\n span?: number;\n degree?: 1 | 0;\n iterations?: number;\n alpha?: number;\n maxSamples?: number;\n delta?: number;\n } = {}\n) {\n const span = options.span ?? 2 / 3;\n const degree = options.degree ?? 1;\n const iterations = options.iterations ?? 3;\n const delta = options.delta ?? 0;\n const alpha = options.alpha ?? 0.05;\n if (\n !(span > 0 && span <= 1) ||\n !Number.isInteger(iterations) ||\n iterations < 0 ||\n !Number.isFinite(delta) ||\n delta < 0 ||\n (degree !== 0 && degree !== 1) ||\n (options.maxSamples != null && (!Number.isInteger(options.maxSamples) || options.maxSamples < 2))\n ) {\n throw new RangeError('Invalid LOWESS span, degree, iterations, delta or maxSamples');\n }\n let pts = regressionPoints(data, x, y).sort((a, b) => a.x - b.x || a.y - b.y);\n if (options.maxSamples != null && pts.length > options.maxSamples) {\n const full = pts;\n const count = options.maxSamples;\n pts = Array.from({ length: count }, (_, i) => full[Math.floor((i * (full.length - 1)) / (count - 1))]);\n }\n const n = pts.length;\n const ptsX = pts.map(p => p.x);\n const ptsY = pts.map(p => p.y);\n const basis = regressionBasis(pts);\n const normalizedX = ptsX.map(v => normalizeRegression(v, basis.xCenter, basis.xScale));\n const normalizedY = ptsY.map(v => normalizeRegression(v, basis.yCenter, basis.yScale));\n const count = Math.min(n, Math.max(2, Math.floor(span * n + 1e-10)));\n let robustWeights: number[] | undefined;\n\n function exact(x0: number) {\n if (!n) {\n return 0;\n }\n const query = normalizeRegression(x0, basis.xCenter, basis.xScale);\n // 找到连续的最近邻窗口;相等距离选择较小的 x(ties 的 y 已排序)。\n let left = 0;\n let right = n - count;\n while (left < right) {\n const mid = (left + right) >>> 1;\n const lowerDistance = x0 - ptsX[mid];\n const upperDistance = ptsX[mid + count] - x0;\n if (\n Number.isFinite(lowerDistance) && Number.isFinite(upperDistance)\n ? lowerDistance > upperDistance\n : query - normalizedX[mid] > normalizedX[mid + count] - query\n ) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n let start = left;\n let end = left + count;\n if (ptsX[start] === ptsX[end - 1]) {\n while (start > 0 && ptsX[start - 1] === ptsX[start]) {\n start--;\n }\n while (end < n && ptsX[end] === ptsX[start]) {\n end++;\n }\n }\n const rawRadius = Math.max(Math.abs(ptsX[start] - x0), Math.abs(ptsX[end - 1] - x0));\n const scaled = !Number.isFinite(rawRadius);\n const radius = scaled\n ? Math.max(Math.abs(normalizedX[start] - query), Math.abs(normalizedX[end - 1] - query))\n : rawRadius;\n // 局部响应坐标不能由远处、未参与该邻域的观测决定精度。\n let yMin = Infinity;\n let yMax = -Infinity;\n for (let i = start; i < end; i++) {\n yMin = Math.min(yMin, ptsY[i]);\n yMax = Math.max(yMax, ptsY[i]);\n }\n const yCenter = yMin / 2 + yMax / 2;\n const yScale = Math.max(Math.abs(yMin - yCenter), Math.abs(yMax - yCenter)) || 1;\n let sw = 0;\n let sx = 0;\n let sy = 0;\n let sxx = 0;\n let sxy = 0;\n for (let i = start; i < end; i++) {\n const z = radius === 0 ? 0 : (scaled ? normalizedX[i] - query : ptsX[i] - x0) / radius;\n const u = Math.abs(z);\n const t = u >= 1 ? 0 : 1 - u * u * u;\n const w = t * t * t * (robustWeights ? robustWeights[i] : 1);\n sw += w;\n sx += w * z;\n const response = normalizeRegression(ptsY[i], yCenter, yScale);\n sy += w * response;\n sxx += w * z * z;\n sxy += w * z * response;\n }\n if (sw === 0) {\n // 核边界零权重时使用最近有效观测的加权常数;等距离取均值。\n let distance = Infinity;\n let weight = 0;\n let value = 0;\n for (let i = 0; i < n; i++) {\n const w = robustWeights ? robustWeights[i] : 1;\n if (w === 0) {\n continue;\n }\n const d = Math.abs(scaled ? normalizedX[i] - query : ptsX[i] - x0);\n if (d < distance) {\n distance = d;\n weight = w;\n value = ptsY[i];\n } else if (d === distance) {\n value = value * (weight / (weight + w)) + ptsY[i] * (w / (weight + w));\n weight += w;\n }\n }\n if (weight === 0) {\n throw new RangeError('LOWESS has no effective local observations');\n }\n return value;\n }\n const mx = sx / sw;\n const my = sy / sw;\n const variance = sxx / sw - mx * mx;\n const slope = degree === 0 || variance <= Number.EPSILON * 32 ? 0 : (sxy / sw - mx * my) / variance;\n return yCenter + yScale * (my - slope * mx);\n }\n\n // delta 不删除观测。只减少局部回归求值位置,全部残差参与重加权。\n const anchors: number[] = [];\n for (let i = 0; i < n; ) {\n anchors.push(i);\n if (i === n - 1) {\n break;\n }\n let next = i + 1;\n if (delta > 0) {\n while (next + 1 < n && ptsX[next + 1] - ptsX[i] <= delta) {\n next++;\n }\n }\n // 重复 x 一起使用同一预测;端点不能丢失。\n while (next + 1 < n && ptsX[next + 1] === ptsX[next]) {\n next++;\n }\n i = next;\n }\n let fits = new Array<number>(n);\n function fitObservations() {\n const out = new Array<number>(n);\n for (let a = 0; a < anchors.length; a++) {\n const index = anchors[a];\n out[index] = exact(ptsX[index]);\n if (a === 0) {\n continue;\n }\n const previous = anchors[a - 1];\n const rawWidth = ptsX[index] - ptsX[previous];\n const width = Number.isFinite(rawWidth) ? rawWidth : normalizedX[index] - normalizedX[previous];\n for (let i = previous + 1; i < index; i++) {\n const t =\n width === 0\n ? 0\n : (Number.isFinite(rawWidth) ? ptsX[i] - ptsX[previous] : normalizedX[i] - normalizedX[previous]) / width;\n out[i] = out[previous] * (1 - t) + out[index] * t;\n }\n }\n return out;\n }\n for (let iteration = 0; iteration <= iterations; iteration++) {\n fits = fitObservations();\n if (iteration === iterations) {\n break;\n }\n const residuals = fits.map((v, i) => {\n const residual = ptsY[i] - v;\n return Number.isFinite(residual)\n ? Math.abs(residual / basis.yScale)\n : Math.abs(normalizedY[i] - normalizeRegression(v, basis.yCenter, basis.yScale));\n });\n const med = median(residuals.slice());\n const currentFits = fits;\n robustWeights = residuals.map((r, i) => {\n if (med === 0) {\n const tolerance = Number.EPSILON * 64 * (Math.max(Math.abs(ptsY[i]), Math.abs(currentFits[i])) / basis.yScale);\n return r <= tolerance ? 1 : 0;\n }\n const u = r / (6 * med);\n return u >= 1 ? 0 : (1 - u * u) ** 2;\n });\n }\n function predictSingle(x0: number): number {\n if (delta === 0 || n < 2 || x0 < ptsX[0] || x0 > ptsX[n - 1]) {\n return exact(x0);\n }\n let lo = 0;\n let hi = n - 1;\n while (hi - lo > 1) {\n const mid = (lo + hi) >>> 1;\n if (ptsX[mid] <= x0) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n if (ptsX[hi] === ptsX[lo]) {\n return fits[lo];\n }\n const width = ptsX[hi] - ptsX[lo];\n const t = Number.isFinite(width)\n ? (x0 - ptsX[lo]) / width\n : (normalizeRegression(x0, basis.xCenter, basis.xScale) - normalizedX[lo]) / (normalizedX[hi] - normalizedX[lo]);\n return fits[lo] * (1 - t) + fits[hi] * t;\n }\n function predict(x0: number | number[]) {\n return Array.isArray(x0) ? x0.map(predictSingle) : predictSingle(x0);\n }\n function evaluateGrid(N: number) {\n return regressionGrid(ptsX[0], ptsX[n - 1], N, predictSingle);\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n\n // use data x-range (already sorted)\n const min = ptsX[0];\n const max = ptsX[n - 1];\n\n if (min === undefined || max === undefined || min === Infinity || max === -Infinity) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, (xx: number) => predictSingle(xx));\n if (comps.n === 0) {\n return out;\n }\n\n const z = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const v = predictSingle(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - meanHalfWidth,\n upper: v + meanHalfWidth,\n predLower: v - predHalfWidth,\n predUpper: v + predHalfWidth\n });\n }\n return out;\n }\n\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n const yh = predictSingle(px);\n const errs = stdErrorsAt(px, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n out.push({\n x: px,\n mean: yh,\n lower: yh - meanHalfWidth,\n upper: yh + meanHalfWidth,\n predLower: yh - predHalfWidth,\n predUpper: yh + predHalfWidth\n });\n }\n return out;\n }\n\n return {\n predict,\n evaluate: predict,\n evaluateGrid,\n confidenceInterval,\n // 节点值按 x 排序,重复观测仍保持其统计权重。\n fitted: pts.map((p, i) => ({ x: p.x, y: fits[i] }))\n };\n}\nexport default regressionLowess;\n"]}
1
+ {"version":3,"sources":["../src/common/regression-lowess.ts"],"names":[],"mappings":"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","file":"regression-lowess.js","sourcesContent":["import { regressionPoints, regressionGrid, regressionBasis, normalizeRegression } from './regression-solver';\nimport { median } from './median';\nimport {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} from './regression-utils';\n\n/**\n * 局部线性 LOWESS。默认全量观测,保留历史参数 span=0.3、iterations=2。\n * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。\n * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。\n */\nexport function regressionLowess(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options: {\n span?: number;\n degree?: 1 | 0;\n iterations?: number;\n alpha?: number;\n maxSamples?: number;\n delta?: number;\n } = {}\n) {\n const span = options.span ?? 0.3;\n const degree = options.degree ?? 1;\n const iterations = options.iterations ?? 2;\n const delta = options.delta ?? 0;\n const alpha = options.alpha ?? 0.05;\n if (\n !(span > 0 && span <= 1) ||\n !Number.isInteger(iterations) ||\n iterations < 0 ||\n !Number.isFinite(delta) ||\n delta < 0 ||\n (degree !== 0 && degree !== 1) ||\n (options.maxSamples != null && (!Number.isInteger(options.maxSamples) || options.maxSamples < 2))\n ) {\n throw new RangeError('Invalid LOWESS span, degree, iterations, delta or maxSamples');\n }\n let pts = regressionPoints(data, x, y).sort((a, b) => a.x - b.x || a.y - b.y);\n if (options.maxSamples != null && pts.length > options.maxSamples) {\n const full = pts;\n const count = options.maxSamples;\n pts = Array.from({ length: count }, (_, i) => full[Math.floor((i * (full.length - 1)) / (count - 1))]);\n }\n const n = pts.length;\n const ptsX = pts.map(p => p.x);\n const ptsY = pts.map(p => p.y);\n const basis = regressionBasis(pts);\n const normalizedX = ptsX.map(v => normalizeRegression(v, basis.xCenter, basis.xScale));\n const normalizedY = ptsY.map(v => normalizeRegression(v, basis.yCenter, basis.yScale));\n const count = Math.min(n, Math.max(2, Math.floor(span * n + 1e-10)));\n let robustWeights: number[] | undefined;\n\n function exact(x0: number) {\n if (!n) {\n return 0;\n }\n const query = normalizeRegression(x0, basis.xCenter, basis.xScale);\n // 找到连续的最近邻窗口;相等距离选择较小的 x(ties 的 y 已排序)。\n let left = 0;\n let right = n - count;\n while (left < right) {\n const mid = (left + right) >>> 1;\n const lowerDistance = x0 - ptsX[mid];\n const upperDistance = ptsX[mid + count] - x0;\n if (\n Number.isFinite(lowerDistance) && Number.isFinite(upperDistance)\n ? lowerDistance > upperDistance\n : query - normalizedX[mid] > normalizedX[mid + count] - query\n ) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n let start = left;\n let end = left + count;\n if (ptsX[start] === ptsX[end - 1]) {\n while (start > 0 && ptsX[start - 1] === ptsX[start]) {\n start--;\n }\n while (end < n && ptsX[end] === ptsX[start]) {\n end++;\n }\n }\n const rawRadius = Math.max(Math.abs(ptsX[start] - x0), Math.abs(ptsX[end - 1] - x0));\n const scaled = !Number.isFinite(rawRadius);\n const radius = scaled\n ? Math.max(Math.abs(normalizedX[start] - query), Math.abs(normalizedX[end - 1] - query))\n : rawRadius;\n // 局部响应坐标不能由远处、未参与该邻域的观测决定精度。\n let yMin = Infinity;\n let yMax = -Infinity;\n for (let i = start; i < end; i++) {\n yMin = Math.min(yMin, ptsY[i]);\n yMax = Math.max(yMax, ptsY[i]);\n }\n const yCenter = yMin / 2 + yMax / 2;\n const yScale = Math.max(Math.abs(yMin - yCenter), Math.abs(yMax - yCenter)) || 1;\n let sw = 0;\n let sx = 0;\n let sy = 0;\n let sxx = 0;\n let sxy = 0;\n for (let i = start; i < end; i++) {\n const z = radius === 0 ? 0 : (scaled ? normalizedX[i] - query : ptsX[i] - x0) / radius;\n const u = Math.abs(z);\n const t = u >= 1 ? 0 : 1 - u * u * u;\n const w = t * t * t * (robustWeights ? robustWeights[i] : 1);\n sw += w;\n sx += w * z;\n const response = normalizeRegression(ptsY[i], yCenter, yScale);\n sy += w * response;\n sxx += w * z * z;\n sxy += w * z * response;\n }\n if (sw === 0) {\n // 核边界零权重时使用最近有效观测的加权常数;等距离取均值。\n let distance = Infinity;\n let weight = 0;\n let value = 0;\n for (let i = 0; i < n; i++) {\n const w = robustWeights ? robustWeights[i] : 1;\n if (w === 0) {\n continue;\n }\n const d = Math.abs(scaled ? normalizedX[i] - query : ptsX[i] - x0);\n if (d < distance) {\n distance = d;\n weight = w;\n value = ptsY[i];\n } else if (d === distance) {\n value = value * (weight / (weight + w)) + ptsY[i] * (w / (weight + w));\n weight += w;\n }\n }\n if (weight === 0) {\n throw new RangeError('LOWESS has no effective local observations');\n }\n return value;\n }\n const mx = sx / sw;\n const my = sy / sw;\n const variance = sxx / sw - mx * mx;\n const slope = degree === 0 || variance <= Number.EPSILON * 32 ? 0 : (sxy / sw - mx * my) / variance;\n return yCenter + yScale * (my - slope * mx);\n }\n\n // delta 不删除观测。只减少局部回归求值位置,全部残差参与重加权。\n const anchors: number[] = [];\n for (let i = 0; i < n; ) {\n anchors.push(i);\n if (i === n - 1) {\n break;\n }\n let next = i + 1;\n if (delta > 0) {\n while (next + 1 < n && ptsX[next + 1] - ptsX[i] <= delta) {\n next++;\n }\n }\n // 重复 x 一起使用同一预测;端点不能丢失。\n while (next + 1 < n && ptsX[next + 1] === ptsX[next]) {\n next++;\n }\n i = next;\n }\n let fits = new Array<number>(n);\n function fitObservations() {\n const out = new Array<number>(n);\n for (let a = 0; a < anchors.length; a++) {\n const index = anchors[a];\n out[index] = exact(ptsX[index]);\n if (a === 0) {\n continue;\n }\n const previous = anchors[a - 1];\n const rawWidth = ptsX[index] - ptsX[previous];\n const width = Number.isFinite(rawWidth) ? rawWidth : normalizedX[index] - normalizedX[previous];\n for (let i = previous + 1; i < index; i++) {\n const t =\n width === 0\n ? 0\n : (Number.isFinite(rawWidth) ? ptsX[i] - ptsX[previous] : normalizedX[i] - normalizedX[previous]) / width;\n out[i] = out[previous] * (1 - t) + out[index] * t;\n }\n }\n return out;\n }\n for (let iteration = 0; iteration <= iterations; iteration++) {\n fits = fitObservations();\n if (iteration === iterations) {\n break;\n }\n const residuals = fits.map((v, i) => {\n const residual = ptsY[i] - v;\n return Number.isFinite(residual)\n ? Math.abs(residual / basis.yScale)\n : Math.abs(normalizedY[i] - normalizeRegression(v, basis.yCenter, basis.yScale));\n });\n const med = median(residuals.slice());\n const currentFits = fits;\n robustWeights = residuals.map((r, i) => {\n if (med === 0) {\n const tolerance = Number.EPSILON * 64 * (Math.max(Math.abs(ptsY[i]), Math.abs(currentFits[i])) / basis.yScale);\n return r <= tolerance ? 1 : 0;\n }\n const u = r / (6 * med);\n return u >= 1 ? 0 : (1 - u * u) ** 2;\n });\n }\n function predictSingle(x0: number): number {\n if (delta === 0 || n < 2 || x0 < ptsX[0] || x0 > ptsX[n - 1]) {\n return exact(x0);\n }\n let lo = 0;\n let hi = n - 1;\n while (hi - lo > 1) {\n const mid = (lo + hi) >>> 1;\n if (ptsX[mid] <= x0) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n if (ptsX[hi] === ptsX[lo]) {\n return fits[lo];\n }\n const width = ptsX[hi] - ptsX[lo];\n const t = Number.isFinite(width)\n ? (x0 - ptsX[lo]) / width\n : (normalizeRegression(x0, basis.xCenter, basis.xScale) - normalizedX[lo]) / (normalizedX[hi] - normalizedX[lo]);\n return fits[lo] * (1 - t) + fits[hi] * t;\n }\n function predict(x0: number | number[]) {\n return Array.isArray(x0) ? x0.map(predictSingle) : predictSingle(x0);\n }\n function evaluateGrid(N: number) {\n return regressionGrid(ptsX[0], ptsX[n - 1], N, predictSingle);\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n\n if (N <= 0) {\n return out;\n }\n if (n === 0) {\n return out;\n }\n\n // use data x-range (already sorted)\n const min = ptsX[0];\n const max = ptsX[n - 1];\n\n if (min === undefined || max === undefined || min === Infinity || max === -Infinity) {\n return out;\n }\n\n const comps = computeLinearCIComponents(data, x, y, (xx: number) => predictSingle(xx));\n if (comps.n === 0) {\n return out;\n }\n\n const z = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const v = predictSingle(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - meanHalfWidth,\n upper: v + meanHalfWidth,\n predLower: v - predHalfWidth,\n predUpper: v + predHalfWidth\n });\n }\n return out;\n }\n\n const step = (max - min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? max : min + step * i;\n const yh = predictSingle(px);\n const errs = stdErrorsAt(px, comps);\n const meanHalfWidth = confidenceHalfWidth(z, errs.seMean);\n const predHalfWidth = confidenceHalfWidth(z, errs.sePred);\n out.push({\n x: px,\n mean: yh,\n lower: yh - meanHalfWidth,\n upper: yh + meanHalfWidth,\n predLower: yh - predHalfWidth,\n predUpper: yh + predHalfWidth\n });\n }\n return out;\n }\n\n return {\n predict,\n evaluate: predict,\n evaluateGrid,\n confidenceInterval,\n // 节点值按 x 排序,重复观测仍保持其统计权重。\n fitted: pts.map((p, i) => ({ x: p.x, y: fits[i] }))\n };\n}\nexport default regressionLowess;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visactor/vutils",
3
- "version": "1.0.27",
3
+ "version": "1.0.28",
4
4
  "main": "cjs/index.js",
5
5
  "module": "es/index.js",
6
6
  "types": "es/index.d.ts",
@@ -36,9 +36,9 @@
36
36
  "typescript": "4.9.5",
37
37
  "@types/node": "*",
38
38
  "@internal/bundler": "0.0.1",
39
- "@internal/jest-config": "0.0.1",
40
39
  "@internal/ts-config": "0.0.1",
41
- "@internal/eslint-config": "0.0.1"
40
+ "@internal/eslint-config": "0.0.1",
41
+ "@internal/jest-config": "0.0.1"
42
42
  },
43
43
  "dependencies": {
44
44
  "eventemitter3": "^4.0.7",