formulab 0.5.1 → 0.10.1

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 (340) hide show
  1. package/CHANGELOG.md +126 -0
  2. package/README.md +122 -32
  3. package/dist/automotive/brakingDistance.d.ts +4 -0
  4. package/dist/automotive/brakingDistance.d.ts.map +1 -1
  5. package/dist/automotive/brakingDistance.js +8 -4
  6. package/dist/automotive/brakingDistance.js.map +1 -1
  7. package/dist/automotive/chargingLoss.d.ts +15 -0
  8. package/dist/automotive/chargingLoss.d.ts.map +1 -0
  9. package/dist/automotive/chargingLoss.js +62 -0
  10. package/dist/automotive/chargingLoss.js.map +1 -0
  11. package/dist/automotive/index.d.ts +2 -1
  12. package/dist/automotive/index.d.ts.map +1 -1
  13. package/dist/automotive/index.js +1 -0
  14. package/dist/automotive/index.js.map +1 -1
  15. package/dist/automotive/types.d.ts +23 -0
  16. package/dist/automotive/types.d.ts.map +1 -1
  17. package/dist/battery/cRate.d.ts.map +1 -1
  18. package/dist/battery/cRate.js +6 -0
  19. package/dist/battery/cRate.js.map +1 -1
  20. package/dist/battery/guards.d.ts +7 -0
  21. package/dist/battery/guards.d.ts.map +1 -0
  22. package/dist/battery/guards.js +17 -0
  23. package/dist/battery/guards.js.map +1 -0
  24. package/dist/battery/index.d.ts +1 -0
  25. package/dist/battery/index.d.ts.map +1 -1
  26. package/dist/battery/index.js +2 -0
  27. package/dist/battery/index.js.map +1 -1
  28. package/dist/chemical/dilution.js +4 -4
  29. package/dist/chemical/dilution.js.map +1 -1
  30. package/dist/chemical/flowControl.d.ts +14 -0
  31. package/dist/chemical/flowControl.d.ts.map +1 -0
  32. package/dist/chemical/flowControl.js +69 -0
  33. package/dist/chemical/flowControl.js.map +1 -0
  34. package/dist/chemical/guards.d.ts +17 -0
  35. package/dist/chemical/guards.d.ts.map +1 -0
  36. package/dist/chemical/guards.js +54 -0
  37. package/dist/chemical/guards.js.map +1 -0
  38. package/dist/chemical/heatTransfer.d.ts +6 -0
  39. package/dist/chemical/heatTransfer.d.ts.map +1 -1
  40. package/dist/chemical/heatTransfer.js +15 -9
  41. package/dist/chemical/heatTransfer.js.map +1 -1
  42. package/dist/chemical/index.d.ts +5 -1
  43. package/dist/chemical/index.d.ts.map +1 -1
  44. package/dist/chemical/index.js +5 -0
  45. package/dist/chemical/index.js.map +1 -1
  46. package/dist/chemical/pid.d.ts +14 -0
  47. package/dist/chemical/pid.d.ts.map +1 -0
  48. package/dist/chemical/pid.js +103 -0
  49. package/dist/chemical/pid.js.map +1 -0
  50. package/dist/chemical/pipeFlow.d.ts +6 -0
  51. package/dist/chemical/pipeFlow.d.ts.map +1 -1
  52. package/dist/chemical/pipeFlow.js +12 -6
  53. package/dist/chemical/pipeFlow.js.map +1 -1
  54. package/dist/chemical/reliefValve.d.ts +14 -0
  55. package/dist/chemical/reliefValve.d.ts.map +1 -0
  56. package/dist/chemical/reliefValve.js +98 -0
  57. package/dist/chemical/reliefValve.js.map +1 -0
  58. package/dist/chemical/types.d.ts +63 -0
  59. package/dist/chemical/types.d.ts.map +1 -1
  60. package/dist/construction/aggregate.d.ts +4 -0
  61. package/dist/construction/aggregate.d.ts.map +1 -1
  62. package/dist/construction/aggregate.js +8 -4
  63. package/dist/construction/aggregate.js.map +1 -1
  64. package/dist/construction/guards.d.ts +7 -0
  65. package/dist/construction/guards.d.ts.map +1 -0
  66. package/dist/construction/guards.js +31 -0
  67. package/dist/construction/guards.js.map +1 -0
  68. package/dist/construction/index.d.ts +1 -0
  69. package/dist/construction/index.d.ts.map +1 -1
  70. package/dist/construction/index.js +2 -0
  71. package/dist/construction/index.js.map +1 -1
  72. package/dist/construction/momentOfInertia.d.ts +7 -0
  73. package/dist/construction/momentOfInertia.d.ts.map +1 -1
  74. package/dist/construction/momentOfInertia.js +19 -12
  75. package/dist/construction/momentOfInertia.js.map +1 -1
  76. package/dist/construction/roof.js +2 -2
  77. package/dist/construction/roof.js.map +1 -1
  78. package/dist/electronics/awg.d.ts +3 -2
  79. package/dist/electronics/awg.d.ts.map +1 -1
  80. package/dist/electronics/awg.js +3 -3
  81. package/dist/electronics/awg.js.map +1 -1
  82. package/dist/electronics/capacitor.js +1 -1
  83. package/dist/electronics/capacitor.js.map +1 -1
  84. package/dist/electronics/guards.d.ts +7 -0
  85. package/dist/electronics/guards.d.ts.map +1 -0
  86. package/dist/electronics/guards.js +17 -0
  87. package/dist/electronics/guards.js.map +1 -0
  88. package/dist/electronics/index.d.ts +1 -0
  89. package/dist/electronics/index.d.ts.map +1 -1
  90. package/dist/electronics/index.js +2 -0
  91. package/dist/electronics/index.js.map +1 -1
  92. package/dist/electronics/led.js +2 -2
  93. package/dist/electronics/led.js.map +1 -1
  94. package/dist/electronics/ohmsLaw.d.ts +3 -0
  95. package/dist/electronics/ohmsLaw.d.ts.map +1 -1
  96. package/dist/electronics/ohmsLaw.js +11 -8
  97. package/dist/electronics/ohmsLaw.js.map +1 -1
  98. package/dist/electronics/stencil.d.ts +2 -1
  99. package/dist/electronics/stencil.d.ts.map +1 -1
  100. package/dist/electronics/stencil.js +4 -3
  101. package/dist/electronics/stencil.js.map +1 -1
  102. package/dist/energy/boilerEfficiency.d.ts +13 -0
  103. package/dist/energy/boilerEfficiency.d.ts.map +1 -0
  104. package/dist/energy/boilerEfficiency.js +46 -0
  105. package/dist/energy/boilerEfficiency.js.map +1 -0
  106. package/dist/energy/cusum.d.ts +15 -0
  107. package/dist/energy/cusum.d.ts.map +1 -0
  108. package/dist/energy/cusum.js +71 -0
  109. package/dist/energy/cusum.js.map +1 -0
  110. package/dist/energy/degreeDay.d.ts +13 -0
  111. package/dist/energy/degreeDay.d.ts.map +1 -0
  112. package/dist/energy/degreeDay.js +46 -0
  113. package/dist/energy/degreeDay.js.map +1 -0
  114. package/dist/energy/heatPump.d.ts +13 -0
  115. package/dist/energy/heatPump.d.ts.map +1 -0
  116. package/dist/energy/heatPump.js +48 -0
  117. package/dist/energy/heatPump.js.map +1 -0
  118. package/dist/energy/index.d.ts +9 -1
  119. package/dist/energy/index.d.ts.map +1 -1
  120. package/dist/energy/index.js +8 -0
  121. package/dist/energy/index.js.map +1 -1
  122. package/dist/energy/insulationRoi.d.ts +14 -0
  123. package/dist/energy/insulationRoi.d.ts.map +1 -0
  124. package/dist/energy/insulationRoi.js +52 -0
  125. package/dist/energy/insulationRoi.js.map +1 -0
  126. package/dist/energy/ledRoi.d.ts +14 -0
  127. package/dist/energy/ledRoi.d.ts.map +1 -0
  128. package/dist/energy/ledRoi.js +49 -0
  129. package/dist/energy/ledRoi.js.map +1 -0
  130. package/dist/energy/solarOutput.d.ts +4 -0
  131. package/dist/energy/solarOutput.d.ts.map +1 -1
  132. package/dist/energy/solarOutput.js +8 -4
  133. package/dist/energy/solarOutput.js.map +1 -1
  134. package/dist/energy/transformerLoss.d.ts +13 -0
  135. package/dist/energy/transformerLoss.d.ts.map +1 -0
  136. package/dist/energy/transformerLoss.js +63 -0
  137. package/dist/energy/transformerLoss.js.map +1 -0
  138. package/dist/energy/types.d.ts +168 -0
  139. package/dist/energy/types.d.ts.map +1 -1
  140. package/dist/energy/windOutput.d.ts +14 -0
  141. package/dist/energy/windOutput.d.ts.map +1 -0
  142. package/dist/energy/windOutput.js +77 -0
  143. package/dist/energy/windOutput.js.map +1 -0
  144. package/dist/environmental/scope2Emissions.d.ts +1 -0
  145. package/dist/environmental/scope2Emissions.d.ts.map +1 -1
  146. package/dist/environmental/scope2Emissions.js +2 -1
  147. package/dist/environmental/scope2Emissions.js.map +1 -1
  148. package/dist/food/index.d.ts +3 -1
  149. package/dist/food/index.d.ts.map +1 -1
  150. package/dist/food/index.js +2 -0
  151. package/dist/food/index.js.map +1 -1
  152. package/dist/food/stabilityStudy.d.ts +15 -0
  153. package/dist/food/stabilityStudy.d.ts.map +1 -0
  154. package/dist/food/stabilityStudy.js +92 -0
  155. package/dist/food/stabilityStudy.js.map +1 -0
  156. package/dist/food/types.d.ts +43 -0
  157. package/dist/food/types.d.ts.map +1 -1
  158. package/dist/food/waterActivity.d.ts +17 -0
  159. package/dist/food/waterActivity.d.ts.map +1 -0
  160. package/dist/food/waterActivity.js +63 -0
  161. package/dist/food/waterActivity.js.map +1 -0
  162. package/dist/logistics/abcAnalysis.d.ts +15 -0
  163. package/dist/logistics/abcAnalysis.d.ts.map +1 -0
  164. package/dist/logistics/abcAnalysis.js +101 -0
  165. package/dist/logistics/abcAnalysis.js.map +1 -0
  166. package/dist/logistics/index.d.ts +4 -1
  167. package/dist/logistics/index.d.ts.map +1 -1
  168. package/dist/logistics/index.js +3 -0
  169. package/dist/logistics/index.js.map +1 -1
  170. package/dist/logistics/inventoryTurnover.d.ts +13 -0
  171. package/dist/logistics/inventoryTurnover.d.ts.map +1 -0
  172. package/dist/logistics/inventoryTurnover.js +36 -0
  173. package/dist/logistics/inventoryTurnover.js.map +1 -0
  174. package/dist/logistics/loadCapacity.d.ts +13 -0
  175. package/dist/logistics/loadCapacity.d.ts.map +1 -0
  176. package/dist/logistics/loadCapacity.js +46 -0
  177. package/dist/logistics/loadCapacity.js.map +1 -0
  178. package/dist/logistics/types.d.ts +78 -0
  179. package/dist/logistics/types.d.ts.map +1 -1
  180. package/dist/machining/boringBarDeflection.d.ts.map +1 -1
  181. package/dist/machining/boringBarDeflection.js +7 -1
  182. package/dist/machining/boringBarDeflection.js.map +1 -1
  183. package/dist/machining/toolDeflection.d.ts.map +1 -1
  184. package/dist/machining/toolDeflection.js +7 -1
  185. package/dist/machining/toolDeflection.js.map +1 -1
  186. package/dist/machining/triangleSolver.d.ts +2 -1
  187. package/dist/machining/triangleSolver.d.ts.map +1 -1
  188. package/dist/machining/triangleSolver.js +6 -5
  189. package/dist/machining/triangleSolver.js.map +1 -1
  190. package/dist/metal/flangeSpec.d.ts +3 -0
  191. package/dist/metal/flangeSpec.d.ts.map +1 -1
  192. package/dist/metal/flangeSpec.js +6 -3
  193. package/dist/metal/flangeSpec.js.map +1 -1
  194. package/dist/metal/guards.d.ts +12 -0
  195. package/dist/metal/guards.d.ts.map +1 -0
  196. package/dist/metal/guards.js +36 -0
  197. package/dist/metal/guards.js.map +1 -0
  198. package/dist/metal/index.d.ts +1 -0
  199. package/dist/metal/index.d.ts.map +1 -1
  200. package/dist/metal/index.js +2 -0
  201. package/dist/metal/index.js.map +1 -1
  202. package/dist/metal/metalWeight.d.ts.map +1 -1
  203. package/dist/metal/metalWeight.js +20 -0
  204. package/dist/metal/metalWeight.js.map +1 -1
  205. package/dist/metal/pipeSpec.d.ts +3 -0
  206. package/dist/metal/pipeSpec.d.ts.map +1 -1
  207. package/dist/metal/pipeSpec.js +6 -3
  208. package/dist/metal/pipeSpec.js.map +1 -1
  209. package/dist/quality/cmk.d.ts +17 -0
  210. package/dist/quality/cmk.d.ts.map +1 -0
  211. package/dist/quality/cmk.js +43 -0
  212. package/dist/quality/cmk.js.map +1 -0
  213. package/dist/quality/controlChart.d.ts +3 -0
  214. package/dist/quality/controlChart.d.ts.map +1 -1
  215. package/dist/quality/controlChart.js +6 -3
  216. package/dist/quality/controlChart.js.map +1 -1
  217. package/dist/quality/gageRR.d.ts +18 -0
  218. package/dist/quality/gageRR.d.ts.map +1 -0
  219. package/dist/quality/gageRR.js +110 -0
  220. package/dist/quality/gageRR.js.map +1 -0
  221. package/dist/quality/index.d.ts +5 -1
  222. package/dist/quality/index.d.ts.map +1 -1
  223. package/dist/quality/index.js +4 -0
  224. package/dist/quality/index.js.map +1 -1
  225. package/dist/quality/oee.js +2 -2
  226. package/dist/quality/oee.js.map +1 -1
  227. package/dist/quality/paretoAnalysis.d.ts +15 -0
  228. package/dist/quality/paretoAnalysis.d.ts.map +1 -0
  229. package/dist/quality/paretoAnalysis.js +92 -0
  230. package/dist/quality/paretoAnalysis.js.map +1 -0
  231. package/dist/quality/types.d.ts +91 -0
  232. package/dist/quality/types.d.ts.map +1 -1
  233. package/dist/quality/weibull.d.ts +17 -0
  234. package/dist/quality/weibull.d.ts.map +1 -0
  235. package/dist/quality/weibull.js +106 -0
  236. package/dist/quality/weibull.js.map +1 -0
  237. package/dist/safety/arcFlash.d.ts +14 -0
  238. package/dist/safety/arcFlash.d.ts.map +1 -0
  239. package/dist/safety/arcFlash.js +90 -0
  240. package/dist/safety/arcFlash.js.map +1 -0
  241. package/dist/safety/confinedSpace.d.ts +15 -0
  242. package/dist/safety/confinedSpace.d.ts.map +1 -0
  243. package/dist/safety/confinedSpace.js +116 -0
  244. package/dist/safety/confinedSpace.js.map +1 -0
  245. package/dist/safety/ergonomicRisk.d.ts +9 -0
  246. package/dist/safety/ergonomicRisk.d.ts.map +1 -0
  247. package/dist/safety/ergonomicRisk.js +208 -0
  248. package/dist/safety/ergonomicRisk.js.map +1 -0
  249. package/dist/safety/illuminance.d.ts +13 -0
  250. package/dist/safety/illuminance.d.ts.map +1 -0
  251. package/dist/safety/illuminance.js +91 -0
  252. package/dist/safety/illuminance.js.map +1 -0
  253. package/dist/safety/index.d.ts +8 -1
  254. package/dist/safety/index.d.ts.map +1 -1
  255. package/dist/safety/index.js +7 -0
  256. package/dist/safety/index.js.map +1 -1
  257. package/dist/safety/ladderAngle.d.ts +16 -0
  258. package/dist/safety/ladderAngle.d.ts.map +1 -0
  259. package/dist/safety/ladderAngle.js +87 -0
  260. package/dist/safety/ladderAngle.js.map +1 -0
  261. package/dist/safety/lel.d.ts +14 -0
  262. package/dist/safety/lel.d.ts.map +1 -0
  263. package/dist/safety/lel.js +66 -0
  264. package/dist/safety/lel.js.map +1 -0
  265. package/dist/safety/thermalComfort.d.ts +14 -0
  266. package/dist/safety/thermalComfort.d.ts.map +1 -0
  267. package/dist/safety/thermalComfort.js +96 -0
  268. package/dist/safety/thermalComfort.js.map +1 -0
  269. package/dist/safety/types.d.ts +164 -0
  270. package/dist/safety/types.d.ts.map +1 -1
  271. package/dist/safety/ventilationRate.d.ts +3 -0
  272. package/dist/safety/ventilationRate.d.ts.map +1 -1
  273. package/dist/safety/ventilationRate.js +6 -3
  274. package/dist/safety/ventilationRate.js.map +1 -1
  275. package/dist/utility/bilinearInterpolation.d.ts +3 -0
  276. package/dist/utility/bilinearInterpolation.d.ts.map +1 -0
  277. package/dist/utility/bilinearInterpolation.js +47 -0
  278. package/dist/utility/bilinearInterpolation.js.map +1 -0
  279. package/dist/utility/correlation.d.ts +3 -0
  280. package/dist/utility/correlation.d.ts.map +1 -0
  281. package/dist/utility/correlation.js +29 -0
  282. package/dist/utility/correlation.js.map +1 -0
  283. package/dist/utility/depreciation.d.ts +3 -0
  284. package/dist/utility/depreciation.d.ts.map +1 -0
  285. package/dist/utility/depreciation.js +57 -0
  286. package/dist/utility/depreciation.js.map +1 -0
  287. package/dist/utility/histogram.d.ts +3 -0
  288. package/dist/utility/histogram.d.ts.map +1 -0
  289. package/dist/utility/histogram.js +42 -0
  290. package/dist/utility/histogram.js.map +1 -0
  291. package/dist/utility/index.d.ts +15 -1
  292. package/dist/utility/index.d.ts.map +1 -1
  293. package/dist/utility/index.js +14 -0
  294. package/dist/utility/index.js.map +1 -1
  295. package/dist/utility/lcc.d.ts +3 -0
  296. package/dist/utility/lcc.d.ts.map +1 -0
  297. package/dist/utility/lcc.js +26 -0
  298. package/dist/utility/lcc.js.map +1 -0
  299. package/dist/utility/linearInterpolation.d.ts +3 -0
  300. package/dist/utility/linearInterpolation.d.ts.map +1 -0
  301. package/dist/utility/linearInterpolation.js +42 -0
  302. package/dist/utility/linearInterpolation.js.map +1 -0
  303. package/dist/utility/movingAverage.d.ts +3 -0
  304. package/dist/utility/movingAverage.d.ts.map +1 -0
  305. package/dist/utility/movingAverage.js +41 -0
  306. package/dist/utility/movingAverage.js.map +1 -0
  307. package/dist/utility/normalize.d.ts +3 -0
  308. package/dist/utility/normalize.d.ts.map +1 -0
  309. package/dist/utility/normalize.js +35 -0
  310. package/dist/utility/normalize.js.map +1 -0
  311. package/dist/utility/npv.d.ts +3 -0
  312. package/dist/utility/npv.d.ts.map +1 -0
  313. package/dist/utility/npv.js +45 -0
  314. package/dist/utility/npv.js.map +1 -0
  315. package/dist/utility/percentile.d.ts +3 -0
  316. package/dist/utility/percentile.d.ts.map +1 -0
  317. package/dist/utility/percentile.js +24 -0
  318. package/dist/utility/percentile.js.map +1 -0
  319. package/dist/utility/regression.d.ts +3 -0
  320. package/dist/utility/regression.d.ts.map +1 -0
  321. package/dist/utility/regression.js +40 -0
  322. package/dist/utility/regression.js.map +1 -0
  323. package/dist/utility/roi.d.ts +3 -0
  324. package/dist/utility/roi.d.ts.map +1 -0
  325. package/dist/utility/roi.js +19 -0
  326. package/dist/utility/roi.js.map +1 -0
  327. package/dist/utility/statistics.d.ts +3 -0
  328. package/dist/utility/statistics.d.ts.map +1 -0
  329. package/dist/utility/statistics.js +34 -0
  330. package/dist/utility/statistics.js.map +1 -0
  331. package/dist/utility/types.d.ts +213 -1
  332. package/dist/utility/types.d.ts.map +1 -1
  333. package/dist/utility/unit.d.ts.map +1 -1
  334. package/dist/utility/unit.js +51 -0
  335. package/dist/utility/unit.js.map +1 -1
  336. package/dist/utility/weightedScore.d.ts +3 -0
  337. package/dist/utility/weightedScore.d.ts.map +1 -0
  338. package/dist/utility/weightedScore.js +35 -0
  339. package/dist/utility/weightedScore.js.map +1 -0
  340. package/package.json +3 -2
