@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.
- package/README.md +165 -0
- package/dist/Bivector4.d.ts +52 -0
- package/dist/Bivector4.d.ts.map +1 -0
- package/dist/Bivector4.js +105 -0
- package/dist/Bivector4.js.map +1 -0
- package/dist/CellGraph.d.ts +259 -0
- package/dist/CellGraph.d.ts.map +1 -0
- package/dist/CellGraph.js +637 -0
- package/dist/CellGraph.js.map +1 -0
- package/dist/Clifford4Internal.d.ts +35 -0
- package/dist/Clifford4Internal.d.ts.map +1 -0
- package/dist/Clifford4Internal.js +86 -0
- package/dist/Clifford4Internal.js.map +1 -0
- package/dist/Combinatorics.d.ts +61 -0
- package/dist/Combinatorics.d.ts.map +1 -0
- package/dist/Combinatorics.js +186 -0
- package/dist/Combinatorics.js.map +1 -0
- package/dist/CombinatoricsGenerators.d.ts +44 -0
- package/dist/CombinatoricsGenerators.d.ts.map +1 -0
- package/dist/CombinatoricsGenerators.js +148 -0
- package/dist/CombinatoricsGenerators.js.map +1 -0
- package/dist/ComplexMath.d.ts +46 -0
- package/dist/ComplexMath.d.ts.map +1 -0
- package/dist/ComplexMath.js +98 -0
- package/dist/ComplexMath.js.map +1 -0
- package/dist/ComplexNumber.d.ts +174 -0
- package/dist/ComplexNumber.d.ts.map +1 -0
- package/dist/ComplexNumber.js +443 -0
- package/dist/ComplexNumber.js.map +1 -0
- package/dist/Cycle.d.ts +42 -0
- package/dist/Cycle.d.ts.map +1 -0
- package/dist/Cycle.js +120 -0
- package/dist/Cycle.js.map +1 -0
- package/dist/Decimal.d.ts +45 -0
- package/dist/Decimal.d.ts.map +1 -0
- package/dist/Decimal.js +135 -0
- package/dist/Decimal.js.map +1 -0
- package/dist/Distributions.d.ts +55 -0
- package/dist/Distributions.d.ts.map +1 -0
- package/dist/Distributions.js +222 -0
- package/dist/Distributions.js.map +1 -0
- package/dist/DualNumber.d.ts +42 -0
- package/dist/DualNumber.d.ts.map +1 -0
- package/dist/DualNumber.js +91 -0
- package/dist/DualNumber.js.map +1 -0
- package/dist/Environment.d.ts +44 -0
- package/dist/Environment.d.ts.map +1 -0
- package/dist/Environment.js +129 -0
- package/dist/Environment.js.map +1 -0
- package/dist/Expression.d.ts +19 -0
- package/dist/Expression.d.ts.map +1 -0
- package/dist/Expression.js +43 -0
- package/dist/Expression.js.map +1 -0
- package/dist/FFT.d.ts +21 -0
- package/dist/FFT.d.ts.map +1 -0
- package/dist/FFT.js +136 -0
- package/dist/FFT.js.map +1 -0
- package/dist/GeometricAlgebra4.d.ts +73 -0
- package/dist/GeometricAlgebra4.d.ts.map +1 -0
- package/dist/GeometricAlgebra4.js +115 -0
- package/dist/GeometricAlgebra4.js.map +1 -0
- package/dist/Geometry.d.ts +41 -0
- package/dist/Geometry.d.ts.map +1 -0
- package/dist/Geometry.js +167 -0
- package/dist/Geometry.js.map +1 -0
- package/dist/Graph.d.ts +72 -0
- package/dist/Graph.d.ts.map +1 -0
- package/dist/Graph.js +337 -0
- package/dist/Graph.js.map +1 -0
- package/dist/Graph3DUtils.d.ts +80 -0
- package/dist/Graph3DUtils.d.ts.map +1 -0
- package/dist/Graph3DUtils.js +156 -0
- package/dist/Graph3DUtils.js.map +1 -0
- package/dist/GraphUtils.d.ts +67 -0
- package/dist/GraphUtils.d.ts.map +1 -0
- package/dist/GraphUtils.js +72 -0
- package/dist/GraphUtils.js.map +1 -0
- package/dist/GroupTheory.d.ts +73 -0
- package/dist/GroupTheory.d.ts.map +1 -0
- package/dist/GroupTheory.js +194 -0
- package/dist/GroupTheory.js.map +1 -0
- package/dist/IntUtils.d.ts +33 -0
- package/dist/IntUtils.d.ts.map +1 -0
- package/dist/IntUtils.js +185 -0
- package/dist/IntUtils.js.map +1 -0
- package/dist/Interval.d.ts +44 -0
- package/dist/Interval.d.ts.map +1 -0
- package/dist/Interval.js +165 -0
- package/dist/Interval.js.map +1 -0
- package/dist/Lattice.d.ts +48 -0
- package/dist/Lattice.d.ts.map +1 -0
- package/dist/Lattice.js +65 -0
- package/dist/Lattice.js.map +1 -0
- package/dist/Logic.d.ts +22 -0
- package/dist/Logic.d.ts.map +1 -0
- package/dist/Logic.js +34 -0
- package/dist/Logic.js.map +1 -0
- package/dist/MatrixMath.d.ts +71 -0
- package/dist/MatrixMath.d.ts.map +1 -0
- package/dist/MatrixMath.js +302 -0
- package/dist/MatrixMath.js.map +1 -0
- package/dist/NumberTheory.d.ts +49 -0
- package/dist/NumberTheory.d.ts.map +1 -0
- package/dist/NumberTheory.js +230 -0
- package/dist/NumberTheory.js.map +1 -0
- package/dist/Numerical.d.ts +85 -0
- package/dist/Numerical.d.ts.map +1 -0
- package/dist/Numerical.js +343 -0
- package/dist/Numerical.js.map +1 -0
- package/dist/Permutation.d.ts +43 -0
- package/dist/Permutation.d.ts.map +1 -0
- package/dist/Permutation.js +142 -0
- package/dist/Permutation.js.map +1 -0
- package/dist/Polygon.d.ts +64 -0
- package/dist/Polygon.d.ts.map +1 -0
- package/dist/Polygon.js +221 -0
- package/dist/Polygon.js.map +1 -0
- package/dist/PolynomialRing.d.ts +74 -0
- package/dist/PolynomialRing.d.ts.map +1 -0
- package/dist/PolynomialRing.js +231 -0
- package/dist/PolynomialRing.js.map +1 -0
- package/dist/Quaternion.d.ts +37 -0
- package/dist/Quaternion.d.ts.map +1 -0
- package/dist/Quaternion.js +106 -0
- package/dist/Quaternion.js.map +1 -0
- package/dist/Rational.d.ts +34 -0
- package/dist/Rational.d.ts.map +1 -0
- package/dist/Rational.js +136 -0
- package/dist/Rational.js.map +1 -0
- package/dist/RealMath.d.ts +112 -0
- package/dist/RealMath.d.ts.map +1 -0
- package/dist/RealMath.js +262 -0
- package/dist/RealMath.js.map +1 -0
- package/dist/Rotor4.d.ts +180 -0
- package/dist/Rotor4.d.ts.map +1 -0
- package/dist/Rotor4.js +388 -0
- package/dist/Rotor4.js.map +1 -0
- package/dist/SpecialFunctions.d.ts +32 -0
- package/dist/SpecialFunctions.d.ts.map +1 -0
- package/dist/SpecialFunctions.js +161 -0
- package/dist/SpecialFunctions.js.map +1 -0
- package/dist/SpecialOperator.d.ts +21 -0
- package/dist/SpecialOperator.d.ts.map +1 -0
- package/dist/SpecialOperator.js +26 -0
- package/dist/SpecialOperator.js.map +1 -0
- package/dist/Statistics.d.ts +50 -0
- package/dist/Statistics.d.ts.map +1 -0
- package/dist/Statistics.js +131 -0
- package/dist/Statistics.js.map +1 -0
- package/dist/StringEvaluator.d.ts +48 -0
- package/dist/StringEvaluator.d.ts.map +1 -0
- package/dist/StringEvaluator.js +190 -0
- package/dist/StringEvaluator.js.map +1 -0
- package/dist/Structure.d.ts +130 -0
- package/dist/Structure.d.ts.map +1 -0
- package/dist/Structure.js +394 -0
- package/dist/Structure.js.map +1 -0
- package/dist/Symbolic.d.ts +501 -0
- package/dist/Symbolic.d.ts.map +1 -0
- package/dist/Symbolic.js +4077 -0
- package/dist/Symbolic.js.map +1 -0
- package/dist/Type.d.ts +31 -0
- package/dist/Type.d.ts.map +1 -0
- package/dist/Type.js +47 -0
- package/dist/Type.js.map +1 -0
- package/dist/Utilities.d.ts +27 -0
- package/dist/Utilities.d.ts.map +1 -0
- package/dist/Utilities.js +47 -0
- package/dist/Utilities.js.map +1 -0
- package/dist/Vec4.d.ts +39 -0
- package/dist/Vec4.d.ts.map +1 -0
- package/dist/Vec4.js +82 -0
- package/dist/Vec4.js.map +1 -0
- package/dist/Vector.d.ts +83 -0
- package/dist/Vector.d.ts.map +1 -0
- package/dist/Vector.js +173 -0
- package/dist/Vector.js.map +1 -0
- package/dist/VectorCalculus.d.ts +42 -0
- package/dist/VectorCalculus.d.ts.map +1 -0
- package/dist/VectorCalculus.js +82 -0
- package/dist/VectorCalculus.js.map +1 -0
- package/dist/VectorUtils.d.ts +172 -0
- package/dist/VectorUtils.d.ts.map +1 -0
- package/dist/VectorUtils.js +706 -0
- package/dist/VectorUtils.js.map +1 -0
- package/dist/differentiation-rules.d.ts +21 -0
- package/dist/differentiation-rules.d.ts.map +1 -0
- package/dist/differentiation-rules.js +52 -0
- package/dist/differentiation-rules.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
- package/src/Bivector4.ts +136 -0
- package/src/CellGraph.ts +669 -0
- package/src/Clifford4Internal.ts +90 -0
- package/src/Combinatorics.ts +183 -0
- package/src/CombinatoricsGenerators.ts +144 -0
- package/src/ComplexMath.ts +162 -0
- package/src/ComplexNumber.ts +491 -0
- package/src/Cycle.ts +126 -0
- package/src/Decimal.ts +145 -0
- package/src/Distributions.ts +269 -0
- package/src/DualNumber.ts +105 -0
- package/src/Environment.ts +127 -0
- package/src/Expression.ts +48 -0
- package/src/FFT.ts +146 -0
- package/src/GeometricAlgebra4.ts +157 -0
- package/src/Geometry.ts +173 -0
- package/src/Graph.ts +337 -0
- package/src/Graph3DUtils.ts +269 -0
- package/src/GraphUtils.ts +159 -0
- package/src/GroupTheory.ts +214 -0
- package/src/IntUtils.ts +200 -0
- package/src/Interval.ts +171 -0
- package/src/Lattice.ts +87 -0
- package/src/Logic.ts +38 -0
- package/src/MatrixMath.ts +326 -0
- package/src/NumberTheory.ts +228 -0
- package/src/Numerical.ts +390 -0
- package/src/Permutation.ts +148 -0
- package/src/Polygon.ts +229 -0
- package/src/PolynomialRing.ts +242 -0
- package/src/Quaternion.ts +125 -0
- package/src/Rational.ts +148 -0
- package/src/RealMath.ts +346 -0
- package/src/Rotor4.ts +440 -0
- package/src/SpecialFunctions.ts +152 -0
- package/src/SpecialOperator.ts +28 -0
- package/src/Statistics.ts +170 -0
- package/src/StringEvaluator.ts +208 -0
- package/src/Structure.ts +481 -0
- package/src/Symbolic.ts +4313 -0
- package/src/Type.ts +48 -0
- package/src/Utilities.ts +49 -0
- package/src/Vec4.ts +98 -0
- package/src/Vector.ts +189 -0
- package/src/VectorCalculus.ts +87 -0
- package/src/VectorUtils.ts +797 -0
- package/src/differentiation-rules.ts +73 -0
- package/src/index.ts +140 -0
package/dist/Vec4.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vec4 — a Euclidean 4D vector `(x, y, z, w)`.
|
|
3
|
+
*
|
|
4
|
+
* This is a genuine fourth *spatial* dimension (not time): all four
|
|
5
|
+
* components are treated symmetrically, exactly like {@link Quaternion}'s
|
|
6
|
+
* imaginary triple but one dimension further. Built to support 4D geometric
|
|
7
|
+
* algebra ({@link Bivector4}, {@link Rotor4}) for applications like simulating
|
|
8
|
+
* or rendering four-dimensional space.
|
|
9
|
+
*/
|
|
10
|
+
export class Vec4 {
|
|
11
|
+
x;
|
|
12
|
+
y;
|
|
13
|
+
z;
|
|
14
|
+
w;
|
|
15
|
+
static Zero = new Vec4(0, 0, 0, 0);
|
|
16
|
+
static Ex = new Vec4(1, 0, 0, 0);
|
|
17
|
+
static Ey = new Vec4(0, 1, 0, 0);
|
|
18
|
+
static Ez = new Vec4(0, 0, 1, 0);
|
|
19
|
+
static Ew = new Vec4(0, 0, 0, 1);
|
|
20
|
+
constructor(x = 0, y = 0, z = 0, w = 0) {
|
|
21
|
+
this.x = x;
|
|
22
|
+
this.y = y;
|
|
23
|
+
this.z = z;
|
|
24
|
+
this.w = w;
|
|
25
|
+
}
|
|
26
|
+
static of(x, y, z, w) {
|
|
27
|
+
return new Vec4(x, y, z, w);
|
|
28
|
+
}
|
|
29
|
+
add(v) {
|
|
30
|
+
return new Vec4(this.x + v.x, this.y + v.y, this.z + v.z, this.w + v.w);
|
|
31
|
+
}
|
|
32
|
+
subtract(v) {
|
|
33
|
+
return new Vec4(this.x - v.x, this.y - v.y, this.z - v.z, this.w - v.w);
|
|
34
|
+
}
|
|
35
|
+
scale(s) {
|
|
36
|
+
return new Vec4(this.x * s, this.y * s, this.z * s, this.w * s);
|
|
37
|
+
}
|
|
38
|
+
negate() {
|
|
39
|
+
return this.scale(-1);
|
|
40
|
+
}
|
|
41
|
+
/** Euclidean inner product. */
|
|
42
|
+
dot(v) {
|
|
43
|
+
return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
|
|
44
|
+
}
|
|
45
|
+
get magnitude() {
|
|
46
|
+
return Math.hypot(this.x, this.y, this.z, this.w);
|
|
47
|
+
}
|
|
48
|
+
get magnitudeSquared() {
|
|
49
|
+
return this.dot(this);
|
|
50
|
+
}
|
|
51
|
+
normalize() {
|
|
52
|
+
const m = this.magnitude;
|
|
53
|
+
if (m === 0)
|
|
54
|
+
throw new Error("Cannot normalize the zero vector.");
|
|
55
|
+
return this.scale(1 / m);
|
|
56
|
+
}
|
|
57
|
+
lerp(v, t) {
|
|
58
|
+
return this.add(v.subtract(this).scale(t));
|
|
59
|
+
}
|
|
60
|
+
equals(v, epsilon = 0) {
|
|
61
|
+
if (epsilon === 0)
|
|
62
|
+
return this.x === v.x && this.y === v.y && this.z === v.z && this.w === v.w;
|
|
63
|
+
return (Math.abs(this.x - v.x) <= epsilon &&
|
|
64
|
+
Math.abs(this.y - v.y) <= epsilon &&
|
|
65
|
+
Math.abs(this.z - v.z) <= epsilon &&
|
|
66
|
+
Math.abs(this.w - v.w) <= epsilon);
|
|
67
|
+
}
|
|
68
|
+
/** The 3D subvector `(x, y, z)` obtained by dropping the w-axis — useful when reading out the current 3D "slice" of a 4D scene. */
|
|
69
|
+
dropW() {
|
|
70
|
+
return [this.x, this.y, this.z];
|
|
71
|
+
}
|
|
72
|
+
toArray() {
|
|
73
|
+
return [this.x, this.y, this.z, this.w];
|
|
74
|
+
}
|
|
75
|
+
static fromArray(a) {
|
|
76
|
+
return new Vec4(a[0], a[1], a[2], a[3]);
|
|
77
|
+
}
|
|
78
|
+
toString() {
|
|
79
|
+
return `(${this.x}, ${this.y}, ${this.z}, ${this.w})`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=Vec4.js.map
|
package/dist/Vec4.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Vec4.js","sourceRoot":"","sources":["../src/Vec4.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,IAAI;IACN,CAAC,CAAS;IACV,CAAC,CAAS;IACV,CAAC,CAAS;IACV,CAAC,CAAS;IAEnB,MAAM,CAAU,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAU,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAU,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAU,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,MAAM,CAAU,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAE1C,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;QAClD,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,CAAO;QACT,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,QAAQ,CAAC,CAAO;QACd,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,CAAS;QACb,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,+BAA+B;IAC/B,GAAG,CAAC,CAAO;QACT,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,SAAS;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,CAAO,EAAE,CAAS;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,CAAO,EAAE,OAAO,GAAG,CAAC;QACzB,IAAI,OAAO,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/F,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO;YACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO;YACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO;YACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAClC,CAAC;IACJ,CAAC;IAED,mIAAmI;IACnI,KAAK;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAA4C;QAC3D,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC;IACxD,CAAC"}
|
package/dist/Vector.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector — an `Array` subclass that doubles as a mathematical vector / matrix row.
|
|
3
|
+
*
|
|
4
|
+
* Ported from Mallory's ActionScript `Vector` (`dynamic class Vector extends Array`).
|
|
5
|
+
* In the original the class was used both as a plain sequence container and, when
|
|
6
|
+
* nested (a Vector of Vectors), as a matrix. That dual role is preserved here.
|
|
7
|
+
*
|
|
8
|
+
* Modernisations & bug fixes relative to the AS3 original:
|
|
9
|
+
* - `setElement` no longer infinitely recurses when the target slot holds a
|
|
10
|
+
* falsy value (the AS3 version looped forever whenever `this[index]` was
|
|
11
|
+
* `0`/`null`/`undefined`). It now pads with the placeholder and assigns.
|
|
12
|
+
* - The `x`/`y`/`z`/`t` accessors return a genuinely stored `0` instead of
|
|
13
|
+
* silently coercing every falsy slot to `0`.
|
|
14
|
+
* - `toXML` returns a `string` (AS3 `XML` no longer exists in JS land).
|
|
15
|
+
* - The class is generic and iterable (inherited from `Array`).
|
|
16
|
+
*/
|
|
17
|
+
export declare class Vector<T = unknown> extends Array<T> {
|
|
18
|
+
/** A shared, empty vector — mirrors AS3 `Vector.Empty`. */
|
|
19
|
+
static readonly Empty: Vector<never>;
|
|
20
|
+
/**
|
|
21
|
+
* Build a Vector from the given elements.
|
|
22
|
+
*
|
|
23
|
+
* NOTE on the single-number case: because `Array` (and therefore this
|
|
24
|
+
* subclass) treats `new Vector(n)` as "create a sparse vector of length n",
|
|
25
|
+
* that behaviour is retained — it is also what `Array.prototype` methods rely
|
|
26
|
+
* on via `Symbol.species` when they allocate result vectors. Use
|
|
27
|
+
* {@link Vector.of} or {@link Vector.from} to wrap a literal single number.
|
|
28
|
+
*/
|
|
29
|
+
constructor(length: number);
|
|
30
|
+
constructor(...rest: T[]);
|
|
31
|
+
/** Ensure `map`/`filter`/`slice`/etc. produce plain `Vector`s, not typed views. */
|
|
32
|
+
static get [Symbol.species](): ArrayConstructor;
|
|
33
|
+
/** Convert any array-like into a Vector (shallow). Mirrors AS3 `ArrayToVector`. */
|
|
34
|
+
static fromArray<U>(array: Iterable<U>): Vector<U>;
|
|
35
|
+
/**
|
|
36
|
+
* Parse the `<vector>` form produced by {@link toXML} (best-effort inverse:
|
|
37
|
+
* numeric coordinates become numbers, everything else stays a string).
|
|
38
|
+
*/
|
|
39
|
+
static fromXML(xml: string): Vector<number | string>;
|
|
40
|
+
/**
|
|
41
|
+
* Parse the bracketed form produced by {@link toString} (best-effort inverse:
|
|
42
|
+
* numeric elements become numbers, everything else stays a trimmed string).
|
|
43
|
+
*/
|
|
44
|
+
static fromString(str: string, seperator?: string, leftBracket?: string, rightBracket?: string): Vector<number | string>;
|
|
45
|
+
/** String representation, e.g. `[1,2,3]`. */
|
|
46
|
+
toString(seperator?: string, leftBracket?: string, rightBracket?: string): string;
|
|
47
|
+
/** XML-ish serialisation, kept for compatibility with the AS3 API. */
|
|
48
|
+
toXML(): string;
|
|
49
|
+
/** Return the element at `index` (defaults to the first). */
|
|
50
|
+
getElement(index?: number): T | undefined;
|
|
51
|
+
/** Remove and return the element at `index`. */
|
|
52
|
+
removeElement(index?: number): T | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Set the element at `index`, padding with `placeHolder` if the vector is too
|
|
55
|
+
* short. Returns the previously stored value (or `undefined`).
|
|
56
|
+
*
|
|
57
|
+
* Bug fix: the AS3 version recursed infinitely whenever the slot was falsy.
|
|
58
|
+
*/
|
|
59
|
+
setElement(newElement: T, index?: number, placeHolder?: T | null): T | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Insert `newElement` at `index`. With no index (or a negative one) it is
|
|
62
|
+
* appended. If `index` is beyond the current end, the gap is filled with
|
|
63
|
+
* `placeHolder`. Returns the resulting length.
|
|
64
|
+
*/
|
|
65
|
+
addElement(newElement?: T | null, index?: number, placeHolder?: T | null): number;
|
|
66
|
+
private coord;
|
|
67
|
+
get x(): T | 0;
|
|
68
|
+
get y(): T | 0;
|
|
69
|
+
get z(): T | 0;
|
|
70
|
+
get t(): T | 0;
|
|
71
|
+
set x(value: T);
|
|
72
|
+
set y(value: T);
|
|
73
|
+
set z(value: T);
|
|
74
|
+
set t(value: T);
|
|
75
|
+
/**
|
|
76
|
+
* Clone the vector. When `deep` is true (default) nested Vectors are cloned
|
|
77
|
+
* recursively, so a matrix is duplicated rather than sharing its rows.
|
|
78
|
+
*/
|
|
79
|
+
clone(deep?: boolean): Vector<T>;
|
|
80
|
+
/** Return a new vector with the elements in reverse order. */
|
|
81
|
+
reversed(): Vector<T>;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=Vector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Vector.d.ts","sourceRoot":"","sources":["../src/Vector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,MAAM,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,KAAK,CAAC,CAAC,CAAC;IAC/C,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAuB;IAE3D;;;;;;;;OAQG;gBACS,MAAM,EAAE,MAAM;gBACd,GAAG,IAAI,EAAE,CAAC,EAAE;IAUxB,mFAAmF;IACnF,WAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAEvD;IAED,mFAAmF;IACnF,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAMlD;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAUpD;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAM,EAAE,WAAW,SAAM,EAAE,YAAY,SAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAc/G,6CAA6C;IACpC,QAAQ,CAAC,SAAS,SAAM,EAAE,WAAW,SAAM,EAAE,YAAY,SAAM,GAAG,MAAM;IASjF,sEAAsE;IACtE,KAAK,IAAI,MAAM;IAQf,6DAA6D;IAC7D,UAAU,CAAC,KAAK,SAAI,GAAG,CAAC,GAAG,SAAS;IAIpC,gDAAgD;IAChD,aAAa,CAAC,KAAK,SAAI,GAAG,CAAC,GAAG,SAAS;IAIvC;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,SAAI,EAAE,WAAW,GAAE,CAAC,GAAG,IAAW,GAAG,CAAC,GAAG,SAAS;IAOjF;;;;OAIG;IACH,UAAU,CAAC,UAAU,GAAE,CAAC,GAAG,IAAW,EAAE,KAAK,SAAK,EAAE,WAAW,GAAE,CAAC,GAAG,IAAW,GAAG,MAAM;IAQzF,OAAO,CAAC,KAAK;IAIb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAEb;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAEb;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAEb;IACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAEb;IAED,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAEb;IACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAEb;IACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAEb;IACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAEb;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,UAAO,GAAG,MAAM,CAAC,CAAC,CAAC;IAS7B,8DAA8D;IAC9D,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC;CAKtB"}
|
package/dist/Vector.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector — an `Array` subclass that doubles as a mathematical vector / matrix row.
|
|
3
|
+
*
|
|
4
|
+
* Ported from Mallory's ActionScript `Vector` (`dynamic class Vector extends Array`).
|
|
5
|
+
* In the original the class was used both as a plain sequence container and, when
|
|
6
|
+
* nested (a Vector of Vectors), as a matrix. That dual role is preserved here.
|
|
7
|
+
*
|
|
8
|
+
* Modernisations & bug fixes relative to the AS3 original:
|
|
9
|
+
* - `setElement` no longer infinitely recurses when the target slot holds a
|
|
10
|
+
* falsy value (the AS3 version looped forever whenever `this[index]` was
|
|
11
|
+
* `0`/`null`/`undefined`). It now pads with the placeholder and assigns.
|
|
12
|
+
* - The `x`/`y`/`z`/`t` accessors return a genuinely stored `0` instead of
|
|
13
|
+
* silently coercing every falsy slot to `0`.
|
|
14
|
+
* - `toXML` returns a `string` (AS3 `XML` no longer exists in JS land).
|
|
15
|
+
* - The class is generic and iterable (inherited from `Array`).
|
|
16
|
+
*/
|
|
17
|
+
export class Vector extends Array {
|
|
18
|
+
/** A shared, empty vector — mirrors AS3 `Vector.Empty`. */
|
|
19
|
+
static Empty = new Vector();
|
|
20
|
+
constructor(...rest) {
|
|
21
|
+
// Reproduce Array's constructor contract: a lone number means "length".
|
|
22
|
+
if (rest.length === 1 && typeof rest[0] === "number") {
|
|
23
|
+
super(rest[0]);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
super(...rest);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Ensure `map`/`filter`/`slice`/etc. produce plain `Vector`s, not typed views. */
|
|
30
|
+
static get [Symbol.species]() {
|
|
31
|
+
return Array;
|
|
32
|
+
}
|
|
33
|
+
/** Convert any array-like into a Vector (shallow). Mirrors AS3 `ArrayToVector`. */
|
|
34
|
+
static fromArray(array) {
|
|
35
|
+
const v = new Vector();
|
|
36
|
+
for (const e of array)
|
|
37
|
+
v.push(e);
|
|
38
|
+
return v;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse the `<vector>` form produced by {@link toXML} (best-effort inverse:
|
|
42
|
+
* numeric coordinates become numbers, everything else stays a string).
|
|
43
|
+
*/
|
|
44
|
+
static fromXML(xml) {
|
|
45
|
+
const out = new Vector();
|
|
46
|
+
for (const match of xml.matchAll(/<coordinate>(.*?)<\/coordinate>/g)) {
|
|
47
|
+
const raw = match[1];
|
|
48
|
+
const n = Number(raw);
|
|
49
|
+
out.push(raw !== "" && !Number.isNaN(n) ? n : raw);
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse the bracketed form produced by {@link toString} (best-effort inverse:
|
|
55
|
+
* numeric elements become numbers, everything else stays a trimmed string).
|
|
56
|
+
*/
|
|
57
|
+
static fromString(str, seperator = ",", leftBracket = "[", rightBracket = "]") {
|
|
58
|
+
let s = str.trim();
|
|
59
|
+
if (s.startsWith(leftBracket))
|
|
60
|
+
s = s.slice(leftBracket.length);
|
|
61
|
+
if (s.endsWith(rightBracket))
|
|
62
|
+
s = s.slice(0, s.length - rightBracket.length);
|
|
63
|
+
const out = new Vector();
|
|
64
|
+
if (s === "")
|
|
65
|
+
return out;
|
|
66
|
+
for (const part of s.split(seperator)) {
|
|
67
|
+
const t = part.trim();
|
|
68
|
+
const n = Number(t);
|
|
69
|
+
out.push(t !== "" && !Number.isNaN(n) ? n : t);
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
/** String representation, e.g. `[1,2,3]`. */
|
|
74
|
+
toString(seperator = ",", leftBracket = "[", rightBracket = "]") {
|
|
75
|
+
let out = leftBracket;
|
|
76
|
+
for (let i = 0; i < this.length; i++) {
|
|
77
|
+
out += this[i] != null ? String(this[i]) : String(null);
|
|
78
|
+
if (i !== this.length - 1)
|
|
79
|
+
out += seperator;
|
|
80
|
+
}
|
|
81
|
+
return out + rightBracket;
|
|
82
|
+
}
|
|
83
|
+
/** XML-ish serialisation, kept for compatibility with the AS3 API. */
|
|
84
|
+
toXML() {
|
|
85
|
+
const parts = [];
|
|
86
|
+
for (let i = 0; i < this.length; i++) {
|
|
87
|
+
parts.push(`<coordinate>${this[i]}</coordinate>`);
|
|
88
|
+
}
|
|
89
|
+
return `<vector>${parts.join("")}</vector>`;
|
|
90
|
+
}
|
|
91
|
+
/** Return the element at `index` (defaults to the first). */
|
|
92
|
+
getElement(index = 0) {
|
|
93
|
+
return this[index];
|
|
94
|
+
}
|
|
95
|
+
/** Remove and return the element at `index`. */
|
|
96
|
+
removeElement(index = 0) {
|
|
97
|
+
return this.splice(index, 1)[0];
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Set the element at `index`, padding with `placeHolder` if the vector is too
|
|
101
|
+
* short. Returns the previously stored value (or `undefined`).
|
|
102
|
+
*
|
|
103
|
+
* Bug fix: the AS3 version recursed infinitely whenever the slot was falsy.
|
|
104
|
+
*/
|
|
105
|
+
setElement(newElement, index = 0, placeHolder = null) {
|
|
106
|
+
while (this.length < index)
|
|
107
|
+
this.push(placeHolder);
|
|
108
|
+
const previous = this[index];
|
|
109
|
+
this[index] = newElement;
|
|
110
|
+
return previous;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Insert `newElement` at `index`. With no index (or a negative one) it is
|
|
114
|
+
* appended. If `index` is beyond the current end, the gap is filled with
|
|
115
|
+
* `placeHolder`. Returns the resulting length.
|
|
116
|
+
*/
|
|
117
|
+
addElement(newElement = null, index = -1, placeHolder = null) {
|
|
118
|
+
if (index < 0)
|
|
119
|
+
return this.push(newElement);
|
|
120
|
+
while (index > this.length)
|
|
121
|
+
this.push(placeHolder);
|
|
122
|
+
this.splice(index, 0, newElement);
|
|
123
|
+
return this.length;
|
|
124
|
+
}
|
|
125
|
+
// The x/y/z/t accessors let a Vector act as a 1-to-4 dimensional point.
|
|
126
|
+
coord(i) {
|
|
127
|
+
return i < this.length && this[i] != null ? this[i] : 0;
|
|
128
|
+
}
|
|
129
|
+
get x() {
|
|
130
|
+
return this.coord(0);
|
|
131
|
+
}
|
|
132
|
+
get y() {
|
|
133
|
+
return this.coord(1);
|
|
134
|
+
}
|
|
135
|
+
get z() {
|
|
136
|
+
return this.coord(2);
|
|
137
|
+
}
|
|
138
|
+
get t() {
|
|
139
|
+
return this.coord(3);
|
|
140
|
+
}
|
|
141
|
+
set x(value) {
|
|
142
|
+
this.setElement(value, 0);
|
|
143
|
+
}
|
|
144
|
+
set y(value) {
|
|
145
|
+
this.setElement(value, 1);
|
|
146
|
+
}
|
|
147
|
+
set z(value) {
|
|
148
|
+
this.setElement(value, 2);
|
|
149
|
+
}
|
|
150
|
+
set t(value) {
|
|
151
|
+
this.setElement(value, 3);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Clone the vector. When `deep` is true (default) nested Vectors are cloned
|
|
155
|
+
* recursively, so a matrix is duplicated rather than sharing its rows.
|
|
156
|
+
*/
|
|
157
|
+
clone(deep = true) {
|
|
158
|
+
const out = new Vector();
|
|
159
|
+
for (let i = 0; i < this.length; i++) {
|
|
160
|
+
const el = this[i];
|
|
161
|
+
out[i] = deep && el instanceof Vector ? el.clone() : el;
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
/** Return a new vector with the elements in reverse order. */
|
|
166
|
+
reversed() {
|
|
167
|
+
const out = new Vector();
|
|
168
|
+
for (let i = 0; i < this.length; i++)
|
|
169
|
+
out[i] = this[this.length - 1 - i];
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=Vector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Vector.js","sourceRoot":"","sources":["../src/Vector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { DualNumber } from "./DualNumber.ts";
|
|
2
|
+
/**
|
|
3
|
+
* VectorCalculus — multivariable differential calculus: gradients, Jacobians,
|
|
4
|
+
* divergence, curl, and Hessians. Built entirely on existing exact-derivative
|
|
5
|
+
* machinery rather than a new autodiff engine: {@link gradient}/{@link jacobian}
|
|
6
|
+
* reuse {@link DualNumber} forward-mode autodiff (exact, first-order);
|
|
7
|
+
* {@link symbolicGradient} reuses {@link Symbolic} differentiation/evaluation
|
|
8
|
+
* for string-expression functions.
|
|
9
|
+
*
|
|
10
|
+
* {@link hessian} is the one approximate method — it takes central differences
|
|
11
|
+
* of the *exact* gradient (not of `f` itself), which is more accurate than a
|
|
12
|
+
* naive finite-difference Hessian without the scope of implementing
|
|
13
|
+
* second-order (hyperdual) numbers.
|
|
14
|
+
*/
|
|
15
|
+
export declare class VectorCalculus {
|
|
16
|
+
/** The gradient of a scalar field `f` at `point` (exact, via {@link DualNumber}). */
|
|
17
|
+
static gradient(f: (xs: DualNumber[]) => DualNumber, point: number[]): number[];
|
|
18
|
+
/** The rate of change of `f` at `point` along `direction` (need not be a unit vector). */
|
|
19
|
+
static directionalDerivative(f: (xs: DualNumber[]) => DualNumber, point: number[], direction: number[]): number;
|
|
20
|
+
/**
|
|
21
|
+
* The Jacobian of a vector field `f: R^n -> R^m` at `point`, as an `m × n`
|
|
22
|
+
* matrix (`J[i][j] = ∂f_i/∂x_j`). Computed via `n` forward autodiff passes,
|
|
23
|
+
* one dual-seeded input dimension at a time.
|
|
24
|
+
*/
|
|
25
|
+
static jacobian(f: (xs: DualNumber[]) => DualNumber[], point: number[]): number[][];
|
|
26
|
+
/** The divergence of a vector field `f: R^n -> R^n` at `point` (the trace of its Jacobian). */
|
|
27
|
+
static divergence(f: (xs: DualNumber[]) => DualNumber[], point: number[]): number;
|
|
28
|
+
/** The curl of a 3D vector field `f: R^3 -> R^3` at `point`. */
|
|
29
|
+
static curl3D(f: (xs: DualNumber[]) => DualNumber[], point: [number, number, number]): [number, number, number];
|
|
30
|
+
/**
|
|
31
|
+
* The Hessian of a scalar field `f` at `point`: central differences (step
|
|
32
|
+
* `h`) of the exact gradient, i.e. `H[i][j] ≈ ∂(∂f/∂x_j)/∂x_i`.
|
|
33
|
+
*/
|
|
34
|
+
static hessian(f: (xs: DualNumber[]) => DualNumber, point: number[], h?: number): number[][];
|
|
35
|
+
/**
|
|
36
|
+
* The exact gradient of a string expression at `point`, via
|
|
37
|
+
* {@link Symbolic.differentiate}/{@link Symbolic.evaluate} (one partial
|
|
38
|
+
* derivative per named variable — every other variable is held constant).
|
|
39
|
+
*/
|
|
40
|
+
static symbolicGradient(expr: string, variables: string[], point: Record<string, number>): number[];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=VectorCalculus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorCalculus.d.ts","sourceRoot":"","sources":["../src/VectorCalculus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IACzB,qFAAqF;IACrF,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAI/E,0FAA0F;IAC1F,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAO/G;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE;IAWnF,+FAA+F;IAC/F,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM;IAKjF,gEAAgE;IAChE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IAS/G;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,SAAO,GAAG,MAAM,EAAE,EAAE;IAY1F;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE;CAGpG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { DualNumber } from "./DualNumber.js";
|
|
2
|
+
import { Symbolic } from "./Symbolic.js";
|
|
3
|
+
/**
|
|
4
|
+
* VectorCalculus — multivariable differential calculus: gradients, Jacobians,
|
|
5
|
+
* divergence, curl, and Hessians. Built entirely on existing exact-derivative
|
|
6
|
+
* machinery rather than a new autodiff engine: {@link gradient}/{@link jacobian}
|
|
7
|
+
* reuse {@link DualNumber} forward-mode autodiff (exact, first-order);
|
|
8
|
+
* {@link symbolicGradient} reuses {@link Symbolic} differentiation/evaluation
|
|
9
|
+
* for string-expression functions.
|
|
10
|
+
*
|
|
11
|
+
* {@link hessian} is the one approximate method — it takes central differences
|
|
12
|
+
* of the *exact* gradient (not of `f` itself), which is more accurate than a
|
|
13
|
+
* naive finite-difference Hessian without the scope of implementing
|
|
14
|
+
* second-order (hyperdual) numbers.
|
|
15
|
+
*/
|
|
16
|
+
export class VectorCalculus {
|
|
17
|
+
/** The gradient of a scalar field `f` at `point` (exact, via {@link DualNumber}). */
|
|
18
|
+
static gradient(f, point) {
|
|
19
|
+
return DualNumber.gradient(f, point);
|
|
20
|
+
}
|
|
21
|
+
/** The rate of change of `f` at `point` along `direction` (need not be a unit vector). */
|
|
22
|
+
static directionalDerivative(f, point, direction) {
|
|
23
|
+
const norm = Math.sqrt(direction.reduce((s, d) => s + d * d, 0));
|
|
24
|
+
if (norm === 0)
|
|
25
|
+
throw new Error("VectorCalculus.directionalDerivative: direction must be non-zero");
|
|
26
|
+
const grad = VectorCalculus.gradient(f, point);
|
|
27
|
+
return grad.reduce((s, g, i) => s + (g * direction[i]) / norm, 0);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The Jacobian of a vector field `f: R^n -> R^m` at `point`, as an `m × n`
|
|
31
|
+
* matrix (`J[i][j] = ∂f_i/∂x_j`). Computed via `n` forward autodiff passes,
|
|
32
|
+
* one dual-seeded input dimension at a time.
|
|
33
|
+
*/
|
|
34
|
+
static jacobian(f, point) {
|
|
35
|
+
const n = point.length;
|
|
36
|
+
const columns = [];
|
|
37
|
+
for (let i = 0; i < n; i++) {
|
|
38
|
+
const seeded = point.map((x, j) => new DualNumber(x, i === j ? 1 : 0));
|
|
39
|
+
columns.push(f(seeded).map((o) => o.deriv));
|
|
40
|
+
}
|
|
41
|
+
const m = columns[0]?.length ?? 0;
|
|
42
|
+
return Array.from({ length: m }, (_, row) => columns.map((column) => column[row]));
|
|
43
|
+
}
|
|
44
|
+
/** The divergence of a vector field `f: R^n -> R^n` at `point` (the trace of its Jacobian). */
|
|
45
|
+
static divergence(f, point) {
|
|
46
|
+
const J = VectorCalculus.jacobian(f, point);
|
|
47
|
+
return point.reduce((sum, _, i) => sum + J[i]?.[i], 0);
|
|
48
|
+
}
|
|
49
|
+
/** The curl of a 3D vector field `f: R^3 -> R^3` at `point`. */
|
|
50
|
+
static curl3D(f, point) {
|
|
51
|
+
const J = VectorCalculus.jacobian(f, point);
|
|
52
|
+
return [
|
|
53
|
+
J[2]?.[1] - J[1]?.[2],
|
|
54
|
+
J[0]?.[2] - J[2]?.[0],
|
|
55
|
+
J[1]?.[0] - J[0]?.[1],
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The Hessian of a scalar field `f` at `point`: central differences (step
|
|
60
|
+
* `h`) of the exact gradient, i.e. `H[i][j] ≈ ∂(∂f/∂x_j)/∂x_i`.
|
|
61
|
+
*/
|
|
62
|
+
static hessian(f, point, h = 1e-4) {
|
|
63
|
+
return point.map((_, i) => {
|
|
64
|
+
const plus = point.slice();
|
|
65
|
+
const minus = point.slice();
|
|
66
|
+
plus[i] = plus[i] + h;
|
|
67
|
+
minus[i] = minus[i] - h;
|
|
68
|
+
const gradPlus = VectorCalculus.gradient(f, plus);
|
|
69
|
+
const gradMinus = VectorCalculus.gradient(f, minus);
|
|
70
|
+
return gradPlus.map((g, j) => (g - gradMinus[j]) / (2 * h));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The exact gradient of a string expression at `point`, via
|
|
75
|
+
* {@link Symbolic.differentiate}/{@link Symbolic.evaluate} (one partial
|
|
76
|
+
* derivative per named variable — every other variable is held constant).
|
|
77
|
+
*/
|
|
78
|
+
static symbolicGradient(expr, variables, point) {
|
|
79
|
+
return variables.map((variable) => Symbolic.evaluate(Symbolic.differentiate(expr, variable), point));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=VectorCalculus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorCalculus.js","sourceRoot":"","sources":["../src/VectorCalculus.ts"],"names":[],"mappings":"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"}
|