formulab 0.5.1 → 0.9.0

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 (258) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +90 -26
  3. package/dist/automotive/chargingLoss.d.ts +15 -0
  4. package/dist/automotive/chargingLoss.d.ts.map +1 -0
  5. package/dist/automotive/chargingLoss.js +62 -0
  6. package/dist/automotive/chargingLoss.js.map +1 -0
  7. package/dist/automotive/index.d.ts +2 -1
  8. package/dist/automotive/index.d.ts.map +1 -1
  9. package/dist/automotive/index.js +1 -0
  10. package/dist/automotive/index.js.map +1 -1
  11. package/dist/automotive/types.d.ts +23 -0
  12. package/dist/automotive/types.d.ts.map +1 -1
  13. package/dist/battery/guards.d.ts +7 -0
  14. package/dist/battery/guards.d.ts.map +1 -0
  15. package/dist/battery/guards.js +17 -0
  16. package/dist/battery/guards.js.map +1 -0
  17. package/dist/battery/index.d.ts +1 -0
  18. package/dist/battery/index.d.ts.map +1 -1
  19. package/dist/battery/index.js +2 -0
  20. package/dist/battery/index.js.map +1 -1
  21. package/dist/chemical/flowControl.d.ts +14 -0
  22. package/dist/chemical/flowControl.d.ts.map +1 -0
  23. package/dist/chemical/flowControl.js +69 -0
  24. package/dist/chemical/flowControl.js.map +1 -0
  25. package/dist/chemical/guards.d.ts +17 -0
  26. package/dist/chemical/guards.d.ts.map +1 -0
  27. package/dist/chemical/guards.js +54 -0
  28. package/dist/chemical/guards.js.map +1 -0
  29. package/dist/chemical/index.d.ts +5 -1
  30. package/dist/chemical/index.d.ts.map +1 -1
  31. package/dist/chemical/index.js +5 -0
  32. package/dist/chemical/index.js.map +1 -1
  33. package/dist/chemical/pid.d.ts +14 -0
  34. package/dist/chemical/pid.d.ts.map +1 -0
  35. package/dist/chemical/pid.js +103 -0
  36. package/dist/chemical/pid.js.map +1 -0
  37. package/dist/chemical/reliefValve.d.ts +14 -0
  38. package/dist/chemical/reliefValve.d.ts.map +1 -0
  39. package/dist/chemical/reliefValve.js +98 -0
  40. package/dist/chemical/reliefValve.js.map +1 -0
  41. package/dist/chemical/types.d.ts +63 -0
  42. package/dist/chemical/types.d.ts.map +1 -1
  43. package/dist/construction/guards.d.ts +7 -0
  44. package/dist/construction/guards.d.ts.map +1 -0
  45. package/dist/construction/guards.js +31 -0
  46. package/dist/construction/guards.js.map +1 -0
  47. package/dist/construction/index.d.ts +1 -0
  48. package/dist/construction/index.d.ts.map +1 -1
  49. package/dist/construction/index.js +2 -0
  50. package/dist/construction/index.js.map +1 -1
  51. package/dist/electronics/guards.d.ts +7 -0
  52. package/dist/electronics/guards.d.ts.map +1 -0
  53. package/dist/electronics/guards.js +17 -0
  54. package/dist/electronics/guards.js.map +1 -0
  55. package/dist/electronics/index.d.ts +1 -0
  56. package/dist/electronics/index.d.ts.map +1 -1
  57. package/dist/electronics/index.js +2 -0
  58. package/dist/electronics/index.js.map +1 -1
  59. package/dist/energy/boilerEfficiency.d.ts +13 -0
  60. package/dist/energy/boilerEfficiency.d.ts.map +1 -0
  61. package/dist/energy/boilerEfficiency.js +46 -0
  62. package/dist/energy/boilerEfficiency.js.map +1 -0
  63. package/dist/energy/cusum.d.ts +15 -0
  64. package/dist/energy/cusum.d.ts.map +1 -0
  65. package/dist/energy/cusum.js +71 -0
  66. package/dist/energy/cusum.js.map +1 -0
  67. package/dist/energy/degreeDay.d.ts +13 -0
  68. package/dist/energy/degreeDay.d.ts.map +1 -0
  69. package/dist/energy/degreeDay.js +46 -0
  70. package/dist/energy/degreeDay.js.map +1 -0
  71. package/dist/energy/heatPump.d.ts +13 -0
  72. package/dist/energy/heatPump.d.ts.map +1 -0
  73. package/dist/energy/heatPump.js +48 -0
  74. package/dist/energy/heatPump.js.map +1 -0
  75. package/dist/energy/index.d.ts +9 -1
  76. package/dist/energy/index.d.ts.map +1 -1
  77. package/dist/energy/index.js +8 -0
  78. package/dist/energy/index.js.map +1 -1
  79. package/dist/energy/insulationRoi.d.ts +14 -0
  80. package/dist/energy/insulationRoi.d.ts.map +1 -0
  81. package/dist/energy/insulationRoi.js +52 -0
  82. package/dist/energy/insulationRoi.js.map +1 -0
  83. package/dist/energy/ledRoi.d.ts +14 -0
  84. package/dist/energy/ledRoi.d.ts.map +1 -0
  85. package/dist/energy/ledRoi.js +49 -0
  86. package/dist/energy/ledRoi.js.map +1 -0
  87. package/dist/energy/transformerLoss.d.ts +13 -0
  88. package/dist/energy/transformerLoss.d.ts.map +1 -0
  89. package/dist/energy/transformerLoss.js +63 -0
  90. package/dist/energy/transformerLoss.js.map +1 -0
  91. package/dist/energy/types.d.ts +168 -0
  92. package/dist/energy/types.d.ts.map +1 -1
  93. package/dist/energy/windOutput.d.ts +14 -0
  94. package/dist/energy/windOutput.d.ts.map +1 -0
  95. package/dist/energy/windOutput.js +77 -0
  96. package/dist/energy/windOutput.js.map +1 -0
  97. package/dist/food/index.d.ts +3 -1
  98. package/dist/food/index.d.ts.map +1 -1
  99. package/dist/food/index.js +2 -0
  100. package/dist/food/index.js.map +1 -1
  101. package/dist/food/stabilityStudy.d.ts +15 -0
  102. package/dist/food/stabilityStudy.d.ts.map +1 -0
  103. package/dist/food/stabilityStudy.js +92 -0
  104. package/dist/food/stabilityStudy.js.map +1 -0
  105. package/dist/food/types.d.ts +43 -0
  106. package/dist/food/types.d.ts.map +1 -1
  107. package/dist/food/waterActivity.d.ts +17 -0
  108. package/dist/food/waterActivity.d.ts.map +1 -0
  109. package/dist/food/waterActivity.js +63 -0
  110. package/dist/food/waterActivity.js.map +1 -0
  111. package/dist/logistics/abcAnalysis.d.ts +15 -0
  112. package/dist/logistics/abcAnalysis.d.ts.map +1 -0
  113. package/dist/logistics/abcAnalysis.js +101 -0
  114. package/dist/logistics/abcAnalysis.js.map +1 -0
  115. package/dist/logistics/index.d.ts +4 -1
  116. package/dist/logistics/index.d.ts.map +1 -1
  117. package/dist/logistics/index.js +3 -0
  118. package/dist/logistics/index.js.map +1 -1
  119. package/dist/logistics/inventoryTurnover.d.ts +13 -0
  120. package/dist/logistics/inventoryTurnover.d.ts.map +1 -0
  121. package/dist/logistics/inventoryTurnover.js +36 -0
  122. package/dist/logistics/inventoryTurnover.js.map +1 -0
  123. package/dist/logistics/loadCapacity.d.ts +13 -0
  124. package/dist/logistics/loadCapacity.d.ts.map +1 -0
  125. package/dist/logistics/loadCapacity.js +46 -0
  126. package/dist/logistics/loadCapacity.js.map +1 -0
  127. package/dist/logistics/types.d.ts +78 -0
  128. package/dist/logistics/types.d.ts.map +1 -1
  129. package/dist/metal/guards.d.ts +12 -0
  130. package/dist/metal/guards.d.ts.map +1 -0
  131. package/dist/metal/guards.js +36 -0
  132. package/dist/metal/guards.js.map +1 -0
  133. package/dist/metal/index.d.ts +1 -0
  134. package/dist/metal/index.d.ts.map +1 -1
  135. package/dist/metal/index.js +2 -0
  136. package/dist/metal/index.js.map +1 -1
  137. package/dist/quality/cmk.d.ts +17 -0
  138. package/dist/quality/cmk.d.ts.map +1 -0
  139. package/dist/quality/cmk.js +43 -0
  140. package/dist/quality/cmk.js.map +1 -0
  141. package/dist/quality/gageRR.d.ts +18 -0
  142. package/dist/quality/gageRR.d.ts.map +1 -0
  143. package/dist/quality/gageRR.js +110 -0
  144. package/dist/quality/gageRR.js.map +1 -0
  145. package/dist/quality/index.d.ts +5 -1
  146. package/dist/quality/index.d.ts.map +1 -1
  147. package/dist/quality/index.js +4 -0
  148. package/dist/quality/index.js.map +1 -1
  149. package/dist/quality/paretoAnalysis.d.ts +15 -0
  150. package/dist/quality/paretoAnalysis.d.ts.map +1 -0
  151. package/dist/quality/paretoAnalysis.js +92 -0
  152. package/dist/quality/paretoAnalysis.js.map +1 -0
  153. package/dist/quality/types.d.ts +91 -0
  154. package/dist/quality/types.d.ts.map +1 -1
  155. package/dist/quality/weibull.d.ts +17 -0
  156. package/dist/quality/weibull.d.ts.map +1 -0
  157. package/dist/quality/weibull.js +106 -0
  158. package/dist/quality/weibull.js.map +1 -0
  159. package/dist/safety/arcFlash.d.ts +14 -0
  160. package/dist/safety/arcFlash.d.ts.map +1 -0
  161. package/dist/safety/arcFlash.js +90 -0
  162. package/dist/safety/arcFlash.js.map +1 -0
  163. package/dist/safety/confinedSpace.d.ts +15 -0
  164. package/dist/safety/confinedSpace.d.ts.map +1 -0
  165. package/dist/safety/confinedSpace.js +116 -0
  166. package/dist/safety/confinedSpace.js.map +1 -0
  167. package/dist/safety/ergonomicRisk.d.ts +9 -0
  168. package/dist/safety/ergonomicRisk.d.ts.map +1 -0
  169. package/dist/safety/ergonomicRisk.js +208 -0
  170. package/dist/safety/ergonomicRisk.js.map +1 -0
  171. package/dist/safety/illuminance.d.ts +13 -0
  172. package/dist/safety/illuminance.d.ts.map +1 -0
  173. package/dist/safety/illuminance.js +91 -0
  174. package/dist/safety/illuminance.js.map +1 -0
  175. package/dist/safety/index.d.ts +8 -1
  176. package/dist/safety/index.d.ts.map +1 -1
  177. package/dist/safety/index.js +7 -0
  178. package/dist/safety/index.js.map +1 -1
  179. package/dist/safety/ladderAngle.d.ts +16 -0
  180. package/dist/safety/ladderAngle.d.ts.map +1 -0
  181. package/dist/safety/ladderAngle.js +87 -0
  182. package/dist/safety/ladderAngle.js.map +1 -0
  183. package/dist/safety/lel.d.ts +14 -0
  184. package/dist/safety/lel.d.ts.map +1 -0
  185. package/dist/safety/lel.js +66 -0
  186. package/dist/safety/lel.js.map +1 -0
  187. package/dist/safety/thermalComfort.d.ts +14 -0
  188. package/dist/safety/thermalComfort.d.ts.map +1 -0
  189. package/dist/safety/thermalComfort.js +96 -0
  190. package/dist/safety/thermalComfort.js.map +1 -0
  191. package/dist/safety/types.d.ts +164 -0
  192. package/dist/safety/types.d.ts.map +1 -1
  193. package/dist/utility/bilinearInterpolation.d.ts +3 -0
  194. package/dist/utility/bilinearInterpolation.d.ts.map +1 -0
  195. package/dist/utility/bilinearInterpolation.js +47 -0
  196. package/dist/utility/bilinearInterpolation.js.map +1 -0
  197. package/dist/utility/correlation.d.ts +3 -0
  198. package/dist/utility/correlation.d.ts.map +1 -0
  199. package/dist/utility/correlation.js +29 -0
  200. package/dist/utility/correlation.js.map +1 -0
  201. package/dist/utility/depreciation.d.ts +3 -0
  202. package/dist/utility/depreciation.d.ts.map +1 -0
  203. package/dist/utility/depreciation.js +57 -0
  204. package/dist/utility/depreciation.js.map +1 -0
  205. package/dist/utility/histogram.d.ts +3 -0
  206. package/dist/utility/histogram.d.ts.map +1 -0
  207. package/dist/utility/histogram.js +42 -0
  208. package/dist/utility/histogram.js.map +1 -0
  209. package/dist/utility/index.d.ts +15 -1
  210. package/dist/utility/index.d.ts.map +1 -1
  211. package/dist/utility/index.js +14 -0
  212. package/dist/utility/index.js.map +1 -1
  213. package/dist/utility/lcc.d.ts +3 -0
  214. package/dist/utility/lcc.d.ts.map +1 -0
  215. package/dist/utility/lcc.js +26 -0
  216. package/dist/utility/lcc.js.map +1 -0
  217. package/dist/utility/linearInterpolation.d.ts +3 -0
  218. package/dist/utility/linearInterpolation.d.ts.map +1 -0
  219. package/dist/utility/linearInterpolation.js +42 -0
  220. package/dist/utility/linearInterpolation.js.map +1 -0
  221. package/dist/utility/movingAverage.d.ts +3 -0
  222. package/dist/utility/movingAverage.d.ts.map +1 -0
  223. package/dist/utility/movingAverage.js +41 -0
  224. package/dist/utility/movingAverage.js.map +1 -0
  225. package/dist/utility/normalize.d.ts +3 -0
  226. package/dist/utility/normalize.d.ts.map +1 -0
  227. package/dist/utility/normalize.js +35 -0
  228. package/dist/utility/normalize.js.map +1 -0
  229. package/dist/utility/npv.d.ts +3 -0
  230. package/dist/utility/npv.d.ts.map +1 -0
  231. package/dist/utility/npv.js +45 -0
  232. package/dist/utility/npv.js.map +1 -0
  233. package/dist/utility/percentile.d.ts +3 -0
  234. package/dist/utility/percentile.d.ts.map +1 -0
  235. package/dist/utility/percentile.js +24 -0
  236. package/dist/utility/percentile.js.map +1 -0
  237. package/dist/utility/regression.d.ts +3 -0
  238. package/dist/utility/regression.d.ts.map +1 -0
  239. package/dist/utility/regression.js +40 -0
  240. package/dist/utility/regression.js.map +1 -0
  241. package/dist/utility/roi.d.ts +3 -0
  242. package/dist/utility/roi.d.ts.map +1 -0
  243. package/dist/utility/roi.js +19 -0
  244. package/dist/utility/roi.js.map +1 -0
  245. package/dist/utility/statistics.d.ts +3 -0
  246. package/dist/utility/statistics.d.ts.map +1 -0
  247. package/dist/utility/statistics.js +34 -0
  248. package/dist/utility/statistics.js.map +1 -0
  249. package/dist/utility/types.d.ts +213 -1
  250. package/dist/utility/types.d.ts.map +1 -1
  251. package/dist/utility/unit.d.ts.map +1 -1
  252. package/dist/utility/unit.js +51 -0
  253. package/dist/utility/unit.js.map +1 -1
  254. package/dist/utility/weightedScore.d.ts +3 -0
  255. package/dist/utility/weightedScore.d.ts.map +1 -0
  256. package/dist/utility/weightedScore.js +35 -0
  257. package/dist/utility/weightedScore.js.map +1 -0
  258. package/package.json +3 -2