@@ -0,0 +1,96 @@
1
+ import { roundTo } from '../utils.js';
2
+ /**
3
+ * PMV/PPD Thermal Comfort — ISO 7730 / Fanger's Model
4
+ *
5
+ * @formula
6
+ * - PMV = f(M, W, Icl, ta, tr, var, pa) with iterative tcl solve
7
+ * - PPD = 100 − 95 × exp(−0.03353×PMV⁴ − 0.2179×PMV²)
8
+ *
9
+ * @reference ISO 7730:2005 — Ergonomics of the thermal environment
10
+ * @reference ASHRAE Standard 55-2020
11
+ * @reference pythermalcomfort reference implementation
12
+ */
13
+ export function thermalComfort(input) {
14
+ const { airTemp, radiantTemp, airVelocity, relativeHumidity, metabolicRate, clothingInsulation } = input;
15
+ const M = metabolicRate * 58.15; // W/m²
16
+ const W = 0;
17
+ const Icl = clothingInsulation * 0.155; // m²·K/W
18
+ const ta = airTemp;
19
+ const tr = radiantTemp;
20
+ const vel = Math.max(airVelocity, 0);
21
+ // Water vapor partial pressure (Pa)
22
+ const pa = (relativeHumidity / 100) * satVaporPressure(ta);
23
+ // Clothing area factor
24
+ const fcl = clothingInsulation <= 0.5
25
+ ? 1.0 + 0.2 * clothingInsulation
26
+ : 1.05 + 0.1 * clothingInsulation;
27
+ // Iterative solve for clothing surface temperature
28
+ let tcl = (ta + tr) / 2 + 0.5; // initial guess
29
+ for (let i = 0; i < 200; i++) {
30
+ const hcn = 2.38 * Math.pow(Math.abs(tcl - ta), 0.25);
31
+ const hcf = 12.1 * Math.sqrt(vel);
32
+ const hc = Math.max(hcn, hcf);
33
+ const tcl_new = 35.7 - 0.028 * (M - W) - Icl * (3.96e-8 * fcl * (Math.pow(tcl + 273, 4) - Math.pow(tr + 273, 4)) +
34
+ fcl * hc * (tcl - ta));
35
+ if (Math.abs(tcl_new - tcl) < 1e-6) {
36
+ tcl = tcl_new;
37
+ break;
38
+ }
39
+ // damped update to prevent oscillation
40
+ tcl = tcl + 0.5 * (tcl_new - tcl);
41
+ }
42
+ // Final hc
43
+ const hcn = 2.38 * Math.pow(Math.abs(tcl - ta), 0.25);
44
+ const hcf = 12.1 * Math.sqrt(vel);
45
+ const hc = Math.max(hcn, hcf);
46
+ // Heat loss components
47
+ const hl1 = 3.05e-3 * (5733 - 6.99 * (M - W) - pa); // skin diffusion
48
+ const hl2 = (M - W) > 58.15 ? 0.42 * ((M - W) - 58.15) : 0; // sweating
49
+ const hl3 = 1.7e-5 * M * (5867 - pa); // latent respiration
50
+ const hl4 = 0.0014 * M * (34 - ta); // dry respiration
51
+ const hl5 = 3.96e-8 * fcl * (Math.pow(tcl + 273, 4) - Math.pow(tr + 273, 4)); // radiation
52
+ const hl6 = fcl * hc * (tcl - ta); // convection
53
+ // PMV
54
+ const ts = 0.303 * Math.exp(-0.036 * M) + 0.028;
55
+ const pmv = ts * ((M - W) - hl1 - hl2 - hl3 - hl4 - hl5 - hl6);
56
+ // PPD
57
+ const ppd = 100 - 95 * Math.exp(-0.03353 * Math.pow(pmv, 4) - 0.2179 * Math.pow(pmv, 2));
58
+ // Category
59
+ const absPmv = Math.abs(pmv);
60
+ let category;
61
+ if (absPmv < 0.2)
62
+ category = 'A';
63
+ else if (absPmv < 0.5)
64
+ category = 'B';
65
+ else if (absPmv < 0.7)
66
+ category = 'C';
67
+ else
68
+ category = 'outside';
69
+ // Sensation
70
+ let sensation;
71
+ if (pmv < -2.5)
72
+ sensation = 'cold';
73
+ else if (pmv < -1.5)
74
+ sensation = 'cool';
75
+ else if (pmv < -0.5)
76
+ sensation = 'slightly_cool';
77
+ else if (pmv <= 0.5)
78
+ sensation = 'neutral';
79
+ else if (pmv <= 1.5)
80
+ sensation = 'slightly_warm';
81
+ else if (pmv <= 2.5)
82
+ sensation = 'warm';
83
+ else
84
+ sensation = 'hot';
85
+ return {
86
+ pmv: roundTo(pmv, 2),
87
+ ppd: roundTo(ppd, 1),
88
+ category,
89
+ sensation,
90
+ };
91
+ }
92
+ /** Saturation vapor pressure (Pa) using Magnus formula */
93
+ function satVaporPressure(t) {
94
+ return 610.7 * Math.exp((17.269 * t) / (237.3 + t));
95
+ }
96
+ //# sourceMappingURL=thermalComfort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thermalComfort.js","sourceRoot":"","sources":["../../src/safety/thermalComfort.ts"],"names":[],"mappings":"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"}
@@ -115,4 +115,168 @@ export interface RespiratorResult {
115
115
  protectionAdequate: boolean;
116
116
  safetyMargin: number;
117
117
  }
