@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
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decimal — an arbitrary-precision decimal number `digits × 10^exponent`,
|
|
3
|
+
* backed by `bigint`. Addition/subtraction/multiplication are exact (unlike
|
|
4
|
+
* `number`, which drifts on values like `0.1 + 0.2`); division is inherently
|
|
5
|
+
* approximate and rounds to a configurable number of significant digits — an
|
|
6
|
+
* honest limitation analogous to floats, just with configurable precision
|
|
7
|
+
* instead of a fixed 53 bits.
|
|
8
|
+
*
|
|
9
|
+
* Unlike {@link Rational}, no canonical/normalized form is maintained —
|
|
10
|
+
* equality and comparison work by aligning exponents rather than requiring
|
|
11
|
+
* reduced digits, which keeps arithmetic simple at the cost of `toString()`
|
|
12
|
+
* not collapsing trailing zeros introduced by intermediate computations.
|
|
13
|
+
*/
|
|
14
|
+
export declare class Decimal {
|
|
15
|
+
static readonly DEFAULT_PRECISION = 20;
|
|
16
|
+
readonly digits: bigint;
|
|
17
|
+
readonly exponent: number;
|
|
18
|
+
static readonly Zero: Decimal;
|
|
19
|
+
static readonly One: Decimal;
|
|
20
|
+
constructor(digits?: bigint, exponent?: number);
|
|
21
|
+
static fromString(value: string): Decimal;
|
|
22
|
+
static from(value: Decimal | bigint | number | string): Decimal;
|
|
23
|
+
/** Rescale `a` and `b` to a shared exponent (the smaller of the two). */
|
|
24
|
+
private static align;
|
|
25
|
+
add(other: Decimal): Decimal;
|
|
26
|
+
subtract(other: Decimal): Decimal;
|
|
27
|
+
multiply(other: Decimal): Decimal;
|
|
28
|
+
/** Division is approximate: the result is rounded to `precision` significant digits. */
|
|
29
|
+
divide(other: Decimal, precision?: number): Decimal;
|
|
30
|
+
negate(): Decimal;
|
|
31
|
+
abs(): Decimal;
|
|
32
|
+
equals(other: Decimal): boolean;
|
|
33
|
+
/** -1, 0 or 1 depending on ordering against `other`. */
|
|
34
|
+
compare(other: Decimal): number;
|
|
35
|
+
lessThan(other: Decimal): boolean;
|
|
36
|
+
isZero(): boolean;
|
|
37
|
+
toNumber(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Renders in plain decimal notation. Trailing fractional zeros are trimmed
|
|
40
|
+
* for readability — this is purely presentational; no canonical form is
|
|
41
|
+
* maintained internally, so `digits`/`exponent` are untouched.
|
|
42
|
+
*/
|
|
43
|
+
toString(): string;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=Decimal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Decimal.d.ts","sourceRoot":"","sources":["../src/Decimal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkBH,qBAAa,OAAO;IAClB,MAAM,CAAC,QAAQ,CAAC,iBAAiB,MAAM;IAEvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAsB;IAC1C,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAsB;gBAE7B,MAAM,GAAE,MAAW,EAAE,QAAQ,SAAI;IAK7C,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASzC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;IAU/D,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,KAAK;IAOpB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAK5B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAKjC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIjC,wFAAwF;IACxF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,SAA4B,GAAG,OAAO;IAStE,MAAM,IAAI,OAAO;IAIjB,GAAG,IAAI,OAAO;IAId,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAK/B,wDAAwD;IACxD,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAK/B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIjC,MAAM,IAAI,OAAO;IAIjB,QAAQ,IAAI,MAAM;IAIlB;;;;OAIG;IACH,QAAQ,IAAI,MAAM;CAanB"}
|
package/dist/Decimal.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decimal — an arbitrary-precision decimal number `digits × 10^exponent`,
|
|
3
|
+
* backed by `bigint`. Addition/subtraction/multiplication are exact (unlike
|
|
4
|
+
* `number`, which drifts on values like `0.1 + 0.2`); division is inherently
|
|
5
|
+
* approximate and rounds to a configurable number of significant digits — an
|
|
6
|
+
* honest limitation analogous to floats, just with configurable precision
|
|
7
|
+
* instead of a fixed 53 bits.
|
|
8
|
+
*
|
|
9
|
+
* Unlike {@link Rational}, no canonical/normalized form is maintained —
|
|
10
|
+
* equality and comparison work by aligning exponents rather than requiring
|
|
11
|
+
* reduced digits, which keeps arithmetic simple at the cost of `toString()`
|
|
12
|
+
* not collapsing trailing zeros introduced by intermediate computations.
|
|
13
|
+
*/
|
|
14
|
+
const digitCount = (n) => (n < 0n ? -n : n).toString().length;
|
|
15
|
+
/** Round `num / den` to the nearest integer (half away from zero), for any sign combination. */
|
|
16
|
+
function divRound(num, den) {
|
|
17
|
+
const q = num / den;
|
|
18
|
+
const r = num % den;
|
|
19
|
+
if (r === 0n)
|
|
20
|
+
return q;
|
|
21
|
+
const doubledR = (r < 0n ? -r : r) * 2n;
|
|
22
|
+
const absDen = den < 0n ? -den : den;
|
|
23
|
+
if (doubledR >= absDen) {
|
|
24
|
+
const sameSign = num < 0n === den < 0n;
|
|
25
|
+
return sameSign ? q + 1n : q - 1n;
|
|
26
|
+
}
|
|
27
|
+
return q;
|
|
28
|
+
}
|
|
29
|
+
export class Decimal {
|
|
30
|
+
static DEFAULT_PRECISION = 20;
|
|
31
|
+
digits;
|
|
32
|
+
exponent;
|
|
33
|
+
static Zero = new Decimal(0n, 0);
|
|
34
|
+
static One = new Decimal(1n, 0);
|
|
35
|
+
constructor(digits = 0n, exponent = 0) {
|
|
36
|
+
this.digits = digits;
|
|
37
|
+
this.exponent = exponent;
|
|
38
|
+
}
|
|
39
|
+
static fromString(value) {
|
|
40
|
+
const match = /^\s*([+-]?)(\d+)(?:\.(\d+))?(?:[eE]([+-]?\d+))?\s*$/.exec(value);
|
|
41
|
+
if (!match)
|
|
42
|
+
throw new Error(`Invalid Decimal string: ${value}`);
|
|
43
|
+
const [, sign, intPart, fracPart = "", expPart] = match;
|
|
44
|
+
const digits = BigInt((sign === "-" ? "-" : "") + intPart + fracPart);
|
|
45
|
+
const exponent = -fracPart.length + (expPart ? Number(expPart) : 0);
|
|
46
|
+
return new Decimal(digits, exponent);
|
|
47
|
+
}
|
|
48
|
+
static from(value) {
|
|
49
|
+
if (value instanceof Decimal)
|
|
50
|
+
return value;
|
|
51
|
+
if (typeof value === "bigint")
|
|
52
|
+
return new Decimal(value, 0);
|
|
53
|
+
if (typeof value === "number") {
|
|
54
|
+
if (!Number.isFinite(value))
|
|
55
|
+
throw new Error("Cannot make a Decimal from a non-finite number.");
|
|
56
|
+
return Decimal.fromString(value.toString());
|
|
57
|
+
}
|
|
58
|
+
return Decimal.fromString(value);
|
|
59
|
+
}
|
|
60
|
+
/** Rescale `a` and `b` to a shared exponent (the smaller of the two). */
|
|
61
|
+
static align(a, b) {
|
|
62
|
+
const exponent = Math.min(a.exponent, b.exponent);
|
|
63
|
+
const ad = a.digits * 10n ** BigInt(a.exponent - exponent);
|
|
64
|
+
const bd = b.digits * 10n ** BigInt(b.exponent - exponent);
|
|
65
|
+
return { ad, bd, exponent };
|
|
66
|
+
}
|
|
67
|
+
add(other) {
|
|
68
|
+
const { ad, bd, exponent } = Decimal.align(this, other);
|
|
69
|
+
return new Decimal(ad + bd, exponent);
|
|
70
|
+
}
|
|
71
|
+
subtract(other) {
|
|
72
|
+
const { ad, bd, exponent } = Decimal.align(this, other);
|
|
73
|
+
return new Decimal(ad - bd, exponent);
|
|
74
|
+
}
|
|
75
|
+
multiply(other) {
|
|
76
|
+
return new Decimal(this.digits * other.digits, this.exponent + other.exponent);
|
|
77
|
+
}
|
|
78
|
+
/** Division is approximate: the result is rounded to `precision` significant digits. */
|
|
79
|
+
divide(other, precision = Decimal.DEFAULT_PRECISION) {
|
|
80
|
+
if (other.digits === 0n)
|
|
81
|
+
throw new Error("Division by zero Decimal.");
|
|
82
|
+
if (this.digits === 0n)
|
|
83
|
+
return Decimal.Zero;
|
|
84
|
+
const shift = Math.max(0, precision - digitCount(this.digits) + digitCount(other.digits));
|
|
85
|
+
const scaledNumerator = this.digits * 10n ** BigInt(shift);
|
|
86
|
+
const quotient = divRound(scaledNumerator, other.digits);
|
|
87
|
+
return new Decimal(quotient, this.exponent - other.exponent - shift);
|
|
88
|
+
}
|
|
89
|
+
negate() {
|
|
90
|
+
return new Decimal(-this.digits, this.exponent);
|
|
91
|
+
}
|
|
92
|
+
abs() {
|
|
93
|
+
return this.digits < 0n ? this.negate() : this;
|
|
94
|
+
}
|
|
95
|
+
equals(other) {
|
|
96
|
+
const { ad, bd } = Decimal.align(this, other);
|
|
97
|
+
return ad === bd;
|
|
98
|
+
}
|
|
99
|
+
/** -1, 0 or 1 depending on ordering against `other`. */
|
|
100
|
+
compare(other) {
|
|
101
|
+
const { ad, bd } = Decimal.align(this, other);
|
|
102
|
+
return ad < bd ? -1 : ad > bd ? 1 : 0;
|
|
103
|
+
}
|
|
104
|
+
lessThan(other) {
|
|
105
|
+
return this.compare(other) < 0;
|
|
106
|
+
}
|
|
107
|
+
isZero() {
|
|
108
|
+
return this.digits === 0n;
|
|
109
|
+
}
|
|
110
|
+
toNumber() {
|
|
111
|
+
return Number(this.digits) * 10 ** this.exponent;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Renders in plain decimal notation. Trailing fractional zeros are trimmed
|
|
115
|
+
* for readability — this is purely presentational; no canonical form is
|
|
116
|
+
* maintained internally, so `digits`/`exponent` are untouched.
|
|
117
|
+
*/
|
|
118
|
+
toString() {
|
|
119
|
+
if (this.digits === 0n)
|
|
120
|
+
return "0";
|
|
121
|
+
const negative = this.digits < 0n;
|
|
122
|
+
let s = (negative ? -this.digits : this.digits).toString();
|
|
123
|
+
if (this.exponent >= 0) {
|
|
124
|
+
s = s + "0".repeat(this.exponent);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
const pointPos = s.length + this.exponent;
|
|
128
|
+
s = pointPos <= 0 ? `0.${"0".repeat(-pointPos)}${s}` : `${s.slice(0, pointPos)}.${s.slice(pointPos)}`;
|
|
129
|
+
if (s.includes("."))
|
|
130
|
+
s = s.replace(/0+$/, "").replace(/\.$/, "");
|
|
131
|
+
}
|
|
132
|
+
return negative ? `-${s}` : s;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=Decimal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Decimal.js","sourceRoot":"","sources":["../src/Decimal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributions — common probability distributions (continuous and discrete),
|
|
3
|
+
* each exposing `pdf`/`pmf`, `cdf`, `mean`, `variance` and a random `sample`,
|
|
4
|
+
* plus a small suite of {@link HypothesisTests}. CDFs use the exact incomplete
|
|
5
|
+
* gamma/beta functions from {@link SpecialFunctions} rather than numeric
|
|
6
|
+
* integration, so they are accurate in the tails.
|
|
7
|
+
*
|
|
8
|
+
* Every factory takes an optional trailing `rng: () => number` (default
|
|
9
|
+
* `Math.random`), threaded through to every nested distribution it samples
|
|
10
|
+
* from — pass a seeded generator to make `sample()` deterministic in tests.
|
|
11
|
+
*/
|
|
12
|
+
export interface ContinuousDistribution {
|
|
13
|
+
pdf(x: number): number;
|
|
14
|
+
cdf(x: number): number;
|
|
15
|
+
mean(): number;
|
|
16
|
+
variance(): number;
|
|
17
|
+
sample(): number;
|
|
18
|
+
}
|
|
19
|
+
export interface DiscreteDistribution {
|
|
20
|
+
pmf(k: number): number;
|
|
21
|
+
cdf(k: number): number;
|
|
22
|
+
mean(): number;
|
|
23
|
+
variance(): number;
|
|
24
|
+
sample(): number;
|
|
25
|
+
}
|
|
26
|
+
export declare class Distributions {
|
|
27
|
+
/** The inverse standard-normal CDF (quantile / probit function). */
|
|
28
|
+
static normalQuantile(p: number, mean?: number, sd?: number): number;
|
|
29
|
+
static normal(mean?: number, sd?: number, rng?: () => number): ContinuousDistribution;
|
|
30
|
+
static exponential(rate?: number, rng?: () => number): ContinuousDistribution;
|
|
31
|
+
static uniform(a?: number, b?: number, rng?: () => number): ContinuousDistribution;
|
|
32
|
+
static gamma(shape: number, scale?: number, rng?: () => number): ContinuousDistribution;
|
|
33
|
+
static chiSquare(df: number, rng?: () => number): ContinuousDistribution;
|
|
34
|
+
static studentT(df: number, rng?: () => number): ContinuousDistribution;
|
|
35
|
+
static binomial(n: number, p: number, rng?: () => number): DiscreteDistribution;
|
|
36
|
+
static poisson(lambda: number, rng?: () => number): DiscreteDistribution;
|
|
37
|
+
/** Marsaglia-Tsang gamma sampler (shape ≥ 0). */
|
|
38
|
+
private static sampleGamma;
|
|
39
|
+
}
|
|
40
|
+
export interface TestResult {
|
|
41
|
+
statistic: number;
|
|
42
|
+
df: number;
|
|
43
|
+
pValue: number;
|
|
44
|
+
}
|
|
45
|
+
export declare class HypothesisTests {
|
|
46
|
+
/** One-sample two-tailed Student t-test against a hypothesised mean `mu0`. */
|
|
47
|
+
static tTestOneSample(sample: number[], mu0?: number): TestResult;
|
|
48
|
+
/** Welch's two-sample t-test (unequal variances). */
|
|
49
|
+
static tTestTwoSample(a: number[], b: number[]): TestResult;
|
|
50
|
+
/** Pearson chi-square goodness-of-fit test. */
|
|
51
|
+
static chiSquareGoodnessOfFit(observed: number[], expected: number[]): TestResult;
|
|
52
|
+
/** Confidence interval for the mean of a sample at the given level (t-based). */
|
|
53
|
+
static confidenceIntervalMean(sample: number[], level?: number): [number, number];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=Distributions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Distributions.d.ts","sourceRoot":"","sources":["../src/Distributions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,IAAI,MAAM,CAAC;IACf,QAAQ,IAAI,MAAM,CAAC;IACnB,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,IAAI,MAAM,CAAC;IACf,QAAQ,IAAI,MAAM,CAAC;IACnB,MAAM,IAAI,MAAM,CAAC;CAClB;AA0CD,qBAAa,aAAa;IACxB,oEAAoE;IACpE,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,SAAI,EAAE,EAAE,SAAI,GAAG,MAAM;IAI1D,MAAM,CAAC,MAAM,CAAC,IAAI,SAAI,EAAE,EAAE,SAAI,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,sBAAsB;IAUxF,MAAM,CAAC,WAAW,CAAC,IAAI,SAAI,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,sBAAsB;IAUrF,MAAM,CAAC,OAAO,CAAC,CAAC,SAAI,EAAE,CAAC,SAAI,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,sBAAsB;IAUrF,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,sBAAsB;IAU/F,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,sBAAsB;IAKrF,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,sBAAsB;IAkBpF,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,oBAAoB;IAuB5F,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,MAAoB,GAAG,oBAAoB;IAmBrF,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,WAAW;CAiB3B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IAC1B,8EAA8E;IAC9E,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,SAAI,GAAG,UAAU;IAW5D,qDAAqD;IACrD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,UAAU;IAc3D,+CAA+C;IAC/C,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU;IAOjF,iFAAiF;IACjF,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,SAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAShF"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { SpecialFunctions as SF } from "./SpecialFunctions.js";
|
|
2
|
+
/** The inverse standard-normal CDF (Acklam's rational approximation). */
|
|
3
|
+
function normInv(p) {
|
|
4
|
+
if (p <= 0)
|
|
5
|
+
return Number.NEGATIVE_INFINITY;
|
|
6
|
+
if (p >= 1)
|
|
7
|
+
return Number.POSITIVE_INFINITY;
|
|
8
|
+
const a = [
|
|
9
|
+
-3.969683028665376e1, 2.209460984245205e2, -2.759285104469687e2, 1.38357751867269e2, -3.066479806614716e1,
|
|
10
|
+
2.506628277459239,
|
|
11
|
+
];
|
|
12
|
+
const b = [
|
|
13
|
+
-5.447609879822406e1, 1.615858368580409e2, -1.556989798598866e2, 6.680131188771972e1, -1.328068155288572e1,
|
|
14
|
+
];
|
|
15
|
+
const c = [
|
|
16
|
+
-7.784894002430293e-3, -3.223964580411365e-1, -2.400758277161838, -2.549732539343734, 4.374664141464968,
|
|
17
|
+
2.938163982698783,
|
|
18
|
+
];
|
|
19
|
+
const d = [7.784695709041462e-3, 3.224671290700398e-1, 2.445134137142996, 3.754408661907416];
|
|
20
|
+
const plow = 0.02425;
|
|
21
|
+
const phigh = 1 - plow;
|
|
22
|
+
if (p < plow) {
|
|
23
|
+
const q = Math.sqrt(-2 * Math.log(p));
|
|
24
|
+
return ((((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) /
|
|
25
|
+
((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1));
|
|
26
|
+
}
|
|
27
|
+
if (p <= phigh) {
|
|
28
|
+
const q = p - 0.5;
|
|
29
|
+
const r = q * q;
|
|
30
|
+
return (((((((a[0] * r + a[1]) * r + a[2]) * r + a[3]) * r + a[4]) * r + a[5]) * q) /
|
|
31
|
+
(((((b[0] * r + b[1]) * r + b[2]) * r + b[3]) * r + b[4]) * r + 1));
|
|
32
|
+
}
|
|
33
|
+
const q = Math.sqrt(-2 * Math.log(1 - p));
|
|
34
|
+
return (-(((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) /
|
|
35
|
+
((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1));
|
|
36
|
+
}
|
|
37
|
+
export class Distributions {
|
|
38
|
+
/** The inverse standard-normal CDF (quantile / probit function). */
|
|
39
|
+
static normalQuantile(p, mean = 0, sd = 1) {
|
|
40
|
+
return mean + sd * normInv(p);
|
|
41
|
+
}
|
|
42
|
+
static normal(mean = 0, sd = 1, rng = Math.random) {
|
|
43
|
+
return {
|
|
44
|
+
pdf: (x) => Math.exp(-0.5 * ((x - mean) / sd) ** 2) / (sd * Math.sqrt(2 * Math.PI)),
|
|
45
|
+
cdf: (x) => 0.5 * SF.erfc(-(x - mean) / (sd * Math.SQRT2)),
|
|
46
|
+
mean: () => mean,
|
|
47
|
+
variance: () => sd * sd,
|
|
48
|
+
sample: () => mean + sd * Math.sqrt(-2 * Math.log(1 - rng())) * Math.cos(2 * Math.PI * rng()),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
static exponential(rate = 1, rng = Math.random) {
|
|
52
|
+
return {
|
|
53
|
+
pdf: (x) => (x < 0 ? 0 : rate * Math.exp(-rate * x)),
|
|
54
|
+
cdf: (x) => (x < 0 ? 0 : 1 - Math.exp(-rate * x)),
|
|
55
|
+
mean: () => 1 / rate,
|
|
56
|
+
variance: () => 1 / (rate * rate),
|
|
57
|
+
sample: () => -Math.log(1 - rng()) / rate,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
static uniform(a = 0, b = 1, rng = Math.random) {
|
|
61
|
+
return {
|
|
62
|
+
pdf: (x) => (x >= a && x <= b ? 1 / (b - a) : 0),
|
|
63
|
+
cdf: (x) => (x < a ? 0 : x > b ? 1 : (x - a) / (b - a)),
|
|
64
|
+
mean: () => (a + b) / 2,
|
|
65
|
+
variance: () => (b - a) ** 2 / 12,
|
|
66
|
+
sample: () => a + rng() * (b - a),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
static gamma(shape, scale = 1, rng = Math.random) {
|
|
70
|
+
return {
|
|
71
|
+
pdf: (x) => (x <= 0 ? 0 : (x ** (shape - 1) * Math.exp(-x / scale)) / (SF.gamma(shape) * scale ** shape)),
|
|
72
|
+
cdf: (x) => (x <= 0 ? 0 : SF.regularizedGammaP(shape, x / scale)),
|
|
73
|
+
mean: () => shape * scale,
|
|
74
|
+
variance: () => shape * scale * scale,
|
|
75
|
+
sample: () => Distributions.sampleGamma(shape, rng) * scale,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
static chiSquare(df, rng = Math.random) {
|
|
79
|
+
const g = Distributions.gamma(df / 2, 2, rng);
|
|
80
|
+
return { ...g, mean: () => df, variance: () => 2 * df };
|
|
81
|
+
}
|
|
82
|
+
static studentT(df, rng = Math.random) {
|
|
83
|
+
const c = SF.gamma((df + 1) / 2) / (Math.sqrt(df * Math.PI) * SF.gamma(df / 2));
|
|
84
|
+
return {
|
|
85
|
+
pdf: (x) => c * (1 + (x * x) / df) ** (-(df + 1) / 2),
|
|
86
|
+
cdf: (x) => {
|
|
87
|
+
const ib = SF.regularizedIncompleteBeta(df / (df + x * x), df / 2, 0.5);
|
|
88
|
+
return x >= 0 ? 1 - 0.5 * ib : 0.5 * ib;
|
|
89
|
+
},
|
|
90
|
+
mean: () => (df > 1 ? 0 : Number.NaN),
|
|
91
|
+
variance: () => (df > 2 ? df / (df - 2) : Number.POSITIVE_INFINITY),
|
|
92
|
+
sample: () => {
|
|
93
|
+
const z = Distributions.normal(0, 1, rng).sample();
|
|
94
|
+
const chi = Distributions.chiSquare(df, rng).sample();
|
|
95
|
+
return z / Math.sqrt(chi / df);
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
static binomial(n, p, rng = Math.random) {
|
|
100
|
+
const logChoose = (k) => SF.lnGamma(n + 1) - SF.lnGamma(k + 1) - SF.lnGamma(n - k + 1);
|
|
101
|
+
const pmf = (k) => k < 0 || k > n || !Number.isInteger(k) ? 0 : Math.exp(logChoose(k) + k * Math.log(p) + (n - k) * Math.log(1 - p));
|
|
102
|
+
return {
|
|
103
|
+
pmf,
|
|
104
|
+
cdf: (k) => {
|
|
105
|
+
// Reuse the single pmf closure above instead of rebuilding a whole new
|
|
106
|
+
// binomial distribution (and its logChoose closure) on every step.
|
|
107
|
+
let s = 0;
|
|
108
|
+
for (let i = 0; i <= Math.floor(k); i++)
|
|
109
|
+
s += pmf(i);
|
|
110
|
+
return Math.min(1, s);
|
|
111
|
+
},
|
|
112
|
+
mean: () => n * p,
|
|
113
|
+
variance: () => n * p * (1 - p),
|
|
114
|
+
sample: () => {
|
|
115
|
+
let count = 0;
|
|
116
|
+
for (let i = 0; i < n; i++)
|
|
117
|
+
if (rng() < p)
|
|
118
|
+
count++;
|
|
119
|
+
return count;
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
static poisson(lambda, rng = Math.random) {
|
|
124
|
+
return {
|
|
125
|
+
pmf: (k) => (k < 0 || !Number.isInteger(k) ? 0 : Math.exp(k * Math.log(lambda) - lambda - SF.lnGamma(k + 1))),
|
|
126
|
+
cdf: (k) => (k < 0 ? 0 : SF.regularizedGammaQ(Math.floor(k) + 1, lambda)),
|
|
127
|
+
mean: () => lambda,
|
|
128
|
+
variance: () => lambda,
|
|
129
|
+
sample: () => {
|
|
130
|
+
const L = Math.exp(-lambda);
|
|
131
|
+
let k = 0;
|
|
132
|
+
let prod = 1;
|
|
133
|
+
do {
|
|
134
|
+
k++;
|
|
135
|
+
prod *= rng();
|
|
136
|
+
} while (prod > L);
|
|
137
|
+
return k - 1;
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** Marsaglia-Tsang gamma sampler (shape ≥ 0). */
|
|
142
|
+
static sampleGamma(shape, rng = Math.random) {
|
|
143
|
+
if (shape < 1)
|
|
144
|
+
return Distributions.sampleGamma(shape + 1, rng) * rng() ** (1 / shape);
|
|
145
|
+
const d = shape - 1 / 3;
|
|
146
|
+
const c = 1 / Math.sqrt(9 * d);
|
|
147
|
+
for (;;) {
|
|
148
|
+
let x;
|
|
149
|
+
let v;
|
|
150
|
+
do {
|
|
151
|
+
x = Distributions.normal(0, 1, rng).sample();
|
|
152
|
+
v = 1 + c * x;
|
|
153
|
+
} while (v <= 0);
|
|
154
|
+
v = v * v * v;
|
|
155
|
+
const u = rng();
|
|
156
|
+
if (u < 1 - 0.0331 * x ** 4)
|
|
157
|
+
return d * v;
|
|
158
|
+
if (Math.log(u) < 0.5 * x * x + d * (1 - v + Math.log(v)))
|
|
159
|
+
return d * v;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export class HypothesisTests {
|
|
164
|
+
/** One-sample two-tailed Student t-test against a hypothesised mean `mu0`. */
|
|
165
|
+
static tTestOneSample(sample, mu0 = 0) {
|
|
166
|
+
const n = sample.length;
|
|
167
|
+
const mean = sample.reduce((a, b) => a + b, 0) / n;
|
|
168
|
+
const variance = sample.reduce((acc, x) => acc + (x - mean) ** 2, 0) / (n - 1);
|
|
169
|
+
const se = Math.sqrt(variance / n);
|
|
170
|
+
const t = (mean - mu0) / se;
|
|
171
|
+
const df = n - 1;
|
|
172
|
+
const p = 2 * (1 - Distributions.studentT(df).cdf(Math.abs(t)));
|
|
173
|
+
return { statistic: t, df, pValue: p };
|
|
174
|
+
}
|
|
175
|
+
/** Welch's two-sample t-test (unequal variances). */
|
|
176
|
+
static tTestTwoSample(a, b) {
|
|
177
|
+
const na = a.length;
|
|
178
|
+
const nb = b.length;
|
|
179
|
+
const ma = a.reduce((s, x) => s + x, 0) / na;
|
|
180
|
+
const mb = b.reduce((s, x) => s + x, 0) / nb;
|
|
181
|
+
const va = a.reduce((s, x) => s + (x - ma) ** 2, 0) / (na - 1);
|
|
182
|
+
const vb = b.reduce((s, x) => s + (x - mb) ** 2, 0) / (nb - 1);
|
|
183
|
+
const se = Math.sqrt(va / na + vb / nb);
|
|
184
|
+
const t = (ma - mb) / se;
|
|
185
|
+
const df = (va / na + vb / nb) ** 2 / ((va / na) ** 2 / (na - 1) + (vb / nb) ** 2 / (nb - 1));
|
|
186
|
+
const p = 2 * (1 - Distributions.studentT(df).cdf(Math.abs(t)));
|
|
187
|
+
return { statistic: t, df, pValue: p };
|
|
188
|
+
}
|
|
189
|
+
/** Pearson chi-square goodness-of-fit test. */
|
|
190
|
+
static chiSquareGoodnessOfFit(observed, expected) {
|
|
191
|
+
const chi2 = observed.reduce((s, o, i) => s + (o - expected[i]) ** 2 / expected[i], 0);
|
|
192
|
+
const df = observed.length - 1;
|
|
193
|
+
const p = 1 - Distributions.chiSquare(df).cdf(chi2);
|
|
194
|
+
return { statistic: chi2, df, pValue: p };
|
|
195
|
+
}
|
|
196
|
+
/** Confidence interval for the mean of a sample at the given level (t-based). */
|
|
197
|
+
static confidenceIntervalMean(sample, level = 0.95) {
|
|
198
|
+
const n = sample.length;
|
|
199
|
+
const m = sample.reduce((a, b) => a + b, 0) / n;
|
|
200
|
+
const variance = sample.reduce((acc, x) => acc + (x - m) ** 2, 0) / (n - 1);
|
|
201
|
+
const se = Math.sqrt(variance / n);
|
|
202
|
+
const alpha = 1 - level;
|
|
203
|
+
const tCrit = tQuantile(1 - alpha / 2, n - 1);
|
|
204
|
+
return [m - tCrit * se, m + tCrit * se];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// -- small internal helpers -------------------------------------------------
|
|
208
|
+
/** Quantile of Student-t via bisection on its CDF. */
|
|
209
|
+
function tQuantile(p, df) {
|
|
210
|
+
const dist = Distributions.studentT(df);
|
|
211
|
+
let lo = -100;
|
|
212
|
+
let hi = 100;
|
|
213
|
+
for (let i = 0; i < 200; i++) {
|
|
214
|
+
const mid = (lo + hi) / 2;
|
|
215
|
+
if (dist.cdf(mid) < p)
|
|
216
|
+
lo = mid;
|
|
217
|
+
else
|
|
218
|
+
hi = mid;
|
|
219
|
+
}
|
|
220
|
+
return (lo + hi) / 2;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=Distributions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Distributions.js","sourceRoot":"","sources":["../src/Distributions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DualNumber — a number of the form `value + deriv·ε` where `ε² = 0`. Evaluating
|
|
3
|
+
* a function on a dual number carries its derivative along automatically (the
|
|
4
|
+
* `ε` component), giving exact forward-mode automatic differentiation — more
|
|
5
|
+
* accurate than the finite differences in {@link RealMath.differentiateN}.
|
|
6
|
+
*
|
|
7
|
+
* It is also a commutative ring (a valid {@link Structure}).
|
|
8
|
+
*/
|
|
9
|
+
export declare class DualNumber {
|
|
10
|
+
readonly value: number;
|
|
11
|
+
readonly deriv: number;
|
|
12
|
+
constructor(value?: number, deriv?: number);
|
|
13
|
+
/** A constant (zero derivative). */
|
|
14
|
+
static constant(x: number): DualNumber;
|
|
15
|
+
/** An independent variable at `x` (unit derivative). */
|
|
16
|
+
static variable(x: number): DualNumber;
|
|
17
|
+
private static lift;
|
|
18
|
+
add(o: DualNumber | number): DualNumber;
|
|
19
|
+
subtract(o: DualNumber | number): DualNumber;
|
|
20
|
+
multiply(o: DualNumber | number): DualNumber;
|
|
21
|
+
divide(o: DualNumber | number): DualNumber;
|
|
22
|
+
negate(): DualNumber;
|
|
23
|
+
/** Raise to a constant power (chain rule). */
|
|
24
|
+
pow(n: number): DualNumber;
|
|
25
|
+
static sin(x: DualNumber): DualNumber;
|
|
26
|
+
static cos(x: DualNumber): DualNumber;
|
|
27
|
+
static tan(x: DualNumber): DualNumber;
|
|
28
|
+
static exp(x: DualNumber): DualNumber;
|
|
29
|
+
static log(x: DualNumber): DualNumber;
|
|
30
|
+
static sqrt(x: DualNumber): DualNumber;
|
|
31
|
+
/** The derivative of `f` at `x`, evaluated exactly via dual numbers. */
|
|
32
|
+
static derivative(f: (x: DualNumber) => DualNumber, x: number): number;
|
|
33
|
+
/** The value and derivative of `f` at `x` together. */
|
|
34
|
+
static valueAndDerivative(f: (x: DualNumber) => DualNumber, x: number): {
|
|
35
|
+
value: number;
|
|
36
|
+
derivative: number;
|
|
37
|
+
};
|
|
38
|
+
/** The gradient of a multivariate `f` at `point` (one dual seed per coordinate). */
|
|
39
|
+
static gradient(f: (xs: DualNumber[]) => DualNumber, point: number[]): number[];
|
|
40
|
+
toString(): string;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=DualNumber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DualNumber.d.ts","sourceRoot":"","sources":["../src/DualNumber.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,UAAU;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,SAAI,EAAE,KAAK,SAAI;IAKhC,oCAAoC;IACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;IAItC,wDAAwD;IACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;IAItC,OAAO,CAAC,MAAM,CAAC,IAAI;IAInB,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU;IAKvC,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU;IAK5C,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU;IAK5C,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU;IAK1C,MAAM,IAAI,UAAU;IAIpB,8CAA8C;IAC9C,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;IAI1B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAGrC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAGrC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAIrC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAIrC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAGrC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU;IAKtC,wEAAwE;IACxE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAItE,uDAAuD;IACvD,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAK7G,oFAAoF;IACpF,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAO/E,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DualNumber — a number of the form `value + deriv·ε` where `ε² = 0`. Evaluating
|
|
3
|
+
* a function on a dual number carries its derivative along automatically (the
|
|
4
|
+
* `ε` component), giving exact forward-mode automatic differentiation — more
|
|
5
|
+
* accurate than the finite differences in {@link RealMath.differentiateN}.
|
|
6
|
+
*
|
|
7
|
+
* It is also a commutative ring (a valid {@link Structure}).
|
|
8
|
+
*/
|
|
9
|
+
export class DualNumber {
|
|
10
|
+
value;
|
|
11
|
+
deriv;
|
|
12
|
+
constructor(value = 0, deriv = 0) {
|
|
13
|
+
this.value = value;
|
|
14
|
+
this.deriv = deriv;
|
|
15
|
+
}
|
|
16
|
+
/** A constant (zero derivative). */
|
|
17
|
+
static constant(x) {
|
|
18
|
+
return new DualNumber(x, 0);
|
|
19
|
+
}
|
|
20
|
+
/** An independent variable at `x` (unit derivative). */
|
|
21
|
+
static variable(x) {
|
|
22
|
+
return new DualNumber(x, 1);
|
|
23
|
+
}
|
|
24
|
+
static lift(x) {
|
|
25
|
+
return x instanceof DualNumber ? x : new DualNumber(x, 0);
|
|
26
|
+
}
|
|
27
|
+
add(o) {
|
|
28
|
+
const d = DualNumber.lift(o);
|
|
29
|
+
return new DualNumber(this.value + d.value, this.deriv + d.deriv);
|
|
30
|
+
}
|
|
31
|
+
subtract(o) {
|
|
32
|
+
const d = DualNumber.lift(o);
|
|
33
|
+
return new DualNumber(this.value - d.value, this.deriv - d.deriv);
|
|
34
|
+
}
|
|
35
|
+
multiply(o) {
|
|
36
|
+
const d = DualNumber.lift(o);
|
|
37
|
+
return new DualNumber(this.value * d.value, this.value * d.deriv + this.deriv * d.value);
|
|
38
|
+
}
|
|
39
|
+
divide(o) {
|
|
40
|
+
const d = DualNumber.lift(o);
|
|
41
|
+
return new DualNumber(this.value / d.value, (this.deriv * d.value - this.value * d.deriv) / (d.value * d.value));
|
|
42
|
+
}
|
|
43
|
+
negate() {
|
|
44
|
+
return new DualNumber(-this.value, -this.deriv);
|
|
45
|
+
}
|
|
46
|
+
/** Raise to a constant power (chain rule). */
|
|
47
|
+
pow(n) {
|
|
48
|
+
return new DualNumber(this.value ** n, n * this.value ** (n - 1) * this.deriv);
|
|
49
|
+
}
|
|
50
|
+
static sin(x) {
|
|
51
|
+
return new DualNumber(Math.sin(x.value), Math.cos(x.value) * x.deriv);
|
|
52
|
+
}
|
|
53
|
+
static cos(x) {
|
|
54
|
+
return new DualNumber(Math.cos(x.value), -Math.sin(x.value) * x.deriv);
|
|
55
|
+
}
|
|
56
|
+
static tan(x) {
|
|
57
|
+
const c = Math.cos(x.value);
|
|
58
|
+
return new DualNumber(Math.tan(x.value), x.deriv / (c * c));
|
|
59
|
+
}
|
|
60
|
+
static exp(x) {
|
|
61
|
+
const e = Math.exp(x.value);
|
|
62
|
+
return new DualNumber(e, e * x.deriv);
|
|
63
|
+
}
|
|
64
|
+
static log(x) {
|
|
65
|
+
return new DualNumber(Math.log(x.value), x.deriv / x.value);
|
|
66
|
+
}
|
|
67
|
+
static sqrt(x) {
|
|
68
|
+
const s = Math.sqrt(x.value);
|
|
69
|
+
return new DualNumber(s, x.deriv / (2 * s));
|
|
70
|
+
}
|
|
71
|
+
/** The derivative of `f` at `x`, evaluated exactly via dual numbers. */
|
|
72
|
+
static derivative(f, x) {
|
|
73
|
+
return f(DualNumber.variable(x)).deriv;
|
|
74
|
+
}
|
|
75
|
+
/** The value and derivative of `f` at `x` together. */
|
|
76
|
+
static valueAndDerivative(f, x) {
|
|
77
|
+
const r = f(DualNumber.variable(x));
|
|
78
|
+
return { value: r.value, derivative: r.deriv };
|
|
79
|
+
}
|
|
80
|
+
/** The gradient of a multivariate `f` at `point` (one dual seed per coordinate). */
|
|
81
|
+
static gradient(f, point) {
|
|
82
|
+
return point.map((_, i) => {
|
|
83
|
+
const seeded = point.map((v, j) => new DualNumber(v, i === j ? 1 : 0));
|
|
84
|
+
return f(seeded).deriv;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
toString() {
|
|
88
|
+
return `${this.value} + ${this.deriv}ε`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=DualNumber.js.map
|