@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 @@
1
+ {"version":3,"file":"DualNumber.js","sourceRoot":"","sources":["../src/DualNumber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Environment — a symbol table mapping string keys to values, with a separate
3
+ * pool of immutable bindings. Used by {@link StringEvaluator} and
4
+ * {@link Expression} to resolve variables and functions.
5
+ *
6
+ * Ported from Mallory's ActionScript `Enviornment` (the original class name was
7
+ * misspelled; corrected here). Deep-clone via Flash `ByteArray` serialisation is
8
+ * replaced with an ordinary entry copy — values are treated as immutable data.
9
+ */
10
+ export declare class Environment {
11
+ private _items;
12
+ private _immutableItems;
13
+ /**
14
+ * Each consecutive pair of arguments `(key, value)` becomes an immutable
15
+ * binding. A trailing unpaired argument is ignored.
16
+ */
17
+ constructor(...rest: unknown[]);
18
+ existKey(request: string): boolean;
19
+ existImmutableKey(request: string): boolean;
20
+ existValue(request: unknown): boolean;
21
+ toString(showImmutable?: boolean, showRest?: boolean): string;
22
+ /** A copy of the environment (bindings are shared by reference). */
23
+ clone(): Environment;
24
+ get size(): number;
25
+ get keys(): string[];
26
+ get immutableKeys(): string[];
27
+ get values(): unknown[];
28
+ /** Bind `key` to `value`. Assigning `undefined` (or the key to itself) removes it. */
29
+ assign(key: string, value?: unknown): boolean;
30
+ /** Bind `key` immutably. Fails if the key already exists in either pool. */
31
+ assignImmutable(key: string, value?: unknown): boolean;
32
+ /** Bind `key` to `value` after first resolving `value` in this environment. */
33
+ assignDeep(key: string, value: string): boolean;
34
+ assignImmutableDeep(key: string, value: string): boolean;
35
+ /** Look up `key`; an unknown key resolves to itself (symbolic passthrough). */
36
+ retrieve(key: string): unknown;
37
+ /** Follow chains of string references to the deepest concrete value. */
38
+ retrieveDeep(key: string): unknown;
39
+ /** Remove a mutable binding (immutable ones cannot be removed). */
40
+ remove(key: string): boolean;
41
+ /** Remove an immutable binding (for debugging; normally you should not). */
42
+ removeImmutable(key: string): boolean;
43
+ }
44
+ //# sourceMappingURL=Environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Environment.d.ts","sourceRoot":"","sources":["../src/Environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,eAAe,CAA8B;IAErD;;;OAGG;gBACS,GAAG,IAAI,EAAE,OAAO,EAAE;IAO9B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI3C,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAMrC,QAAQ,CAAC,aAAa,UAAO,EAAE,QAAQ,UAAO,GAAG,MAAM;IAOvD,oEAAoE;IACpE,KAAK,IAAI,WAAW;IAOpB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,EAAE,CAEnB;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,MAAM,IAAI,OAAO,EAAE,CAEtB;IAED,sFAAsF;IACtF,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IAO7C,4EAA4E;IAC5E,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IAOtD,+EAA+E;IAC/E,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAI/C,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxD,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM9B,wEAAwE;IACxE,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAclC,mEAAmE;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK5B,4EAA4E;IAC5E,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAGtC"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Environment — a symbol table mapping string keys to values, with a separate
3
+ * pool of immutable bindings. Used by {@link StringEvaluator} and
4
+ * {@link Expression} to resolve variables and functions.
5
+ *
6
+ * Ported from Mallory's ActionScript `Enviornment` (the original class name was
7
+ * misspelled; corrected here). Deep-clone via Flash `ByteArray` serialisation is
8
+ * replaced with an ordinary entry copy — values are treated as immutable data.
9
+ */
10
+ export class Environment {
11
+ _items = new Map();
12
+ _immutableItems = new Map();
13
+ /**
14
+ * Each consecutive pair of arguments `(key, value)` becomes an immutable
15
+ * binding. A trailing unpaired argument is ignored.
16
+ */
17
+ constructor(...rest) {
18
+ if (rest.length % 2 === 1)
19
+ rest.pop();
20
+ for (let i = 0; i < rest.length; i += 2) {
21
+ if (typeof rest[i] === "string")
22
+ this.assignImmutable(rest[i], rest[i + 1]);
23
+ }
24
+ }
25
+ existKey(request) {
26
+ return this._immutableItems.has(request) || this._items.has(request);
27
+ }
28
+ existImmutableKey(request) {
29
+ return this._immutableItems.has(request);
30
+ }
31
+ existValue(request) {
32
+ for (const v of this._immutableItems.values())
33
+ if (v === request)
34
+ return true;
35
+ for (const v of this._items.values())
36
+ if (v === request)
37
+ return true;
38
+ return false;
39
+ }
40
+ toString(showImmutable = true, showRest = true) {
41
+ const result = [];
42
+ if (showImmutable)
43
+ for (const [k, v] of this._immutableItems)
44
+ result.push(`${k} : ${v}`);
45
+ if (showRest)
46
+ for (const [k, v] of this._items)
47
+ result.push(`${k} : ${v}`);
48
+ return `{${result.join(" ; ")}}`;
49
+ }
50
+ /** A copy of the environment (bindings are shared by reference). */
51
+ clone() {
52
+ const out = new Environment();
53
+ out._items = new Map(this._items);
54
+ out._immutableItems = new Map(this._immutableItems);
55
+ return out;
56
+ }
57
+ get size() {
58
+ return this._items.size + this._immutableItems.size;
59
+ }
60
+ get keys() {
61
+ return [...this._immutableItems.keys(), ...this._items.keys()];
62
+ }
63
+ get immutableKeys() {
64
+ return [...this._immutableItems.keys()];
65
+ }
66
+ get values() {
67
+ return [...this._immutableItems.values(), ...this._items.values()];
68
+ }
69
+ /** Bind `key` to `value`. Assigning `undefined` (or the key to itself) removes it. */
70
+ assign(key, value) {
71
+ if (value === undefined || key === value)
72
+ return this.remove(key);
73
+ if (this.existImmutableKey(key))
74
+ return false;
75
+ this._items.set(key, value);
76
+ return true;
77
+ }
78
+ /** Bind `key` immutably. Fails if the key already exists in either pool. */
79
+ assignImmutable(key, value) {
80
+ if (value === undefined || key === value)
81
+ return this.remove(key);
82
+ if (this.existKey(key))
83
+ return false;
84
+ this._immutableItems.set(key, value);
85
+ return true;
86
+ }
87
+ /** Bind `key` to `value` after first resolving `value` in this environment. */
88
+ assignDeep(key, value) {
89
+ return this.assign(key, this.retrieveDeep(value));
90
+ }
91
+ assignImmutableDeep(key, value) {
92
+ return this.assignImmutable(key, this.retrieveDeep(value));
93
+ }
94
+ /** Look up `key`; an unknown key resolves to itself (symbolic passthrough). */
95
+ retrieve(key) {
96
+ if (!this.existKey(key))
97
+ return key;
98
+ if (this.existImmutableKey(key))
99
+ return this._immutableItems.get(key);
100
+ return this._items.get(key);
101
+ }
102
+ /** Follow chains of string references to the deepest concrete value. */
103
+ retrieveDeep(key) {
104
+ let previous = this.retrieve(key);
105
+ // <= (not <): the initial `retrieve` above already consumes one lookup
106
+ // that isn't tied to a loop iteration, so even an empty environment
107
+ // (size 0) must still get one pass to notice `previous === key` and
108
+ // return the symbolic passthrough instead of falling through below.
109
+ for (let i = 0; i <= this.size; i++) {
110
+ if (previous === key)
111
+ return key;
112
+ if (typeof previous !== "string" || previous === this.retrieve(previous))
113
+ return previous;
114
+ previous = this.retrieve(previous);
115
+ }
116
+ return undefined;
117
+ }
118
+ /** Remove a mutable binding (immutable ones cannot be removed). */
119
+ remove(key) {
120
+ if (this.existImmutableKey(key))
121
+ return false;
122
+ return this._items.delete(key);
123
+ }
124
+ /** Remove an immutable binding (for debugging; normally you should not). */
125
+ removeImmutable(key) {
126
+ return this._immutableItems.delete(key);
127
+ }
128
+ }
129
+ //# sourceMappingURL=Environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Environment.js","sourceRoot":"","sources":["../src/Environment.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAW;IACd,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IACpC,eAAe,GAAG,IAAI,GAAG,EAAmB,CAAC;IAErD;;;OAGG;IACH,YAAY,GAAG,IAAe;QAC5B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAW,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,iBAAiB,CAAC,OAAe;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,OAAgB;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;QAC9E,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,aAAa,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI;QAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,aAAa;YAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzF,IAAI,QAAQ;YAAE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACnC,CAAC;IAED,oEAAoE;IACpE,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,GAAG,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,GAAG,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IACtD,CAAC;IAED,IAAI,IAAI;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,aAAa;QACf,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,MAAM;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,sFAAsF;IACtF,MAAM,CAAC,GAAW,EAAE,KAAe;QACjC,IAAI,KAAK,KAAK,SAAS,IAAK,GAAe,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,eAAe,CAAC,GAAW,EAAE,KAAe;QAC1C,IAAI,KAAK,KAAK,SAAS,IAAK,GAAe,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+EAA+E;IAC/E,UAAU,CAAC,GAAW,EAAE,KAAa;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,mBAAmB,CAAC,GAAW,EAAE,KAAa;QAC5C,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,+EAA+E;IAC/E,QAAQ,CAAC,GAAW;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACpC,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,wEAAwE;IACxE,YAAY,CAAC,GAAW;QACtB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClC,uEAAuE;QACvE,oEAAoE;QACpE,oEAAoE;QACpE,oEAAoE;QACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,QAAQ,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC;YACjC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC1F,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,mEAAmE;IACnE,MAAM,CAAC,GAAW;QAChB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,4EAA4E;IAC5E,eAAe,CAAC,GAAW;QACzB,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { Environment } from "./Environment.ts";
2
+ /**
3
+ * Expression — a named formula over a list of independent variables, evaluated
4
+ * by substituting values and delegating to {@link StringEvaluator}. Ported from
5
+ * Mallory's ActionScript `Expression`. (The dead `mx.messaging` import is dropped.)
6
+ */
7
+ export declare class Expression {
8
+ private readonly _representation;
9
+ private readonly _indeVars;
10
+ constructor(representation?: unknown, independentVariables?: string[] | null);
11
+ indeVarString(): string;
12
+ toString(expanded?: boolean, name?: string): string;
13
+ /**
14
+ * Evaluate the expression. `values` are bound to the independent variables
15
+ * (in order); an outer `environment` supplies everything else.
16
+ */
17
+ evaluate(values?: unknown, environment?: Environment | null): unknown;
18
+ }
19
+ //# sourceMappingURL=Expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Expression.d.ts","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C;;;;GAIG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;gBAEzB,cAAc,GAAE,OAAY,EAAE,oBAAoB,GAAE,MAAM,EAAE,GAAG,IAAW;IAKtF,aAAa,IAAI,MAAM;IAIvB,QAAQ,CAAC,QAAQ,UAAO,EAAE,IAAI,SAAa,GAAG,MAAM;IAKpD;;;OAGG;IACH,QAAQ,CAAC,MAAM,GAAE,OAAc,EAAE,WAAW,GAAE,WAAW,GAAG,IAAW,GAAG,OAAO;CAiBlF"}
@@ -0,0 +1,43 @@
1
+ import { Environment } from "./Environment.js";
2
+ import { StringEvaluator } from "./StringEvaluator.js";
3
+ /**
4
+ * Expression — a named formula over a list of independent variables, evaluated
5
+ * by substituting values and delegating to {@link StringEvaluator}. Ported from
6
+ * Mallory's ActionScript `Expression`. (The dead `mx.messaging` import is dropped.)
7
+ */
8
+ export class Expression {
9
+ _representation;
10
+ _indeVars;
11
+ constructor(representation = "", independentVariables = null) {
12
+ this._representation = String(representation);
13
+ this._indeVars = independentVariables ?? [];
14
+ }
15
+ indeVarString() {
16
+ return this._indeVars.join(",");
17
+ }
18
+ toString(expanded = true, name = "function") {
19
+ if (expanded)
20
+ return `${name}(${this.indeVarString()})=${this._representation}`;
21
+ return this._representation;
22
+ }
23
+ /**
24
+ * Evaluate the expression. `values` are bound to the independent variables
25
+ * (in order); an outer `environment` supplies everything else.
26
+ */
27
+ evaluate(values = null, environment = null) {
28
+ const args = Array.isArray(values) ? values : [values];
29
+ if (environment === null) {
30
+ const subEnvironment = new Environment();
31
+ for (let i = 0; i < this._indeVars.length; i++) {
32
+ subEnvironment.assign(this._indeVars[i], args[i]);
33
+ }
34
+ return StringEvaluator.evaluate(this._representation, subEnvironment);
35
+ }
36
+ const subEnvironment = environment.clone();
37
+ for (let i = 0; i < this._indeVars.length; i++) {
38
+ subEnvironment.assign(this._indeVars[i], args[i]);
39
+ }
40
+ return StringEvaluator.evaluate(StringEvaluator.evaluate(this._representation, subEnvironment), environment);
41
+ }
42
+ }
43
+ //# sourceMappingURL=Expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Expression.js","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,OAAO,UAAU;IACJ,eAAe,CAAS;IACxB,SAAS,CAAW;IAErC,YAAY,iBAA0B,EAAE,EAAE,uBAAwC,IAAI;QACpF,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAC9C,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAAE,IAAI,GAAG,UAAU;QACzC,IAAI,QAAQ;YAAE,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,SAAkB,IAAI,EAAE,cAAkC,IAAI;QACrE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEvD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC;YACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,EAAE,WAAW,CAAC,CAAC;IAC/G,CAAC;CACF"}
package/dist/FFT.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { ComplexNumber } from "./ComplexNumber.ts";
2
+ /**
3
+ * FFT — the discrete Fourier transform and its fast (Cooley-Tukey) radix-2
4
+ * implementation, plus the inverse transform and FFT-based convolution. Builds
5
+ * on {@link ComplexNumber}. Inputs may be complex numbers or plain reals.
6
+ */
7
+ type Signal = ReadonlyArray<ComplexNumber | number>;
8
+ export declare class FFT {
9
+ /** Fast Fourier transform (input length must be a power of two). */
10
+ static fft(input: Signal): ComplexNumber[];
11
+ /** Inverse fast Fourier transform. */
12
+ static ifft(input: Signal): ComplexNumber[];
13
+ /** FFT with the input zero-padded up to the next power of two. */
14
+ static fftPadded(input: Signal): ComplexNumber[];
15
+ /** Direct O(n²) discrete Fourier transform for any length (reference implementation). */
16
+ static dft(input: Signal): ComplexNumber[];
17
+ /** Linear convolution of two real (or complex) signals, via the FFT. */
18
+ static convolve(a: Signal, b: Signal): ComplexNumber[];
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=FFT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FFT.d.ts","sourceRoot":"","sources":["../src/FFT.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;GAIG;AAEH,KAAK,MAAM,GAAG,aAAa,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC;AA+DpD,qBAAa,GAAG;IACd,oEAAoE;IACpE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAO1C,sCAAsC;IACtC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAO3C,kEAAkE;IAClE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAYhD,yFAAyF;IACzF,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAiB1C,wEAAwE;IACxE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;CAyBvD"}
package/dist/FFT.js ADDED
@@ -0,0 +1,136 @@
1
+ import { ComplexNumber } from "./ComplexNumber.js";
2
+ const toParts = (input) => {
3
+ const re = [];
4
+ const im = [];
5
+ for (const x of input) {
6
+ if (x instanceof ComplexNumber) {
7
+ re.push(x.value);
8
+ im.push(x.iValue);
9
+ }
10
+ else {
11
+ re.push(x);
12
+ im.push(0);
13
+ }
14
+ }
15
+ return { re, im };
16
+ };
17
+ const toComplex = (re, im) => re.map((r, i) => new ComplexNumber(r, im[i]));
18
+ const isPowerOfTwo = (n) => n > 0 && (n & (n - 1)) === 0;
19
+ /** In-place iterative radix-2 Cooley-Tukey. `invert` runs the inverse transform. */
20
+ function transform(re, im, invert) {
21
+ const n = re.length;
22
+ // bit-reversal permutation
23
+ for (let i = 1, j = 0; i < n; i++) {
24
+ let bit = n >> 1;
25
+ for (; j & bit; bit >>= 1)
26
+ j ^= bit;
27
+ j ^= bit;
28
+ if (i < j) {
29
+ [re[i], re[j]] = [re[j], re[i]];
30
+ [im[i], im[j]] = [im[j], im[i]];
31
+ }
32
+ }
33
+ for (let len = 2; len <= n; len <<= 1) {
34
+ const ang = ((2 * Math.PI) / len) * (invert ? 1 : -1);
35
+ const wlenR = Math.cos(ang);
36
+ const wlenI = Math.sin(ang);
37
+ for (let i = 0; i < n; i += len) {
38
+ let wr = 1;
39
+ let wi = 0;
40
+ for (let j = 0; j < len / 2; j++) {
41
+ const uR = re[i + j];
42
+ const uI = im[i + j];
43
+ const vR = re[i + j + len / 2] * wr - im[i + j + len / 2] * wi;
44
+ const vI = re[i + j + len / 2] * wi + im[i + j + len / 2] * wr;
45
+ re[i + j] = uR + vR;
46
+ im[i + j] = uI + vI;
47
+ re[i + j + len / 2] = uR - vR;
48
+ im[i + j + len / 2] = uI - vI;
49
+ const nwr = wr * wlenR - wi * wlenI;
50
+ wi = wr * wlenI + wi * wlenR;
51
+ wr = nwr;
52
+ }
53
+ }
54
+ }
55
+ if (invert)
56
+ for (let i = 0; i < n; i++) {
57
+ re[i] /= n;
58
+ im[i] /= n;
59
+ }
60
+ }
61
+ export class FFT {
62
+ /** Fast Fourier transform (input length must be a power of two). */
63
+ static fft(input) {
64
+ const { re, im } = toParts(input);
65
+ if (!isPowerOfTwo(re.length))
66
+ throw new Error("FFT input length must be a power of two (see fftPadded).");
67
+ transform(re, im, false);
68
+ return toComplex(re, im);
69
+ }
70
+ /** Inverse fast Fourier transform. */
71
+ static ifft(input) {
72
+ const { re, im } = toParts(input);
73
+ if (!isPowerOfTwo(re.length))
74
+ throw new Error("IFFT input length must be a power of two.");
75
+ transform(re, im, true);
76
+ return toComplex(re, im);
77
+ }
78
+ /** FFT with the input zero-padded up to the next power of two. */
79
+ static fftPadded(input) {
80
+ const { re, im } = toParts(input);
81
+ let n = 1;
82
+ while (n < re.length)
83
+ n <<= 1;
84
+ while (re.length < n) {
85
+ re.push(0);
86
+ im.push(0);
87
+ }
88
+ transform(re, im, false);
89
+ return toComplex(re, im);
90
+ }
91
+ /** Direct O(n²) discrete Fourier transform for any length (reference implementation). */
92
+ static dft(input) {
93
+ const { re, im } = toParts(input);
94
+ const n = re.length;
95
+ const out = [];
96
+ for (let k = 0; k < n; k++) {
97
+ let sumR = 0;
98
+ let sumI = 0;
99
+ for (let t = 0; t < n; t++) {
100
+ const ang = (-2 * Math.PI * k * t) / n;
101
+ sumR += re[t] * Math.cos(ang) - im[t] * Math.sin(ang);
102
+ sumI += re[t] * Math.sin(ang) + im[t] * Math.cos(ang);
103
+ }
104
+ out.push(new ComplexNumber(sumR, sumI));
105
+ }
106
+ return out;
107
+ }
108
+ /** Linear convolution of two real (or complex) signals, via the FFT. */
109
+ static convolve(a, b) {
110
+ const resultLen = a.length + b.length - 1;
111
+ let n = 1;
112
+ while (n < resultLen)
113
+ n <<= 1;
114
+ const pad = (s) => {
115
+ const { re, im } = toParts(s);
116
+ while (re.length < n) {
117
+ re.push(0);
118
+ im.push(0);
119
+ }
120
+ return { re, im };
121
+ };
122
+ const A = pad(a);
123
+ const B = pad(b);
124
+ transform(A.re, A.im, false);
125
+ transform(B.re, B.im, false);
126
+ const re = new Array(n);
127
+ const im = new Array(n);
128
+ for (let i = 0; i < n; i++) {
129
+ re[i] = A.re[i] * B.re[i] - A.im[i] * B.im[i];
130
+ im[i] = A.re[i] * B.im[i] + A.im[i] * B.re[i];
131
+ }
132
+ transform(re, im, true);
133
+ return toComplex(re.slice(0, resultLen), im.slice(0, resultLen));
134
+ }
135
+ }
136
+ //# sourceMappingURL=FFT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FFT.js","sourceRoot":"","sources":["../src/FFT.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * GeometricAlgebra4 — the products that combine {@link Vec4} and
3
+ * {@link Bivector4} objects, mirroring how {@link ComplexMath} and
4
+ * {@link RealMath} hold the free-function operations for their respective
5
+ * types. {@link Rotor4} is built on top of these.
6
+ *
7
+ * Scope note: this module only implements the specific products the physics
8
+ * and rendering layers of a 4D engine actually need (vector·vector,
9
+ * vector∧vector, bivector*bivector, and the Hodge dual of a bivector) rather
10
+ * than a fully generic arbitrary-grade multivector type — Cl(4,0) has 16
11
+ * basis blades across grades 0–4, but rotors only ever touch grades 0, 2, 4,
12
+ * and nothing in this package needs grade-1 (vector) or grade-3 (trivector)
13
+ * results from a product.
14
+ */
15
+ import { Bivector4 } from "./Bivector4.ts";
16
+ import { type Multivector4 } from "./Clifford4Internal.ts";
17
+ import { Vec4 } from "./Vec4.ts";
18
+ export declare function bivectorToMV(b: Bivector4): Multivector4;
19
+ export declare function bivectorFromMV(mv: Multivector4): Bivector4;
20
+ /** The Euclidean inner product `a · b` (a scalar). Equivalent to `a.dot(b)`. */
21
+ export declare function dotProduct(a: Vec4, b: Vec4): number;
22
+ /** The outer (wedge) product `a ∧ b` — the oriented 2-plane spanned by `a` and `b`. */
23
+ export declare function wedgeProduct(a: Vec4, b: Vec4): Bivector4;
24
+ export interface VectorGeometricProduct {
25
+ readonly scalar: number;
26
+ readonly bivector: Bivector4;
27
+ }
28
+ /** The full geometric product `a * b = a·b + a∧b` of two vectors. */
29
+ export declare function geometricProductVectors(a: Vec4, b: Vec4): VectorGeometricProduct;
30
+ export interface BivectorGeometricProduct {
31
+ readonly scalar: number;
32
+ readonly bivector: Bivector4;
33
+ readonly pseudoscalar: number;
34
+ }
35
+ /**
36
+ * The full geometric product `A * B` of two bivectors: `⟨AB⟩₀ + ⟨AB⟩₂ + ⟨AB⟩₄`.
37
+ * This is the operation that makes 4D rotors an 8-component (1 + 6 + 1)
38
+ * object — the grade-4 (pseudoscalar) term has no 3D analogue, since in 3D
39
+ * the product of two bivectors never produces a grade-4 term (3D has no
40
+ * grade above 3). It's exactly this term that lets a 4D rotor encode a
41
+ * *double rotation*: simultaneous rotation in two independent orthogonal
42
+ * planes at once.
43
+ */
44
+ export declare function geometricProductBivectors(a: Bivector4, b: Bivector4): BivectorGeometricProduct;
45
+ /**
46
+ * Hodge dual of a bivector in 4D: maps each basis 2-plane to its orthogonal
47
+ * complement 2-plane (e.g. `dual(e12) = ±e34`), scaled by the pseudoscalar.
48
+ * Unlike 3D (where the dual of a bivector is a vector), the 4D dual of a
49
+ * bivector is again a bivector — this is a 4D-specific fact worth remembering
50
+ * when porting 3D geometric intuition.
51
+ */
52
+ export declare function dual(b: Bivector4): Bivector4;
53
+ /**
54
+ * The commutator product `A × B = ½(AB − BA)` of two bivectors -- distinct
55
+ * from {@link geometricProductBivectors}'s full `AB`. This is the operation
56
+ * n-dimensional rigid body dynamics needs for the generalized Euler's
57
+ * equation `L_t(ω) = I(ω_t) − ω × I(ω) = τ` (angular momentum, inertia
58
+ * tensor, and torque are all bivectors in 4D; this `×` is the commutator,
59
+ * not the 3D cross product it specializes to in 3D).
60
+ */
61
+ export declare function commutatorProduct(a: Bivector4, b: Bivector4): Bivector4;
62
+ /**
63
+ * The left contraction `v⌋B` of a vector into a bivector, producing a
64
+ * vector -- the grade-1 part of the geometric product `vB` (the geometric
65
+ * product of a grade-1 and a grade-2 element splits into grade 1 [this] and
66
+ * grade 3, and this package doesn't otherwise need grade-3/trivector
67
+ * results, so only the grade-1 part is extracted here). Needed for a rigid
68
+ * body's point velocity: `v_point = v + r⌋ω`, where `v` is linear velocity
69
+ * (Vec4), `ω` is angular velocity (Bivector4), and `r` is the point's offset
70
+ * from the body's center of mass.
71
+ */
72
+ export declare function leftContraction(v: Vec4, b: Bivector4): Vec4;
73
+ //# sourceMappingURL=GeometricAlgebra4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeometricAlgebra4.d.ts","sourceRoot":"","sources":["../src/GeometricAlgebra4.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAYL,KAAK,YAAY,EAIlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWjC,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,CASvD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,SAAS,CAS1D;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAEnD;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,SAAS,CAExD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,qEAAqE;AACrE,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,sBAAsB,CAGhF;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,wBAAwB,CAO9F;AAED;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAQ5C;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CAMvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAG3D"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * GeometricAlgebra4 — the products that combine {@link Vec4} and
3
+ * {@link Bivector4} objects, mirroring how {@link ComplexMath} and
4
+ * {@link RealMath} hold the free-function operations for their respective
5
+ * types. {@link Rotor4} is built on top of these.
6
+ *
7
+ * Scope note: this module only implements the specific products the physics
8
+ * and rendering layers of a 4D engine actually need (vector·vector,
9
+ * vector∧vector, bivector*bivector, and the Hodge dual of a bivector) rather
10
+ * than a fully generic arbitrary-grade multivector type — Cl(4,0) has 16
11
+ * basis blades across grades 0–4, but rotors only ever touch grades 0, 2, 4,
12
+ * and nothing in this package needs grade-1 (vector) or grade-3 (trivector)
13
+ * results from a product.
14
+ */
15
+ import { Bivector4 } from "./Bivector4.js";
16
+ import { E1, E2, E3, E4, E12, E13, E14, E23, E24, E34, geometricProductMV, mvZero, PSEUDOSCALAR4, wedgeProductMV, } from "./Clifford4Internal.js";
17
+ import { Vec4 } from "./Vec4.js";
18
+ function vecToMV(v) {
19
+ const mv = mvZero();
20
+ mv[E1] = v.x;
21
+ mv[E2] = v.y;
22
+ mv[E3] = v.z;
23
+ mv[E4] = v.w;
24
+ return mv;
25
+ }
26
+ export function bivectorToMV(b) {
27
+ const mv = mvZero();
28
+ mv[E12] = b.xy;
29
+ mv[E13] = b.xz;
30
+ mv[E14] = b.xw;
31
+ mv[E23] = b.yz;
32
+ mv[E24] = b.yw;
33
+ mv[E34] = b.zw;
34
+ return mv;
35
+ }
36
+ export function bivectorFromMV(mv) {
37
+ return new Bivector4(mv[E12], mv[E13], mv[E14], mv[E23], mv[E24], mv[E34]);
38
+ }
39
+ /** The Euclidean inner product `a · b` (a scalar). Equivalent to `a.dot(b)`. */
40
+ export function dotProduct(a, b) {
41
+ return a.dot(b);
42
+ }
43
+ /** The outer (wedge) product `a ∧ b` — the oriented 2-plane spanned by `a` and `b`. */
44
+ export function wedgeProduct(a, b) {
45
+ return bivectorFromMV(wedgeProductMV(vecToMV(a), vecToMV(b)));
46
+ }
47
+ /** The full geometric product `a * b = a·b + a∧b` of two vectors. */
48
+ export function geometricProductVectors(a, b) {
49
+ const mv = geometricProductMV(vecToMV(a), vecToMV(b));
50
+ return { scalar: mv[0], bivector: bivectorFromMV(mv) };
51
+ }
52
+ /**
53
+ * The full geometric product `A * B` of two bivectors: `⟨AB⟩₀ + ⟨AB⟩₂ + ⟨AB⟩₄`.
54
+ * This is the operation that makes 4D rotors an 8-component (1 + 6 + 1)
55
+ * object — the grade-4 (pseudoscalar) term has no 3D analogue, since in 3D
56
+ * the product of two bivectors never produces a grade-4 term (3D has no
57
+ * grade above 3). It's exactly this term that lets a 4D rotor encode a
58
+ * *double rotation*: simultaneous rotation in two independent orthogonal
59
+ * planes at once.
60
+ */
61
+ export function geometricProductBivectors(a, b) {
62
+ const mv = geometricProductMV(bivectorToMV(a), bivectorToMV(b));
63
+ return {
64
+ scalar: mv[0],
65
+ bivector: bivectorFromMV(mv),
66
+ pseudoscalar: mv[PSEUDOSCALAR4],
67
+ };
68
+ }
69
+ /**
70
+ * Hodge dual of a bivector in 4D: maps each basis 2-plane to its orthogonal
71
+ * complement 2-plane (e.g. `dual(e12) = ±e34`), scaled by the pseudoscalar.
72
+ * Unlike 3D (where the dual of a bivector is a vector), the 4D dual of a
73
+ * bivector is again a bivector — this is a 4D-specific fact worth remembering
74
+ * when porting 3D geometric intuition.
75
+ */
76
+ export function dual(b) {
77
+ // Multiplying by the inverse pseudoscalar (I⁻¹ = -I in Cl(4,0), since
78
+ // I*I = +1... actually for Cl(4,0), I^2 = (e1e2e3e4)^2 = +1, so I⁻¹ = I)
79
+ // implements the Hodge dual via the geometric product with I.
80
+ const I = mvZero();
81
+ I[PSEUDOSCALAR4] = 1;
82
+ const mv = geometricProductMV(bivectorToMV(b), I);
83
+ return bivectorFromMV(mv);
84
+ }
85
+ /**
86
+ * The commutator product `A × B = ½(AB − BA)` of two bivectors -- distinct
87
+ * from {@link geometricProductBivectors}'s full `AB`. This is the operation
88
+ * n-dimensional rigid body dynamics needs for the generalized Euler's
89
+ * equation `L_t(ω) = I(ω_t) − ω × I(ω) = τ` (angular momentum, inertia
90
+ * tensor, and torque are all bivectors in 4D; this `×` is the commutator,
91
+ * not the 3D cross product it specializes to in 3D).
92
+ */
93
+ export function commutatorProduct(a, b) {
94
+ const ab = geometricProductMV(bivectorToMV(a), bivectorToMV(b));
95
+ const ba = geometricProductMV(bivectorToMV(b), bivectorToMV(a));
96
+ const commutator = mvZero();
97
+ for (let i = 0; i < commutator.length; i++)
98
+ commutator[i] = (ab[i] - ba[i]) / 2;
99
+ return bivectorFromMV(commutator);
100
+ }
101
+ /**
102
+ * The left contraction `v⌋B` of a vector into a bivector, producing a
103
+ * vector -- the grade-1 part of the geometric product `vB` (the geometric
104
+ * product of a grade-1 and a grade-2 element splits into grade 1 [this] and
105
+ * grade 3, and this package doesn't otherwise need grade-3/trivector
106
+ * results, so only the grade-1 part is extracted here). Needed for a rigid
107
+ * body's point velocity: `v_point = v + r⌋ω`, where `v` is linear velocity
108
+ * (Vec4), `ω` is angular velocity (Bivector4), and `r` is the point's offset
109
+ * from the body's center of mass.
110
+ */
111
+ export function leftContraction(v, b) {
112
+ const mv = geometricProductMV(vecToMV(v), bivectorToMV(b));
113
+ return new Vec4(mv[E1], mv[E2], mv[E3], mv[E4]);
114
+ }
115
+ //# sourceMappingURL=GeometricAlgebra4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeometricAlgebra4.js","sourceRoot":"","sources":["../src/GeometricAlgebra4.ts"],"names":[],"mappings":"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"}