118
+ /**
119
+ * Ladder Angle Calculator Types (OSHA 4:1 rule)
120
+ */
121
+ export interface LadderAngleInput {
122
+ ladderLength: number;
123
+ height?: number;
124
+ baseDistance?: number;
125
+ }
126
+ export interface LadderAngleResult {
127
+ angle: number;
128
+ height: number;
129
+ baseDistance: number;
130
+ ladderLength: number;
131
+ idealBaseDistance: number;
132
+ reachHeight: number;
133
+ isCompliant: boolean;
134
+ warnings: string[];
135
+ }
136
+ /**
137
+ * Illuminance Calculator Types (Lumen Method)
138
+ */
139
+ export interface IlluminanceInput {
140
+ roomLength: number;
141
+ roomWidth: number;
142
+ luminaireHeight: number;
143
+ workplaneHeight?: number;
144
+ targetLux: number;
145
+ lumensPerLuminaire: number;
146
+ wattsPerLuminaire?: number;
147
+ cu?: number;
148
+ mf?: number;
149
+ }
150
+ export interface IlluminanceResult {
151
+ fixturesNeeded: number;
152
+ actualLux: number;
153
+ roomIndex: number;
154
+ totalLumens: number;
155
+ powerDensity: number | null;
156
+ recommendedSpacing: number;
157
+ }
158
+ /**
159
+ * Thermal Comfort (PMV/PPD) Types — ISO 7730
160
+ */
161
+ export interface ThermalComfortInput {
162
+ airTemp: number;
163
+ radiantTemp: number;
164
+ airVelocity: number;
165
+ relativeHumidity: number;
166
+ metabolicRate: number;
167
+ clothingInsulation: number;
168
+ }
169
+ export interface ThermalComfortResult {
170
+ pmv: number;
171
+ ppd: number;
172
+ category: 'A' | 'B' | 'C' | 'outside';
173
+ sensation: 'cold' | 'cool' | 'slightly_cool' | 'neutral' | 'slightly_warm' | 'warm' | 'hot';
174
+ }
175
+ /**
176
+ * REBA (Rapid Entire Body Assessment) Types
177
+ */
178
+ export interface RebaInput {
179
+ trunkAngle: number;
180
+ trunkTwisted: boolean;
181
+ trunkSideBent: boolean;
182
+ neckAngle: number;
183
+ neckTwisted: boolean;
184
+ neckSideBent: boolean;
185
+ legSupport: 'bilateral' | 'unilateral';
186
+ kneeFlexion: number;
187
+ upperArmAngle: number;
188
+ shoulderRaised: boolean;
189
+ armAbducted: boolean;
190
+ armSupported: boolean;
191
+ lowerArmAngle: number;
192
+ wristAngle: number;
193
+ wristTwisted: boolean;
194
+ load: number;
195
+ shockForce: boolean;
196
+ staticPosture: boolean;
197
+ repeatedSmallRange: boolean;
198
+ rapidLargeChange: boolean;
199
+ }
200
+ export interface RebaResult {
201
+ trunkScore: number;
202
+ neckScore: number;
203
+ legScore: number;
204
+ upperArmScore: number;
205
+ lowerArmScore: number;
206
+ wristScore: number;
207
+ scoreA: number;
208
+ scoreB: number;
209
+ scoreC: number;
210
+ rebaScore: number;
211
+ riskLevel: 'negligible' | 'low' | 'medium' | 'high' | 'very_high';
212
+ actionLevel: number;
213
+ }
214
+ /**
215
+ * Arc Flash Types — IEEE 1584 / NFPA 70E
216
+ */
217
+ export interface ArcFlashInput {
218
+ voltage: number;
219
+ boltedFaultCurrent: number;
220
+ workingDistance: number;
221
+ faultClearingTime: number;
222
+ gapBetweenConductors: number;
223
+ enclosureType: 'open' | 'box' | 'mcc' | 'panel' | 'cable';
224
+ }
225
+ export interface ArcFlashResult {
226
+ arcCurrent: number;
227
+ incidentEnergy: number;
228
+ arcFlashBoundary: number;
229
+ ppeCategory: 0 | 1 | 2 | 3 | 4;
230
+ hazardLevel: 'safe' | 'danger' | 'extreme';
231
+ requiredPPE: string;
232
+ }
233
+ /**
234
+ * Confined Space Atmospheric Assessment Types — OSHA 29 CFR 1910.146
235
+ */
236
+ export interface ConfinedSpaceInput {
237
+ oxygenPercent: number;
238
+ lelPercent: number;
239
+ h2sPpm?: number;
240
+ coPpm?: number;
241
+ customGas?: {
242
+ name: string;
243
+ concentration: number;
244
+ pel: number;
245
+ idlh: number;
246
+ };
247
+ }
248
+ export interface ConfinedSpaceResult {
249
+ oxygenStatus: 'safe' | 'deficient' | 'enriched';
250
+ lelStatus: 'safe' | 'caution' | 'danger';
251
+ h2sStatus: 'safe' | 'caution' | 'danger' | 'idlh' | null;
252
+ coStatus: 'safe' | 'caution' | 'danger' | 'idlh' | null;
253
+ customGasStatus: 'safe' | 'exceeds_pel' | 'idlh' | null;
254
+ overallStatus: 'safe' | 'caution' | 'danger' | 'idlh';
255
+ entryPermitted: boolean;
256
+ warnings: string[];
257
+ }
258
+ /**
259
+ * LEL (Lower Explosive Limit) Mixed Gas Types — Le Chatelier's Rule
260
+ */
261
+ export interface GasComponent {
262
+ name: string;
263
+ concentration: number;
264
+ lel: number;
265
+ }
266
+ export interface LelInput {
267
+ gases: GasComponent[];
268
+ temperature?: number;
269
+ pressure?: number;
270
+ }
271
+ export interface LelResult {
272
+ mixtureLel: number;
273
+ totalConcentration: number;
274
+ percentOfLel: number;
275
+ status: 'safe' | 'caution' | 'danger';
276
+ safetyMargin: number;
277
+ contributions: {
278
+ name: string;
279
+ fraction: number;
280
+ }[];
281
+ }
118
282
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/safety/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,UAAU,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAGD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC;CACxC;AAGD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACpD;AAGD,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,CAAC;AAE7E,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;CACvC;AAGD,MAAM,WAAW,YAAY;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,MAAM,wBAAwB,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AACpF,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEzH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,wBAAwB,CAAC;IACxC,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,GACd,wBAAwB,GACxB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/safety/types.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,9 @@ import type { VentilationRateInput, VentilationRateResult } from './types.js';
5
5
  * Calculates required ventilation airflow based on room dimensions,
