@johnhenry/math 0.0.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 (242) hide show
  1. package/README.md +165 -0
  2. package/dist/Bivector4.d.ts +52 -0
  3. package/dist/Bivector4.d.ts.map +1 -0
  4. package/dist/Bivector4.js +105 -0
  5. package/dist/Bivector4.js.map +1 -0
  6. package/dist/CellGraph.d.ts +259 -0
  7. package/dist/CellGraph.d.ts.map +1 -0
  8. package/dist/CellGraph.js +637 -0
  9. package/dist/CellGraph.js.map +1 -0
  10. package/dist/Clifford4Internal.d.ts +35 -0
  11. package/dist/Clifford4Internal.d.ts.map +1 -0
  12. package/dist/Clifford4Internal.js +86 -0
  13. package/dist/Clifford4Internal.js.map +1 -0
  14. package/dist/Combinatorics.d.ts +61 -0
  15. package/dist/Combinatorics.d.ts.map +1 -0
  16. package/dist/Combinatorics.js +186 -0
  17. package/dist/Combinatorics.js.map +1 -0
  18. package/dist/CombinatoricsGenerators.d.ts +44 -0
  19. package/dist/CombinatoricsGenerators.d.ts.map +1 -0
  20. package/dist/CombinatoricsGenerators.js +148 -0
  21. package/dist/CombinatoricsGenerators.js.map +1 -0
  22. package/dist/ComplexMath.d.ts +46 -0
  23. package/dist/ComplexMath.d.ts.map +1 -0
  24. package/dist/ComplexMath.js +98 -0
  25. package/dist/ComplexMath.js.map +1 -0
  26. package/dist/ComplexNumber.d.ts +174 -0
  27. package/dist/ComplexNumber.d.ts.map +1 -0
  28. package/dist/ComplexNumber.js +443 -0
  29. package/dist/ComplexNumber.js.map +1 -0
  30. package/dist/Cycle.d.ts +42 -0
  31. package/dist/Cycle.d.ts.map +1 -0
  32. package/dist/Cycle.js +120 -0
  33. package/dist/Cycle.js.map +1 -0
  34. package/dist/Decimal.d.ts +45 -0
  35. package/dist/Decimal.d.ts.map +1 -0
  36. package/dist/Decimal.js +135 -0
  37. package/dist/Decimal.js.map +1 -0
  38. package/dist/Distributions.d.ts +55 -0
  39. package/dist/Distributions.d.ts.map +1 -0
  40. package/dist/Distributions.js +222 -0
  41. package/dist/Distributions.js.map +1 -0
  42. package/dist/DualNumber.d.ts +42 -0
  43. package/dist/DualNumber.d.ts.map +1 -0
  44. package/dist/DualNumber.js +91 -0
  45. package/dist/DualNumber.js.map +1 -0
  46. package/dist/Environment.d.ts +44 -0
  47. package/dist/Environment.d.ts.map +1 -0
  48. package/dist/Environment.js +129 -0
  49. package/dist/Environment.js.map +1 -0
  50. package/dist/Expression.d.ts +19 -0
  51. package/dist/Expression.d.ts.map +1 -0
  52. package/dist/Expression.js +43 -0
  53. package/dist/Expression.js.map +1 -0
  54. package/dist/FFT.d.ts +21 -0
  55. package/dist/FFT.d.ts.map +1 -0
  56. package/dist/FFT.js +136 -0
  57. package/dist/FFT.js.map +1 -0
  58. package/dist/GeometricAlgebra4.d.ts +73 -0
  59. package/dist/GeometricAlgebra4.d.ts.map +1 -0
  60. package/dist/GeometricAlgebra4.js +115 -0
  61. package/dist/GeometricAlgebra4.js.map +1 -0
  62. package/dist/Geometry.d.ts +41 -0
  63. package/dist/Geometry.d.ts.map +1 -0
  64. package/dist/Geometry.js +167 -0
  65. package/dist/Geometry.js.map +1 -0
  66. package/dist/Graph.d.ts +72 -0
  67. package/dist/Graph.d.ts.map +1 -0
  68. package/dist/Graph.js +337 -0
  69. package/dist/Graph.js.map +1 -0
  70. package/dist/Graph3DUtils.d.ts +80 -0
  71. package/dist/Graph3DUtils.d.ts.map +1 -0
  72. package/dist/Graph3DUtils.js +156 -0
  73. package/dist/Graph3DUtils.js.map +1 -0
  74. package/dist/GraphUtils.d.ts +67 -0
  75. package/dist/GraphUtils.d.ts.map +1 -0
  76. package/dist/GraphUtils.js +72 -0
  77. package/dist/GraphUtils.js.map +1 -0
  78. package/dist/GroupTheory.d.ts +73 -0
  79. package/dist/GroupTheory.d.ts.map +1 -0
  80. package/dist/GroupTheory.js +194 -0
  81. package/dist/GroupTheory.js.map +1 -0
  82. package/dist/IntUtils.d.ts +33 -0
  83. package/dist/IntUtils.d.ts.map +1 -0
  84. package/dist/IntUtils.js +185 -0
  85. package/dist/IntUtils.js.map +1 -0
  86. package/dist/Interval.d.ts +44 -0
  87. package/dist/Interval.d.ts.map +1 -0
  88. package/dist/Interval.js +165 -0
  89. package/dist/Interval.js.map +1 -0
  90. package/dist/Lattice.d.ts +48 -0
  91. package/dist/Lattice.d.ts.map +1 -0
  92. package/dist/Lattice.js +65 -0
  93. package/dist/Lattice.js.map +1 -0
  94. package/dist/Logic.d.ts +22 -0
  95. package/dist/Logic.d.ts.map +1 -0
  96. package/dist/Logic.js +34 -0
  97. package/dist/Logic.js.map +1 -0
  98. package/dist/MatrixMath.d.ts +71 -0
  99. package/dist/MatrixMath.d.ts.map +1 -0
  100. package/dist/MatrixMath.js +302 -0
  101. package/dist/MatrixMath.js.map +1 -0
  102. package/dist/NumberTheory.d.ts +49 -0
  103. package/dist/NumberTheory.d.ts.map +1 -0
  104. package/dist/NumberTheory.js +230 -0
  105. package/dist/NumberTheory.js.map +1 -0
  106. package/dist/Numerical.d.ts +85 -0
  107. package/dist/Numerical.d.ts.map +1 -0
  108. package/dist/Numerical.js +343 -0
  109. package/dist/Numerical.js.map +1 -0
  110. package/dist/Permutation.d.ts +43 -0
  111. package/dist/Permutation.d.ts.map +1 -0
  112. package/dist/Permutation.js +142 -0
  113. package/dist/Permutation.js.map +1 -0
  114. package/dist/Polygon.d.ts +64 -0
  115. package/dist/Polygon.d.ts.map +1 -0
  116. package/dist/Polygon.js +221 -0
  117. package/dist/Polygon.js.map +1 -0
  118. package/dist/PolynomialRing.d.ts +74 -0
  119. package/dist/PolynomialRing.d.ts.map +1 -0
  120. package/dist/PolynomialRing.js +231 -0
  121. package/dist/PolynomialRing.js.map +1 -0
  122. package/dist/Quaternion.d.ts +37 -0
  123. package/dist/Quaternion.d.ts.map +1 -0
  124. package/dist/Quaternion.js +106 -0
  125. package/dist/Quaternion.js.map +1 -0
  126. package/dist/Rational.d.ts +34 -0
  127. package/dist/Rational.d.ts.map +1 -0
  128. package/dist/Rational.js +136 -0
  129. package/dist/Rational.js.map +1 -0
  130. package/dist/RealMath.d.ts +112 -0
  131. package/dist/RealMath.d.ts.map +1 -0
  132. package/dist/RealMath.js +262 -0
  133. package/dist/RealMath.js.map +1 -0
  134. package/dist/Rotor4.d.ts +180 -0
  135. package/dist/Rotor4.d.ts.map +1 -0
  136. package/dist/Rotor4.js +388 -0
  137. package/dist/Rotor4.js.map +1 -0
  138. package/dist/SpecialFunctions.d.ts +32 -0
  139. package/dist/SpecialFunctions.d.ts.map +1 -0
  140. package/dist/SpecialFunctions.js +161 -0
  141. package/dist/SpecialFunctions.js.map +1 -0
  142. package/dist/SpecialOperator.d.ts +21 -0
  143. package/dist/SpecialOperator.d.ts.map +1 -0
  144. package/dist/SpecialOperator.js +26 -0
  145. package/dist/SpecialOperator.js.map +1 -0
  146. package/dist/Statistics.d.ts +50 -0
  147. package/dist/Statistics.d.ts.map +1 -0
  148. package/dist/Statistics.js +131 -0
  149. package/dist/Statistics.js.map +1 -0
  150. package/dist/StringEvaluator.d.ts +48 -0
  151. package/dist/StringEvaluator.d.ts.map +1 -0
  152. package/dist/StringEvaluator.js +190 -0
  153. package/dist/StringEvaluator.js.map +1 -0
  154. package/dist/Structure.d.ts +130 -0
  155. package/dist/Structure.d.ts.map +1 -0
  156. package/dist/Structure.js +394 -0
  157. package/dist/Structure.js.map +1 -0
  158. package/dist/Symbolic.d.ts +501 -0
  159. package/dist/Symbolic.d.ts.map +1 -0
  160. package/dist/Symbolic.js +4077 -0
  161. package/dist/Symbolic.js.map +1 -0
  162. package/dist/Type.d.ts +31 -0
  163. package/dist/Type.d.ts.map +1 -0
  164. package/dist/Type.js +47 -0
  165. package/dist/Type.js.map +1 -0
  166. package/dist/Utilities.d.ts +27 -0
  167. package/dist/Utilities.d.ts.map +1 -0
  168. package/dist/Utilities.js +47 -0
  169. package/dist/Utilities.js.map +1 -0
  170. package/dist/Vec4.d.ts +39 -0
  171. package/dist/Vec4.d.ts.map +1 -0
  172. package/dist/Vec4.js +82 -0
  173. package/dist/Vec4.js.map +1 -0
  174. package/dist/Vector.d.ts +83 -0
  175. package/dist/Vector.d.ts.map +1 -0
  176. package/dist/Vector.js +173 -0
  177. package/dist/Vector.js.map +1 -0
  178. package/dist/VectorCalculus.d.ts +42 -0
  179. package/dist/VectorCalculus.d.ts.map +1 -0
  180. package/dist/VectorCalculus.js +82 -0
  181. package/dist/VectorCalculus.js.map +1 -0
  182. package/dist/VectorUtils.d.ts +172 -0
  183. package/dist/VectorUtils.d.ts.map +1 -0
  184. package/dist/VectorUtils.js +706 -0
  185. package/dist/VectorUtils.js.map +1 -0
  186. package/dist/differentiation-rules.d.ts +21 -0
  187. package/dist/differentiation-rules.d.ts.map +1 -0
  188. package/dist/differentiation-rules.js +52 -0
  189. package/dist/differentiation-rules.js.map +1 -0
  190. package/dist/index.d.ts +52 -0
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +66 -0
  193. package/dist/index.js.map +1 -0
  194. package/package.json +68 -0
  195. package/src/Bivector4.ts +136 -0
  196. package/src/CellGraph.ts +669 -0
  197. package/src/Clifford4Internal.ts +90 -0
  198. package/src/Combinatorics.ts +183 -0
  199. package/src/CombinatoricsGenerators.ts +144 -0
  200. package/src/ComplexMath.ts +162 -0
  201. package/src/ComplexNumber.ts +491 -0
  202. package/src/Cycle.ts +126 -0
  203. package/src/Decimal.ts +145 -0
  204. package/src/Distributions.ts +269 -0
  205. package/src/DualNumber.ts +105 -0
  206. package/src/Environment.ts +127 -0
  207. package/src/Expression.ts +48 -0
  208. package/src/FFT.ts +146 -0
  209. package/src/GeometricAlgebra4.ts +157 -0
  210. package/src/Geometry.ts +173 -0
  211. package/src/Graph.ts +337 -0
  212. package/src/Graph3DUtils.ts +269 -0
  213. package/src/GraphUtils.ts +159 -0
  214. package/src/GroupTheory.ts +214 -0
  215. package/src/IntUtils.ts +200 -0
  216. package/src/Interval.ts +171 -0
  217. package/src/Lattice.ts +87 -0
  218. package/src/Logic.ts +38 -0
  219. package/src/MatrixMath.ts +326 -0
  220. package/src/NumberTheory.ts +228 -0
  221. package/src/Numerical.ts +390 -0
  222. package/src/Permutation.ts +148 -0
  223. package/src/Polygon.ts +229 -0
  224. package/src/PolynomialRing.ts +242 -0
  225. package/src/Quaternion.ts +125 -0
  226. package/src/Rational.ts +148 -0
  227. package/src/RealMath.ts +346 -0
  228. package/src/Rotor4.ts +440 -0
  229. package/src/SpecialFunctions.ts +152 -0
  230. package/src/SpecialOperator.ts +28 -0
  231. package/src/Statistics.ts +170 -0
  232. package/src/StringEvaluator.ts +208 -0
  233. package/src/Structure.ts +481 -0
  234. package/src/Symbolic.ts +4313 -0
  235. package/src/Type.ts +48 -0
  236. package/src/Utilities.ts +49 -0
  237. package/src/Vec4.ts +98 -0
  238. package/src/Vector.ts +189 -0
  239. package/src/VectorCalculus.ts +87 -0
  240. package/src/VectorUtils.ts +797 -0
  241. package/src/differentiation-rules.ts +73 -0
  242. package/src/index.ts +140 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SpecialOperator — a named symbolic operator (`+`, `-`, `*`, …) pairing a