@@ -0,0 +1,57 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function depreciation(input) {
3
+ const { assetCost, salvageValue, usefulLife, method } = input;
4
+ if (assetCost <= 0 || salvageValue < 0 || usefulLife <= 0)
5
+ return null;
6
+ if (salvageValue >= assetCost)
7
+ return null;
8
+ if (method === 'straight-line') {
9
+ return straightLine(assetCost, salvageValue, usefulLife);
10
+ }
11
+ if (method === 'declining-balance') {
12
+ return decliningBalance(assetCost, salvageValue, usefulLife);
13
+ }
14
+ return null;
15
+ }
16
+ function straightLine(cost, salvage, life) {
17
+ const annual = (cost - salvage) / life;
18
+ const schedule = [];
19
+ for (let year = 1; year <= life; year++) {
20
+ schedule.push({
21
+ year,
22
+ depreciation: roundTo(annual, 6),
23
+ accumulatedDepreciation: roundTo(annual * year, 6),
24
+ bookValue: roundTo(cost - annual * year, 6),
25
+ });
26
+ }
27
+ return {
28
+ annualDepreciation: roundTo(annual, 6),
29
+ schedule,
30
+ totalDepreciation: roundTo(cost - salvage, 6),
31
+ };
32
+ }
33
+ function decliningBalance(cost, salvage, life) {
34
+ const rate = 1 - (salvage / cost) ** (1 / life);
35
+ const schedule = [];
36
+ let bookValue = cost;
37
+ let accumulated = 0;
38
+ for (let year = 1; year <= life; year++) {
39
+ const dep = year === life
40
+ ? bookValue - salvage // ensure final book value = salvage
41
+ : bookValue * rate;
42
+ accumulated += dep;
43
+ bookValue -= dep;
44
+ schedule.push({
45
+ year,
46
+ depreciation: roundTo(dep, 6),
47
+ accumulatedDepreciation: roundTo(accumulated, 6),
48
+ bookValue: roundTo(bookValue, 6),
49
+ });
50
+ }
51
+ return {
52
+ annualDepreciation: roundTo(schedule[0].depreciation, 6),
53
+ schedule,
54
+ totalDepreciation: roundTo(cost - salvage, 6),
55
+ };
56
+ }
57
+ //# sourceMappingURL=depreciation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depreciation.js","sourceRoot":"","sources":["../../src/utility/depreciation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC9D,IAAI,SAAS,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,IAAI,YAAY,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,MAAM,KAAK,eAAe,EAAE,CAAC;QAC/B,OAAO,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACnC,OAAO,gBAAgB,CAAC,SAAS,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAChC,uBAAuB,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,OAAO,CAAC,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;SAC5C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,QAAQ;QACR,iBAAiB,EAAE,OAAO,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,OAAe,EAAE,IAAY;IACnE,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,KAAK,IAAI;YACvB,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,oCAAoC;YAC1D,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;QACrB,WAAW,IAAI,GAAG,CAAC;QACnB,SAAS,IAAI,GAAG,CAAC;QAEjB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7B,uBAAuB,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YAChD,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACxD,QAAQ;QACR,iBAAiB,EAAE,OAAO,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { HistogramInput, HistogramResult } from './types.js';
2
+ export declare function histogram(input: HistogramInput): HistogramResult | null;
3
+ //# sourceMappingURL=histogram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram.d.ts","sourceRoot":"","sources":["../../src/utility/histogram.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAEhF,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CA2CvE"}
@@ -0,0 +1,42 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function histogram(input) {
3
+ const { data } = input;
4
+ if (!data || data.length === 0)
5
+ return null;
6
+ const n = data.length;
7
+ // Sturges' rule for default bin count
8
+ const numBins = input.bins ?? Math.max(1, Math.ceil(Math.log2(n) + 1));
9
+ if (numBins < 1)
10
+ return null;
11
+ const min = Math.min(...data);
12
+ const max = Math.max(...data);
13
+ // Handle case where all values are identical
14
+ const range = max - min;
15
+ const binWidth = range === 0 ? 1 : range / numBins;
16
+ const bins = [];
17
+ for (let i = 0; i < numBins; i++) {
18
+ const lower = min + i * binWidth;
19
+ const upper = min + (i + 1) * binWidth;
20
+ bins.push({
21
+ lower: roundTo(lower, 6),
22
+ upper: roundTo(upper, 6),
23
+ count: 0,
24
+ frequency: 0,
25
+ });
26
+ }
27
+ for (const value of data) {
28
+ let idx = range === 0 ? 0 : Math.floor((value - min) / binWidth);
29
+ if (idx >= numBins)
30
+ idx = numBins - 1; // include max in last bin
31
+ bins[idx].count++;
32
+ }
33
+ for (const bin of bins) {
34
+ bin.frequency = roundTo(bin.count / n, 6);
35
+ }
36
+ return {
37
+ bins,
38
+ binWidth: roundTo(binWidth, 6),
39
+ totalCount: n,
40
+ };
41
+ }
42
+ //# sourceMappingURL=histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"histogram.js","sourceRoot":"","sources":["../../src/utility/histogram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,sCAAsC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAE9B,6CAA6C;IAC7C,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;IACxB,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC;IAEnD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC;QACjC,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YACxB,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QACjE,IAAI,GAAG,IAAI,OAAO;YAAE,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,0BAA0B;QACjE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC"}
@@ -1,4 +1,18 @@
1
1
  export { solveAssignment } from './assignment.js';
