@use-gpu/math 0.0.0-stage → 0.21.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/LICENSE.md +28 -0
- package/README.md +24 -2
- package/cjs/ease.cjs +285 -0
- package/cjs/ease.d.cts +25 -0
- package/cjs/ease.js.map +1 -0
- package/cjs/index.cjs +25 -0
- package/cjs/index.d.cts +6 -0
- package/cjs/index.js.map +1 -0
- package/cjs/linalg.cjs +101 -0
- package/cjs/linalg.d.cts +4 -0
- package/cjs/linalg.js.map +1 -0
- package/cjs/math.cjs +52 -0
- package/cjs/math.js.map +1 -0
- package/cjs/matrix.cjs +247 -0
- package/cjs/matrix.d.cts +18 -0
- package/cjs/matrix.js.map +1 -0
- package/cjs/number.cjs +52 -0
- package/cjs/number.d.cts +13 -0
- package/cjs/number.js.map +1 -0
- package/cjs/polynomial.cjs +174 -0
- package/cjs/polynomial.d.cts +5 -0
- package/cjs/polynomial.js.map +1 -0
- package/cjs/vector.cjs +108 -0
- package/cjs/vector.d.cts +32 -0
- package/cjs/vector.js.map +1 -0
- package/mjs/ease.d.mts +25 -0
- package/mjs/ease.js.map +1 -0
- package/mjs/ease.mjs +247 -0
- package/mjs/index.d.mts +6 -0
- package/mjs/index.js.map +1 -0
- package/mjs/index.mjs +8 -0
- package/mjs/linalg.d.mts +4 -0
- package/mjs/linalg.js.map +1 -0
- package/mjs/linalg.mjs +81 -0
- package/mjs/matrix.d.mts +18 -0
- package/mjs/matrix.js.map +1 -0
- package/mjs/matrix.mjs +237 -0
- package/mjs/number.d.mts +13 -0
- package/mjs/number.js.map +1 -0
- package/mjs/number.mjs +16 -0
- package/mjs/polynomial.d.mts +5 -0
- package/mjs/polynomial.js.map +1 -0
- package/mjs/polynomial.mjs +152 -0
- package/mjs/vector.d.mts +32 -0
- package/mjs/vector.js.map +1 -0
- package/mjs/vector.mjs +98 -0
- package/package.json +19 -3
package/cjs/vector.d.cts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { VectorLike } from './number.d.cts';
|
|
2
|
+
export declare const Vector: {
|
|
3
|
+
binary: (f: (a: number, b: number) => number) => <T extends VectorLike>(a: T, b: T) => T;
|
|
4
|
+
reduce: (f: (a: number, b: number, i: number) => number) => <T extends VectorLike>(v: T, accum?: number) => number;
|
|
5
|
+
reduce2: (f: (a: number, b: number, c: number, i: number) => number) => <T extends VectorLike>(a: T, b: T, accum?: number) => number;
|
|
6
|
+
add: <T extends VectorLike>(a: T, b: T) => T;
|
|
7
|
+
sub: <T extends VectorLike>(a: T, b: T) => T;
|
|
8
|
+
mul: <T extends VectorLike>(a: T, b: T) => T;
|
|
9
|
+
div: <T extends VectorLike>(a: T, b: T) => T;
|
|
10
|
+
dot: <T extends VectorLike>(a: T, b: T, accum?: number) => number;
|
|
11
|
+
adds: <T extends VectorLike>(a: T, s: number) => T;
|
|
12
|
+
subs: <T extends VectorLike>(a: T, s: number) => T;
|
|
13
|
+
muls: <T extends VectorLike>(a: T, s: number) => T;
|
|
14
|
+
mins: <T extends VectorLike>(a: T, b: number) => T;
|
|
15
|
+
maxs: <T extends VectorLike>(a: T, b: number) => T;
|
|
16
|
+
scale: <T extends VectorLike>(a: T, s: number) => T;
|
|
17
|
+
sum: <T extends VectorLike>(v: T, accum?: number) => number;
|
|
18
|
+
len2: <T extends VectorLike>(v: T, accum?: number) => number;
|
|
19
|
+
len: <T extends VectorLike>(a: T) => number;
|
|
20
|
+
dist2: <T extends VectorLike>(a: T, b: T, accum?: number) => number;
|
|
21
|
+
dist: <T extends VectorLike>(a: T, b: T) => number;
|
|
22
|
+
abs: <T extends VectorLike>(a: T) => T;
|
|
23
|
+
unit: <T extends VectorLike>(a: T) => T;
|
|
24
|
+
minEl: <T extends VectorLike>(a: T) => number;
|
|
25
|
+
maxEl: <T extends VectorLike>(a: T) => number;
|
|
26
|
+
min: <T extends VectorLike>(a: T, b: T) => T;
|
|
27
|
+
max: <T extends VectorLike>(a: T, b: T) => T;
|
|
28
|
+
clamp: <T extends VectorLike>(vector: T, a?: number, b?: number) => T;
|
|
29
|
+
lerp: <T extends VectorLike>(a: T, b: T, t: number) => T;
|
|
30
|
+
project: <T extends VectorLike>(a: T, n: T) => T;
|
|
31
|
+
select: <T extends VectorLike>(a: T, b: T, m: T) => T;
|
|
32
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../packages/math/src/vector.ts"],"sourcesContent":["import type { VectorLike } from './number';\n\n// Binary dot-like operator\nconst binary = (f: (a: number, b: number) => number) =>\n <T extends VectorLike>(a: T, b: T): T => {\n const {length} = a;\n const c = a.slice() as T;\n for (let i = 0; i < length; ++i) {\n c[i] = f(a[i], b[i]);\n }\n return c;\n }\n\n// Unary reduction operator\nconst reduce = (f: (a: number, b: number, i: number) => number) =>\n <T extends VectorLike>(v: T, accum: number = 0): number => {\n const {length} = v;\n for (let i = 0; i < length; ++i) {\n accum = f(accum, v[i], i);\n }\n return accum;\n };\n\n// Binary reduction operator\nconst reduce2 = (f: (a: number, b: number, c: number, i: number) => number) =>\n <T extends VectorLike>(a: T, b: T, accum: number = 0): number => {\n const {length} = a;\n for (let i = 0; i < length; ++i) {\n accum = f(accum, a[i], b[i], i);\n }\n return accum;\n };\n\n// Scalar operators\nconst plus = (x: number, y: number) => x + y;\nconst minus = (x: number, y: number) => x - y;\nconst multiply = (x: number, y: number) => x * y;\nconst divide = (x: number, y: number) => x / y;\nconst minimum = (x: number, y: number) => Math.min(x, y);\nconst maximum = (x: number, y: number) => Math.max(x, y);\n\nconst plus2 = (x: number, y: number) => x + y*y;\nconst mad = (x: number, y: number, z: number) => x + y*z;\nconst madl2 = (x: number, y: number, z: number) => x + (y - z) * (y - z);\n\n// Vector operators\nconst add = binary(plus);\nconst sub = binary(minus);\nconst mul = binary(multiply);\nconst div = binary(divide);\nconst dot = reduce2(mad);\nconst adds = <T extends VectorLike>(a: T, s: number) => a.map(x => x + s) as T;\nconst subs = <T extends VectorLike>(a: T, s: number) => a.map(x => x - s) as T;\nconst muls = <T extends VectorLike>(a: T, s: number) => a.map(x => x * s) as T;\nconst scale = muls;\n\nconst sum = reduce(plus);\nconst len2 = reduce(plus2);\nconst len = <T extends VectorLike>(a: T): number => Math.sqrt(len2(a));\nconst dist2 = reduce2(madl2);\nconst dist = <T extends VectorLike>(a: T, b: T): number => Math.sqrt(dist2(a, b));\n\nconst abs = <T extends VectorLike>(a: T): T => a.map(x => Math.abs(x)) as T;\nconst unit = <T extends VectorLike>(a: T): T => {\n const l = len(a);\n return scale(a, l ? 1/l : 0);\n};\n\nconst minEl = <T extends VectorLike>(a: T) => reduce(minimum)(a, Infinity);\nconst maxEl = <T extends VectorLike>(a: T) => reduce(maximum)(a, -Infinity);\n\nconst min = <T extends VectorLike>(a: T, b: T): T => a.map((_, i) => Math.min(a[i], b[i])) as T;\nconst max = <T extends VectorLike>(a: T, b: T): T => a.map((_, i) => Math.max(a[i], b[i])) as T;\nconst clamp = <T extends VectorLike>(vector: T, a: number = 0, b: number = 1): T => vector.map(v => Math.max(a, Math.min(b, v))) as T;\n\nconst mins = <T extends VectorLike>(a: T, b: number): T => a.map((_, i) => Math.min(a[i], b)) as T;\nconst maxs = <T extends VectorLike>(a: T, b: number): T => a.map((_, i) => Math.max(a[i], b)) as T;\n\nconst lerp = <T extends VectorLike>(a: T, b: T, t: number): T => add(a, scale(sub(b, a), t));\nconst project = <T extends VectorLike>(a: T, n: T): T => sub(a, scale(n, dot(a, n)));\nconst select = <T extends VectorLike>(a: T, b: T, m: T): T => m.map((s, i) => s ? b[i] : a[i]) as T;\n\nexport const Vector = {\n binary,\n reduce,\n reduce2,\n add,\n sub,\n mul,\n div,\n dot,\n adds,\n subs,\n muls,\n mins,\n maxs,\n scale,\n sum,\n len2,\n len,\n dist2,\n dist,\n abs,\n unit,\n minEl,\n maxEl,\n min,\n max,\n clamp,\n lerp,\n project,\n select,\n};\n"],"names":["Vector","binary","f","a","b","length","c","slice","i","reduce","v","accum","reduce2","plus","x","y","minus","multiply","divide","minimum","Math","min","maximum","max","plus2","mad","z","madl2","add","sub","mul","div","dot","adds","s","map","subs","muls","scale","sum","len2","len","sqrt","dist2","dist","abs","unit","l","minEl","Infinity","maxEl","_","clamp","vector","mins","maxs","lerp","t","project","n","select","m"],"mappings":"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"}
|
package/mjs/ease.d.mts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const cubicBezier: (t: number, a: number, b: number, c: number, d: number) => number;
|
|
2
|
+
export declare const cubicBezierDt: (t: number, a: number, b: number, c: number, d: number) => number;
|
|
3
|
+
export declare const cubicBezierDt2: (t: number, a: number, b: number, c: number, d: number) => number;
|
|
4
|
+
export declare const cubicBezier01: (t: number, b: number, c: number) => number;
|
|
5
|
+
export declare const cubicBezierInverse01: (v: number, b: number, c: number) => number;
|
|
6
|
+
export declare const bezierEase: (t: number, x1: number, y1: number, x2: number, y2: number) => number;
|
|
7
|
+
export declare const velocityToBezierEase: (duration: number, arcLength: number, v1: number, v2: number, w1?: number, w2?: number) => number[];
|
|
8
|
+
export declare const catmullRom: (t: number, t0: number, t1: number, t2: number, t3: number, a: number, b: number, c: number, d: number) => number;
|
|
9
|
+
export declare const catmullRomDual: (t: number, t0: number, t1: number, t2: number, t3: number, a: number, b: number, c: number, d: number) => [number, number];
|
|
10
|
+
export declare const catmullRomWeighted: (fraction: number, a: number, b: number, c: number, d: number, ab: number, bc: number, cd: number, power?: number) => number;
|
|
11
|
+
export declare const catmullRomWeightedDual: (fraction: number, a: number, b: number, c: number, d: number, ab: number, bc: number, cd: number, power?: number) => [number, number];
|
|
12
|
+
export declare const sampleToCubicBezier: (sampleDual: (t: number) => [number, number]) => number[];
|
|
13
|
+
export type ArcLengthMap = {
|
|
14
|
+
map: Float32Array;
|
|
15
|
+
count: number;
|
|
16
|
+
length: number;
|
|
17
|
+
limit: number;
|
|
18
|
+
};
|
|
19
|
+
export declare const makeArcLengthMap: (measure: (t1: number, t2: number) => number, tolerance?: number, evenness?: number, limit?: number) => {
|
|
20
|
+
map: Float32Array<ArrayBuffer>;
|
|
21
|
+
count: number;
|
|
22
|
+
length: number;
|
|
23
|
+
limit: number;
|
|
24
|
+
};
|
|
25
|
+
export declare const queryArcLengthMap: (am: ArcLengthMap, value: number) => number;
|
package/mjs/ease.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../packages/math/src/ease.ts"],"sourcesContent":["import { π, clamp, sqr } from './number';\n\nconst { abs, acos, cbrt, ceil, cos, log2, min, pow, sign, sqrt } = Math;\n\n// Cubic bezier 1D\nexport const cubicBezier = (t: number, a: number, b: number, c: number, d: number) =>\n (a + (3 * b - a) * t) * sqr(1 - t) + (d + (3 * c - d) * (1 - t)) * sqr(t);\n\n// Cubic bezier 1D derivative\nexport const cubicBezierDt = (t: number, a: number, b: number, c: number, d: number) =>\n a * (- 3*sqr(1 - t)) +\n b * ((9*t - 12)*t + 3) +\n c * (6 - 9*t) * t +\n d * 3*sqr(t);\n \n// Cubic bezier 1D 2nd derivative\nexport const cubicBezierDt2 = (t: number, a: number, b: number, c: number, d: number) =>\n a * (3*2*(1 - t)) +\n b * (18*t - 12) +\n c * (6 - 18*t) +\n d * 3*2*t;\n\n// Cubic bezier 1D (a=0 d=1)\nexport const cubicBezier01 = (t: number, b: number, c: number) =>\n (3 * b) * t * sqr(1 - t) + ((3 * c) * (1 - t) + t) * sqr(t);\n\n// Invert monotonous cubic bezier (a=0 d=1) (analytic)\nexport const cubicBezierInverse01 = (v: number, b: number, c: number) => {\n // Bezier over x=[-1..1] y=[-1..1] with symmetric basis functions\n const y = v * 2 - 1;\n\n // Sum and difference of middle two bezier bands relative to f(x) = x\n const s = (3/4) * (b + c - 1);\n const d = (3/4) * (b - c + (1/3));\n if (abs(d) < 1e-5) {\n if (abs(s) < 1e-5) return v;\n return solveQuadraticBezier(s, y) * .5 + .5;\n }\n\n // Construct cubic basis\n // y = (d x^3 - s x^2 - d x + s) + x\n\n // Deflate cubic\n // t = x - o\n // t^3 + pt + q = 0\n const id = 1/d;\n const s2 = s*s;\n const d2 = d*d;\n const id2 = id*id;\n\n const o = (1/3) * s * id;\n const p = (d - d2 + (-1/3) * s2) * id2;\n const q = (((-2/27) * s2 + (1/3) * (d - d2) + d2) * s - y * d2) * (id2 * id);\n\n return (solveDepressedCubicBezier(p, q, s, d) + o) * .5 + .5;\n};\n\n// Helper for quadratic inverse (d=0)\nconst solveQuadraticBezier = (s: number, y: number) => {\n const d = 1 - 4 * s * (y - s);\n const v = (1 - sqrt(d)) / (2*s);\n return v;\n};\n\n// Helper for cubic inverse, solve depressed cubic p/q using s/d to pick roots\nconst solveDepressedCubicBezier = (p: number, q: number, s: number, d: number) => {\n const p_3 = p / 3;\n const q_2 = q / 2;\n\n const p3_27 = p_3 * p_3 * p_3;\n const ds = p3_27 + q_2 * q_2;\n\n if (ds === 0) {\n // Multiple root\n if (p) return -q_2 / p_3;\n else return 0;\n }\n else if (ds > 0) {\n // Vieta's substitution. Pick matching sign for better precision.\n const w = -q_2 - sqrt(ds) * sign(q);\n const cw = cbrt(w);\n return cw - p_3 / cw;\n }\n else {\n // Imaginary sqrt(ds)\n const dp = sqrt(-p3_27);\n const theta = acos(-q_2 / dp) / 3;\n const cw = cbrt(dp);\n const r = cw - p_3 / cw;\n\n const i = +(d < 0) || (+(s*d > 0) * 2);\n const cc = cos(theta - i * (2/3) * π);\n const v = cc * r;\n\n return v;\n }\n};\n\n// Cubic bezier ease, X = time / Y = value\n// Only control points (x1,y1) and (x2,y2) are adjustable (x = [0...1], y = any)\nexport const bezierEase = (t: number, x1: number, y1: number, x2: number, y2: number) => {\n if (t === 0 || t === 1) return t;\n const s = cubicBezierInverse01(t, x1, x2);\n const value = cubicBezier01(s, y1, y2);\n return value;\n};\n\n// Velocity helper for cubic bezier ease.\n// Ease across arcLength over duration, entering at speed v1 and exiting at speed v2.\nexport const velocityToBezierEase = (\n duration: number,\n arcLength: number,\n v1: number,\n v2: number,\n w1: number = 1/3,\n w2: number = 1/3,\n) => {\n const slope1 = arcLength ? v1 * duration / arcLength : 0;\n const slope2 = arcLength ? v2 * duration / arcLength : 0;\n\n const x1 = min(w1, 1 / slope1);\n const x2 = min(w2, 1 / slope2);\n const y1 = x1 * slope1;\n const y2 = x2 * slope2;\n\n return [x1, y1, 1 - x2, 1 - y2];\n};\n\n// Catmull-rom spline with movable knots\nexport const catmullRom = (\n t: number,\n t0: number,\n t1: number,\n t2: number,\n t3: number,\n a: number,\n b: number,\n c: number,\n d: number,\n) => {\n const d0t = t0 - t;\n\n const d10 = t1 - t0;\n const d1t = t1 - t;\n const d20 = t2 - t0;\n const d21 = t2 - t1;\n const d2t = t2 - t;\n const d31 = t3 - t1;\n const d32 = t3 - t2;\n const d3t = t3 - t;\n\n const a1 = (d10 !== 0) ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;\n const a2 = (d21 !== 0) ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;\n const a3 = (d32 !== 0) ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;\n\n const b1 = (d20 !== 0) ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;\n const b2 = (d31 !== 0) ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;\n\n const v = (d21 !== 0) ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;\n\n return v;\n};\n\n// Catmull-rom spline value+derivative with movable knots\nexport const catmullRomDual = (\n t: number,\n t0: number,\n t1: number,\n t2: number,\n t3: number,\n a: number,\n b: number,\n c: number,\n d: number,\n): [number, number] => {\n const d0t = t0 - t;\n\n const d10 = t1 - t0;\n const d1t = t1 - t;\n const d20 = t2 - t0;\n const d21 = t2 - t1;\n const d2t = t2 - t;\n const d31 = t3 - t1;\n const d32 = t3 - t2;\n const d3t = t3 - t;\n\n const a1 = (d10 !== 0) ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;\n const a2 = (d21 !== 0) ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;\n const a3 = (d32 !== 0) ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;\n\n const b1 = (d20 !== 0) ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;\n const b2 = (d31 !== 0) ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;\n\n const v = (d21 !== 0) ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;\n\n const da1dt = (d10 !== 0) ? a * (-1 / d10) + b * (1 / d10) : 0;\n const da2dt = (d21 !== 0) ? b * (-1 / d21) + c * (1 / d21) : 0;\n const da3dt = (d32 !== 0) ? c * (-1 / d32) + d * (1 / d32) : 0;\n\n const db1dt = (d20 !== 0) ? a1 * (-1 / d20) + da1dt * (d2t / d20) + a2 * (1 / d20) + da2dt * (-d0t / d20) : 0;\n const db2dt = (d31 !== 0) ? a2 * (-1 / d31) + da2dt * (d3t / d31) + a3 * (1 / d31) + da3dt * (-d1t / d31) : 0;\n\n const dvdt = (d21 !== 0) ? b1 * (-1 / d21) + db1dt * (d2t / d21) + b2 * (1 / d21) + db2dt * (-d1t / d21) : 0;\n\n return [v, dvdt];\n};\n\n// Weighted catmull rom (chordal = 1, centripetal = 1/2)\nexport const catmullRomWeighted = (\n fraction: number,\n a: number,\n b: number,\n c: number,\n d: number,\n ab: number,\n bc: number,\n cd: number,\n power: number = 1/2,\n) => {\n const d1 = pow(ab, power);\n const d2 = pow(bc, power);\n const d3 = pow(cd, power);\n\n const t0 = -d1;\n const t1 = 0;\n const t2 = d2;\n const t3 = d2 + d3;\n\n return catmullRom(fraction * d2, t0, t1, t2, t3, a, b, c, d);\n};\n\n// Weighted catmull rom value+derivative (chordal = 1, centripetal = 1/2)\nexport const catmullRomWeightedDual = (\n fraction: number,\n a: number,\n b: number,\n c: number,\n d: number,\n ab: number,\n bc: number,\n cd: number,\n power: number = 1/2,\n): [number, number] => {\n const d1 = pow(ab, power);\n const d2 = pow(bc, power);\n const d3 = pow(cd, power);\n\n const t0 = -d1;\n const t1 = 0;\n const t2 = d2;\n const t3 = d2 + d3;\n\n const [v, dvdt] = catmullRomDual(fraction * d2, t0, t1, t2, t3, a, b, c, d);\n return [v, dvdt * d2];\n};\n\n// Sample spline at endpoints (0..1) to make cubic bezier\nexport const sampleToCubicBezier = (\n sampleDual: (t: number) => [number, number],\n) => {\n const [b0, v0] = sampleDual(0);\n const [b3, v3] = sampleDual(1);\n\n const b1 = b0 + v0 / 3;\n const b2 = b3 - v3 / 3;\n\n return [b0, b1, b2, b3];\n};\n\n// Arc length map for a spline\nexport type ArcLengthMap = {\n map: Float32Array,\n count: number,\n length: number,\n limit: number,\n};\n\n// Make arc length map for a spline\nexport const makeArcLengthMap = (\n measure: (t1: number, t2: number) => number,\n tolerance: number = 0.005,\n evenness: number = 0.5,\n limit: number = 8,\n) => {\n\n let n = 0;\n let accum = 0;\n const eps = pow(2, ceil(log2(tolerance)));\n\n // Extra epsilon at start\n const data: number[] = [-measure(-eps, 0), -eps, 0];\n\n // Accumulate samples from 0..1\n const range = (a: number, b: number, l: number, force: number, limit: number) => {\n const m = (a + b) / 2;\n const l1 = measure(a, m);\n const l2 = measure(m, b);\n const d = l1 + l2;\n const e = min(l1 / l2, l2 / l1);\n\n if ((force > 0 || (l / d < 1 - tolerance) || (e < evenness)) && (limit > 0)) {\n range(a, m, l1, force - 1, limit - 1);\n range(m, b, l2, force - 1, limit - 1);\n }\n else {\n n++;\n const r = l / d;\n accum += d / (1 + r) * 2;\n data.push(a);\n data.push(accum);\n }\n };\n\n range(0, 1, measure(0, 1), 2, limit);\n data.push(1);\n\n // Extra epsilon at end\n data.push(accum + measure(1, 1 + eps));\n data.push(1 + eps);\n\n const count = n;\n const length = accum;\n const map = new Float32Array(data);\n\n return {map, count, length, limit};\n};\n\n// Query value in arc length map\nexport const queryArcLengthMap = (am: ArcLengthMap, value: number) => {\n const {map, count} = am;\n let {limit} = am;\n\n let a = 1;\n let b = count;\n\n while (b > a && limit-- > 0) {\n const m = b - ((b - a) >> 1);\n const d = map[m * 2];\n if (d > value) b = m - 1;\n else a = m;\n }\n\n const a2 = a * 2;\n\n const d0 = map[a2 - 2];\n const t0 = map[a2 - 1];\n\n const d1 = map[a2];\n const t1 = map[a2 + 1];\n\n const d2 = map[a2 + 2];\n const t2 = map[a2 + 3];\n\n const d3 = map[a2 + 4];\n const t3 = map[a2 + 5];\n\n return clamp(catmullRom(value, d0, d1, d2, d3, t0, t1, t2, t3), 0, 1);\n};\n"],"names":["π","clamp","sqr","abs","acos","cbrt","ceil","cos","log2","min","pow","sign","sqrt","Math","cubicBezier","t","a","b","c","d","cubicBezierDt","cubicBezierDt2","cubicBezier01","cubicBezierInverse01","v","y","s","solveQuadraticBezier","id","s2","d2","id2","o","p","q","solveDepressedCubicBezier","p_3","q_2","p3_27","ds","w","cw","dp","theta","r","i","cc","bezierEase","x1","y1","x2","y2","value","velocityToBezierEase","duration","arcLength","v1","v2","w1","w2","slope1","slope2","catmullRom","t0","t1","t2","t3","d0t","d10","d1t","d20","d21","d2t","d31","d32","d3t","a1","a2","a3","b1","b2","catmullRomDual","da1dt","da2dt","da3dt","db1dt","db2dt","dvdt","catmullRomWeighted","fraction","ab","bc","cd","power","d1","d3","catmullRomWeightedDual","sampleToCubicBezier","sampleDual","b0","v0","b3","v3","makeArcLengthMap","measure","tolerance","evenness","limit","n","accum","eps","data","range","l","force","m","l1","l2","e","push","count","length","map","Float32Array","queryArcLengthMap","am","d0"],"mappings":"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"}
|
package/mjs/ease.mjs
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { π, clamp, sqr } from './number.mjs';
|
|
2
|
+
const { abs, acos, cbrt, ceil, cos, log2, min, pow, sign, sqrt } = Math;
|
|
3
|
+
// Cubic bezier 1D
|
|
4
|
+
export const cubicBezier = (t, a, b, c, d)=>(a + (3 * b - a) * t) * sqr(1 - t) + (d + (3 * c - d) * (1 - t)) * sqr(t);
|
|
5
|
+
// Cubic bezier 1D derivative
|
|
6
|
+
export const cubicBezierDt = (t, a, b, c, d)=>a * (-3 * sqr(1 - t)) + b * ((9 * t - 12) * t + 3) + c * (6 - 9 * t) * t + d * 3 * sqr(t);
|
|
7
|
+
// Cubic bezier 1D 2nd derivative
|
|
8
|
+
export const cubicBezierDt2 = (t, a, b, c, d)=>a * (3 * 2 * (1 - t)) + b * (18 * t - 12) + c * (6 - 18 * t) + d * 3 * 2 * t;
|
|
9
|
+
// Cubic bezier 1D (a=0 d=1)
|
|
10
|
+
export const cubicBezier01 = (t, b, c)=>3 * b * t * sqr(1 - t) + (3 * c * (1 - t) + t) * sqr(t);
|
|
11
|
+
// Invert monotonous cubic bezier (a=0 d=1) (analytic)
|
|
12
|
+
export const cubicBezierInverse01 = (v, b, c)=>{
|
|
13
|
+
// Bezier over x=[-1..1] y=[-1..1] with symmetric basis functions
|
|
14
|
+
const y = v * 2 - 1;
|
|
15
|
+
// Sum and difference of middle two bezier bands relative to f(x) = x
|
|
16
|
+
const s = 3 / 4 * (b + c - 1);
|
|
17
|
+
const d = 3 / 4 * (b - c + 1 / 3);
|
|
18
|
+
if (abs(d) < 1e-5) {
|
|
19
|
+
if (abs(s) < 1e-5) return v;
|
|
20
|
+
return solveQuadraticBezier(s, y) * .5 + .5;
|
|
21
|
+
}
|
|
22
|
+
// Construct cubic basis
|
|
23
|
+
// y = (d x^3 - s x^2 - d x + s) + x
|
|
24
|
+
// Deflate cubic
|
|
25
|
+
// t = x - o
|
|
26
|
+
// t^3 + pt + q = 0
|
|
27
|
+
const id = 1 / d;
|
|
28
|
+
const s2 = s * s;
|
|
29
|
+
const d2 = d * d;
|
|
30
|
+
const id2 = id * id;
|
|
31
|
+
const o = 1 / 3 * s * id;
|
|
32
|
+
const p = (d - d2 + -1 / 3 * s2) * id2;
|
|
33
|
+
const q = ((-2 / 27 * s2 + 1 / 3 * (d - d2) + d2) * s - y * d2) * (id2 * id);
|
|
34
|
+
return (solveDepressedCubicBezier(p, q, s, d) + o) * .5 + .5;
|
|
35
|
+
};
|
|
36
|
+
// Helper for quadratic inverse (d=0)
|
|
37
|
+
const solveQuadraticBezier = (s, y)=>{
|
|
38
|
+
const d = 1 - 4 * s * (y - s);
|
|
39
|
+
const v = (1 - sqrt(d)) / (2 * s);
|
|
40
|
+
return v;
|
|
41
|
+
};
|
|
42
|
+
// Helper for cubic inverse, solve depressed cubic p/q using s/d to pick roots
|
|
43
|
+
const solveDepressedCubicBezier = (p, q, s, d)=>{
|
|
44
|
+
const p_3 = p / 3;
|
|
45
|
+
const q_2 = q / 2;
|
|
46
|
+
const p3_27 = p_3 * p_3 * p_3;
|
|
47
|
+
const ds = p3_27 + q_2 * q_2;
|
|
48
|
+
if (ds === 0) {
|
|
49
|
+
// Multiple root
|
|
50
|
+
if (p) return -q_2 / p_3;
|
|
51
|
+
else return 0;
|
|
52
|
+
} else if (ds > 0) {
|
|
53
|
+
// Vieta's substitution. Pick matching sign for better precision.
|
|
54
|
+
const w = -q_2 - sqrt(ds) * sign(q);
|
|
55
|
+
const cw = cbrt(w);
|
|
56
|
+
return cw - p_3 / cw;
|
|
57
|
+
} else {
|
|
58
|
+
// Imaginary sqrt(ds)
|
|
59
|
+
const dp = sqrt(-p3_27);
|
|
60
|
+
const theta = acos(-q_2 / dp) / 3;
|
|
61
|
+
const cw = cbrt(dp);
|
|
62
|
+
const r = cw - p_3 / cw;
|
|
63
|
+
const i = +(d < 0) || +(s * d > 0) * 2;
|
|
64
|
+
const cc = cos(theta - i * (2 / 3) * π);
|
|
65
|
+
const v = cc * r;
|
|
66
|
+
return v;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
// Cubic bezier ease, X = time / Y = value
|
|
70
|
+
// Only control points (x1,y1) and (x2,y2) are adjustable (x = [0...1], y = any)
|
|
71
|
+
export const bezierEase = (t, x1, y1, x2, y2)=>{
|
|
72
|
+
if (t === 0 || t === 1) return t;
|
|
73
|
+
const s = cubicBezierInverse01(t, x1, x2);
|
|
74
|
+
const value = cubicBezier01(s, y1, y2);
|
|
75
|
+
return value;
|
|
76
|
+
};
|
|
77
|
+
// Velocity helper for cubic bezier ease.
|
|
78
|
+
// Ease across arcLength over duration, entering at speed v1 and exiting at speed v2.
|
|
79
|
+
export const velocityToBezierEase = (duration, arcLength, v1, v2, w1 = 1 / 3, w2 = 1 / 3)=>{
|
|
80
|
+
const slope1 = arcLength ? v1 * duration / arcLength : 0;
|
|
81
|
+
const slope2 = arcLength ? v2 * duration / arcLength : 0;
|
|
82
|
+
const x1 = min(w1, 1 / slope1);
|
|
83
|
+
const x2 = min(w2, 1 / slope2);
|
|
84
|
+
const y1 = x1 * slope1;
|
|
85
|
+
const y2 = x2 * slope2;
|
|
86
|
+
return [
|
|
87
|
+
x1,
|
|
88
|
+
y1,
|
|
89
|
+
1 - x2,
|
|
90
|
+
1 - y2
|
|
91
|
+
];
|
|
92
|
+
};
|
|
93
|
+
// Catmull-rom spline with movable knots
|
|
94
|
+
export const catmullRom = (t, t0, t1, t2, t3, a, b, c, d)=>{
|
|
95
|
+
const d0t = t0 - t;
|
|
96
|
+
const d10 = t1 - t0;
|
|
97
|
+
const d1t = t1 - t;
|
|
98
|
+
const d20 = t2 - t0;
|
|
99
|
+
const d21 = t2 - t1;
|
|
100
|
+
const d2t = t2 - t;
|
|
101
|
+
const d31 = t3 - t1;
|
|
102
|
+
const d32 = t3 - t2;
|
|
103
|
+
const d3t = t3 - t;
|
|
104
|
+
const a1 = d10 !== 0 ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;
|
|
105
|
+
const a2 = d21 !== 0 ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;
|
|
106
|
+
const a3 = d32 !== 0 ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;
|
|
107
|
+
const b1 = d20 !== 0 ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;
|
|
108
|
+
const b2 = d31 !== 0 ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;
|
|
109
|
+
const v = d21 !== 0 ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;
|
|
110
|
+
return v;
|
|
111
|
+
};
|
|
112
|
+
// Catmull-rom spline value+derivative with movable knots
|
|
113
|
+
export const catmullRomDual = (t, t0, t1, t2, t3, a, b, c, d)=>{
|
|
114
|
+
const d0t = t0 - t;
|
|
115
|
+
const d10 = t1 - t0;
|
|
116
|
+
const d1t = t1 - t;
|
|
117
|
+
const d20 = t2 - t0;
|
|
118
|
+
const d21 = t2 - t1;
|
|
119
|
+
const d2t = t2 - t;
|
|
120
|
+
const d31 = t3 - t1;
|
|
121
|
+
const d32 = t3 - t2;
|
|
122
|
+
const d3t = t3 - t;
|
|
123
|
+
const a1 = d10 !== 0 ? a * (d1t / d10) + b * (-d0t / d10) : (a + b) / 2;
|
|
124
|
+
const a2 = d21 !== 0 ? b * (d2t / d21) + c * (-d1t / d21) : (b + c) / 2;
|
|
125
|
+
const a3 = d32 !== 0 ? c * (d3t / d32) + d * (-d2t / d32) : (c + d) / 2;
|
|
126
|
+
const b1 = d20 !== 0 ? a1 * (d2t / d20) + a2 * (-d0t / d20) : (a1 + a2) / 2;
|
|
127
|
+
const b2 = d31 !== 0 ? a2 * (d3t / d31) + a3 * (-d1t / d31) : (a2 + a3) / 2;
|
|
128
|
+
const v = d21 !== 0 ? b1 * (d2t / d21) + b2 * (-d1t / d21) : (b1 + b2) / 2;
|
|
129
|
+
const da1dt = d10 !== 0 ? a * (-1 / d10) + b * (1 / d10) : 0;
|
|
130
|
+
const da2dt = d21 !== 0 ? b * (-1 / d21) + c * (1 / d21) : 0;
|
|
131
|
+
const da3dt = d32 !== 0 ? c * (-1 / d32) + d * (1 / d32) : 0;
|
|
132
|
+
const db1dt = d20 !== 0 ? a1 * (-1 / d20) + da1dt * (d2t / d20) + a2 * (1 / d20) + da2dt * (-d0t / d20) : 0;
|
|
133
|
+
const db2dt = d31 !== 0 ? a2 * (-1 / d31) + da2dt * (d3t / d31) + a3 * (1 / d31) + da3dt * (-d1t / d31) : 0;
|
|
134
|
+
const dvdt = d21 !== 0 ? b1 * (-1 / d21) + db1dt * (d2t / d21) + b2 * (1 / d21) + db2dt * (-d1t / d21) : 0;
|
|
135
|
+
return [
|
|
136
|
+
v,
|
|
137
|
+
dvdt
|
|
138
|
+
];
|
|
139
|
+
};
|
|
140
|
+
// Weighted catmull rom (chordal = 1, centripetal = 1/2)
|
|
141
|
+
export const catmullRomWeighted = (fraction, a, b, c, d, ab, bc, cd, power = 1 / 2)=>{
|
|
142
|
+
const d1 = pow(ab, power);
|
|
143
|
+
const d2 = pow(bc, power);
|
|
144
|
+
const d3 = pow(cd, power);
|
|
145
|
+
const t0 = -d1;
|
|
146
|
+
const t1 = 0;
|
|
147
|
+
const t2 = d2;
|
|
148
|
+
const t3 = d2 + d3;
|
|
149
|
+
return catmullRom(fraction * d2, t0, t1, t2, t3, a, b, c, d);
|
|
150
|
+
};
|
|
151
|
+
// Weighted catmull rom value+derivative (chordal = 1, centripetal = 1/2)
|
|
152
|
+
export const catmullRomWeightedDual = (fraction, a, b, c, d, ab, bc, cd, power = 1 / 2)=>{
|
|
153
|
+
const d1 = pow(ab, power);
|
|
154
|
+
const d2 = pow(bc, power);
|
|
155
|
+
const d3 = pow(cd, power);
|
|
156
|
+
const t0 = -d1;
|
|
157
|
+
const t1 = 0;
|
|
158
|
+
const t2 = d2;
|
|
159
|
+
const t3 = d2 + d3;
|
|
160
|
+
const [v, dvdt] = catmullRomDual(fraction * d2, t0, t1, t2, t3, a, b, c, d);
|
|
161
|
+
return [
|
|
162
|
+
v,
|
|
163
|
+
dvdt * d2
|
|
164
|
+
];
|
|
165
|
+
};
|
|
166
|
+
// Sample spline at endpoints (0..1) to make cubic bezier
|
|
167
|
+
export const sampleToCubicBezier = (sampleDual)=>{
|
|
168
|
+
const [b0, v0] = sampleDual(0);
|
|
169
|
+
const [b3, v3] = sampleDual(1);
|
|
170
|
+
const b1 = b0 + v0 / 3;
|
|
171
|
+
const b2 = b3 - v3 / 3;
|
|
172
|
+
return [
|
|
173
|
+
b0,
|
|
174
|
+
b1,
|
|
175
|
+
b2,
|
|
176
|
+
b3
|
|
177
|
+
];
|
|
178
|
+
};
|
|
179
|
+
// Make arc length map for a spline
|
|
180
|
+
export const makeArcLengthMap = (measure, tolerance = 0.005, evenness = 0.5, limit = 8)=>{
|
|
181
|
+
let n = 0;
|
|
182
|
+
let accum = 0;
|
|
183
|
+
const eps = pow(2, ceil(log2(tolerance)));
|
|
184
|
+
// Extra epsilon at start
|
|
185
|
+
const data = [
|
|
186
|
+
-measure(-eps, 0),
|
|
187
|
+
-eps,
|
|
188
|
+
0
|
|
189
|
+
];
|
|
190
|
+
// Accumulate samples from 0..1
|
|
191
|
+
const range = (a, b, l, force, limit)=>{
|
|
192
|
+
const m = (a + b) / 2;
|
|
193
|
+
const l1 = measure(a, m);
|
|
194
|
+
const l2 = measure(m, b);
|
|
195
|
+
const d = l1 + l2;
|
|
196
|
+
const e = min(l1 / l2, l2 / l1);
|
|
197
|
+
if ((force > 0 || l / d < 1 - tolerance || e < evenness) && limit > 0) {
|
|
198
|
+
range(a, m, l1, force - 1, limit - 1);
|
|
199
|
+
range(m, b, l2, force - 1, limit - 1);
|
|
200
|
+
} else {
|
|
201
|
+
n++;
|
|
202
|
+
const r = l / d;
|
|
203
|
+
accum += d / (1 + r) * 2;
|
|
204
|
+
data.push(a);
|
|
205
|
+
data.push(accum);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
range(0, 1, measure(0, 1), 2, limit);
|
|
209
|
+
data.push(1);
|
|
210
|
+
// Extra epsilon at end
|
|
211
|
+
data.push(accum + measure(1, 1 + eps));
|
|
212
|
+
data.push(1 + eps);
|
|
213
|
+
const count = n;
|
|
214
|
+
const length = accum;
|
|
215
|
+
const map = new Float32Array(data);
|
|
216
|
+
return {
|
|
217
|
+
map,
|
|
218
|
+
count,
|
|
219
|
+
length,
|
|
220
|
+
limit
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
// Query value in arc length map
|
|
224
|
+
export const queryArcLengthMap = (am, value)=>{
|
|
225
|
+
const { map, count } = am;
|
|
226
|
+
let { limit } = am;
|
|
227
|
+
let a = 1;
|
|
228
|
+
let b = count;
|
|
229
|
+
while(b > a && limit-- > 0){
|
|
230
|
+
const m = b - (b - a >> 1);
|
|
231
|
+
const d = map[m * 2];
|
|
232
|
+
if (d > value) b = m - 1;
|
|
233
|
+
else a = m;
|
|
234
|
+
}
|
|
235
|
+
const a2 = a * 2;
|
|
236
|
+
const d0 = map[a2 - 2];
|
|
237
|
+
const t0 = map[a2 - 1];
|
|
238
|
+
const d1 = map[a2];
|
|
239
|
+
const t1 = map[a2 + 1];
|
|
240
|
+
const d2 = map[a2 + 2];
|
|
241
|
+
const t2 = map[a2 + 3];
|
|
242
|
+
const d3 = map[a2 + 4];
|
|
243
|
+
const t3 = map[a2 + 5];
|
|
244
|
+
return clamp(catmullRom(value, d0, d1, d2, d3, t0, t1, t2, t3), 0, 1);
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
//# sourceMappingURL=ease.js.map
|
package/mjs/index.d.mts
ADDED
package/mjs/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../packages/math/src/index.ts"],"sourcesContent":["export * from './ease';\nexport * from './linalg';\nexport * from './matrix';\nexport * from './number';\nexport * from './polynomial';\nexport * from './vector';\n"],"names":[],"mappings":"AAAA,cAAc,SAAS;AACvB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,WAAW;AACzB,cAAc,eAAe;AAC7B,cAAc,WAAW"}
|
package/mjs/index.mjs
ADDED
package/mjs/linalg.d.mts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const solveLinearSystem: (A: number[][], B: number[]) => number[] | null;
|
|
2
|
+
export declare const lagrangeMinimumTo: (A: number[][], B: number[], P: number[]) => [number[][], number[]];
|
|
3
|
+
export declare const leastSquares: (A: number[][], B: number[]) => [number[][], number[]];
|
|
4
|
+
export declare const leastSquaresClosest: (A: number[][], B: number[], P: number[]) => [number[][], number[]];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../packages/math/src/linalg.ts"],"sourcesContent":["import { Matrix } from './matrix';\nimport { seq } from './number';\n\nconst {abs, min} = Math;\nconst {concat, dims, fill, jordanNormal, mul, transpose} = Matrix;\n\n// Fill an array of length n with all zeros except a single v at index i\nconst select = (n: number, i = n - 1, v = 1) => seq(n).map(j => i == j ? v : 0);\n\n// Solve linear system of equations A X = B\nexport const solveLinearSystem = (A: number[][], B: number[]) => {\n // eslint-disable-next-line\n let [n, m] = dims(A);\n\n // Diagonalize system of equations\n let G = jordanNormal(concat(A, B));\n\n // Filter out zero rows\n G = G.filter(row => row.filter(x => x).length > 0);\n n = G.length;\n\n if (n > m) {\n // Overdetermined, no solution\n return null;\n }\n\n if (!isJordanNormalDiagonal(G)) {\n // Underdetermined, no solution\n return null;\n }\n\n if (n == m) {\n // Extract exact solution\n const v = seq(m).map(i => G[i][m]);\n return v;\n }\n\n return null;\n}\n\n// Use lagrange multipliers to minimize distance to P subject to A X = B\nexport const lagrangeMinimumTo = (A: number[][], B: number[], P: number[]): [number[][], number[]] => {\n const [n, m] = dims(A);\n\n const M = concat(A, fill(n, n));\n const T = seq(m).map(i => [\n ...select(m, i, 2), ...seq(n).map(j => -A[j][i]),\n ]);\n\n const AL = [...M, ...T];\n const BL = [...B, ...P.map(v => 2*v)];\n\n return [AL, BL];\n}\n\n// Reduce overdetermined system to least squares equivalent\nexport const leastSquares = (A: number[][], B: number[]): [number[][], number[]] => {\n const AT = transpose(A);\n\n const ATA = mul(AT, A);\n const ATB = mul([B], A)[0];\n\n return [ATA, ATB];\n}\n\n// Reduce overdetermined system to least squares equivalent with attractor P\nexport const leastSquaresClosest = (A: number[][], B: number[], P: number[]): [number[][], number[]] => {\n const d = P.length;\n\n const AP = A.concat(seq(d).map(i => select(d, i)));\n const BP = B.concat(P);\n\n return leastSquares(AP, BP);\n}\n\n// Verify if matrix is jordan normal on the diagonal\nconst isJordanNormalDiagonal = (x: number[][]) => {\n const [n, m] = dims(x);\n const l = min(n, m);\n\n for (let i = 0; i < l; ++i) {\n if (abs(x[i][i] - 1) > 1e-2) return false;\n }\n return true;\n}\n"],"names":["Matrix","seq","abs","min","Math","concat","dims","fill","jordanNormal","mul","transpose","select","n","i","v","map","j","solveLinearSystem","A","B","m","G","filter","row","x","length","isJordanNormalDiagonal","lagrangeMinimumTo","P","M","T","AL","BL","leastSquares","AT","ATA","ATB","leastSquaresClosest","d","AP","BP","l"],"mappings":"AAAA,SAASA,MAAM,QAAQ,WAAW;AAClC,SAASC,GAAG,QAAQ,WAAW;AAE/B,MAAM,EAACC,GAAG,EAAEC,GAAG,EAAC,GAAGC;AACnB,MAAM,EAACC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,YAAY,EAAEC,GAAG,EAAEC,SAAS,EAAC,GAAGV;AAE3D,wEAAwE;AACxE,MAAMW,SAAS,CAACC,GAAWC,IAAID,IAAI,CAAC,EAAEE,IAAI,CAAC,GAAKb,IAAIW,GAAGG,GAAG,CAACC,CAAAA,IAAKH,KAAKG,IAAIF,IAAI;AAE7E,2CAA2C;AAC3C,OAAO,MAAMG,oBAAoB,CAACC,GAAeC;IAC/C,2BAA2B;IAC3B,IAAI,CAACP,GAAGQ,EAAE,GAAGd,KAAKY;IAElB,kCAAkC;IAClC,IAAIG,IAAIb,aAAaH,OAAOa,GAAGC;IAE/B,uBAAuB;IACvBE,IAAIA,EAAEC,MAAM,CAACC,CAAAA,MAAOA,IAAID,MAAM,CAACE,CAAAA,IAAKA,GAAGC,MAAM,GAAG;IAChDb,IAAIS,EAAEI,MAAM;IAEZ,IAAIb,IAAIQ,GAAG;QACT,8BAA8B;QAC9B,OAAO;IACT;IAEA,IAAI,CAACM,uBAAuBL,IAAI;QAC9B,+BAA+B;QAC/B,OAAO;IACT;IAEA,IAAIT,KAAKQ,GAAG;QACV,yBAAyB;QACzB,MAAMN,IAAIb,IAAImB,GAAGL,GAAG,CAACF,CAAAA,IAAKQ,CAAC,CAACR,EAAE,CAACO,EAAE;QACjC,OAAON;IACT;IAEA,OAAO;AACT,EAAC;AAED,wEAAwE;AACxE,OAAO,MAAMa,oBAAoB,CAACT,GAAeC,GAAaS;IAC5D,MAAM,CAAChB,GAAGQ,EAAE,GAAGd,KAAKY;IAEpB,MAAMW,IAAIxB,OAAOa,GAAGX,KAAKK,GAAGA;IAC5B,MAAMkB,IAAI7B,IAAImB,GAAGL,GAAG,CAACF,CAAAA,IAAK;eACrBF,OAAOS,GAAGP,GAAG;eAAOZ,IAAIW,GAAGG,GAAG,CAACC,CAAAA,IAAK,CAACE,CAAC,CAACF,EAAE,CAACH,EAAE;SAChD;IAED,MAAMkB,KAAK;WAAIF;WAAMC;KAAE;IACvB,MAAME,KAAK;WAAIb;WAAMS,EAAEb,GAAG,CAACD,CAAAA,IAAK,IAAEA;KAAG;IAErC,OAAO;QAACiB;QAAIC;KAAG;AACjB,EAAC;AAED,2DAA2D;AAC3D,OAAO,MAAMC,eAAe,CAACf,GAAeC;IAC1C,MAAMe,KAAKxB,UAAUQ;IAErB,MAAMiB,MAAM1B,IAAIyB,IAAIhB;IACpB,MAAMkB,MAAM3B,IAAI;QAACU;KAAE,EAAED,EAAE,CAAC,EAAE;IAE1B,OAAO;QAACiB;QAAKC;KAAI;AACnB,EAAC;AAED,4EAA4E;AAC5E,OAAO,MAAMC,sBAAsB,CAACnB,GAAeC,GAAaS;IAC9D,MAAMU,IAAIV,EAAEH,MAAM;IAElB,MAAMc,KAAKrB,EAAEb,MAAM,CAACJ,IAAIqC,GAAGvB,GAAG,CAACF,CAAAA,IAAKF,OAAO2B,GAAGzB;IAC9C,MAAM2B,KAAKrB,EAAEd,MAAM,CAACuB;IAEpB,OAAOK,aAAaM,IAAIC;AAC1B,EAAC;AAED,oDAAoD;AACpD,MAAMd,yBAAyB,CAACF;IAC9B,MAAM,CAACZ,GAAGQ,EAAE,GAAGd,KAAKkB;IACpB,MAAMiB,IAAItC,IAAIS,GAAGQ;IAEjB,IAAK,IAAIP,IAAI,GAAGA,IAAI4B,GAAG,EAAE5B,EAAG;QAC1B,IAAIX,IAAIsB,CAAC,CAACX,EAAE,CAACA,EAAE,GAAG,KAAK,MAAM,OAAO;IACtC;IACA,OAAO;AACT"}
|
package/mjs/linalg.mjs
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Matrix } from './matrix.mjs';
|
|
2
|
+
import { seq } from './number.mjs';
|
|
3
|
+
const { abs, min } = Math;
|
|
4
|
+
const { concat, dims, fill, jordanNormal, mul, transpose } = Matrix;
|
|
5
|
+
// Fill an array of length n with all zeros except a single v at index i
|
|
6
|
+
const select = (n, i = n - 1, v = 1)=>seq(n).map((j)=>i == j ? v : 0);
|
|
7
|
+
// Solve linear system of equations A X = B
|
|
8
|
+
export const solveLinearSystem = (A, B)=>{
|
|
9
|
+
// eslint-disable-next-line
|
|
10
|
+
let [n, m] = dims(A);
|
|
11
|
+
// Diagonalize system of equations
|
|
12
|
+
let G = jordanNormal(concat(A, B));
|
|
13
|
+
// Filter out zero rows
|
|
14
|
+
G = G.filter((row)=>row.filter((x)=>x).length > 0);
|
|
15
|
+
n = G.length;
|
|
16
|
+
if (n > m) {
|
|
17
|
+
// Overdetermined, no solution
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
if (!isJordanNormalDiagonal(G)) {
|
|
21
|
+
// Underdetermined, no solution
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
if (n == m) {
|
|
25
|
+
// Extract exact solution
|
|
26
|
+
const v = seq(m).map((i)=>G[i][m]);
|
|
27
|
+
return v;
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
};
|
|
31
|
+
// Use lagrange multipliers to minimize distance to P subject to A X = B
|
|
32
|
+
export const lagrangeMinimumTo = (A, B, P)=>{
|
|
33
|
+
const [n, m] = dims(A);
|
|
34
|
+
const M = concat(A, fill(n, n));
|
|
35
|
+
const T = seq(m).map((i)=>[
|
|
36
|
+
...select(m, i, 2),
|
|
37
|
+
...seq(n).map((j)=>-A[j][i])
|
|
38
|
+
]);
|
|
39
|
+
const AL = [
|
|
40
|
+
...M,
|
|
41
|
+
...T
|
|
42
|
+
];
|
|
43
|
+
const BL = [
|
|
44
|
+
...B,
|
|
45
|
+
...P.map((v)=>2 * v)
|
|
46
|
+
];
|
|
47
|
+
return [
|
|
48
|
+
AL,
|
|
49
|
+
BL
|
|
50
|
+
];
|
|
51
|
+
};
|
|
52
|
+
// Reduce overdetermined system to least squares equivalent
|
|
53
|
+
export const leastSquares = (A, B)=>{
|
|
54
|
+
const AT = transpose(A);
|
|
55
|
+
const ATA = mul(AT, A);
|
|
56
|
+
const ATB = mul([
|
|
57
|
+
B
|
|
58
|
+
], A)[0];
|
|
59
|
+
return [
|
|
60
|
+
ATA,
|
|
61
|
+
ATB
|
|
62
|
+
];
|
|
63
|
+
};
|
|
64
|
+
// Reduce overdetermined system to least squares equivalent with attractor P
|
|
65
|
+
export const leastSquaresClosest = (A, B, P)=>{
|
|
66
|
+
const d = P.length;
|
|
67
|
+
const AP = A.concat(seq(d).map((i)=>select(d, i)));
|
|
68
|
+
const BP = B.concat(P);
|
|
69
|
+
return leastSquares(AP, BP);
|
|
70
|
+
};
|
|
71
|
+
// Verify if matrix is jordan normal on the diagonal
|
|
72
|
+
const isJordanNormalDiagonal = (x)=>{
|
|
73
|
+
const [n, m] = dims(x);
|
|
74
|
+
const l = min(n, m);
|
|
75
|
+
for(let i = 0; i < l; ++i){
|
|
76
|
+
if (abs(x[i][i] - 1) > 1e-2) return false;
|
|
77
|
+
}
|
|
78
|
+
return true;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=linalg.js.map
|
package/mjs/matrix.d.mts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const Matrix: {
|
|
2
|
+
dims: (m: number[][]) => number[];
|
|
3
|
+
fill: (n: number, m: number, f?: (i: number, j: number) => number) => number[][];
|
|
4
|
+
identity: (n: number) => number[][];
|
|
5
|
+
add: (a: number[][], b: number[][]) => number[][];
|
|
6
|
+
sub: (a: number[][], b: number[][]) => number[][];
|
|
7
|
+
mul: (a: number[][], b: number[][]) => number[][];
|
|
8
|
+
muls: (a: number[][], s: number) => number[][];
|
|
9
|
+
tmul: (a: number[][], b: number[][]) => number[][];
|
|
10
|
+
transpose: (x: number[][]) => number[][];
|
|
11
|
+
concat: (a: number[][], b: number[] | number[][]) => number[][];
|
|
12
|
+
slice: (M: number[][], a: number, b: number, c: number, d: number) => number[][];
|
|
13
|
+
rank: (A: number[][]) => number;
|
|
14
|
+
norm: (x: number[][]) => number;
|
|
15
|
+
norm2: (x: number[][]) => number;
|
|
16
|
+
determinant: (x: number[][]) => number;
|
|
17
|
+
jordanNormal: (x: number[][]) => number[][];
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../packages/math/src/matrix.ts"],"sourcesContent":["import { sqr } from './number';\n\nconst { sqrt } = Math;\n\n// Get matrix dimensions\nconst dims = (m: number[][]) => [m.length, m[0].length];\nconst size = ([a, b]: number[]) => `${a}x${b}`;\n\n// Fill an NxM matrix using a given expression\nconst fill = (n: number, m: number, f: (i: number, j: number) => number = () => 0) => {\n const out = [];\n for (let j = 0; j < n; ++j) {\n const row = [];\n for (let i = 0; i < m; ++i) {\n row[i] = f(i, j);\n }\n out.push(row);\n }\n return out;\n}\n\n// Identity matrix\nconst identity = (n: number) => fill(n, n, (i, j) => +(i == j));\n\n// Add two matrices\nconst add = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== mb || na !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, ma, (i, j) => a[j][i] + b[j][i]);\n}\n\n// Subtract two matrices\nconst sub = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== mb || na !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, ma, (i, j) => a[j][i] - b[j][i]);\n}\n\n// Scale matrix by a scalar\nconst muls = (a: number[][], s: number) => {\n const [na, ma] = dims(a);\n return fill(na, ma, (i, j) => a[j][i] * s);\n}\n\n// Multiply two matrices\nconst mul = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, mb, (i, j) => {\n let v = 0;\n for (let k = 0; k < ma; ++k) v += a[j][k] * b[k][i];\n return v;\n });\n}\n\n// Multiply two matrices while transposing the second\nconst tmul = (a: number[][], b: number[][]) => {\n const [na, ma] = dims(a);\n const [nb, mb] = dims(b);\n if (ma !== mb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), size(dims(b)));\n throw new Error(\"Matrix error\");\n }\n return fill(na, nb, (i, j) => {\n let v = 0;\n for (let k = 0; k < ma; ++k) v += a[j][k] * b[i][k];\n return v;\n });\n}\n\n// Transpose a matrix\nconst transpose = (x: number[][]) => {\n const [n, m] = dims(x);\n return fill(m, n, (i, j) => x[i][j]);\n}\n\n// Concatenate two matrices horizontally\nconst concat = (a: number[][], b: number[] | number[][]) => {\n const [na] = dims(a);\n const nb = b.length;\n if (na !== nb) {\n console.error(\"Incompatible matrices\", a, b, size(dims(a)), nb);\n throw \"Matrix error\";\n }\n return a.map((_,i) => a[i].concat(b[i]));\n}\n\n// Extract a submatrix from index (a,b) to (c,d) exclusive\nconst slice = (M: number[][], a: number, b: number, c: number, d: number) => {\n const [n, m] = dims(M);\n\n a = Math.min(a, m);\n b = Math.min(b, n);\n\n if (c === undefined) c = m;\n if (d === undefined) d = n;\n\n c = Math.max(a, Math.min(m, c < 0 ? m + c : c));\n d = Math.max(b, Math.min(n, d < 0 ? n + d : d));\n\n return fill(d - b, c - a, (i, j) => M[j][i]);\n}\n\n// Get matrix rank\nconst rank = (A: number[][]) => {\n const G = jordanNormal(A);\n return diagonalRank(G);\n}\n\n// Calculate frobenius norm squared\nconst norm2 = (x: number[][]) => {\n const [n, m] = dims(x);\n\n let v = 0;\n for (let j = 0; j < m; ++j) {\n for (let i = 0; i < n; ++i) {\n v += sqr(x[j][i]);\n }\n }\n return v;\n};\n\n// Calculate frobenius norm\nconst norm = (x: number[][]) => sqrt(norm2(x));\n\n// Swap a later row to make (i,j) non-zero\nconst swapZero = (x: number[][], i: number, j: number) => {\n const [n] = dims(x);\n for (let k = j + 1; k < n; ++k) {\n if (x[k][i] !== 0) {\n [x[k], x[j]] = [x[j], x[k]];\n return true;\n }\n }\n return false;\n}\n\n// In-place vector ops to spare the GC\n\n// Scale a row by a constant\nconst scaleRow = (a: number[], s: number) => {\n const {length} = a;\n for (let i = 0; i < length; ++i) a[i] *= s;\n}\n\n// Multiply and add one row to another\nconst madRow = (a: number[], b: number[], s: number) => {\n const {length} = a;\n for (let i = 0; i < length; ++i) a[i] += b[i] * s;\n}\n\n// Get determinant\nconst determinant = (x: number[][]) => {\n const [n, m] = dims(x);\n let offset = 0;\n\n x = structuredClone(x);\n\n let det = 1;\n\n for (let i = 0; i < Math.min(n, m); ++i) {\n // Find next pivot element\n const pivot = x[i][i + offset];\n\n if (pivot == 0) {\n // Unsuitable, find other row to swap with\n if (!swapZero(x, i + offset, i)) {\n\n // All zeros, move one column over until out of bounds\n if (offset++ >= (m - n)) {\n return 0;\n }\n }\n\n // Repeat iteration\n i--;\n continue;\n }\n\n // Scale pivot row\n scaleRow(x[i], 1 / pivot);\n\n det *= pivot;\n\n // Subtract from other rows\n for (let j = 0; j < n; ++j) if (i !== j) {\n const pivot = x[j][i + offset];\n madRow(x[j], x[i], -pivot);\n }\n }\n\n return det;\n}\n\n// Convert matrix into jordan normal form if possible\nconst jordanNormal = (x: number[][]) => {\n const [n, m] = dims(x);\n let offset = 0;\n\n // Don't modify argument\n x = structuredClone(x);\n\n for (let i = 0; i < Math.min(n, m); ++i) {\n // Find next pivot element\n const pivot = x[i][i + offset];\n\n if (pivot == 0) {\n // Unsuitable, find other row to swap with\n if (!swapZero(x, i + offset, i)) {\n\n // All zeros, move one column over until out of bounds\n if (offset++ >= (m - n)) {\n return x;\n }\n }\n\n // Repeat iteration\n i--;\n continue;\n }\n\n // Scale pivot row\n scaleRow(x[i], 1 / pivot);\n\n // Subtract from other rows\n for (let j = 0; j < n; ++j) if (i !== j) {\n const pivot = x[j][i + offset];\n madRow(x[j], x[i], -pivot);\n }\n }\n return x;\n}\n\n// Verify if matrix has uninterrupted non-zero diagonal\nconst diagonalRank = (x: number[][]) => {\n const [n, m] = dims(x);\n const l = Math.min(n, m);\n\n let i = 0;\n for (; i < l; ++i) {\n if (x[i][i] == 0) break;\n }\n return i;\n}\n\nexport const Matrix = {\n dims,\n fill,\n identity,\n add,\n sub,\n mul,\n muls,\n tmul,\n transpose,\n concat,\n slice,\n rank,\n norm,\n norm2,\n determinant,\n jordanNormal,\n};\n"],"names":["sqr","sqrt","Math","dims","m","length","size","a","b","fill","n","f","out","j","row","i","push","identity","add","na","ma","nb","mb","console","error","Error","sub","muls","s","mul","v","k","tmul","transpose","x","concat","map","_","slice","M","c","d","min","undefined","max","rank","A","G","jordanNormal","diagonalRank","norm2","norm","swapZero","scaleRow","madRow","determinant","offset","structuredClone","det","pivot","l","Matrix"],"mappings":"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"}
|