3
+ * textual representation (`rep`) with the name of the function that implements it
4
+ * (`funct`). Ported from Mallory's ActionScript `SpecialOperator`; used by the
5
+ * expression evaluator.
6
+ */
7
+ export class SpecialOperator {
8
+ rep;
9
+ funct;
10
+ constructor(rep, funct) {
11
+ this.rep = rep;
12
+ this.funct = funct;
13
+ }
14
+ toString() {
15
+ return `Operator: ${this.rep}`;
16
+ }
17
+ static Plus = new SpecialOperator("+", "add");
18
+ static Minus = new SpecialOperator("-", "subtract");
19
+ static Times = new SpecialOperator("*", "multiply");
20
+ static Divided = new SpecialOperator("/", "divide");
21
+ static Power = new SpecialOperator("^", "power");
22
+ static Modulous = new SpecialOperator("%", "mod");
23
+ static Elipses = new SpecialOperator("...", null);
24
+ static System = new SpecialOperator("#", null);
25
+ }
26
+ //# sourceMappingURL=SpecialOperator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpecialOperator.js","sourceRoot":"","sources":["../src/SpecialOperator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACjB,GAAG,CAAS;IACZ,KAAK,CAAgB;IAE9B,YAAY,GAAW,EAAE,KAAoB;QAC3C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,OAAO,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,CAAU,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,CAAU,KAAK,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,CAAU,KAAK,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,CAAU,OAAO,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,CAAU,KAAK,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,CAAU,QAAQ,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,CAAU,OAAO,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3D,MAAM,CAAU,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { Vector } from "./Vector.ts";
2
+ /**
3
+ * Statistics — order-dependent descriptive statistics and simple linear
4
+ * regression over `number[]`-like {@link Vector}s. Split out of `RealMath`/
5
+ * `ComplexMath` because these operations (median, percentiles, IQR, outlier
6
+ * detection) rely on a total order and don't generalize to complex numbers.
7
+ *
8
+ * Plain exported functions (no wrapping class), matching the "namespace
9
+ * class" fix applied to {@link RealMath}.
10
+ *
11
+ * Bug fixes inherited from the RealMath/ComplexMath AS3 port:
12
+ * - `sort` is numeric, not the default lexicographic Array sort.
13
+ * - `variance` is sample variance (divides by N-1), not population variance.
14
+ */
15
+ type RVec = Vector<number>;
16
+ type Unary = (x: number) => number;
17
+ /** Numeric sort (bug fix: the AS3 default sort was lexicographic). */
18
+ export declare function sort(list: RVec, ascending?: boolean): RVec;
19
+ export declare function minimum(list: RVec): number;
20
+ export declare function maximum(list: RVec): number;
21
+ export declare function percentile(list: RVec, n: number): number;
22
+ export declare function median(list: RVec): number;
23
+ export declare function q1(list: RVec): number;
24
+ export declare function q3(list: RVec): number;
25
+ export declare function fiveNumberSummary(list: RVec): RVec;
26
+ export declare function sum(list: RVec): number;
27
+ export declare function product(list: RVec): number;
28
+ export declare function mean(list: RVec): number;
29
+ /** Sample variance (bug fix: AS3 divided by N despite the `n<2 -> NaN` guard). */
30
+ export declare function variance(list: RVec): number;
31
+ export declare function standardDeviation(list: RVec): number;
32
+ /** Population variance (divides by N; complements the sample {@link variance}). */
33
+ export declare function populationVariance(list: RVec): number;
34
+ export declare function populationStandardDeviation(list: RVec): number;
35
+ export declare function zScore(x: number, mean_?: number, sDev?: number): number;
36
+ export declare function invertZScore(z: number, mean_?: number, sDev?: number): number;
37
+ export declare function zScoreList(list: RVec): RVec;
38
+ export declare function roundedList(list: RVec, precision: number): RVec;
39
+ export declare function jitteredList(list: RVec, magnitude?: number): RVec;
40
+ export declare function isOutlier(list: RVec, value: number, distance?: number): boolean;
41
+ export declare function interQuartileRange(list: RVec): number;
42
+ export declare function outliers(list: RVec, distance?: number): RVec;
43
+ export declare function outliersRemoved(list: RVec, distance?: number): RVec;
44
+ export declare function correlation(x: RVec, y: RVec): number;
45
+ export declare function linRegSlope(x: RVec, y: RVec): number;
46
+ export declare function linRegIntercept(x: RVec, y: RVec): number;
47
+ export declare function linearRegression(x: RVec, y: RVec): RVec;
48
+ export declare function linearRegressionFunction(x: RVec, y: RVec): Unary;
49
+ export {};
50
+ //# sourceMappingURL=Statistics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Statistics.d.ts","sourceRoot":"","sources":["../src/Statistics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { jitter, roundTo } from "./RealMath.js";
2
+ import { Vector } from "./Vector.js";
3
+ import { VectorUtils } from "./VectorUtils.js";
4
+ /** Numeric sort (bug fix: the AS3 default sort was lexicographic). */
5
+ export function sort(list, ascending = true) {
6
+ const sorted = list.clone().sort((a, b) => a - b);
7
+ return ascending ? sorted : sorted.reversed();
8
+ }
9
+ export function minimum(list) {
10
+ return sort(list, true)[0];
11
+ }
12
+ export function maximum(list) {
13
+ return sort(list, false)[0];
14
+ }
15
+ export function percentile(list, n) {
16
+ const ordered = sort(list);
17
+ // Clamp to the valid 1-based rank range [1, length]: the raw n*(length+1)
18
+ // formula lands on 0 (n=0) or length+1 (n=1), one step outside the array on
19
+ // each end, so percentile 0/1 (min/max) would otherwise index out of bounds.
20
+ const theIndex = Math.min(Math.max(n * (ordered.length + 1), 1), ordered.length);
21
+ if (theIndex === Math.floor(theIndex)) {
22
+ return ordered[theIndex - 1];
23
+ }
24
+ return (ordered[Math.floor(theIndex - 1)] + ordered[Math.ceil(theIndex - 1)]) / 2;
25
+ }
26
+ export function median(list) {
27
+ return percentile(list, 0.5);
28
+ }
29
+ export function q1(list) {
30
+ return percentile(list, 0.25);
31
+ }
32
+ export function q3(list) {
33
+ return percentile(list, 0.75);
34
+ }
35
+ export function fiveNumberSummary(list) {
36
+ return Vector.fromArray([minimum(list), q1(list), median(list), q3(list), maximum(list)]);
37
+ }
38
+ export function sum(list) {
39
+ return VectorUtils.collapse(list, (a, b) => a + b, 0);
40
+ }
41
+ export function product(list) {
42
+ return VectorUtils.collapse(list, (a, b) => a * b, 1);
43
+ }
44
+ export function mean(list) {
45
+ return sum(list) / list.length;
46
+ }
47
+ /** Sample variance (bug fix: AS3 divided by N despite the `n<2 -> NaN` guard). */
48
+ export function variance(list) {
49
+ if (list.length < 2)
50
+ return NaN;
51
+ const m = mean(list);
52
+ let s = 0;
53
+ for (const x of list)
54
+ s += (x - m) ** 2;
55
+ return s / (list.length - 1);
56
+ }
57
+ export function standardDeviation(list) {
58
+ return Math.sqrt(variance(list));
59
+ }
60
+ /** Population variance (divides by N; complements the sample {@link variance}). */
61
+ export function populationVariance(list) {
62
+ if (list.length < 1)
63
+ return NaN;
64
+ const m = mean(list);
65
+ let s = 0;
66
+ for (const x of list)
67
+ s += (x - m) ** 2;
68
+ return s / list.length;
69
+ }
70
+ export function populationStandardDeviation(list) {
71
+ return Math.sqrt(populationVariance(list));
72
+ }
73
+ export function zScore(x, mean_ = 0, sDev = 1) {
74
+ return (x - mean_) / sDev;
75
+ }
76
+ export function invertZScore(z, mean_ = 0, sDev = 1) {
77
+ return z * sDev + mean_;
78
+ }
79
+ export function zScoreList(list) {
80
+ const m = mean(list);
81
+ const sd = standardDeviation(list);
82
+ return VectorUtils.transform(list, (x) => zScore(x, m, sd));
83
+ }
84
+ export function roundedList(list, precision) {
85
+ return VectorUtils.transform(list, (x) => roundTo(x, precision));
86
+ }
87
+ export function jitteredList(list, magnitude = 0.1) {
88
+ return VectorUtils.transform(list, (x) => jitter(x, magnitude));
89
+ }
90
+ export function isOutlier(list, value, distance = 1.5) {
91
+ const range = distance * interQuartileRange(list);
92
+ return value < q1(list) - range || value > q3(list) + range;
93
+ }
94
+ export function interQuartileRange(list) {
95
+ return q3(list) - q1(list);
96
+ }
97
+ export function outliers(list, distance = 1.5) {
98
+ return VectorUtils.filter(list, (x) => isOutlier(list, x, distance));
99
+ }
100
+ export function outliersRemoved(list, distance = 1.5) {
101
+ return VectorUtils.filter(list, (x) => !isOutlier(list, x, distance));
102
+ }
103
+ // -- bivariate ------------------------------------------------------------------
104
+ export function correlation(x, y) {
105
+ if (x.length < 2)
106
+ return NaN;
107
+ const xMean = mean(x);
108
+ const yMean = mean(y);
109
+ const xSD = standardDeviation(x);
110
+ const ySD = standardDeviation(y);
111
+ let s = 0;
112
+ for (let i = 0; i < x.length; i++) {
113
+ s += ((x[i] - xMean) / xSD) * ((y[i] - yMean) / ySD);
114
+ }
115
+ return s / (x.length - 1);
116
+ }
117
+ export function linRegSlope(x, y) {
118
+ return (correlation(x, y) * standardDeviation(y)) / standardDeviation(x);
119
+ }
120
+ export function linRegIntercept(x, y) {
121
+ return mean(y) - linRegSlope(x, y) * mean(x);
122
+ }
123
+ export function linearRegression(x, y) {
124
+ return Vector.fromArray([linRegSlope(x, y), linRegIntercept(x, y)]);
125
+ }
126
+ export function linearRegressionFunction(x, y) {
127
+ const slope = linRegSlope(x, y);
128
+ const intercept = linRegIntercept(x, y);
129
+ return (a) => slope * a + intercept;
130
+ }
131
+ //# sourceMappingURL=Statistics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Statistics.js","sourceRoot":"","sources":["../src/Statistics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { Environment } from "./Environment.ts";
2
+ import { Vector } from "./Vector.ts";
3
+ /**
4
+ * StringEvaluator — a small recursive evaluator for mathematical expression
5
+ * strings such as `"3+4*2"`, `"sin(pi/2)"` or `"[1,2,3]"`. Ported from Mallory's
6
+ * ActionScript `StringEvaluator`.
7
+ *
8
+ * Operator precedence follows the AS3 design (encoded by the internal operator
9
+ * list order): `%` binds loosest, then `+`, `-`, `*`, `/`, and `^` binds tightest.
10
+ *
11
+ * Bug fixes from the AS3 original:
12
+ * - Associativity: the AS3 splitter was uniformly right-associative, so
13
+ * `10-2-3` evaluated as `10-(2-3)` and `8/4/2` as `8/(4/2)`. Non-power
14
+ * operators are now left-associative (`^` stays right-associative, as in
15
+ * standard notation).
16
+ * - The unresolved-parameter guard was dead code (`(p is String) is String`
17
+ * is always false); the intended symbolic passthrough is implemented, so an
18
+ * unbound `f(x)` returns the string `"f(x)"` instead of calling `f("x")`.
19
+ */
20
+ export declare class StringEvaluator {
21
+ /** Matches an acceptable variable/function name. */
22
+ static readonly VarMatch: RegExp;
23
+ private static readonly operatorList;
24
+ /** Evaluate `expression` within `environment`. */
25
+ static evaluate(expression: unknown, environment: Environment): unknown;
26
+ private static functionEvaluate;
27
+ static vectorEvaluate(expression: string, environment: Environment): Vector<unknown>;
28
+ private static countChar;
29
+ private static isSurrounded;
30
+ private static unSurroundOK;
31
+ private static unSurround;
32
+ /** Split at top-level `splitter`s, rejoining pieces that fall inside brackets. */
33
+ private static seperateArray;
34
+ /**
35
+ * Split an expression across the top-level occurrences of a binary operator
36
+ * into `[left, right]`. Left-associative by default (split at the last
37
+ * occurrence); right-associative (split at the first) when `leftAssociative`
38
+ * is false, used for `^`.
39
+ */
40
+ private static splitBinary;
41
+ /**
42
+ * Build an {@link Environment} pre-populated with the arithmetic operators,
43
+ * common {@link ComplexNumber} instance methods and the constants `pi`, `e`,
44
+ * `i`, `phi` — enough to evaluate ordinary numeric expressions out of the box.
45
+ */
46
+ static mathEnvironment(): Environment;
47
+ }
48
+ //# sourceMappingURL=StringEvaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringEvaluator.d.ts","sourceRoot":"","sources":["../src/StringEvaluator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAe;IAC1B,oDAAoD;IACpD,MAAM,CAAC,QAAQ,CAAC,QAAQ,SAA8B;IAEtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAOlC;IAEF,kDAAkD;IAClD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO;IAqCvE,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAsB/B,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;IAQpF,OAAO,CAAC,MAAM,CAAC,SAAS;IAMxB,OAAO,CAAC,MAAM,CAAC,YAAY;IAI3B,OAAO,CAAC,MAAM,CAAC,YAAY;IAO3B,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,kFAAkF;IAClF,OAAO,CAAC,MAAM,CAAC,aAAa;IAoB5B;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAa1B;;;;OAIG;IACH,MAAM,CAAC,eAAe,IAAI,WAAW;CAqCtC"}
@@ -0,0 +1,190 @@
1
+ import { ComplexNumber } from "./ComplexNumber.js";
2
+ import { Environment } from "./Environment.js";
3
+ import { Expression } from "./Expression.js";
4
+ import { SpecialOperator } from "./SpecialOperator.js";
5
+ import { Vector } from "./Vector.js";
6
+ /**
7
+ * StringEvaluator — a small recursive evaluator for mathematical expression
8
+ * strings such as `"3+4*2"`, `"sin(pi/2)"` or `"[1,2,3]"`. Ported from Mallory's
9
+ * ActionScript `StringEvaluator`.
10
+ *
11
+ * Operator precedence follows the AS3 design (encoded by the internal operator
12
+ * list order): `%` binds loosest, then `+`, `-`, `*`, `/`, and `^` binds tightest.
13
+ *
14
+ * Bug fixes from the AS3 original:
15
+ * - Associativity: the AS3 splitter was uniformly right-associative, so
16
+ * `10-2-3` evaluated as `10-(2-3)` and `8/4/2` as `8/(4/2)`. Non-power
17
+ * operators are now left-associative (`^` stays right-associative, as in
18
+ * standard notation).
19
+ * - The unresolved-parameter guard was dead code (`(p is String) is String`
20
+ * is always false); the intended symbolic passthrough is implemented, so an
21
+ * unbound `f(x)` returns the string `"f(x)"` instead of calling `f("x")`.
22
+ */
23
+ export class StringEvaluator {
24
+ /** Matches an acceptable variable/function name. */
25
+ static VarMatch = /[_a-zA-Z]+[_a-zA-Z0-9]*/g;
26
+ static operatorList = [
27
+ SpecialOperator.Modulous,
28
+ SpecialOperator.Plus,
29
+ SpecialOperator.Minus,
30
+ SpecialOperator.Times,
31
+ SpecialOperator.Divided,
32
+ SpecialOperator.Power,
33
+ ];
34
+ /** Evaluate `expression` within `environment`. */
35
+ static evaluate(expression, environment) {
36
+ if (typeof expression !== "string")
37
+ return expression;
38
+ const expr = expression.split("\r").join("").split(" ").join("");
39
+ if (ComplexNumber.isComplex(expr))
40
+ return new ComplexNumber(expr);
41
+ if (StringEvaluator.unSurroundOK(expr, "[", "]")) {
42
+ return StringEvaluator.vectorEvaluate(StringEvaluator.unSurround(expr), environment);
43
+ }
44
+ if (StringEvaluator.unSurroundOK(expr, "(", ")")) {
45
+ return StringEvaluator.evaluate(StringEvaluator.unSurround(expr), environment);
46
+ }
47
+ const pCount = StringEvaluator.countChar(expr, "(") - StringEvaluator.countChar(expr, ")");
48
+ if (pCount > 0)
49
+ return new Error(`Missing ${pCount} ')'.`);
50
+ if (pCount < 0)
51
+ return new Error(`Missing ${-pCount} '('.`);
52
+ for (const op of StringEvaluator.operatorList) {
53
+ const leftAssociative = op !== SpecialOperator.Power;
54
+ const parts = StringEvaluator.splitBinary(expr, op.rep, leftAssociative);
55
+ if (parts.length === 2) {
56
+ return StringEvaluator.functionEvaluate(op.funct, parts, environment);
57
+ }
58
+ }
59
+ const pPosition = expr.indexOf("(");
60
+ if (pPosition > 0) {
61
+ const functionName = expr.substr(0, pPosition);
62
+ const args = StringEvaluator.seperateArray(expr.substr(pPosition + 1, expr.length - pPosition - 2));
63
+ return StringEvaluator.functionEvaluate(functionName, args, environment);
64
+ }
65
+ return environment.retrieve(expr);
66
+ }
67
+ static functionEvaluate(fName, parameters, environment) {
68
+ const params = parameters.map((p) => StringEvaluator.evaluate(p, environment));
69
+ if (!environment.existKey(fName))
70
+ return `${fName}(${params})`;
71
+ const f = environment.retrieve(fName);
72
+ if (f instanceof Environment)
73
+ return f.retrieve(String(params[0]));
74
+ // Symbolic passthrough for any still-unresolved (string) parameter.
75
+ for (const p of params) {
76
+ if (typeof p === "string" && p === StringEvaluator.evaluate(p, environment)) {
77
+ return `${fName}(${params})`;
78
+ }
79
+ }
80
+ if (f instanceof Expression)
81
+ return f.evaluate(params, environment);
82
+ if (typeof f === "function")
83
+ return f(...params);
84
+ return f;
85
+ }
86
+ static vectorEvaluate(expression, environment) {
87
+ const out = Vector.fromArray(StringEvaluator.seperateArray(expression));
88
+ for (let i = 0; i < out.length; i++)
89
+ out[i] = StringEvaluator.evaluate(out[i], environment);
90
+ return out;
91
+ }
92
+ // -- helpers -------------------------------------------------------------
93
+ static countChar(expression, char = " ") {
94
+ let count = 0;
95
+ for (const c of expression)
96
+ if (c === char)
97
+ count++;
98
+ return count;
99
+ }
100
+ static isSurrounded(expression, leftBracket = "(", rightBracket = ")") {
101
+ return expression.charAt(0) === leftBracket && expression.charAt(expression.length - 1) === rightBracket;
102
+ }
103
+ static unSurroundOK(expression, leftBracket = "(", rightBracket = ")") {
104
+ if (!StringEvaluator.isSurrounded(expression, leftBracket, rightBracket))
105
+ return false;
106
+ const inner = expression.substring(1, expression.length - 1);
107
+ // If the first inner closer precedes its opener, the brackets were not a pair.
108
+ return inner.lastIndexOf(leftBracket) <= inner.lastIndexOf(rightBracket);
109
+ }
110
+ static unSurround(expression) {
111
+ return expression.substring(1, expression.length - 1);
112
+ }
113
+ /** Split at top-level `splitter`s, rejoining pieces that fall inside brackets. */
114
+ static seperateArray(expression, splitter = ",") {
115
+ const exArray = expression.split(splitter);
116
+ for (const [open, close] of [
117
+ ["(", ")"],
118
+ ["[", "]"],
119
+ ["{", "}"],
120
+ ]) {
121
+ for (let i = 0; i < exArray.length - 1; i++) {
122
+ if (StringEvaluator.countChar(exArray[i], open) > StringEvaluator.countChar(exArray[i], close)) {
123
+ exArray[i] = `${exArray[i]}${splitter}${exArray[i + 1]}`;
124
+ exArray.splice(i + 1, 1);
125
+ i--;
126
+ }
127
+ }
128
+ }
129
+ return exArray;
130
+ }
131
+ /**
132
+ * Split an expression across the top-level occurrences of a binary operator
133
+ * into `[left, right]`. Left-associative by default (split at the last
134
+ * occurrence); right-associative (split at the first) when `leftAssociative`
135
+ * is false, used for `^`.
136
+ */
137
+ static splitBinary(expression, splitter = "+", leftAssociative = true) {
138
+ const pieces = StringEvaluator.seperateArray(expression, splitter);
139
+ if (pieces.length <= 1)
140
+ return pieces;
141
+ if (leftAssociative) {
142
+ const right = pieces[pieces.length - 1];
143
+ const left = pieces.slice(0, -1).join(splitter);
144
+ return [left, right];
145
+ }
146
+ const left = pieces[0];
147
+ const right = pieces.slice(1).join(splitter);
148
+ return [left, right];
149
+ }
150
+ /**
151
+ * Build an {@link Environment} pre-populated with the arithmetic operators,
152
+ * common {@link ComplexNumber} instance methods and the constants `pi`, `e`,
153
+ * `i`, `phi` — enough to evaluate ordinary numeric expressions out of the box.
154
+ */
155
+ static mathEnvironment() {
156
+ const env = new Environment();
157
+ const cn = (x) => (x instanceof ComplexNumber ? x : new ComplexNumber(x));
158
+ env.assignImmutable("add", (a, b) => cn(a).add(cn(b)));
159
+ env.assignImmutable("subtract", (a, b) => cn(a).subtract(cn(b)));
160
+ env.assignImmutable("multiply", (a, b) => cn(a).multiply(cn(b)));
161
+ env.assignImmutable("divide", (a, b) => cn(a).divide(cn(b)));
162
+ env.assignImmutable("power", (a, b) => cn(a).power(cn(b)));
163
+ env.assignImmutable("mod", (a, b) => {
164
+ const x = cn(a).value;
165
+ const y = cn(b).value;
166
+ return new ComplexNumber(((x % y) + y) % y, 0);
167
+ });
168
+ const unary = {
169
+ sin: (z) => z.sine(),
170
+ cos: (z) => z.cosine(),
171
+ tan: (z) => z.tangent(),
172
+ sqrt: (z) => z.squareRoot(),
173
+ exp: (z) => ComplexNumber.E.power(z),
174
+ ln: (z) => z.logarithm(),
175
+ log: (z) => z.logarithm(10),
176
+ abs: (z) => new ComplexNumber(z.magnitude(), 0),
177
+ conj: (z) => z.conjugate(),
178
+ neg: (z) => z.neg(),
179
+ };
180
+ for (const [name, fn] of Object.entries(unary)) {
181
+ env.assignImmutable(name, (a) => fn(cn(a)));
182
+ }
183
+ env.assignImmutable("pi", ComplexNumber.PI);
184
+ env.assignImmutable("e", ComplexNumber.E);
185
+ env.assignImmutable("i", ComplexNumber.I);
186
+ env.assignImmutable("phi", ComplexNumber.PHI);
187
+ return env;
188
+ }
189
+ }
190
+ //# sourceMappingURL=StringEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StringEvaluator.js","sourceRoot":"","sources":["../src/StringEvaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import { ComplexNumber } from "./ComplexNumber.ts";
2
+ import { Decimal } from "./Decimal.ts";
3
+ import { DualNumber } from "./DualNumber.ts";
4
+ import { Quaternion } from "./Quaternion.ts";
5
+ import { Rational } from "./Rational.ts";
6
+ import { Vector } from "./Vector.ts";
7
+ import { type Matrix } from "./VectorUtils.ts";
8
+ /**
9
+ * Structure — a generic algebraic structure (group, ring, field, …) defined by
10
+ * its membership criteria, operations, inverses and identities. Given those, it
11
+ * provides linear algebra (vectors and matrices) over the structure, mirroring
12
+ * {@link RealMath}/{@link ComplexMath} but parameterised by arbitrary operations.
13
+ *
14
+ * Ported from Mallory's ActionScript `Structure`. The AS3 matrix section was
15
+ * essentially non-functional — several methods were mistakenly declared `static`
16
+ * yet called instance operations, many referenced undefined capitalised names
17
+ * (`Scale`, `ScaleMatrix`, `Determinant`), `crossProduct` overwrote its first
18
+ * operand with the second and read index 3, `powerMatrix` invoked a method that
19
+ * does not exist, and `vectorSum`/`vectorProduct` never returned. All of this is
20
+ * reconstructed here as working instance methods. The `chriteria` spelling is
21
+ * corrected to `criteria`.
22
+ */
23
+ export interface StructureOptions<T> {
24
+ /** Membership predicates; an element is a member iff it satisfies them all. */
25
+ criteria?: Array<(element: unknown) => boolean>;
26
+ /** Binary operations; `operations[0]` is "add", `operations[1]` is "multiply". */
27
+ operations?: Array<(a: T, b: T) => T>;
28
+ /** Inverse maps; `inverses[0]` is "negative", `inverses[1]` is "reciprocal". */
29
+ inverses?: Array<(x: T) => T>;
30
+ /** Identity elements; `identities[0]` is "zero", `identities[1]` is "one". */
31
+ identities?: T[];
32
+ /** Optional coercion of an arbitrary value into the structure. */
33
+ wrap?: (x: unknown) => T;
34
+ /** Optional equality test (defaults to strict `===`). */
35
+ equality?: (a: T, b: T) => boolean;
36
+ }
37
+ type SVec<T> = Vector<T>;
38
+ type SMat<T> = Matrix<T>;
39
+ export declare class Structure<T = unknown> {
40
+ private readonly _criteria;
41
+ private readonly _operations;
42
+ private readonly _inverses;
43
+ private readonly _identities;
44
+ private readonly _wrapMethod;
45
+ private readonly _equalityMethod;
46
+ constructor(options?: StructureOptions<T>);
47
+ criterion(index: number): (element: unknown) => boolean;
48
+ isMember(element: unknown): boolean;
49
+ operation(index: number): (a: T, b: T) => T;
50
+ /** Repeatedly apply `operation(operationIndex)` `power` times (using the inverse for negative powers). */
51
+ integerPower(scalar: T, power: number, operationIndex?: number): T;
52
+ get add(): (a: T, b: T) => T;
53
+ addPower(scalar: T, power: number): T;
54
+ get multiply(): (a: T, b: T) => T;
55
+ multiplyPower(scalar: T, power: number): T;
56
+ inverse(index?: number): (x: T) => T;
57
+ get negative(): (x: T) => T;
58
+ get reciprocal(): (x: T) => T;
59
+ subtract(a: T, b: T): T;
60
+ divide(a: T, b: T): T;
61
+ identity(index?: number): T;
62
+ get zero(): T;
63
+ get one(): T;
64
+ get wrap(): (x: unknown) => T;
65
+ get equality(): (a: T, b: T) => boolean;
66
+ contains(alpha: SVec<T>, element: T): boolean;
67
+ wrapVector(alpha: Vector<unknown>): SVec<T>;
68
+ addVector(alpha: SVec<T>, beta: SVec<T>): SVec<T>;
69
+ scaleVector(alpha: SVec<T>, scalar: T): SVec<T>;
70
+ negativeVector(alpha: SVec<T>): SVec<T>;
71
+ reciprocalVector(alpha: SVec<T>): SVec<T>;
72
+ inverseVector(alpha: SVec<T>, index?: number): SVec<T>;
73
+ subtractVector(alpha: SVec<T>, beta: SVec<T>): SVec<T>;
74
+ dotProduct(alpha: SVec<T>, beta: SVec<T>): T;
75
+ /** 3D cross product (bug fix: correct operands and index 2 for the z-component). */
76
+ crossProduct(alpha: SVec<T>, beta: SVec<T>): SVec<T>;
77
+ kroneckerProduct(A: SVec<T>, B: SVec<T>): SVec<T>;
78
+ generateIdentity(height?: number, width?: number): SMat<T>;
79
+ addMatrix(alpha: SMat<T>, beta: SMat<T>): SMat<T>;
80
+ scaleMatrix(alpha: SMat<T>, scalar: T): SMat<T>;
81
+ negativeMatrix(alpha: SMat<T>): SMat<T>;
82
+ subtractMatrix(alpha: SMat<T>, beta: SMat<T>): SMat<T>;
83
+ scaleRow(alpha: SMat<T>, index: number | undefined, scalar: T): SMat<T>;
84
+ scaleColumn(alpha: SMat<T>, index: number | undefined, scalar: T): SMat<T>;
85
+ trace(alpha: SMat<T>): T;
86
+ kroneckerMatrixProduct(alpha: SMat<T>, beta: SMat<T>): SMat<T>;
87
+ multiplyMatrix(alpha: SMat<T>, beta: SMat<T>): SMat<T>;
88
+ /** Integer matrix power (bug fix: actually accumulates the factors). */
89
+ powerMatrix(alpha: SMat<T>, power?: number): SMat<T>;
90
+ /**
91
+ * Determinant via Gaussian elimination with row-swap pivoting, O(n^3)
92
+ * instead of the previous O(n!) cofactor (Laplace) expansion.
93
+ */
94
+ determinant(alpha: SMat<T>): T;
95
+ permanent(alpha: SMat<T>): T;
96
+ /**
97
+ * Matrix inverse by Gauss-Jordan elimination over the structure's field
98
+ * operations, with a zero-pivot row swap (bug fix — the AS3 version had no
99
+ * pivoting and divided by a zero pivot).
100
+ */
101
+ invertMatrix(alpha: SMat<T>, checkDeterminant?: boolean): SMat<T>;
102
+ vectorSum(alpha: SVec<T>): T;
103
+ vectorProduct(alpha: SVec<T>): T;
104
+ vectorCollapseOperation(alpha: SVec<T>, index?: number): T;
105
+ /** The field of real numbers (JS `number`). */
106
+ static realField(): Structure<number>;
107
+ /** The field of complex numbers ({@link ComplexNumber}). */
108
+ static complexField(): Structure<ComplexNumber>;
109
+ /**
110
+ * The ring of integers modulo `n` (Z/nZ). It is a field when `n` is prime; for
111
+ * a composite `n`, {@link reciprocal} returns `NaN` for non-invertible elements.
112
+ */
113
+ static integersModulo(n: number): Structure<number>;
114
+ /** The Boolean ring GF(2): XOR is addition, AND is multiplication (elements 0/1). */
115
+ static booleanRing(): Structure<number>;
116
+ /** The field of exact rational numbers ({@link Rational}). */
117
+ static rationalField(): Structure<Rational>;
118
+ /**
119
+ * The field of arbitrary-precision {@link Decimal}s. Division is approximate
120
+ * (rounded to `Decimal.DEFAULT_PRECISION` significant digits) — the one place
121
+ * this "field" isn't exact, matching `Decimal.divide` itself.
122
+ */
123
+ static decimalField(): Structure<Decimal>;
124
+ /** The (non-commutative) division ring of {@link Quaternion}s. */
125
+ static quaternionRing(): Structure<Quaternion>;
126
+ /** The commutative ring of {@link DualNumber}s (autodiff carrier). */
127
+ static dualNumbers(): Structure<DualNumber>;
128
+ }
129
+ export {};
130
+ //# sourceMappingURL=Structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Structure.d.ts","sourceRoot":"","sources":["../src/Structure.ts"],"names":[],"mappings":"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"}