2
2
  export { calculateUnit, getUnitCategories, getUnitsForCategory } from './unit.js';
3
- export type { AssignmentObjective, AssignmentInput, AssignmentPair, AssignmentResult, UnitCategory, UnitDef, UnitInput, ConversionEntry, UnitResult, } from './types.js';
3
+ export { statistics } from './statistics.js';
4
+ export { percentile } from './percentile.js';
5
+ export { correlation } from './correlation.js';
6
+ export { regression } from './regression.js';
7
+ export { movingAverage } from './movingAverage.js';
8
+ export { linearInterpolation } from './linearInterpolation.js';
9
+ export { bilinearInterpolation } from './bilinearInterpolation.js';
10
+ export { roi } from './roi.js';
11
+ export { npv } from './npv.js';
12
+ export { depreciation } from './depreciation.js';
13
+ export { lcc } from './lcc.js';
14
+ export { normalize } from './normalize.js';
15
+ export { histogram } from './histogram.js';
16
+ export { weightedScore } from './weightedScore.js';
17
+ export type { AssignmentObjective, AssignmentInput, AssignmentPair, AssignmentResult, UnitCategory, UnitDef, UnitInput, ConversionEntry, UnitResult, StatisticsInput, StatisticsResult, PercentileInput, PercentileResult, CorrelationInput, CorrelationResult, RegressionInput, RegressionResult, MovingAverageMethod, MovingAverageInput, MovingAverageResult, LinearInterpolationInput, LinearInterpolationResult, BilinearInterpolationInput, BilinearInterpolationResult, RoiInput, RoiResult, NpvInput, NpvResult, DepreciationMethod, DepreciationInput, DepreciationYearEntry, DepreciationResult, LccInput, LccResult, NormalizeMethod, NormalizeInput, NormalizeResult, HistogramInput, HistogramBin, HistogramResult, WeightedScoreInput, WeightedScoreAlternative, WeightedScoreResult, } from './types.js';
4
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGlF,YAAY,EAEV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAEhB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,YAAY,EAEV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,gBAAgB,EAEhB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,eAAe,EACf,UAAU,EAEV,eAAe,EACf,gBAAgB,EAEhB,eAAe,EACf,gBAAgB,EAEhB,gBAAgB,EAChB,iBAAiB,EAEjB,eAAe,EACf,gBAAgB,EAEhB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EAEnB,wBAAwB,EACxB,yBAAyB,EAEzB,0BAA0B,EAC1B,2BAA2B,EAE3B,QAAQ,EACR,SAAS,EAET,QAAQ,EACR,SAAS,EAET,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAElB,QAAQ,EACR,SAAS,EAET,eAAe,EACf,cAAc,EACd,eAAe,EAEf,cAAc,EACd,YAAY,EACZ,eAAe,EAEf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -1,4 +1,18 @@
1
1
  // Utility domain formulas
