@visactor/vutils 1.0.24 → 1.0.26

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.
Files changed (452) hide show
  1. package/README.zh-CN.md +12 -0
  2. package/REGRESSION.md +36 -0
  3. package/cjs/angle.d.ts +61 -0
  4. package/cjs/angle.js +73 -7
  5. package/cjs/angle.js.map +1 -1
  6. package/cjs/color/Color.d.ts +3 -0
  7. package/cjs/color/Color.js +64 -10
  8. package/cjs/color/Color.js.map +1 -1
  9. package/cjs/color/hexToRgb.d.ts +5 -0
  10. package/cjs/color/hexToRgb.js +5 -0
  11. package/cjs/color/hexToRgb.js.map +1 -1
  12. package/cjs/color/rgbToHsl.js +5 -1
  13. package/cjs/color/rgbToHsl.js.map +1 -1
  14. package/cjs/common/array.d.ts +43 -0
  15. package/cjs/common/array.js +44 -0
  16. package/cjs/common/array.js.map +1 -1
  17. package/cjs/common/bisect.d.ts +21 -0
  18. package/cjs/common/bisect.js +29 -0
  19. package/cjs/common/bisect.js.map +1 -1
  20. package/cjs/common/bootstrap.d.ts +5 -0
  21. package/cjs/common/bootstrap.js +22 -0
  22. package/cjs/common/bootstrap.js.map +1 -0
  23. package/cjs/common/clone.js +6 -0
  24. package/cjs/common/clone.js.map +1 -1
  25. package/cjs/common/cloneDeep.js +4 -1
  26. package/cjs/common/cloneDeep.js.map +1 -1
  27. package/cjs/common/correlation.d.ts +3 -0
  28. package/cjs/common/correlation.js +83 -0
  29. package/cjs/common/correlation.js.map +1 -0
  30. package/cjs/common/debounce.js +22 -4
  31. package/cjs/common/debounce.js.map +1 -1
  32. package/cjs/common/deviation.js +1 -2
  33. package/cjs/common/ecdf.d.ts +8 -0
  34. package/cjs/common/ecdf.js +11 -2
  35. package/cjs/common/ecdf.js.map +1 -1
  36. package/cjs/common/extent.d.ts +4 -0
  37. package/cjs/common/extent.js +4 -2
  38. package/cjs/common/extent.js.map +1 -1
  39. package/cjs/common/field.d.ts +6 -0
  40. package/cjs/common/field.js +3 -0
  41. package/cjs/common/field.js.map +1 -1
  42. package/cjs/common/has.d.ts +17 -0
  43. package/cjs/common/has.js +18 -1
  44. package/cjs/common/has.js.map +1 -1
  45. package/cjs/common/index.d.ts +5 -0
  46. package/cjs/common/index.js +34 -6
  47. package/cjs/common/index.js.map +1 -1
  48. package/cjs/common/interpolate.js +16 -3
  49. package/cjs/common/interpolate.js.map +1 -1
  50. package/cjs/common/isBase64.d.ts +6 -0
  51. package/cjs/common/isBase64.js +6 -0
  52. package/cjs/common/isBase64.js.map +1 -1
  53. package/cjs/common/isBoolean.d.ts +13 -0
  54. package/cjs/common/isBoolean.js +13 -1
  55. package/cjs/common/isBoolean.js.map +1 -1
  56. package/cjs/common/isEmpty.js +11 -1
  57. package/cjs/common/isEmpty.js.map +1 -1
  58. package/cjs/common/isEqual.js +19 -7
  59. package/cjs/common/isEqual.js.map +1 -1
  60. package/cjs/common/isFunction.d.ts +25 -0
  61. package/cjs/common/isFunction.js +27 -2
  62. package/cjs/common/isFunction.js.map +1 -1
  63. package/cjs/common/isNull.js +2 -1
  64. package/cjs/common/isNumber.d.ts +23 -0
  65. package/cjs/common/isNumber.js +23 -1
  66. package/cjs/common/isNumber.js.map +1 -1
  67. package/cjs/common/isNumeric.d.ts +25 -0
  68. package/cjs/common/isNumeric.js +25 -0
  69. package/cjs/common/isNumeric.js.map +1 -1
  70. package/cjs/common/isObject.d.ts +21 -0
  71. package/cjs/common/isObject.js +22 -0
  72. package/cjs/common/isObject.js.map +1 -1
  73. package/cjs/common/isObjectLike.d.ts +20 -0
  74. package/cjs/common/isObjectLike.js +21 -0
  75. package/cjs/common/isObjectLike.js.map +1 -1
  76. package/cjs/common/isPlainObject.d.ts +25 -0
  77. package/cjs/common/isPlainObject.js.map +1 -1
  78. package/cjs/common/isPrototype.js +1 -1
  79. package/cjs/common/isRegExp.js +1 -1
  80. package/cjs/common/isShallowEqual.js +1 -0
  81. package/cjs/common/isShallowEqual.js.map +1 -1
  82. package/cjs/common/isString.d.ts +13 -0
  83. package/cjs/common/isString.js +13 -1
  84. package/cjs/common/isString.js.map +1 -1
  85. package/cjs/common/isType.d.ts +6 -0
  86. package/cjs/common/isType.js +6 -0
  87. package/cjs/common/isType.js.map +1 -1
  88. package/cjs/common/isValidNumber.js.map +1 -1
  89. package/cjs/common/isValidUrl.js.map +1 -1
  90. package/cjs/common/kde.d.ts +28 -0
  91. package/cjs/common/kde.js +29 -5
  92. package/cjs/common/kde.js.map +1 -1
  93. package/cjs/common/mean.d.ts +2 -0
  94. package/cjs/common/mean.js +25 -0
  95. package/cjs/common/mean.js.map +1 -0
  96. package/cjs/common/merge.js +20 -4
  97. package/cjs/common/merge.js.map +1 -1
  98. package/cjs/common/mixin.js +14 -3
  99. package/cjs/common/mixin.js.map +1 -1
  100. package/cjs/common/normalQuantile.d.ts +5 -0
  101. package/cjs/common/normalQuantile.js +21 -0
  102. package/cjs/common/normalQuantile.js.map +1 -0
  103. package/cjs/common/number.d.ts +24 -0
  104. package/cjs/common/number.js +24 -1
  105. package/cjs/common/number.js.map +1 -1
  106. package/cjs/common/pad.d.ts +21 -0
  107. package/cjs/common/pad.js +21 -1
  108. package/cjs/common/pad.js.map +1 -1
  109. package/cjs/common/random.d.ts +3 -0
  110. package/cjs/common/random.js +13 -0
  111. package/cjs/common/random.js.map +1 -1
  112. package/cjs/common/regression-bootstrap.d.ts +14 -0
  113. package/cjs/common/regression-bootstrap.js +37 -0
  114. package/cjs/common/regression-bootstrap.js.map +1 -0
  115. package/cjs/common/regression-linear.d.ts +5 -0
  116. package/cjs/common/regression-linear.js +28 -39
  117. package/cjs/common/regression-linear.js.map +1 -1
  118. package/cjs/common/regression-logistic.d.ts +6 -0
  119. package/cjs/common/regression-logistic.js +25 -14
  120. package/cjs/common/regression-logistic.js.map +1 -1
  121. package/cjs/common/regression-lowess.d.ts +11 -1
  122. package/cjs/common/regression-lowess.js +125 -118
  123. package/cjs/common/regression-lowess.js.map +1 -1
  124. package/cjs/common/regression-polynomial.d.ts +1 -0
  125. package/cjs/common/regression-polynomial.js +24 -94
  126. package/cjs/common/regression-polynomial.js.map +1 -1
  127. package/cjs/common/regression-solver.d.ts +26 -0
  128. package/cjs/common/regression-solver.js +180 -0
  129. package/cjs/common/regression-solver.js.map +1 -0
  130. package/cjs/common/regression-utils.d.ts +13 -1
  131. package/cjs/common/regression-utils.js +27 -12
  132. package/cjs/common/regression-utils.js.map +1 -1
  133. package/cjs/common/throttle.js +3 -0
  134. package/cjs/common/throttle.js.map +1 -1
  135. package/cjs/common/toDate.js +22 -3
  136. package/cjs/common/toDate.js.map +1 -1
  137. package/cjs/common/uuid.d.ts +7 -0
  138. package/cjs/common/uuid.js +15 -1
  139. package/cjs/common/uuid.js.map +1 -1
  140. package/cjs/data-structure/bounds.d.ts +101 -0
  141. package/cjs/data-structure/bounds.js +74 -7
  142. package/cjs/data-structure/bounds.js.map +1 -1
  143. package/cjs/data-structure/hashTable.d.ts +4 -0
  144. package/cjs/data-structure/hashTable.js +11 -2
  145. package/cjs/data-structure/hashTable.js.map +1 -1
  146. package/cjs/data-structure/index.js +6 -2
  147. package/cjs/data-structure/index.js.map +1 -1
  148. package/cjs/data-structure/matrix.d.ts +91 -0
  149. package/cjs/data-structure/matrix.js +52 -4
  150. package/cjs/data-structure/matrix.js.map +1 -1
  151. package/cjs/data-structure/point.d.ts +3 -0
  152. package/cjs/data-structure/point.js +5 -1
  153. package/cjs/data-structure/point.js.map +1 -1
  154. package/cjs/dom.d.ts +36 -0
  155. package/cjs/dom.js +43 -1
  156. package/cjs/dom.js.map +1 -1
  157. package/cjs/fmin/blas1.js +10 -1
  158. package/cjs/fmin/blas1.js.map +1 -1
  159. package/cjs/fmin/conjugate-gradient.js +18 -3
  160. package/cjs/fmin/conjugate-gradient.js.map +1 -1
  161. package/cjs/fmin/linesearch.js +15 -1
  162. package/cjs/fmin/linesearch.js.map +1 -1
  163. package/cjs/fmin/nelder-mead.d.ts +1 -0
  164. package/cjs/fmin/nelder-mead.js +30 -10
  165. package/cjs/fmin/nelder-mead.js.map +1 -1
  166. package/cjs/format/number/formatDecimal.js +9 -1
  167. package/cjs/format/number/formatDecimal.js.map +1 -1
  168. package/cjs/format/number/formatGroup.js +7 -0
  169. package/cjs/format/number/formatGroup.js.map +1 -1
  170. package/cjs/format/number/formatPrefixAuto.js +8 -0
  171. package/cjs/format/number/formatPrefixAuto.js.map +1 -1
  172. package/cjs/format/number/formatRounded.js +7 -0
  173. package/cjs/format/number/formatRounded.js.map +1 -1
  174. package/cjs/format/number/formatTrim.js +7 -0
  175. package/cjs/format/number/formatTrim.js.map +1 -1
  176. package/cjs/format/number/number.js +39 -9
  177. package/cjs/format/number/number.js.map +1 -1
  178. package/cjs/format/time.js +23 -6
  179. package/cjs/format/time.js.map +1 -1
  180. package/cjs/geo/circle-intersection.d.ts +12 -0
  181. package/cjs/geo/circle-intersection.js +54 -9
  182. package/cjs/geo/circle-intersection.js.map +1 -1
  183. package/cjs/geo/constant.js +8 -1
  184. package/cjs/geo/constant.js.map +1 -1
  185. package/cjs/geo/invariant.d.ts +22 -0
  186. package/cjs/geo/invariant.js +24 -1
  187. package/cjs/geo/invariant.js.map +1 -1
  188. package/cjs/graphics/algorithm/aabb.js +7 -3
  189. package/cjs/graphics/algorithm/aabb.js.map +1 -1
  190. package/cjs/graphics/algorithm/intersect.d.ts +48 -0
  191. package/cjs/graphics/algorithm/intersect.js +75 -7
  192. package/cjs/graphics/algorithm/intersect.js.map +1 -1
  193. package/cjs/graphics/bounds-util.js +4 -2
  194. package/cjs/graphics/bounds-util.js.map +1 -1
  195. package/cjs/graphics/graph-util.js +4 -0
  196. package/cjs/graphics/graph-util.js.map +1 -1
  197. package/cjs/graphics/index.js +7 -4
  198. package/cjs/graphics/index.js.map +1 -1
  199. package/cjs/graphics/polygon.d.ts +12 -0
  200. package/cjs/graphics/polygon.js +28 -5
  201. package/cjs/graphics/polygon.js.map +1 -1
  202. package/cjs/graphics/text/measure/interface.d.ts +12 -0
  203. package/cjs/graphics/text/measure/textMeasure.d.ts +23 -0
  204. package/cjs/graphics/text/measure/textMeasure.js +50 -22
  205. package/cjs/graphics/text/measure/textMeasure.js.map +1 -1
  206. package/cjs/graphics/text/measure/util.js +1 -0
  207. package/cjs/graphics/text/measure/util.js.map +1 -1
  208. package/cjs/graphics/text/stringWidth.js +7 -3
  209. package/cjs/graphics/text/stringWidth.js.map +1 -1
  210. package/cjs/index.d.ts +6 -0
  211. package/cjs/index.js +19 -4
  212. package/cjs/index.js.map +1 -1
  213. package/cjs/logger.js +12 -2
  214. package/cjs/logger.js.map +1 -1
  215. package/cjs/lru.js +14 -6
  216. package/cjs/lru.js.map +1 -1
  217. package/cjs/math.d.ts +9 -0
  218. package/cjs/math.js +10 -0
  219. package/cjs/math.js.map +1 -1
  220. package/cjs/padding.d.ts +5 -0
  221. package/cjs/padding.js +5 -0
  222. package/cjs/padding.js.map +1 -1
  223. package/cjs/time/formatUtils.d.ts +6 -0
  224. package/cjs/time/formatUtils.js +7 -0
  225. package/cjs/time/formatUtils.js.map +1 -1
  226. package/dist/index.js +2035 -411
  227. package/dist/index.min.js +128 -1
  228. package/es/angle.d.ts +61 -0
  229. package/es/angle.js +66 -10
  230. package/es/angle.js.map +1 -1
  231. package/es/color/Color.d.ts +3 -0
  232. package/es/color/Color.js +64 -9
  233. package/es/color/Color.js.map +1 -1
  234. package/es/color/hexToRgb.d.ts +5 -0
  235. package/es/color/hexToRgb.js +5 -0
  236. package/es/color/hexToRgb.js.map +1 -1
  237. package/es/color/rgbToHsl.js +5 -1
  238. package/es/color/rgbToHsl.js.map +1 -1
  239. package/es/common/array.d.ts +43 -0
  240. package/es/common/array.js +44 -8
  241. package/es/common/array.js.map +1 -1
  242. package/es/common/bisect.d.ts +21 -0
  243. package/es/common/bisect.js +29 -4
  244. package/es/common/bisect.js.map +1 -1
  245. package/es/common/bootstrap.d.ts +5 -0
  246. package/es/common/bootstrap.js +14 -0
  247. package/es/common/bootstrap.js.map +1 -0
  248. package/es/common/clone.js +6 -0
  249. package/es/common/clone.js.map +1 -1
  250. package/es/common/cloneDeep.js +4 -1
  251. package/es/common/cloneDeep.js.map +1 -1
  252. package/es/common/correlation.d.ts +3 -0
  253. package/es/common/correlation.js +77 -0
  254. package/es/common/correlation.js.map +1 -0
  255. package/es/common/debounce.js +22 -4
  256. package/es/common/debounce.js.map +1 -1
  257. package/es/common/deviation.js +1 -2
  258. package/es/common/ecdf.d.ts +8 -0
  259. package/es/common/ecdf.js +11 -1
  260. package/es/common/ecdf.js.map +1 -1
  261. package/es/common/extent.d.ts +4 -0
  262. package/es/common/extent.js +8 -3
  263. package/es/common/extent.js.map +1 -1
  264. package/es/common/field.d.ts +6 -0
  265. package/es/common/field.js +3 -1
  266. package/es/common/field.js.map +1 -1
  267. package/es/common/has.d.ts +17 -0
  268. package/es/common/has.js +18 -1
  269. package/es/common/has.js.map +1 -1
  270. package/es/common/index.d.ts +5 -0
  271. package/es/common/index.js +24 -0
  272. package/es/common/index.js.map +1 -1
  273. package/es/common/interpolate.js +16 -3
  274. package/es/common/interpolate.js.map +1 -1
  275. package/es/common/isBase64.d.ts +6 -0
  276. package/es/common/isBase64.js +6 -0
  277. package/es/common/isBase64.js.map +1 -1
  278. package/es/common/isBoolean.d.ts +13 -0
  279. package/es/common/isBoolean.js +13 -1
  280. package/es/common/isBoolean.js.map +1 -1
  281. package/es/common/isEmpty.js +11 -1
  282. package/es/common/isEmpty.js.map +1 -1
  283. package/es/common/isEqual.js +19 -7
  284. package/es/common/isEqual.js.map +1 -1
  285. package/es/common/isFunction.d.ts +25 -0
  286. package/es/common/isFunction.js +27 -2
  287. package/es/common/isFunction.js.map +1 -1
  288. package/es/common/isNull.js +2 -1
  289. package/es/common/isNumber.d.ts +23 -0
  290. package/es/common/isNumber.js +23 -1
  291. package/es/common/isNumber.js.map +1 -1
  292. package/es/common/isNumeric.d.ts +25 -0
  293. package/es/common/isNumeric.js +25 -0
  294. package/es/common/isNumeric.js.map +1 -1
  295. package/es/common/isObject.d.ts +21 -0
  296. package/es/common/isObject.js +22 -0
  297. package/es/common/isObject.js.map +1 -1
  298. package/es/common/isObjectLike.d.ts +20 -0
  299. package/es/common/isObjectLike.js +21 -0
  300. package/es/common/isObjectLike.js.map +1 -1
  301. package/es/common/isPlainObject.d.ts +25 -0
  302. package/es/common/isPlainObject.js +26 -0
  303. package/es/common/isPlainObject.js.map +1 -1
  304. package/es/common/isPrototype.js +1 -1
  305. package/es/common/isRegExp.js +1 -1
  306. package/es/common/isShallowEqual.js +1 -0
  307. package/es/common/isShallowEqual.js.map +1 -1
  308. package/es/common/isString.d.ts +13 -0
  309. package/es/common/isString.js +13 -1
  310. package/es/common/isString.js.map +1 -1
  311. package/es/common/isType.d.ts +6 -0
  312. package/es/common/isType.js +6 -0
  313. package/es/common/isType.js.map +1 -1
  314. package/es/common/isValidNumber.js.map +1 -1
  315. package/es/common/isValidUrl.js.map +1 -1
  316. package/es/common/kde.d.ts +28 -0
  317. package/es/common/kde.js +29 -7
  318. package/es/common/kde.js.map +1 -1
  319. package/es/common/mean.d.ts +2 -0
  320. package/es/common/mean.js +19 -0
  321. package/es/common/mean.js.map +1 -0
  322. package/es/common/merge.js +22 -5
  323. package/es/common/merge.js.map +1 -1
  324. package/es/common/mixin.js +14 -3
  325. package/es/common/mixin.js.map +1 -1
  326. package/es/common/normalQuantile.d.ts +5 -0
  327. package/es/common/normalQuantile.js +15 -0
  328. package/es/common/normalQuantile.js.map +1 -0
  329. package/es/common/number.d.ts +24 -0
  330. package/es/common/number.js +24 -2
  331. package/es/common/number.js.map +1 -1
  332. package/es/common/pad.d.ts +21 -0
  333. package/es/common/pad.js +21 -1
  334. package/es/common/pad.js.map +1 -1
  335. package/es/common/random.d.ts +3 -0
  336. package/es/common/random.js +13 -1
  337. package/es/common/random.js.map +1 -1
  338. package/es/common/regression-bootstrap.d.ts +14 -0
  339. package/es/common/regression-bootstrap.js +31 -0
  340. package/es/common/regression-bootstrap.js.map +1 -0
  341. package/es/common/regression-linear.d.ts +5 -0
  342. package/es/common/regression-linear.js +25 -39
  343. package/es/common/regression-linear.js.map +1 -1
  344. package/es/common/regression-logistic.d.ts +6 -0
  345. package/es/common/regression-logistic.js +24 -16
  346. package/es/common/regression-logistic.js.map +1 -1
  347. package/es/common/regression-lowess.d.ts +11 -1
  348. package/es/common/regression-lowess.js +120 -118
  349. package/es/common/regression-lowess.js.map +1 -1
  350. package/es/common/regression-polynomial.d.ts +1 -0
  351. package/es/common/regression-polynomial.js +21 -89
  352. package/es/common/regression-polynomial.js.map +1 -1
  353. package/es/common/regression-solver.d.ts +26 -0
  354. package/es/common/regression-solver.js +168 -0
  355. package/es/common/regression-solver.js.map +1 -0
  356. package/es/common/regression-utils.d.ts +13 -1
  357. package/es/common/regression-utils.js +18 -9
  358. package/es/common/regression-utils.js.map +1 -1
  359. package/es/common/throttle.js +3 -0
  360. package/es/common/throttle.js.map +1 -1
  361. package/es/common/toDate.js +23 -3
  362. package/es/common/toDate.js.map +1 -1
  363. package/es/common/uuid.d.ts +7 -0
  364. package/es/common/uuid.js +15 -1
  365. package/es/common/uuid.js.map +1 -1
  366. package/es/data-structure/bounds.d.ts +101 -0
  367. package/es/data-structure/bounds.js +74 -8
  368. package/es/data-structure/bounds.js.map +1 -1
  369. package/es/data-structure/hashTable.d.ts +4 -0
  370. package/es/data-structure/hashTable.js +11 -2
  371. package/es/data-structure/hashTable.js.map +1 -1
  372. package/es/data-structure/index.js +2 -0
  373. package/es/data-structure/index.js.map +1 -1
  374. package/es/data-structure/matrix.d.ts +91 -0
  375. package/es/data-structure/matrix.js +52 -5
  376. package/es/data-structure/matrix.js.map +1 -1
  377. package/es/data-structure/point.d.ts +3 -0
  378. package/es/data-structure/point.js +5 -1
  379. package/es/data-structure/point.js.map +1 -1
  380. package/es/dom.d.ts +36 -0
  381. package/es/dom.js +43 -8
  382. package/es/dom.js.map +1 -1
  383. package/es/fmin/blas1.js +10 -0
  384. package/es/fmin/blas1.js.map +1 -1
  385. package/es/fmin/conjugate-gradient.js +18 -2
  386. package/es/fmin/conjugate-gradient.js.map +1 -1
  387. package/es/fmin/linesearch.js +15 -0
  388. package/es/fmin/linesearch.js.map +1 -1
  389. package/es/fmin/nelder-mead.d.ts +1 -0
  390. package/es/fmin/nelder-mead.js +29 -9
  391. package/es/fmin/nelder-mead.js.map +1 -1
  392. package/es/format/number/formatDecimal.js +9 -1
  393. package/es/format/number/formatDecimal.js.map +1 -1
  394. package/es/format/number/formatGroup.js +7 -0
  395. package/es/format/number/formatGroup.js.map +1 -1
  396. package/es/format/number/formatPrefixAuto.js +8 -0
  397. package/es/format/number/formatPrefixAuto.js.map +1 -1
  398. package/es/format/number/formatRounded.js +7 -0
  399. package/es/format/number/formatRounded.js.map +1 -1
  400. package/es/format/number/formatTrim.js +7 -0
  401. package/es/format/number/formatTrim.js.map +1 -1
  402. package/es/format/number/number.js +40 -8
  403. package/es/format/number/number.js.map +1 -1
  404. package/es/format/time.js +23 -5
  405. package/es/format/time.js.map +1 -1
  406. package/es/geo/circle-intersection.d.ts +12 -0
  407. package/es/geo/circle-intersection.js +54 -14
  408. package/es/geo/circle-intersection.js.map +1 -1
  409. package/es/geo/constant.js +8 -0
  410. package/es/geo/constant.js.map +1 -1
  411. package/es/geo/invariant.d.ts +22 -0
  412. package/es/geo/invariant.js +24 -0
  413. package/es/geo/invariant.js.map +1 -1
  414. package/es/graphics/algorithm/aabb.js +7 -3
  415. package/es/graphics/algorithm/aabb.js.map +1 -1
  416. package/es/graphics/algorithm/intersect.d.ts +48 -0
  417. package/es/graphics/algorithm/intersect.js +75 -12
  418. package/es/graphics/algorithm/intersect.js.map +1 -1
  419. package/es/graphics/bounds-util.js +4 -2
  420. package/es/graphics/bounds-util.js.map +1 -1
  421. package/es/graphics/graph-util.js +4 -0
  422. package/es/graphics/graph-util.js.map +1 -1
  423. package/es/graphics/index.js +2 -0
  424. package/es/graphics/index.js.map +1 -1
  425. package/es/graphics/polygon.d.ts +12 -0
  426. package/es/graphics/polygon.js +28 -6
  427. package/es/graphics/polygon.js.map +1 -1
  428. package/es/graphics/text/measure/interface.d.ts +12 -0
  429. package/es/graphics/text/measure/textMeasure.d.ts +23 -0
  430. package/es/graphics/text/measure/textMeasure.js +46 -21
  431. package/es/graphics/text/measure/textMeasure.js.map +1 -1
  432. package/es/graphics/text/measure/util.js +1 -0
  433. package/es/graphics/text/measure/util.js.map +1 -1
  434. package/es/graphics/text/stringWidth.js +7 -3
  435. package/es/graphics/text/stringWidth.js.map +1 -1
  436. package/es/index.d.ts +6 -0
  437. package/es/index.js +15 -1
  438. package/es/index.js.map +1 -1
  439. package/es/logger.js +12 -1
  440. package/es/logger.js.map +1 -1
  441. package/es/lru.js +14 -6
  442. package/es/lru.js.map +1 -1
  443. package/es/math.d.ts +9 -0
  444. package/es/math.js +10 -1
  445. package/es/math.js.map +1 -1
  446. package/es/padding.d.ts +5 -0
  447. package/es/padding.js +5 -1
  448. package/es/padding.js.map +1 -1
  449. package/es/time/formatUtils.d.ts +6 -0
  450. package/es/time/formatUtils.js +7 -1
  451. package/es/time/formatUtils.js.map +1 -1
  452. package/package.json +4 -3