6
6
  * occupancy, space type, and activity level.
7
7
  *
8
+ * @throws {RangeError} Room dimensions must be positive
9
+ * @throws {RangeError} Occupants must be positive
10
+ * @throws {RangeError} Custom ACH must be provided and positive for custom space type
8
11
  * @param input - room dimensions, occupants, space type
9
12
  * @returns ventilation requirements in multiple units
10
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ventilationRate.d.ts","sourceRoot":"","sources":["../../src/safety/ventilationRate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAa,MAAM,YAAY,CAAC;AAgBzF;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAuDlF"}
1
+ {"version":3,"file":"ventilationRate.d.ts","sourceRoot":"","sources":["../../src/safety/ventilationRate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAa,MAAM,YAAY,CAAC;AAgBzF;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAuDlF"}
@@ -18,23 +18,26 @@ const ACH_TABLE = {
18
18
  * Calculates required ventilation airflow based on room dimensions,
19
19
  * occupancy, space type, and activity level.
20
20
  *
21
+ * @throws {RangeError} Room dimensions must be positive
22
+ * @throws {RangeError} Occupants must be positive
23
+ * @throws {RangeError} Custom ACH must be provided and positive for custom space type
21
24
  * @param input - room dimensions, occupants, space type
22
25
  * @returns ventilation requirements in multiple units
23
26
  */
24
27
  export function ventilationRate(input) {
25
28
  const { roomLength, roomWidth, roomHeight, occupants, activityLevel, spaceType, customAch } = input;
26
29
  if (roomLength <= 0 || roomWidth <= 0 || roomHeight <= 0) {
27
- throw new Error('Room dimensions must be positive');
30
+ throw new RangeError('Room dimensions must be positive');
28
31
  }
29
32
  if (occupants <= 0) {
30
- throw new Error('Occupants must be positive');
33
+ throw new RangeError('Occupants must be positive');
31
34
  }
32
35
  const roomVolume = roomLength * roomWidth * roomHeight; // m³
33
36
  // Determine ACH
34
37
  let baseAch;
35
38
  if (spaceType === 'custom') {
36
39
  if (customAch == null || customAch <= 0) {
37
- throw new Error('Custom ACH must be provided and positive for custom space type');
40
+ throw new RangeError('Custom ACH must be provided and positive for custom space type');
38
41
  }
39
42
  baseAch = customAch;
40
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ventilationRate.js","sourceRoot":"","sources":["../../src/safety/ventilationRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;GAGG;AACH,MAAM,SAAS,GAAiD;IAC9D,MAAM,EAAE,CAAC,EAAW,sBAAsB;IAC1C,SAAS,EAAE,CAAC,EAAQ,cAAc;IAClC,MAAM,EAAE,CAAC,EAAW,cAAc;IAClC,UAAU,EAAE,EAAE,EAAM,qCAAqC;IACzD,UAAU,EAAE,EAAE,EAAM,gCAAgC;IACpD,SAAS,EAAE,CAAC,EAAQ,mBAAmB;IACvC,GAAG,EAAE,EAAE,EAAa,iCAAiC;CACtD,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEpG,IAAI,UAAU,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,KAAK;IAE7D,gBAAgB;IAChB,IAAI,OAAe,CAAC;IACpB,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,mEAAmE;IACnE,MAAM,kBAAkB,GAA2B;QACjD,SAAS,EAAE,GAAG;QACd,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,GAAG;QACb,KAAK,EAAE,GAAG;KACX,CAAC;IACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IAEzC,4BAA4B;IAC5B,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAE3C,yBAAyB;IACzB,qBAAqB;IACrB,wCAAwC;IACxC,MAAM,GAAG,GAAG,SAAS,GAAG,OAAO,CAAC;IAEhC,uCAAuC;IACvC,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;IAE5C,MAAM,YAAY,GAAG,GAAG,GAAG,SAAS,CAAC;IAErC,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;KACvC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ventilationRate.js","sourceRoot":"","sources":["../../src/safety/ventilationRate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC;;;GAGG;AACH,MAAM,SAAS,GAAiD;IAC9D,MAAM,EAAE,CAAC,EAAW,sBAAsB;IAC1C,SAAS,EAAE,CAAC,EAAQ,cAAc;IAClC,MAAM,EAAE,CAAC,EAAW,cAAc;IAClC,UAAU,EAAE,EAAE,EAAM,qCAAqC;IACzD,UAAU,EAAE,EAAE,EAAM,gCAAgC;IACpD,SAAS,EAAE,CAAC,EAAQ,mBAAmB;IACvC,GAAG,EAAE,EAAE,EAAa,iCAAiC;CACtD,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAEpG,IAAI,UAAU,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,4BAA4B,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,KAAK;IAE7D,gBAAgB;IAChB,IAAI,OAAe,CAAC;IACpB,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,UAAU,CAAC,gEAAgE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,GAAG,SAAS,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,mEAAmE;IACnE,MAAM,kBAAkB,GAA2B;QACjD,SAAS,EAAE,GAAG;QACd,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,GAAG;QACb,KAAK,EAAE,GAAG;KACX,CAAC;IACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC;IAEzC,4BAA4B;IAC5B,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAE3C,yBAAyB;IACzB,qBAAqB;IACrB,wCAAwC;IACxC,MAAM,GAAG,GAAG,SAAS,GAAG,OAAO,CAAC;IAEhC,uCAAuC;IACvC,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;IAE5C,MAAM,YAAY,GAAG,GAAG,GAAG,SAAS,CAAC;IAErC,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;KACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BilinearInterpolationInput, BilinearInterpolationResult } from './types.js';
2
+ export declare function bilinearInterpolation(input: BilinearInterpolationInput): BilinearInterpolationResult | null;
3
+ //# sourceMappingURL=bilinearInterpolation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bilinearInterpolation.d.ts","sourceRoot":"","sources":["../../src/utility/bilinearInterpolation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAE1F,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,2BAA2B,GAAG,IAAI,CAsC3G"}
@@ -0,0 +1,47 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function bilinearInterpolation(input) {
3
+ const { x, y, z, targetX, targetY } = input;
4
+ if (!x || !y || !z || x.length < 2 || y.length < 2)
5
+ return null;
6
+ if (z.length !== x.length)
7
+ return null;
8
+ for (const row of z) {
9
+ if (row.length !== y.length)
10
+ return null;
11
+ }
12
+ const xi = findBracket(x, targetX);
13
+ const yi = findBracket(y, targetY);
14
+ const isExtrapolation = targetX < x[0] || targetX > x[x.length - 1] ||
15
+ targetY < y[0] || targetY > y[y.length - 1];
16
+ const x0 = x[xi.lower];
17
+ const x1 = x[xi.upper];
18
+ const y0 = y[yi.lower];
19
+ const y1 = y[yi.upper];
20
+ const tx = x1 === x0 ? 0 : (targetX - x0) / (x1 - x0);
21
+ const ty = y1 === y0 ? 0 : (targetY - y0) / (y1 - y0);
22
+ const q00 = z[xi.lower][yi.lower];
23
+ const q01 = z[xi.lower][yi.upper];
24
+ const q10 = z[xi.upper][yi.lower];
25
+ const q11 = z[xi.upper][yi.upper];
26
+ const value = q00 * (1 - tx) * (1 - ty) +
27
+ q10 * tx * (1 - ty) +
28
+ q01 * (1 - tx) * ty +
29
+ q11 * tx * ty;
30
+ return {
31
+ value: roundTo(value, 6),
32
+ isExtrapolation,
33
+ };
34
+ }
35
+ function findBracket(arr, target) {
36
+ if (target <= arr[0])
37
+ return { lower: 0, upper: 1 };
38
+ if (target >= arr[arr.length - 1])
39
+ return { lower: arr.length - 2, upper: arr.length - 1 };
40
+ for (let i = 0; i < arr.length - 1; i++) {
41
+ if (target >= arr[i] && target <= arr[i + 1]) {
42
+ return { lower: i, upper: i + 1 };
43
+ }
44
+ }
45
+ return { lower: arr.length - 2, upper: arr.length - 1 };
46
+ }
47
+ //# sourceMappingURL=bilinearInterpolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bilinearInterpolation.js","sourceRoot":"","sources":["../../src/utility/bilinearInterpolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CorrelationInput, CorrelationResult } from './types.js';
2
+ export declare function correlation(input: CorrelationInput): CorrelationResult | null;
3
+ //# sourceMappingURL=correlation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation.d.ts","sourceRoot":"","sources":["../../src/utility/correlation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,IAAI,CA8B7E"}
@@ -0,0 +1,29 @@
1
+ import { roundTo } from '../utils.js';
2
+ export function correlation(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
+ const denom = Math.sqrt(sumX2 * sumY2);
20
+ if (denom === 0)
21
+ return { r: 0, r2: 0, n };
22
+ const r = sumXY / denom;
23
+ return {
24
+ r: roundTo(r, 6),
25
+ r2: roundTo(r * r, 6),
26
+ n,
27
+ };
28
+ }
29
+ //# sourceMappingURL=correlation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"correlation.js","sourceRoot":"","sources":["../../src/utility/correlation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,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,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAE3C,MAAM,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IAExB,OAAO;QACL,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAChB,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DepreciationInput, DepreciationResult } from './types.js';
2
+ export declare function depreciation(input: DepreciationInput): DepreciationResult | null;
3
+ //# sourceMappingURL=depreciation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depreciation.d.ts","sourceRoot":"","sources":["../../src/utility/depreciation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAE/F,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,IAAI,CAYhF"}
@@ -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