2
2
  export { solveAssignment } from './assignment.js';
3
3
  export { calculateUnit, getUnitCategories, getUnitsForCategory } from './unit.js';
4
+ export { statistics } from './statistics.js';
5
+ export { percentile } from './percentile.js';
6
+ export { correlation } from './correlation.js';
7
+ export { regression } from './regression.js';
8
+ export { movingAverage } from './movingAverage.js';
9
+ export { linearInterpolation } from './linearInterpolation.js';
10
+ export { bilinearInterpolation } from './bilinearInterpolation.js';
11
+ export { roi } from './roi.js';
12
+ export { npv } from './npv.js';
13
+ export { depreciation } from './depreciation.js';
14
+ export { lcc } from './lcc.js';
15
+ export { normalize } from './normalize.js';
16
+ export { histogram } from './histogram.js';
17
+ export { weightedScore } from './weightedScore.js';
4
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LccInput, LccResult } from './types.js';
2
+ export declare function lcc(input: LccInput): LccResult | null;
3
+ //# sourceMappingURL=lcc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lcc.d.ts","sourceRoot":"","sources":["../../src/utility/lcc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CA0BrD"}
@@ -0,0 +1,26 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function lcc(input) {
3
+ const { initialCost, annualOperatingCost, annualMaintenanceCost, disposalCost, lifespan, discountRate } = input;
4
+ if (initialCost < 0 || lifespan <= 0)
5
+ return null;
6
+ if (discountRate < 0 || discountRate >= 1)
7
+ return null;
8
+ // Present value of annuity factor: (1 - (1+r)^-n) / r
9
+ const pvFactor = discountRate === 0
10
+ ? lifespan
11
+ : (1 - (1 + discountRate) ** -lifespan) / discountRate;
12
+ const presentValueOperating = annualOperatingCost * pvFactor;
13
+ const presentValueMaintenance = annualMaintenanceCost * pvFactor;
14
+ const presentValueDisposal = disposalCost / (1 + discountRate) ** lifespan;
15
+ const totalLcc = initialCost + presentValueOperating + presentValueMaintenance + presentValueDisposal;
16
+ // Annual equivalent cost
17
+ const annualEquivalentCost = pvFactor === 0 ? totalLcc : totalLcc / pvFactor;
18
+ return {
19
+ totalLcc: roundTo(totalLcc, 6),
20
+ presentValueOperating: roundTo(presentValueOperating, 6),
21
+ presentValueMaintenance: roundTo(presentValueMaintenance, 6),
22
+ presentValueDisposal: roundTo(presentValueDisposal, 6),
23
+ annualEquivalentCost: roundTo(annualEquivalentCost, 6),
24
+ };
25
+ }
26
+ //# sourceMappingURL=lcc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lcc.js","sourceRoot":"","sources":["../../src/utility/lcc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAChH,IAAI,WAAW,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,sDAAsD;IACtD,MAAM,QAAQ,GAAG,YAAY,KAAK,CAAC;QACjC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;IAEzD,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IAC7D,MAAM,uBAAuB,GAAG,qBAAqB,GAAG,QAAQ,CAAC;IACjE,MAAM,oBAAoB,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,QAAQ,CAAC;IAE3E,MAAM,QAAQ,GAAG,WAAW,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,oBAAoB,CAAC;IAEtG,yBAAyB;IACzB,MAAM,oBAAoB,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAE7E,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACxD,uBAAuB,EAAE,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;QAC5D,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACtD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LinearInterpolationInput, LinearInterpolationResult } from './types.js';
2
+ export declare function linearInterpolation(input: LinearInterpolationInput): LinearInterpolationResult | null;
3
+ //# sourceMappingURL=linearInterpolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linearInterpolation.d.ts","sourceRoot":"","sources":["../../src/utility/linearInterpolation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEtF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,yBAAyB,GAAG,IAAI,CAyCrG"}
@@ -0,0 +1,42 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function linearInterpolation(input) {
3
+ const { x, y, target } = input;
4
+ if (!x || !y || x.length !== y.length || x.length < 2)
5
+ return null;
6
+ // Find bracketing interval
7
+ let lowerIndex = 0;
8
+ let upperIndex = x.length - 1;
9
+ let isExtrapolation = false;
10
+ if (target <= x[0]) {
11
+ lowerIndex = 0;
12
+ upperIndex = 1;
13
+ isExtrapolation = target < x[0];
14
+ }
15
+ else if (target >= x[x.length - 1]) {
16
+ lowerIndex = x.length - 2;
17
+ upperIndex = x.length - 1;
18
+ isExtrapolation = target > x[x.length - 1];
19
+ }
20
+ else {
21
+ for (let i = 0; i < x.length - 1; i++) {
22
+ if (target >= x[i] && target <= x[i + 1]) {
23
+ lowerIndex = i;
24
+ upperIndex = i + 1;
25
+ break;
26
+ }
27
+ }
28
+ }
29
+ const x0 = x[lowerIndex];
30
+ const x1 = x[upperIndex];
31
+ const y0 = y[lowerIndex];
32
+ const y1 = y[upperIndex];
33
+ const t = x1 === x0 ? 0 : (target - x0) / (x1 - x0);
34
+ const value = y0 + t * (y1 - y0);
35
+ return {
36
+ value: roundTo(value, 6),
37
+ lowerIndex,
38
+ upperIndex,
39
+ isExtrapolation,
40
+ };
41
+ }
42
+ //# sourceMappingURL=linearInterpolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linearInterpolation.js","sourceRoot":"","sources":["../../src/utility/linearInterpolation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,2BAA2B;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,UAAU,GAAG,CAAC,CAAC;QACf,UAAU,GAAG,CAAC,CAAC;QACf,eAAe,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACrC,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,eAAe,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzC,UAAU,GAAG,CAAC,CAAC;gBACf,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAEzB,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEjC,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,UAAU;QACV,UAAU;QACV,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { MovingAverageInput, MovingAverageResult } from './types.js';
2
+ export declare function movingAverage(input: MovingAverageInput): MovingAverageResult | null;
3
+ //# sourceMappingURL=movingAverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movingAverage.d.ts","sourceRoot":"","sources":["../../src/utility/movingAverage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,IAAI,CAWnF"}
@@ -0,0 +1,41 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function movingAverage(input) {
3
+ const { data, window, method } = input;
4
+ if (!data || data.length === 0 || window < 1 || window > data.length)
5
+ return null;
6
+ if (method === 'sma') {
7
+ return { values: sma(data, window) };
8
+ }
9
+ if (method === 'ema') {
10
+ return { values: ema(data, window) };
11
+ }
12
+ return null;
13
+ }
14
+ function sma(data, window) {
15
+ const result = [];
16
+ for (let i = window - 1; i < data.length; i++) {
17
+ let sum = 0;
18
+ for (let j = i - window + 1; j <= i; j++) {
19
+ sum += data[j];
20
+ }
21
+ result.push(roundTo(sum / window, 6));
22
+ }
23
+ return result;
24
+ }
25
+ function ema(data, window) {
26
+ const k = 2 / (window + 1);
27
+ const result = [];
28
+ // First EMA value is SMA of first window
29
+ let sum = 0;
30
+ for (let i = 0; i < window; i++) {
31
+ sum += data[i];
32
+ }
33
+ let prev = sum / window;
34
+ result.push(roundTo(prev, 6));
35
+ for (let i = window; i < data.length; i++) {
36
+ prev = data[i] * k + prev * (1 - k);
37
+ result.push(roundTo(prev, 6));
38
+ }
39
+ return result;
40
+ }
41
+ //# sourceMappingURL=movingAverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movingAverage.js","sourceRoot":"","sources":["../../src/utility/movingAverage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,aAAa,CAAC,KAAyB;IACrD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAElF,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,MAAc;IACzC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,MAAc;IACzC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,yCAAyC;IACzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,IAAI,GAAG,GAAG,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { NormalizeInput, NormalizeResult } from './types.js';
2
+ export declare function normalize(input: NormalizeInput): NormalizeResult | null;
3
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utility/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CAiCvE"}
@@ -0,0 +1,35 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function normalize(input) {
3
+ const { data, method } = input;
4
+ if (!data || data.length === 0)
5
+ return null;
6
+ const n = data.length;
7
+ const min = Math.min(...data);
8
+ const max = Math.max(...data);
9
+ const mean = data.reduce((a, v) => a + v, 0) / n;
10
+ const variance = data.reduce((a, v) => a + (v - mean) ** 2, 0) / n;
11
+ const stdDev = Math.sqrt(variance);
12
+ let values;
13
+ if (method === 'min-max') {
14
+ const range = max - min;
15
+ values = range === 0
16
+ ? data.map(() => 0)
17
+ : data.map((v) => roundTo((v - min) / range, 6));
18
+ }
19
+ else if (method === 'z-score') {
20
+ values = stdDev === 0
21
+ ? data.map(() => 0)
22
+ : data.map((v) => roundTo((v - mean) / stdDev, 6));
23
+ }
24
+ else {
25
+ return null;
26
+ }
27
+ return {
28
+ values,
29
+ min: roundTo(min, 6),
30
+ max: roundTo(max, 6),
31
+ mean: roundTo(mean, 6),
32
+ stdDev: roundTo(stdDev, 6),
33
+ };
34
+ }
35
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utility/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAC/B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,MAAgB,CAAC;IAErB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;QACxB,MAAM,GAAG,KAAK,KAAK,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,GAAG,MAAM,KAAK,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM;QACN,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { NpvInput, NpvResult } from './types.js';
2
+ export declare function npv(input: NpvInput): NpvResult | null;
3
+ //# sourceMappingURL=npv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npv.d.ts","sourceRoot":"","sources":["../../src/utility/npv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAqBrD"}
@@ -0,0 +1,45 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function npv(input) {
3
+ const { initialInvestment, cashFlows, discountRate } = input;
4
+ if (initialInvestment < 0 || !cashFlows || cashFlows.length === 0)
5
+ return null;
6
+ if (discountRate < 0 || discountRate >= 1)
7
+ return null;
8
+ const pvCashFlows = cashFlows.reduce((acc, cf, i) => {
9
+ return acc + cf / (1 + discountRate) ** (i + 1);
10
+ }, 0);
11
+ const npvValue = pvCashFlows - initialInvestment;
12
+ const pvTotal = pvCashFlows;
13
+ const profitabilityIndex = initialInvestment === 0 ? 0 : pvTotal / initialInvestment;
14
+ const irr = calculateIrr(initialInvestment, cashFlows);
15
+ return {
16
+ npv: roundTo(npvValue, 6),
17
+ irr: irr !== null ? roundTo(irr, 6) : null,
18
+ profitabilityIndex: roundTo(profitabilityIndex, 6),
19
+ };
20
+ }
21
+ function calculateIrr(investment, cashFlows) {
22
+ // Newton-Raphson method to find IRR
23
+ let rate = 0.1; // initial guess
24
+ const maxIter = 100;
25
+ const tolerance = 1e-8;
26
+ for (let iter = 0; iter < maxIter; iter++) {
27
+ let npvVal = -investment;
28
+ let derivative = 0;
29
+ for (let i = 0; i < cashFlows.length; i++) {
30
+ const t = i + 1;
31
+ const discounted = cashFlows[i] / (1 + rate) ** t;
32
+ npvVal += discounted;
33
+ derivative -= t * cashFlows[i] / (1 + rate) ** (t + 1);
34
+ }
35
+ if (Math.abs(npvVal) < tolerance)
36
+ return rate;
37
+ if (derivative === 0)
38
+ return null;
39
+ rate = rate - npvVal / derivative;
40
+ if (rate <= -1)
41
+ return null; // diverged
42
+ }
43
+ return null; // did not converge
44
+ }
45
+ //# sourceMappingURL=npv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npv.js","sourceRoot":"","sources":["../../src/utility/npv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAC7D,IAAI,iBAAiB,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QAClD,OAAO,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,MAAM,QAAQ,GAAG,WAAW,GAAG,iBAAiB,CAAC;IAEjD,MAAM,OAAO,GAAG,WAAW,CAAC;IAC5B,MAAM,kBAAkB,GAAG,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,iBAAiB,CAAC;IAErF,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAEvD,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzB,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB,EAAE,SAAmB;IAC3D,oCAAoC;IACpC,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,gBAAgB;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,CAAC;IAEvB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1C,IAAI,MAAM,GAAG,CAAC,UAAU,CAAC;QACzB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,IAAI,UAAU,CAAC;YACrB,UAAU,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS;YAAE,OAAO,IAAI,CAAC;QAC9C,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAElC,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;QAElC,IAAI,IAAI,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,WAAW;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC,CAAC,mBAAmB;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PercentileInput, PercentileResult } from './types.js';
2
+ export declare function percentile(input: PercentileInput): PercentileResult | null;
3
+ //# sourceMappingURL=percentile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"percentile.d.ts","sourceRoot":"","sources":["../../src/utility/percentile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAsB1E"}
@@ -0,0 +1,24 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function percentile(input) {
3
+ const { data, percentile: p } = input;
4
+ if (!data || data.length === 0)
5
+ return null;
6
+ if (p < 0 || p > 100)
7
+ return null;
8
+ const sorted = [...data].sort((a, b) => a - b);
9
+ const n = sorted.length;
10
+ if (p === 0)
11
+ return { percentile: p, value: sorted[0] };
12
+ if (p === 100)
13
+ return { percentile: p, value: sorted[n - 1] };
14
+ const rank = (p / 100) * (n - 1);
15
+ const lower = Math.floor(rank);
16
+ const upper = Math.ceil(rank);
17
+ const frac = rank - lower;
18
+ const value = sorted[lower] + frac * (sorted[upper] - sorted[lower]);
19
+ return {
20
+ percentile: p,
21
+ value: roundTo(value, 6),
22
+ };
23
+ }
24
+ //# sourceMappingURL=percentile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"percentile.js","sourceRoot":"","sources":["../../src/utility/percentile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;IACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IAExB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAE9D,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;IAE1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAErE,OAAO;QACL,UAAU,EAAE,CAAC;QACb,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RegressionInput, RegressionResult } from './types.js';
2
+ export declare function regression(input: RegressionInput): RegressionResult | null;
3
+ //# sourceMappingURL=regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/utility/regression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CA2C1E"}
@@ -0,0 +1,40 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function regression(input) {
3
+ const { x, y } = input;
4
+ if (!x || !y || x.length !== y.length || x.length < 2)
5
+ return null;
6
+ const n = x.length;
7
+ const meanX = x.reduce((a, v) => a + v, 0) / n;
8
+ const meanY = y.reduce((a, v) => a + v, 0) / n;
9
+ let sumXY = 0;
10
+ let sumX2 = 0;
11
+ let sumY2 = 0;
12
+ for (let i = 0; i < n; i++) {
13
+ const dx = x[i] - meanX;
14
+ const dy = y[i] - meanY;
15
+ sumXY += dx * dy;
16
+ sumX2 += dx * dx;
17
+ sumY2 += dy * dy;
18
+ }
19
+ if (sumX2 === 0)
20
+ return null;
21
+ const slope = sumXY / sumX2;
22
+ const intercept = meanY - slope * meanX;
23
+ const ssTot = sumY2;
24
+ const ssRes = y.reduce((acc, yi, i) => {
25
+ const predicted = slope * x[i] + intercept;
26
+ return acc + (yi - predicted) ** 2;
27
+ }, 0);
28
+ const r2 = ssTot === 0 ? 1 : 1 - ssRes / ssTot;
29
+ const slopeStr = roundTo(slope, 6);
30
+ const interceptStr = roundTo(intercept, 6);
31
+ const sign = interceptStr >= 0 ? '+' : '-';
32
+ const equation = `y = ${slopeStr}x ${sign} ${Math.abs(interceptStr)}`;
33
+ return {
34
+ slope: roundTo(slope, 6),
35
+ intercept: roundTo(intercept, 6),
36
+ r2: roundTo(r2, 6),
37
+ equation,
38
+ };
39
+ }
40
+ //# sourceMappingURL=regression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.js","sourceRoot":"","sources":["../../src/utility/regression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAE/C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACxB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5B,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAExC,MAAM,KAAK,GAAG,KAAK,CAAC;IACpB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QAC3C,OAAO,GAAG,GAAG,CAAC,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IAE/C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;IAEtE,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAClB,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RoiInput, RoiResult } from './types.js';
2
+ export declare function roi(input: RoiInput): RoiResult | null;
3
+ //# sourceMappingURL=roi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roi.d.ts","sourceRoot":"","sources":["../../src/utility/roi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,CAiBrD"}
@@ -0,0 +1,19 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function roi(input) {
3
+ const { investment, annualReturn, years } = input;
4
+ if (investment <= 0 || annualReturn <= 0 || years <= 0)
5
+ return null;
6
+ const totalReturn = annualReturn * years;
7
+ const netProfit = totalReturn - investment;
8
+ const roiPercent = (netProfit / investment) * 100;
9
+ const annualRoi = ((1 + netProfit / investment) ** (1 / years) - 1) * 100;
10
+ const paybackPeriod = investment / annualReturn;
11
+ return {
12
+ roi: roundTo(roiPercent, 6),
13
+ annualRoi: roundTo(annualRoi, 6),
14
+ paybackPeriod: roundTo(paybackPeriod, 6),
15
+ totalReturn: roundTo(totalReturn, 6),
16
+ netProfit: roundTo(netProfit, 6),
17
+ };
18
+ }
19
+ //# sourceMappingURL=roi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roi.js","sourceRoot":"","sources":["../../src/utility/roi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,GAAG,CAAC,KAAe;IACjC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAClD,IAAI,UAAU,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpE,MAAM,WAAW,GAAG,YAAY,GAAG,KAAK,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;IAC3C,MAAM,UAAU,GAAG,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;IAClD,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IAC1E,MAAM,aAAa,GAAG,UAAU,GAAG,YAAY,CAAC;IAEhD,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3B,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACxC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StatisticsInput, StatisticsResult } from './types.js';
2
+ export declare function statistics(input: StatisticsInput): StatisticsResult | null;
3
+ //# sourceMappingURL=statistics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statistics.d.ts","sourceRoot":"","sources":["../../src/utility/statistics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI,CAiC1E"}
@@ -0,0 +1,34 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function statistics(input) {
3
+ const { data } = input;
4
+ if (!data || data.length === 0)
5
+ return null;
6
+ const n = data.length;
7
+ const sorted = [...data].sort((a, b) => a - b);
8
+ const sum = data.reduce((acc, v) => acc + v, 0);
9
+ const mean = sum / n;
10
+ const min = sorted[0];
11
+ const max = sorted[n - 1];
12
+ const range = max - min;
13
+ let median;
14
+ if (n % 2 === 0) {
15
+ median = (sorted[n / 2 - 1] + sorted[n / 2]) / 2;
16
+ }
17
+ else {
18
+ median = sorted[Math.floor(n / 2)];
19
+ }
20
+ const variance = data.reduce((acc, v) => acc + (v - mean) ** 2, 0) / n;
21
+ const stdDev = Math.sqrt(variance);
22
+ return {
23
+ count: n,
24
+ sum: roundTo(sum, 6),
25
+ mean: roundTo(mean, 6),
26
+ median: roundTo(median, 6),
27
+ min: roundTo(min, 6),
28
+ max: roundTo(max, 6),
29
+ range: roundTo(range, 6),
30
+ variance: roundTo(variance, 6),
31
+ stdDev: roundTo(stdDev, 6),
32
+ };
33
+ }
34
+ //# sourceMappingURL=statistics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statistics.js","sourceRoot":"","sources":["../../src/utility/statistics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;IAExB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAChB,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnC,OAAO;QACL,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;KAC3B,CAAC;AACJ,CAAC"}