@@ -1,20 +1,43 @@
1
1
  "use strict";
2
2
 
3
- Object.defineProperty(exports, "__esModule", {
3
+ /**
4
+ * @description 处理数值相关的方法
5
+ */ Object.defineProperty(exports, "__esModule", {
4
6
  value: !0
5
7
  }), exports.isLess = exports.isGreater = exports.isNumberClose = void 0;
6
8
 
7
9
  const DEFAULT_ABSOLUTE_TOLERATE = 1e-10, DEFAULT_RELATIVE_TOLERATE = 1e-10;
8
10
 
11
+ /**
12
+ * 判断两数是否接近相等,函数参数参照 python isClose 方法
13
+ * @param {number} a
14
+ * @param {number} b
15
+ * @param refTol 指定的相对容差比例,将乘以两数的最大值作为相对容差
16
+ * @param absTol 指定的绝对容差
17
+ */
9
18
  function isNumberClose(a, b, relTol = DEFAULT_RELATIVE_TOLERATE, absTol = DEFAULT_ABSOLUTE_TOLERATE) {
10
19
  const abs = absTol, rel = relTol * Math.max(a, b);
11
20
  return Math.abs(a - b) <= Math.max(abs, rel);
12
21
  }
13
22
 
23
+ /**
24
+ * 判断 a 是否大于 b,并排除容差范围
25
+ * @param a
26
+ * @param b
27
+ * @param relTol 指定的相对容差比例,将乘以两数的最大值作为相对容差
28
+ * @param absTol 指定的绝对容差
29
+ */
14
30
  function isGreater(a, b, relTol, absTol) {
15
31
  return a > b && !isNumberClose(a, b, relTol, absTol);
16
32
  }
17
33
 
34
+ /**
35
+ * 判断 a 是否小于 b,并排除容差范围
36
+ * @param a
37
+ * @param b
38
+ * @param relTol 指定的相对容差比例,将乘以两数的最大值作为相对容差
39
+ * @param absTol 指定的绝对容差
40
+ */
18
41
  function isLess(a, b, relTol, absTol) {
19
42
  return a < b && !isNumberClose(a, b, relTol, absTol);
20
43
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/number.ts"],"names":[],"mappings":";;;AAIA,MAAM,yBAAyB,GAAG,KAAK,CAAC;AACxC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AASxC,SAAgB,aAAa,CAC3B,CAAS,EACT,CAAS,EACT,SAAiB,yBAAyB,EAC1C,SAAiB,yBAAyB;IAE1C,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,MAAM,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AATD,sCASC;AASD,SAAgB,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,MAAe,EAAE,MAAe;IAC9E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAFD,8BAEC;AASD,SAAgB,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,MAAe,EAAE,MAAe;IAC3E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAFD,wBAEC","file":"number.js","sourcesContent":["/**\n * @description 处理数值相关的方法\n */\n\nconst DEFAULT_ABSOLUTE_TOLERATE = 1e-10;\nconst DEFAULT_RELATIVE_TOLERATE = 1e-10;\n\n/**\n * 判断两数是否接近相等,函数参数参照 python isClose 方法\n * @param {number} a\n * @param {number} b\n * @param refTol 指定的相对容差比例,将乘以两数的最大值作为相对容差\n * @param absTol 指定的绝对容差\n */\nexport function isNumberClose(\n a: number,\n b: number,\n relTol: number = DEFAULT_RELATIVE_TOLERATE,\n absTol: number = DEFAULT_ABSOLUTE_TOLERATE\n) {\n const abs = absTol;\n const rel = relTol * Math.max(a, b);\n return Math.abs(a - b) <= Math.max(abs, rel);\n}\n\n/**\n * 判断 a 是否大于 b,并排除容差范围\n * @param a\n * @param b\n * @param relTol 指定的相对容差比例,将乘以两数的最大值作为相对容差\n * @param absTol 指定的绝对容差\n */\nexport function isGreater(a: number, b: number, relTol?: number, absTol?: number) {\n return a > b && !isNumberClose(a, b, relTol, absTol);\n}\n\n/**\n * 判断 a 是否小于 b,并排除容差范围\n * @param a\n * @param b\n * @param relTol 指定的相对容差比例,将乘以两数的最大值作为相对容差\n * @param absTol 指定的绝对容差\n */\nexport function isLess(a: number, b: number, relTol?: number, absTol?: number) {\n return a < b && !isNumberClose(a, b, relTol, absTol);\n}\n"]}
1
+ {"version":3,"sources":["../src/common/number.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,MAAM,yBAAyB,GAAG,KAAK,CAAC;AACxC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAExC;;;;;;GAMG;AACH,SAAgB,aAAa,CAC3B,CAAS,EACT,CAAS,EACT,SAAiB,yBAAyB,EAC1C,SAAiB,yBAAyB;IAE1C,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,MAAM,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AATD,sCASC;AAED;;;;;;GAMG;AACH,SAAgB,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,MAAe,EAAE,MAAe;IAC9E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAFD,8BAEC;AAED;;;;;;GAMG;AACH,SAAgB,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,MAAe,EAAE,MAAe;IAC3E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAFD,wBAEC","file":"number.js","sourcesContent":["/**\n * @description 处理数值相关的方法\n */\n\nconst DEFAULT_ABSOLUTE_TOLERATE = 1e-10;\nconst DEFAULT_RELATIVE_TOLERATE = 1e-10;\n\n/**\n * 判断两数是否接近相等,函数参数参照 python isClose 方法\n * @param {number} a\n * @param {number} b\n * @param refTol 指定的相对容差比例,将乘以两数的最大值作为相对容差\n * @param absTol 指定的绝对容差\n */\nexport function isNumberClose(\n a: number,\n b: number,\n relTol: number = DEFAULT_RELATIVE_TOLERATE,\n absTol: number = DEFAULT_ABSOLUTE_TOLERATE\n) {\n const abs = absTol;\n const rel = relTol * Math.max(a, b);\n return Math.abs(a - b) <= Math.max(abs, rel);\n}\n\n/**\n * 判断 a 是否大于 b,并排除容差范围\n * @param a\n * @param b\n * @param relTol 指定的相对容差比例,将乘以两数的最大值作为相对容差\n * @param absTol 指定的绝对容差\n */\nexport function isGreater(a: number, b: number, relTol?: number, absTol?: number) {\n return a > b && !isNumberClose(a, b, relTol, absTol);\n}\n\n/**\n * 判断 a 是否小于 b,并排除容差范围\n * @param a\n * @param b\n * @param relTol 指定的相对容差比例,将乘以两数的最大值作为相对容差\n * @param absTol 指定的绝对容差\n */\nexport function isLess(a: number, b: number, relTol?: number, absTol?: number) {\n return a < b && !isNumberClose(a, b, relTol, absTol);\n}\n"]}
@@ -1,2 +1,23 @@
1
+ /**
2
+ * Pads `string` on the left and right, left or right sides if it's shorter than `length`.
3
+ * Padding characters are truncated if they can't be evenly divided by `length`.
4
+ *
5
+ * @since 3.0.0
6
+ * @category String
7
+ * @param {string} [string=''] The string to pad.
8
+ * @param {number} [length=0] The padding length.
9
+ * @param {string} [chars=' '] The string used as padding.
10
+ * @returns {string} Returns the padded string.
11
+ * @example
12
+ *
13
+ * pad('abc', 8)
14
+ * // => ' abc '
15
+ *
16
+ * pad('abc', 8, '_-')
17
+ * // => '_-abc_-_'
18
+ *
19
+ * pad('abc', 2)
20
+ * // => 'abc'
21
+ */
1
22
  declare const pad: (str: string | number, length: number, padChar?: string, align?: string) => string;
2
23
  export default pad;
package/cjs/common/pad.js CHANGED
@@ -13,5 +13,25 @@ const repeat = (str, repeatCount = 0) => {
13
13
  return n <= 0 ? s : "left" === align ? repeat(c, n) + s : "center" === align ? repeat(c, Math.floor(n / 2)) + s + repeat(c, Math.ceil(n / 2)) : s + repeat(c, n);
14
14
  };
15
15
 
16
- exports.default = pad;
16
+ /**
17
+ * Pads `string` on the left and right, left or right sides if it's shorter than `length`.
18
+ * Padding characters are truncated if they can't be evenly divided by `length`.
19
+ *
20
+ * @since 3.0.0
21
+ * @category String
22
+ * @param {string} [string=''] The string to pad.
23
+ * @param {number} [length=0] The padding length.
24
+ * @param {string} [chars=' '] The string used as padding.
25
+ * @returns {string} Returns the padded string.
26
+ * @example
27
+ *
28
+ * pad('abc', 8)
29
+ * // => ' abc '
30
+ *
31
+ * pad('abc', 8, '_-')
32
+ * // => '_-abc_-_'
33
+ *
34
+ * pad('abc', 2)
35
+ * // => 'abc'
36
+ */ exports.default = pad;
17
37
  //# sourceMappingURL=pad.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/pad.ts"],"names":[],"mappings":";;AAAA,MAAM,MAAM,GAAG,CAAC,GAAoB,EAAE,cAAsB,CAAC,EAAE,EAAE;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,EAAE;QACb,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QACjB,CAAC,IAAI,CAAC,CAAC;KACR;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAuBF,MAAM,GAAG,GAAG,CAAC,GAAoB,EAAE,MAAc,EAAE,UAAkB,GAAG,EAAE,QAAgB,OAAO,EAAE,EAAE;IACnG,MAAM,CAAC,GAAG,OAAO,CAAC;IAClB,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;IACnB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAE5B,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,OAAO,CAAC,CAAC;KACV;IAED,IAAI,KAAK,KAAK,MAAM,EAAE;QACpB,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;KACzB;IAED,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC,CAAC;AAEF,kBAAe,GAAG,CAAC","file":"pad.js","sourcesContent":["const repeat = (str: string | number, repeatCount: number = 0) => {\n let s = '';\n let i = repeatCount - 1;\n while (i >= 0) {\n s = `${s}${str}`;\n i -= 1;\n }\n return s;\n};\n\n/**\n * Pads `string` on the left and right, left or right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * pad('abc', 8)\n * // => ' abc '\n *\n * pad('abc', 8, '_-')\n * // => '_-abc_-_'\n *\n * pad('abc', 2)\n * // => 'abc'\n */\nconst pad = (str: string | number, length: number, padChar: string = ' ', align: string = 'right') => {\n const c = padChar;\n const s = str + '';\n const n = length - s.length;\n\n if (n <= 0) {\n return s;\n }\n\n if (align === 'left') {\n return repeat(c, n) + s;\n }\n\n return align === 'center' ? repeat(c, Math.floor(n / 2)) + s + repeat(c, Math.ceil(n / 2)) : s + repeat(c, n);\n};\n\nexport default pad;\n"]}
1
+ {"version":3,"sources":["../src/common/pad.ts"],"names":[],"mappings":";;AAAA,MAAM,MAAM,GAAG,CAAC,GAAoB,EAAE,cAAsB,CAAC,EAAE,EAAE;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,EAAE;QACb,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QACjB,CAAC,IAAI,CAAC,CAAC;KACR;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,GAAG,GAAG,CAAC,GAAoB,EAAE,MAAc,EAAE,UAAkB,GAAG,EAAE,QAAgB,OAAO,EAAE,EAAE;IACnG,MAAM,CAAC,GAAG,OAAO,CAAC;IAClB,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;IACnB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAE5B,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,OAAO,CAAC,CAAC;KACV;IAED,IAAI,KAAK,KAAK,MAAM,EAAE;QACpB,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;KACzB;IAED,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC,CAAC;AAEF,kBAAe,GAAG,CAAC","file":"pad.js","sourcesContent":["const repeat = (str: string | number, repeatCount: number = 0) => {\n let s = '';\n let i = repeatCount - 1;\n while (i >= 0) {\n s = `${s}${str}`;\n i -= 1;\n }\n return s;\n};\n\n/**\n * Pads `string` on the left and right, left or right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * pad('abc', 8)\n * // => ' abc '\n *\n * pad('abc', 8, '_-')\n * // => '_-abc_-_'\n *\n * pad('abc', 2)\n * // => 'abc'\n */\nconst pad = (str: string | number, length: number, padChar: string = ' ', align: string = 'right') => {\n const c = padChar;\n const s = str + '';\n const n = length - s.length;\n\n if (n <= 0) {\n return s;\n }\n\n if (align === 'left') {\n return repeat(c, n) + s;\n }\n\n return align === 'center' ? repeat(c, Math.floor(n / 2)) + s + repeat(c, Math.ceil(n / 2)) : s + repeat(c, n);\n};\n\nexport default pad;\n"]}
@@ -1,3 +1,6 @@
1
1
  export declare function seedRandom(seed: number): number;
2
2
  export declare function randomLCG(initS?: number): () => number;
3
+ /**
4
+ * 随机拟合
5
+ */
3
6
  export declare const fakeRandom: () => () => number;
@@ -8,8 +8,18 @@ Object.defineProperty(exports, "__esModule", {
8
8
  value: !0
9
9
  }), exports.fakeRandom = exports.randomLCG = exports.seedRandom = void 0, exports.seedRandom = seedRandom;
10
10
 
11
+ /* Adapted from vega by University of Washington Interactive Data Lab
12
+ * https://vega.github.io/vega/
13
+ * Licensed under the BSD-3-Clause
14
+
15
+ * url: https://github.com/vega/vega/blob/main/packages/vega-statistics/src/lcg.js
16
+ * License: https://github.com/vega/vega/blob/main/LICENSE
17
+ * @license
18
+ */
19
+ // https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use
11
20
  const a = 1664525, c = 1013904223, m = 4294967296;
12
21
 
22
+ // 2^32
13
23
  function randomLCG(initS = 1) {
14
24
  let s = initS;
15
25
  return () => (s = (a * s + c) % m) / m;
@@ -17,6 +27,9 @@ function randomLCG(initS = 1) {
17
27
 
18
28
  exports.randomLCG = randomLCG;
19
29
 
30
+ /**
31
+ * 随机拟合
32
+ */
20
33
  const fakeRandom = () => {
21
34
  let i = -1;
22
35
  const arr = [ 0, .1, .2, .3, .4, .5, .6, .7, .8, .9 ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/random.ts"],"names":[],"mappings":";;;AAAA,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAFD,gCAEC;AAYD,MAAM,CAAC,GAAG,OAAO,CAAC;AAClB,MAAM,CAAC,GAAG,UAAU,CAAC;AACrB,MAAM,CAAC,GAAG,UAAU,CAAC;AAErB,SAAgB,SAAS,CAAC,QAAgB,CAAC;IACzC,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAHD,8BAGC;AAKM,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACX,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,UAAU,cAOrB","file":"random.js","sourcesContent":["export function seedRandom(seed: number) {\n return parseFloat('0.' + Math.sin(seed).toString().substring(6));\n}\n\n/* Adapted from vega by University of Washington Interactive Data Lab\n * https://vega.github.io/vega/\n * Licensed under the BSD-3-Clause\n\n * url: https://github.com/vega/vega/blob/main/packages/vega-statistics/src/lcg.js\n * License: https://github.com/vega/vega/blob/main/LICENSE\n * @license\n */\n\n// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport function randomLCG(initS: number = 1) {\n let s = initS;\n return () => (s = (a * s + c) % m) / m;\n}\n\n/**\n * 随机拟合\n */\nexport const fakeRandom = () => {\n let i = -1;\n const arr = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9];\n return () => {\n i = (i + 1) % arr.length;\n return arr[i];\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/common/random.ts"],"names":[],"mappings":";;;AAAA,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAFD,gCAEC;AAED;;;;;;;GAOG;AAEH,uFAAuF;AACvF,MAAM,CAAC,GAAG,OAAO,CAAC;AAClB,MAAM,CAAC,GAAG,UAAU,CAAC;AACrB,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,OAAO;AAE7B,SAAgB,SAAS,CAAC,QAAgB,CAAC;IACzC,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAHD,8BAGC;AAED;;GAEG;AACI,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACX,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,GAAG,EAAE;QACV,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,UAAU,cAOrB","file":"random.js","sourcesContent":["export function seedRandom(seed: number) {\n return parseFloat('0.' + Math.sin(seed).toString().substring(6));\n}\n\n/* Adapted from vega by University of Washington Interactive Data Lab\n * https://vega.github.io/vega/\n * Licensed under the BSD-3-Clause\n\n * url: https://github.com/vega/vega/blob/main/packages/vega-statistics/src/lcg.js\n * License: https://github.com/vega/vega/blob/main/LICENSE\n * @license\n */\n\n// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport function randomLCG(initS: number = 1) {\n let s = initS;\n return () => (s = (a * s + c) % m) / m;\n}\n\n/**\n * 随机拟合\n */\nexport const fakeRandom = () => {\n let i = -1;\n const arr = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9];\n return () => {\n i = (i + 1) % arr.length;\n return arr[i];\n };\n};\n"]}
@@ -0,0 +1,14 @@
1
+ import { type RegressionPoint } from './regression-solver';
2
+ /** 成对 percentile bootstrap;每次重采样仅拟合一次,固定原始坐标基底。 */
3
+ export declare function regressionBootstrap(data: readonly RegressionPoint[], options: {
4
+ method: 'linear' | 'polynomial';
5
+ degree?: number;
6
+ grid: readonly number[];
7
+ level: number;
8
+ resamples: number;
9
+ seed: number;
10
+ }): {
11
+ x: number;
12
+ lower: number;
13
+ upper: number;
14
+ }[];
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.regressionBootstrap = void 0;
6
+
7
+ const random_1 = require("./random"), quantileSorted_1 = require("./quantileSorted"), regression_solver_1 = require("./regression-solver");
8
+
9
+ /** 成对 percentile bootstrap;每次重采样仅拟合一次,固定原始坐标基底。 */
10
+ function regressionBootstrap(data, options) {
11
+ var _a;
12
+ const degree = "linear" === options.method ? 1 : null !== (_a = options.degree) && void 0 !== _a ? _a : NaN;
13
+ if ("linear" !== options.method && "polynomial" !== options.method || !Number.isInteger(degree) || degree < 1 || !data.length || data.some((p => !Number.isFinite(p.x) || !Number.isFinite(p.y))) || options.grid.some((x => !Number.isFinite(x))) || !(options.level > 0 && options.level < 1) || !Number.isInteger(options.resamples) || options.resamples < 1 || !Number.isInteger(options.seed) || options.seed < 0 || options.seed > 4294967295) throw new RangeError("Invalid paired regression bootstrap inputs");
14
+ if (data.length <= degree + 1) throw new RangeError("Regression bootstrap requires positive residual degrees of freedom");
15
+ const sorted = data.slice().sort(((a, b) => a.x - b.x || a.y - b.y)), basis = (0,
16
+ regression_solver_1.regressionBasis)(sorted);
17
+ if ((0, regression_solver_1.fitRegression)(sorted, degree, basis).rank < degree + 1) throw new RangeError("Original regression design is rank deficient");
18
+ const random = (0, random_1.randomLCG)(options.seed), sample = new Array(sorted.length), values = options.grid.map((() => new Array(options.resamples)));
19
+ for (let b = 0; b < options.resamples; b++) {
20
+ for (let i = 0; i < sample.length; i++) sample[i] = sorted[Math.floor(random() * sorted.length)];
21
+ const model = (0, regression_solver_1.fitRegression)(sample, degree, basis);
22
+ for (let j = 0; j < options.grid.length; j++) {
23
+ const value = (0, regression_solver_1.regressionPrediction)(model, options.grid[j]);
24
+ if (!Number.isFinite(value)) throw new RangeError("Regression bootstrap prediction is not finite");
25
+ values[j][b] = value;
26
+ }
27
+ }
28
+ const tail = (1 - options.level) / 2;
29
+ return options.grid.map(((x, j) => (values[j].sort(((a, b) => a - b)), {
30
+ x: x,
31
+ lower: (0, quantileSorted_1.quantileSorted)(values[j], tail),
32
+ upper: (0, quantileSorted_1.quantileSorted)(values[j], 1 - tail)
33
+ })));
34
+ }
35
+
36
+ exports.regressionBootstrap = regressionBootstrap;
37
+ //# sourceMappingURL=regression-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/common/regression-bootstrap.ts"],"names":[],"mappings":"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","file":"regression-bootstrap.js","sourcesContent":["import { randomLCG } from './random';\nimport { quantileSorted } from './quantileSorted';\nimport { fitRegression, regressionBasis, regressionPrediction, type RegressionPoint } from './regression-solver';\n\n/** 成对 percentile bootstrap;每次重采样仅拟合一次,固定原始坐标基底。 */\nexport function regressionBootstrap(\n data: readonly RegressionPoint[],\n options: {\n method: 'linear' | 'polynomial';\n degree?: number;\n grid: readonly number[];\n level: number;\n resamples: number;\n seed: number;\n }\n) {\n const degree = options.method === 'linear' ? 1 : options.degree ?? NaN;\n if (\n (options.method !== 'linear' && options.method !== 'polynomial') ||\n !Number.isInteger(degree) ||\n degree < 1 ||\n !data.length ||\n data.some(p => !Number.isFinite(p.x) || !Number.isFinite(p.y)) ||\n options.grid.some(x => !Number.isFinite(x)) ||\n !(options.level > 0 && options.level < 1) ||\n !Number.isInteger(options.resamples) ||\n options.resamples < 1 ||\n !Number.isInteger(options.seed) ||\n options.seed < 0 ||\n options.seed > 0xffffffff\n ) {\n throw new RangeError('Invalid paired regression bootstrap inputs');\n }\n if (data.length <= degree + 1) {\n throw new RangeError('Regression bootstrap requires positive residual degrees of freedom');\n }\n const sorted = data.slice().sort((a, b) => a.x - b.x || a.y - b.y);\n const basis = regressionBasis(sorted);\n if (fitRegression(sorted, degree, basis).rank < degree + 1) {\n throw new RangeError('Original regression design is rank deficient');\n }\n const random = randomLCG(options.seed);\n const sample = new Array<RegressionPoint>(sorted.length);\n const values = options.grid.map(() => new Array<number>(options.resamples));\n for (let b = 0; b < options.resamples; b++) {\n for (let i = 0; i < sample.length; i++) {\n sample[i] = sorted[Math.floor(random() * sorted.length)];\n }\n const model = fitRegression(sample, degree, basis);\n for (let j = 0; j < options.grid.length; j++) {\n const value = regressionPrediction(model, options.grid[j]);\n if (!Number.isFinite(value)) {\n throw new RangeError('Regression bootstrap prediction is not finite');\n }\n values[j][b] = value;\n }\n }\n const tail = (1 - options.level) / 2;\n return options.grid.map((x, j) => {\n values[j].sort((a, b) => a - b);\n return { x, lower: quantileSorted(values[j], tail), upper: quantileSorted(values[j], 1 - tail) };\n });\n}\n"]}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Linear regression utilities (single clean implementation).
3
+ * Exports: ordinaryLeastSquares, visitPoints, rSquared, regressionLinear
4
+ */
1
5
  export declare function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number): {
2
6
  a: number;
3
7
  b: number;
@@ -11,6 +15,7 @@ export declare function regressionLinear(data: any[], x?: (d: any) => number, y?
11
15
  a: number;
12
16
  b: number;
13
17
  };
18
+ rank: number;
14
19
  predict: (xx: number) => number;
15
20
  rSquared: number;
16
21
  evaluateGrid: (N: number) => {
@@ -10,8 +10,12 @@ Object.defineProperty(exports, "__esModule", {
10
10
  value: !0
11
11
  }), exports.regressionLinear = exports.rSquared = exports.visitPoints = exports.ordinaryLeastSquares = void 0;
12
12
 
13
- const isNil_1 = __importDefault(require("./isNil")), regression_utils_1 = require("./regression-utils");
13
+ const isNil_1 = __importDefault(require("./isNil")), regression_solver_1 = require("./regression-solver"), regression_utils_1 = require("./regression-utils");
14
14
 
15
+ /**
16
+ * Linear regression utilities (single clean implementation).
17
+ * Exports: ordinaryLeastSquares, visitPoints, rSquared, regressionLinear
18
+ */
15
19
  function ordinaryLeastSquares(uX, uY, uXY, uX2) {
16
20
  const denom = uX2 - uX * uX;
17
21
  if (Math.abs(denom) < Number.EPSILON) return {
@@ -50,68 +54,53 @@ function rSquared(data, x, y, uY, predict) {
50
54
 
51
55
  function regressionLinear(data, x = (d => d.x), y = (d => d.y), options) {
52
56
  var _a;
53
- const alpha = null !== (_a = null == options ? void 0 : options.alpha) && void 0 !== _a ? _a : .05;
54
- let n = 0, meanX = 0, meanY = 0, meanXY = 0, meanX2 = 0;
55
- visitPoints(data, x, y, ((xi, yi) => {
56
- n++, meanX += (xi - meanX) / n, meanY += (yi - meanY) / n, meanXY += (xi * yi - meanXY) / n,
57
- meanX2 += (xi * xi - meanX2) / n;
58
- }));
59
- const {a: a, b: b} = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2), predict = xx => a + b * xx, comps = (0,
60
- regression_utils_1.computeLinearCIComponents)(data, x, y, predict);
61
- return {
57
+ const alpha = null !== (_a = null == options ? void 0 : options.alpha) && void 0 !== _a ? _a : .05, points = (0,
58
+ regression_solver_1.regressionPoints)(data, x, y), model = (0, regression_solver_1.fitRegression)(points, 1), coef = (0,
59
+ regression_solver_1.regressionCoefficients)(model), a = coef[0], b = coef[1], predict = xx => (0,
60
+ regression_solver_1.regressionPrediction)(model, xx), comps = (0, regression_utils_1.computeLinearCIComponents)(data, x, y, predict);
61
+ let meanY = 0;
62
+ return points.forEach(((p, i) => {
63
+ meanY += (p.y - meanY) / (i + 1);
64
+ })), {
62
65
  coef: {
63
66
  a: a,
64
67
  b: b
65
68
  },
69
+ rank: model.rank,
66
70
  predict: predict,
67
71
  rSquared: rSquared(data, x, y, meanY, predict),
68
72
  evaluateGrid: function(N) {
69
- const out = [];
70
- if (0 === comps.n || N <= 0) return out;
71
- if (comps.min === comps.max) {
72
- for (let i = 0; i < N; i++) out.push({
73
- x: comps.min,
74
- y: predict(comps.min)
75
- });
76
- return out;
77
- }
78
- const step = (comps.max - comps.min) / (N - 1);
79
- for (let i = 0; i < N; i++) {
80
- const px = i === N - 1 ? comps.max : comps.min + step * i;
81
- out.push({
82
- x: px,
83
- y: predict(px)
84
- });
85
- }
86
- return out;
73
+ return (0, regression_solver_1.regressionGrid)(comps.min, comps.max, N, predict);
87
74
  },
88
75
  confidenceInterval: function(N = 50) {
89
76
  const out = [];
90
77
  if (0 === comps.n || N <= 0) return out;
91
- const z = (0, regression_utils_1.invNorm)(1 - alpha / 2);
78
+ const z = (0, regression_utils_1.confidenceCriticalValue)(alpha);
92
79
  if (comps.min === comps.max) {
93
- const m = predict(comps.min), errs = (0, regression_utils_1.stdErrorsAt)(comps.min, comps);
80
+ const m = predict(comps.min), errs = (0, regression_utils_1.stdErrorsAt)(comps.min, comps), meanHalfWidth = (0,
81
+ regression_utils_1.confidenceHalfWidth)(z, errs.seMean), predHalfWidth = (0, regression_utils_1.confidenceHalfWidth)(z, errs.sePred);
94
82
  for (let i = 0; i < N; i++) out.push({
95
83
  x: comps.min,
96
84
  mean: m,
97
- lower: m - z * errs.seMean,
98
- upper: m + z * errs.seMean,
99
- predLower: m - z * errs.sePred,
100
- predUpper: m + z * errs.sePred
85
+ lower: m - meanHalfWidth,
86
+ upper: m + meanHalfWidth,
87
+ predLower: m - predHalfWidth,
88
+ predUpper: m + predHalfWidth
101
89
  });
102
90
  return out;
103
91
  }
104
92
  const step = (comps.max - comps.min) / (N - 1);
105
93
  for (let i = 0; i < N; i++) {
106
94
  const px = i === N - 1 ? comps.max : comps.min + step * i, m = predict(px), errs = (0,
107
- regression_utils_1.stdErrorsAt)(px, comps);
95
+ regression_utils_1.stdErrorsAt)(px, comps), meanHalfWidth = (0, regression_utils_1.confidenceHalfWidth)(z, errs.seMean), predHalfWidth = (0,
96
+ regression_utils_1.confidenceHalfWidth)(z, errs.sePred);
108
97
  out.push({
109
98
  x: px,
110
99
  mean: m,
111
- lower: m - z * errs.seMean,
112
- upper: m + z * errs.seMean,
113
- predLower: m - z * errs.sePred,
114
- predUpper: m + z * errs.sePred
100
+ lower: m - meanHalfWidth,
101
+ upper: m + meanHalfWidth,
102
+ predLower: m - predHalfWidth,
103
+ predUpper: m + predHalfWidth
115
104
  });
116
105
  }
117
106
  return out;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-linear.ts"],"names":[],"mappings":"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","file":"regression-linear.js","sourcesContent":["import isNil from './isNil';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\n/**\n * Linear regression utilities (single clean implementation).\n * Exports: ordinaryLeastSquares, visitPoints, rSquared, regressionLinear\n */\n\nexport function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number) {\n const denom = uX2 - uX * uX;\n if (Math.abs(denom) < Number.EPSILON) {\n return { a: uY, b: 0 };\n }\n const b = (uXY - uX * uY) / denom;\n const a = uY - b * uX;\n return { a, b };\n}\n\nexport function visitPoints(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n callback: (x: number, y: number, index: number) => void\n) {\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let xi = x(d);\n let yi = y(d);\n if (!isNil(xi) && (xi = +xi) >= xi && !isNil(yi) && (yi = +yi) >= yi) {\n callback(xi, yi, i);\n }\n }\n}\n\nexport function rSquared(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n uY: number,\n predict: (x: number) => number\n) {\n let ssr = 0;\n let sst = 0;\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let yi = y(d);\n if (!isNil(yi) && (yi = +yi) >= yi) {\n const p = predict(x(d));\n const r = yi - p;\n ssr += r * r;\n const t = yi - uY;\n sst += t * t;\n }\n }\n return sst === 0 ? 0 : 1 - ssr / sst;\n}\n\nexport function regressionLinear(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options?: {\n alpha?: number;\n }\n) {\n const alpha = options?.alpha ?? 0.05;\n // accumulate online means (sufficient statistics)\n let n = 0;\n let meanX = 0;\n let meanY = 0;\n let meanXY = 0;\n let meanX2 = 0;\n\n visitPoints(data, x, y, (xi, yi) => {\n n++;\n meanX += (xi - meanX) / n;\n meanY += (yi - meanY) / n;\n meanXY += (xi * yi - meanXY) / n;\n meanX2 += (xi * xi - meanX2) / n;\n });\n\n const { a, b } = ordinaryLeastSquares(meanX, meanY, meanXY, meanX2);\n const predict = (xx: number) => a + b * xx;\n\n const comps = computeLinearCIComponents(data, x, y, predict);\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (comps.n === 0 || N <= 0) {\n return out;\n }\n if (comps.min === comps.max) {\n for (let i = 0; i < N; i++) {\n out.push({ x: comps.min, y: predict(comps.min) });\n }\n return out;\n }\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n out.push({ x: px, y: predict(px) });\n }\n return out;\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n if (comps.n === 0 || N <= 0) {\n return out;\n }\n const z = invNorm(1 - alpha / 2);\n if (comps.min === comps.max) {\n const m = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: m,\n lower: m - z * errs.seMean,\n upper: m + z * errs.seMean,\n predLower: m - z * errs.sePred,\n predUpper: m + z * errs.sePred\n });\n }\n return out;\n }\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const m = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: m,\n lower: m - z * errs.seMean,\n upper: m + z * errs.seMean,\n predLower: m - z * errs.sePred,\n predUpper: m + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n coef: { a, b },\n predict,\n rSquared: rSquared(data, x, y, meanY, predict),\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default {\n ordinaryLeastSquares,\n visitPoints,\n rSquared,\n regressionLinear\n};\n"]}
1
+ {"version":3,"sources":["../src/common/regression-linear.ts"],"names":[],"mappings":"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","file":"regression-linear.js","sourcesContent":["import isNil from './isNil';\nimport {\n regressionPoints,\n fitRegression,\n regressionPrediction,\n regressionCoefficients,\n regressionGrid\n} from './regression-solver';\nimport {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} from './regression-utils';\n\n/**\n * Linear regression utilities (single clean implementation).\n * Exports: ordinaryLeastSquares, visitPoints, rSquared, regressionLinear\n */\n\nexport function ordinaryLeastSquares(uX: number, uY: number, uXY: number, uX2: number) {\n const denom = uX2 - uX * uX;\n if (Math.abs(denom) < Number.EPSILON) {\n return { a: uY, b: 0 };\n }\n const b = (uXY - uX * uY) / denom;\n const a = uY - b * uX;\n return { a, b };\n}\n\nexport function visitPoints(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n callback: (x: number, y: number, index: number) => void\n) {\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let xi = x(d);\n let yi = y(d);\n if (!isNil(xi) && (xi = +xi) >= xi && !isNil(yi) && (yi = +yi) >= yi) {\n callback(xi, yi, i);\n }\n }\n}\n\nexport function rSquared(\n data: any[],\n x: (d: any) => number,\n y: (d: any) => number,\n uY: number,\n predict: (x: number) => number\n) {\n let ssr = 0;\n let sst = 0;\n for (let i = 0; i < data.length; i++) {\n const d = data[i];\n let yi = y(d);\n if (!isNil(yi) && (yi = +yi) >= yi) {\n const p = predict(x(d));\n const r = yi - p;\n ssr += r * r;\n const t = yi - uY;\n sst += t * t;\n }\n }\n return sst === 0 ? 0 : 1 - ssr / sst;\n}\n\nexport function regressionLinear(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options?: {\n alpha?: number;\n }\n) {\n const alpha = options?.alpha ?? 0.05;\n const points = regressionPoints(data, x, y);\n const model = fitRegression(points, 1);\n const coef = regressionCoefficients(model);\n const a = coef[0];\n const b = coef[1];\n const predict = (xx: number) => regressionPrediction(model, xx);\n const comps = computeLinearCIComponents(data, x, y, predict);\n let meanY = 0;\n points.forEach((p, i) => {\n meanY += (p.y - meanY) / (i + 1);\n });\n\n function evaluateGrid(N: number) {\n return regressionGrid(comps.min, comps.max, N, predict);\n }\n\n function confidenceInterval(N: number = 50) {\n const out: { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[] = [];\n if (comps.n === 0 || N <= 0) {\n return out;\n }\n const z = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const m = predict(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: m,\n lower: m - meanHalfWidth,\n upper: m + meanHalfWidth,\n predLower: m - predHalfWidth,\n predUpper: m + predHalfWidth\n });\n }\n return out;\n }\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const m = predict(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: m,\n lower: m - meanHalfWidth,\n upper: m + meanHalfWidth,\n predLower: m - predHalfWidth,\n predUpper: m + predHalfWidth\n });\n }\n return out;\n }\n\n return {\n coef: { a, b },\n rank: model.rank,\n predict,\n rSquared: rSquared(data, x, y, meanY, predict),\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default {\n ordinaryLeastSquares,\n visitPoints,\n rSquared,\n regressionLinear\n};\n"]}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Simple logistic regression (binary) using Newton-Raphson (IRLS).
3
+ * Returns { coef, predict, evaluateGrid }
4
+ * - coef: [intercept, beta]
5
+ * - predict(x): probability p(y=1|x)
6
+ */
1
7
  export declare function regressionLogistic(data: any[], x?: (d: any) => number, y?: (d: any) => number, options?: {
2
8
  maxIteration?: number;
3
9
  tol?: number;
@@ -6,6 +6,12 @@ Object.defineProperty(exports, "__esModule", {
6
6
 
7
7
  const regression_linear_1 = require("./regression-linear"), regression_utils_1 = require("./regression-utils");
8
8
 
9
+ /**
10
+ * Simple logistic regression (binary) using Newton-Raphson (IRLS).
11
+ * Returns { coef, predict, evaluateGrid }
12
+ * - coef: [intercept, beta]
13
+ * - predict(x): probability p(y=1|x)
14
+ */
9
15
  function regressionLogistic(data, x = (d => d.x), y = (d => d.y), options) {
10
16
  var _a, _b, _c;
11
17
  const maxIter = null !== (_a = null == options ? void 0 : options.maxIteration) && void 0 !== _a ? _a : 25, tol = null !== (_b = null == options ? void 0 : options.tol) && void 0 !== _b ? _b : 1e-6, alpha = null !== (_c = null == options ? void 0 : options.alpha) && void 0 !== _c ? _c : .05, xs = [], ys = [];
@@ -19,7 +25,8 @@ function regressionLogistic(data, x = (d => d.x), y = (d => d.y), options) {
19
25
  evaluateGrid: N => [],
20
26
  confidenceInterval: (N = 50) => []
21
27
  };
22
- let intercept = 0, beta = 0;
28
+ // initial coef via linear regression rough guess
29
+ let intercept = 0, beta = 0;
23
30
  for (let iter = 0; iter < maxIter; iter++) {
24
31
  const p = new Array(n);
25
32
  let converged = !0;
@@ -27,12 +34,14 @@ function regressionLogistic(data, x = (d => d.x), y = (d => d.y), options) {
27
34
  const z = intercept + beta * xs[i], pi = 1 / (1 + Math.exp(-z));
28
35
  p[i] = pi;
29
36
  }
30
- let g0 = 0, g1 = 0, h00 = 0, h01 = 0, h11 = 0;
37
+ // compute gradient and hessian
38
+ let g0 = 0, g1 = 0, h00 = 0, h01 = 0, h11 = 0;
31
39
  for (let i = 0; i < n; i++) {
32
40
  const wi = p[i] * (1 - p[i]), diff = ys[i] - p[i];
33
41
  g0 += diff, g1 += diff * xs[i], h00 += wi, h01 += wi * xs[i], h11 += wi * xs[i] * xs[i];
34
42
  }
35
- const det = h00 * h11 - h01 * h01;
43
+ // solve 2x2 system H * delta = g
44
+ const det = h00 * h11 - h01 * h01;
36
45
  if (Math.abs(det) < 1e-12) break;
37
46
  const delta0 = (h11 * g0 - h01 * g1) / det, delta1 = (-h01 * g0 + h00 * g1) / det;
38
47
  if (intercept += delta0, beta += delta1, (Math.abs(delta0) > tol || Math.abs(delta1) > tol) && (converged = !1),
@@ -75,30 +84,32 @@ function regressionLogistic(data, x = (d => d.x), y = (d => d.y), options) {
75
84
  if (N <= 0) return out;
76
85
  const comps = (0, regression_utils_1.computeLinearCIComponents)(data, x, y, predict);
77
86
  if (0 === comps.n) return out;
78
- const z = Math.abs((0, regression_utils_1.invNorm)(1 - alpha / 2));
87
+ const z = (0, regression_utils_1.confidenceCriticalValue)(alpha);
79
88
  if (comps.min === comps.max) {
80
- const v = predict(comps.min), errs = (0, regression_utils_1.stdErrorsAt)(comps.min, comps);
89
+ const v = predict(comps.min), errs = (0, regression_utils_1.stdErrorsAt)(comps.min, comps), meanHalfWidth = (0,
90
+ regression_utils_1.confidenceHalfWidth)(z, errs.seMean), predHalfWidth = (0, regression_utils_1.confidenceHalfWidth)(z, errs.sePred);
81
91
  for (let i = 0; i < N; i++) out.push({
82
92
  x: comps.min,
83
93
  mean: v,
84
- lower: v - z * errs.seMean,
85
- upper: v + z * errs.seMean,
86
- predLower: v - z * errs.sePred,
87
- predUpper: v + z * errs.sePred
94
+ lower: v - meanHalfWidth,
95
+ upper: v + meanHalfWidth,
96
+ predLower: v - predHalfWidth,
97
+ predUpper: v + predHalfWidth
88
98
  });
89
99
  return out;
90
100
  }
91
101
  const step = (comps.max - comps.min) / (N - 1);
92
102
  for (let i = 0; i < N; i++) {
93
103
  const px = i === N - 1 ? comps.max : comps.min + step * i, yh = predict(px), errs = (0,
94
- regression_utils_1.stdErrorsAt)(px, comps);
104
+ regression_utils_1.stdErrorsAt)(px, comps), meanHalfWidth = (0, regression_utils_1.confidenceHalfWidth)(z, errs.seMean), predHalfWidth = (0,
105
+ regression_utils_1.confidenceHalfWidth)(z, errs.sePred);
95
106
  out.push({
96
107
  x: px,
97
108
  mean: yh,
98
- lower: yh - z * errs.seMean,
99
- upper: yh + z * errs.seMean,
100
- predLower: yh - z * errs.sePred,
101
- predUpper: yh + z * errs.sePred
109
+ lower: yh - meanHalfWidth,
110
+ upper: yh + meanHalfWidth,
111
+ predLower: yh - predHalfWidth,
112
+ predUpper: yh + predHalfWidth
102
113
  });
103
114
  }
104
115
  return out;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/regression-logistic.ts"],"names":[],"mappings":"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","file":"regression-logistic.js","sourcesContent":["import { visitPoints } from './regression-linear';\nimport { computeLinearCIComponents, invNorm, stdErrorsAt } from './regression-utils';\n\n/**\n * Simple logistic regression (binary) using Newton-Raphson (IRLS).\n * Returns { coef, predict, evaluateGrid }\n * - coef: [intercept, beta]\n * - predict(x): probability p(y=1|x)\n */\nexport function regressionLogistic(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options?: { maxIteration?: number; tol?: number; alpha?: number }\n) {\n const maxIter = options?.maxIteration ?? 25;\n const tol = options?.tol ?? 1e-6;\n const alpha = options?.alpha ?? 0.05;\n // build arrays\n const xs: number[] = [];\n const ys: number[] = [];\n visitPoints(data, x, y, (dx, dy) => {\n xs.push(dx);\n ys.push(dy ? 1 : 0);\n });\n\n const n = xs.length;\n if (n === 0) {\n return {\n coef: [0, 0],\n predict: (_x: number) => 0,\n evaluateGrid: (N: number) => [] as { x: number; y: number }[],\n confidenceInterval: (N: number = 50) =>\n [] as { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[]\n };\n }\n\n // initial coef via linear regression rough guess\n let intercept = 0;\n let beta = 0;\n\n for (let iter = 0; iter < maxIter; iter++) {\n const p: number[] = new Array(n);\n let converged = true;\n for (let i = 0; i < n; i++) {\n const z = intercept + beta * xs[i];\n const pi = 1 / (1 + Math.exp(-z));\n p[i] = pi;\n }\n\n // compute gradient and hessian\n let g0 = 0;\n let g1 = 0;\n let h00 = 0;\n let h01 = 0;\n let h11 = 0;\n for (let i = 0; i < n; i++) {\n const wi = p[i] * (1 - p[i]);\n const diff = ys[i] - p[i];\n g0 += diff;\n g1 += diff * xs[i];\n h00 += wi;\n h01 += wi * xs[i];\n h11 += wi * xs[i] * xs[i];\n }\n\n // solve 2x2 system H * delta = g\n const det = h00 * h11 - h01 * h01;\n if (Math.abs(det) < 1e-12) {\n break;\n }\n const delta0 = (h11 * g0 - h01 * g1) / det;\n const delta1 = (-h01 * g0 + h00 * g1) / det;\n\n intercept += delta0;\n beta += delta1;\n\n if (Math.abs(delta0) > tol || Math.abs(delta1) > tol) {\n converged = false;\n }\n if (converged) {\n break;\n }\n }\n\n const predict = (xx: number) => {\n const z = intercept + beta * xx;\n return 1 / (1 + Math.exp(-z));\n };\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n let min = Infinity;\n let max = -Infinity;\n visitPoints(data, x, y, dx => {\n if (dx < min) {\n min = dx;\n }\n if (dx > max) {\n max = dx;\n }\n });\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n if (min === max) {\n const v = predict(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\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 out.push({ x: px, y: predict(px) });\n }\n return out;\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\n const comps = computeLinearCIComponents(data, x, y, predict);\n if (comps.n === 0) {\n return out;\n }\n\n const z = Math.abs(invNorm(1 - alpha / 2));\n if (comps.min === comps.max) {\n const v = predict(comps.min);\n const errs = stdErrorsAt(comps.min, comps);\n for (let i = 0; i < N; i++) {\n out.push({\n x: comps.min,\n mean: v,\n lower: v - z * errs.seMean,\n upper: v + z * errs.seMean,\n predLower: v - z * errs.sePred,\n predUpper: v + z * errs.sePred\n });\n }\n return out;\n }\n\n const step = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const yh = predict(px);\n const errs = stdErrorsAt(px, comps);\n out.push({\n x: px,\n mean: yh,\n lower: yh - z * errs.seMean,\n upper: yh + z * errs.seMean,\n predLower: yh - z * errs.sePred,\n predUpper: yh + z * errs.sePred\n });\n }\n return out;\n }\n\n return {\n coef: [intercept, beta],\n predict,\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default regressionLogistic;\n"]}
1
+ {"version":3,"sources":["../src/common/regression-logistic.ts"],"names":[],"mappings":"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","file":"regression-logistic.js","sourcesContent":["import { visitPoints } from './regression-linear';\nimport {\n computeLinearCIComponents,\n confidenceCriticalValue,\n confidenceHalfWidth,\n stdErrorsAt\n} from './regression-utils';\n\n/**\n * Simple logistic regression (binary) using Newton-Raphson (IRLS).\n * Returns { coef, predict, evaluateGrid }\n * - coef: [intercept, beta]\n * - predict(x): probability p(y=1|x)\n */\nexport function regressionLogistic(\n data: any[],\n x: (d: any) => number = d => d.x,\n y: (d: any) => number = d => d.y,\n options?: { maxIteration?: number; tol?: number; alpha?: number }\n) {\n const maxIter = options?.maxIteration ?? 25;\n const tol = options?.tol ?? 1e-6;\n const alpha = options?.alpha ?? 0.05;\n // build arrays\n const xs: number[] = [];\n const ys: number[] = [];\n visitPoints(data, x, y, (dx, dy) => {\n xs.push(dx);\n ys.push(dy ? 1 : 0);\n });\n\n const n = xs.length;\n if (n === 0) {\n return {\n coef: [0, 0],\n predict: (_x: number) => 0,\n evaluateGrid: (N: number) => [] as { x: number; y: number }[],\n confidenceInterval: (N: number = 50) =>\n [] as { x: number; mean: number; lower: number; upper: number; predLower: number; predUpper: number }[]\n };\n }\n\n // initial coef via linear regression rough guess\n let intercept = 0;\n let beta = 0;\n\n for (let iter = 0; iter < maxIter; iter++) {\n const p: number[] = new Array(n);\n let converged = true;\n for (let i = 0; i < n; i++) {\n const z = intercept + beta * xs[i];\n const pi = 1 / (1 + Math.exp(-z));\n p[i] = pi;\n }\n\n // compute gradient and hessian\n let g0 = 0;\n let g1 = 0;\n let h00 = 0;\n let h01 = 0;\n let h11 = 0;\n for (let i = 0; i < n; i++) {\n const wi = p[i] * (1 - p[i]);\n const diff = ys[i] - p[i];\n g0 += diff;\n g1 += diff * xs[i];\n h00 += wi;\n h01 += wi * xs[i];\n h11 += wi * xs[i] * xs[i];\n }\n\n // solve 2x2 system H * delta = g\n const det = h00 * h11 - h01 * h01;\n if (Math.abs(det) < 1e-12) {\n break;\n }\n const delta0 = (h11 * g0 - h01 * g1) / det;\n const delta1 = (-h01 * g0 + h00 * g1) / det;\n\n intercept += delta0;\n beta += delta1;\n\n if (Math.abs(delta0) > tol || Math.abs(delta1) > tol) {\n converged = false;\n }\n if (converged) {\n break;\n }\n }\n\n const predict = (xx: number) => {\n const z = intercept + beta * xx;\n return 1 / (1 + Math.exp(-z));\n };\n\n function evaluateGrid(N: number) {\n const out: { x: number; y: number }[] = [];\n if (N <= 0) {\n return out;\n }\n let min = Infinity;\n let max = -Infinity;\n visitPoints(data, x, y, dx => {\n if (dx < min) {\n min = dx;\n }\n if (dx > max) {\n max = dx;\n }\n });\n if (min === Infinity || max === -Infinity) {\n return out;\n }\n if (min === max) {\n const v = predict(min);\n for (let i = 0; i < N; i++) {\n out.push({ x: min, y: v });\n }\n return out;\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 out.push({ x: px, y: predict(px) });\n }\n return out;\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\n const comps = computeLinearCIComponents(data, x, y, predict);\n if (comps.n === 0) {\n return out;\n }\n\n const z = confidenceCriticalValue(alpha);\n if (comps.min === comps.max) {\n const v = predict(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 = (comps.max - comps.min) / (N - 1);\n for (let i = 0; i < N; i++) {\n const px = i === N - 1 ? comps.max : comps.min + step * i;\n const yh = predict(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 coef: [intercept, beta],\n predict,\n evaluateGrid,\n confidenceInterval\n };\n}\n\nexport default regressionLogistic;\n"]}
@@ -1,12 +1,18 @@
1
+ /**
2
+ * 局部线性 LOWESS。默认全量观测、span=2/3、三次稳健重加权。
3
+ * delta 显式插值加速;maxSamples 仅保留显式选择的历史抽样用途。
4
+ * predict 与 evaluateGrid 查询构建时固定的同一模型,不触发再拟合。
5
+ */
1
6
  export declare function regressionLowess(data: any[], x?: (d: any) => number, y?: (d: any) => number, options?: {
2
7
  span?: number;
3
8
  degree?: 1 | 0;
4
9
  iterations?: number;
5
10
  alpha?: number;
6
11
  maxSamples?: number;
12
+ delta?: number;
7
13
  }): {
8
14
  predict: (x0: number | number[]) => number | number[];
9
- evaluate: any;
15
+ evaluate: (x0: number | number[]) => number | number[];
10
16
  evaluateGrid: (N: number) => {
11
17
  x: number;
12
18
  y: number;
@@ -19,5 +25,9 @@ export declare function regressionLowess(data: any[], x?: (d: any) => number, y?
19
25
  predLower: number;
20
26
  predUpper: number;
21
27
  }[];
28
+ fitted: {
29
+ x: number;
30
+ y: number;
31
+ }[];
22
32
  };
23
33
  export default regressionLowess;