@cortex-js/compute-engine 0.58.0 → 0.59.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 +4 -0
- package/dist/compile.esm.js +1721 -483
- package/dist/compile.min.esm.js +122 -74
- package/dist/compile.min.umd.cjs +122 -74
- package/dist/compile.umd.cjs +1721 -483
- package/dist/compute-engine.esm.js +25209 -22883
- package/dist/compute-engine.min.esm.js +135 -87
- package/dist/compute-engine.min.umd.cjs +135 -87
- package/dist/compute-engine.umd.cjs +24952 -22626
- package/dist/core.esm.js +25208 -22882
- package/dist/core.min.esm.js +134 -86
- package/dist/core.min.umd.cjs +134 -86
- package/dist/core.umd.cjs +24951 -22625
- package/dist/identities.esm.js +1921 -0
- package/dist/identities.min.esm.js +2 -0
- package/dist/identities.min.umd.cjs +4 -0
- package/dist/identities.umd.cjs +1946 -0
- package/dist/interval.esm.js +653 -330
- package/dist/interval.min.esm.js +8 -8
- package/dist/interval.min.umd.cjs +8 -8
- package/dist/interval.umd.cjs +653 -330
- package/dist/latex-syntax.esm.js +758 -512
- package/dist/latex-syntax.min.esm.js +7 -7
- package/dist/latex-syntax.min.umd.cjs +7 -7
- package/dist/latex-syntax.umd.cjs +758 -512
- package/dist/math-json.esm.js +8 -12
- package/dist/math-json.min.esm.js +2 -2
- package/dist/math-json.min.umd.cjs +2 -2
- package/dist/math-json.umd.cjs +8 -12
- package/dist/numerics.esm.js +1349 -228
- package/dist/numerics.min.esm.js +16 -5
- package/dist/numerics.min.umd.cjs +16 -5
- package/dist/numerics.umd.cjs +1349 -228
- package/dist/types/big-decimal/big-decimal.d.ts +1 -1
- package/dist/types/big-decimal/index.d.ts +1 -1
- package/dist/types/big-decimal/transcendentals.d.ts +1 -1
- package/dist/types/big-decimal/utils.d.ts +1 -1
- package/dist/types/common/ansi-codes.d.ts +1 -1
- package/dist/types/common/configuration-change.d.ts +1 -1
- package/dist/types/common/fuzzy-string-match.d.ts +1 -1
- package/dist/types/common/grapheme-splitter.d.ts +1 -1
- package/dist/types/common/interruptible.d.ts +1 -1
- package/dist/types/common/one-of.d.ts +1 -1
- package/dist/types/common/signals.d.ts +1 -1
- package/dist/types/common/type/ast-nodes.d.ts +1 -1
- package/dist/types/common/type/boxed-type.d.ts +1 -1
- package/dist/types/common/type/lexer.d.ts +1 -1
- package/dist/types/common/type/parse.d.ts +1 -208
- package/dist/types/common/type/parser.d.ts +124 -2
- package/dist/types/common/type/primitive.d.ts +5 -1
- package/dist/types/common/type/reduce.d.ts +1 -1
- package/dist/types/common/type/serialize.d.ts +1 -1
- package/dist/types/common/type/subtype.d.ts +18 -1
- package/dist/types/common/type/type-builder.d.ts +1 -1
- package/dist/types/common/type/types.d.ts +1 -1
- package/dist/types/common/type/utils.d.ts +1 -1
- package/dist/types/common/utils.d.ts +1 -1
- package/dist/types/compile.d.ts +1 -1
- package/dist/types/compute-engine/assume.d.ts +13 -6
- package/dist/types/compute-engine/boxed-expression/abstract-boxed-expression.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/apply.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/arithmetic-add.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/arithmetic-mul-div.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/arithmetic-power.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/ascii-math.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/box.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-dictionary.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-function.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-number.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-operator-definition.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-patterns.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-string.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-symbol.d.ts +3 -3
- package/dist/types/compute-engine/boxed-expression/boxed-tensor.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/boxed-value-definition.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/cache.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/canonical-utils.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/canonical.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/compare.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/constants.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/constraint-subject.d.ts +140 -0
- package/dist/types/compute-engine/boxed-expression/expand.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/expression-map.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/factor.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/flatten.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/hold.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/inequality-bounds.d.ts +14 -4
- package/dist/types/compute-engine/boxed-expression/init-lazy-refs.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/invisible-operator.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/match.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/negate.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/numerics.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/order.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/pattern-utils.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/polynomial-degree.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/polynomials.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/predicates.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/rule-index.d.ts +112 -0
- package/dist/types/compute-engine/boxed-expression/rules.d.ts +2 -1
- package/dist/types/compute-engine/boxed-expression/serialize.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/sgn.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/simplify.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/solve-linear-system.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/solve.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/stochastic-equal.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/trigonometry.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/type-guards.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/utils.d.ts +1 -1
- package/dist/types/compute-engine/boxed-expression/validate.d.ts +1 -1
- package/dist/types/compute-engine/collection-utils.d.ts +1 -1
- package/dist/types/compute-engine/compilation/base-compiler.d.ts +1 -1
- package/dist/types/compute-engine/compilation/compile-expression.d.ts +1 -1
- package/dist/types/compute-engine/compilation/constant-folding.d.ts +16 -1
- package/dist/types/compute-engine/compilation/glsl-target.d.ts +1 -1
- package/dist/types/compute-engine/compilation/gpu-target.d.ts +15 -5
- package/dist/types/compute-engine/compilation/interval-javascript-target.d.ts +4 -4
- package/dist/types/compute-engine/compilation/javascript-target.d.ts +1 -1
- package/dist/types/compute-engine/compilation/python-target.d.ts +1 -1
- package/dist/types/compute-engine/compilation/types.d.ts +1 -1
- package/dist/types/compute-engine/compilation/wgsl-target.d.ts +1 -1
- package/dist/types/compute-engine/cost-function.d.ts +1 -1
- package/dist/types/compute-engine/engine-assumptions.d.ts +1 -1
- package/dist/types/compute-engine/engine-cache.d.ts +1 -1
- package/dist/types/compute-engine/engine-common-symbols.d.ts +1 -1
- package/dist/types/compute-engine/engine-compilation-targets.d.ts +1 -1
- package/dist/types/compute-engine/engine-configuration-lifecycle.d.ts +1 -1
- package/dist/types/compute-engine/engine-declarations.d.ts +1 -1
- package/dist/types/compute-engine/engine-expression-entrypoints.d.ts +1 -1
- package/dist/types/compute-engine/engine-extension-contracts.d.ts +1 -1
- package/dist/types/compute-engine/engine-library-bootstrap.d.ts +1 -1
- package/dist/types/compute-engine/engine-numeric-configuration.d.ts +1 -1
- package/dist/types/compute-engine/engine-runtime-state.d.ts +1 -1
- package/dist/types/compute-engine/engine-scope.d.ts +1 -1
- package/dist/types/compute-engine/engine-sequences.d.ts +1 -1
- package/dist/types/compute-engine/engine-simplification-rules.d.ts +10 -2
- package/dist/types/compute-engine/engine-startup-coordinator.d.ts +1 -1
- package/dist/types/compute-engine/engine-type-resolver.d.ts +1 -1
- package/dist/types/compute-engine/engine-validation-entrypoints.d.ts +1 -1
- package/dist/types/compute-engine/free-functions.d.ts +1 -1
- package/dist/types/compute-engine/function-utils.d.ts +1 -1
- package/dist/types/compute-engine/fungrim/loader.d.ts +13 -0
- package/dist/types/compute-engine/fungrim/types.d.ts +160 -0
- package/dist/types/compute-engine/global-types.d.ts +1 -1
- package/dist/types/compute-engine/index.d.ts +48 -2
- package/dist/types/compute-engine/interval/arithmetic.d.ts +1 -1
- package/dist/types/compute-engine/interval/comparison.d.ts +1 -1
- package/dist/types/compute-engine/interval/elementary.d.ts +10 -2
- package/dist/types/compute-engine/interval/index.d.ts +2 -2
- package/dist/types/compute-engine/interval/trigonometric.d.ts +1 -1
- package/dist/types/compute-engine/interval/types.d.ts +1 -1
- package/dist/types/compute-engine/interval/util.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/default-dictionary.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-algebra.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-arithmetic.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-calculus.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-colors.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-complex.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-core.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-linear-algebra.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-logic.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-other.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-relational-operators.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-sets.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-statistics.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-symbols.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-trigonometry.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions-units.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/definitions.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/dictionary/indexed-types.d.ts +4 -1
- package/dist/types/compute-engine/latex-syntax/latex-syntax.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/parse-number.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/parse-symbol.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/parse.d.ts +3 -2
- package/dist/types/compute-engine/latex-syntax/serialize-dms.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/serialize-number.d.ts +1 -11
- package/dist/types/compute-engine/latex-syntax/serializer-style.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/serializer.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/tokenizer.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/types.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/utils.d.ts +1 -1
- package/dist/types/compute-engine/library/arithmetic.d.ts +1 -1
- package/dist/types/compute-engine/library/calculus.d.ts +1 -1
- package/dist/types/compute-engine/library/collections.d.ts +1 -1
- package/dist/types/compute-engine/library/colors.d.ts +1 -1
- package/dist/types/compute-engine/library/combinatorics.d.ts +1 -1
- package/dist/types/compute-engine/library/complex.d.ts +13 -1
- package/dist/types/compute-engine/library/control-structures.d.ts +1 -1
- package/dist/types/compute-engine/library/core.d.ts +1 -1
- package/dist/types/compute-engine/library/fractals.d.ts +1 -1
- package/dist/types/compute-engine/library/library.d.ts +1 -1
- package/dist/types/compute-engine/library/linear-algebra.d.ts +1 -1
- package/dist/types/compute-engine/library/logic-analysis.d.ts +1 -1
- package/dist/types/compute-engine/library/logic.d.ts +1 -1
- package/dist/types/compute-engine/library/number-theory.d.ts +1 -1
- package/dist/types/compute-engine/library/polynomials.d.ts +1 -1
- package/dist/types/compute-engine/library/quantity-arithmetic.d.ts +1 -1
- package/dist/types/compute-engine/library/random-expression.d.ts +1 -1
- package/dist/types/compute-engine/library/relational-operator.d.ts +1 -1
- package/dist/types/compute-engine/library/sets.d.ts +27 -1
- package/dist/types/compute-engine/library/statistics.d.ts +1 -1
- package/dist/types/compute-engine/library/trigonometry.d.ts +1 -1
- package/dist/types/compute-engine/library/type-handlers.d.ts +1 -1
- package/dist/types/compute-engine/library/unit-data.d.ts +1 -1
- package/dist/types/compute-engine/library/units.d.ts +1 -1
- package/dist/types/compute-engine/library/utils.d.ts +1 -1
- package/dist/types/compute-engine/numeric-value/big-numeric-value.d.ts +1 -1
- package/dist/types/compute-engine/numeric-value/exact-numeric-value.d.ts +7 -1
- package/dist/types/compute-engine/numeric-value/machine-numeric-value.d.ts +1 -1
- package/dist/types/compute-engine/numeric-value/types.d.ts +1 -1
- package/dist/types/compute-engine/numerics/bernoulli.d.ts +39 -0
- package/dist/types/compute-engine/numerics/bigint.d.ts +1 -1
- package/dist/types/compute-engine/numerics/expression.d.ts +1 -1
- package/dist/types/compute-engine/numerics/interval.d.ts +1 -1
- package/dist/types/compute-engine/numerics/linear-algebra.d.ts +1 -1
- package/dist/types/compute-engine/numerics/monte-carlo.d.ts +1 -1
- package/dist/types/compute-engine/numerics/numeric-bigint.d.ts +1 -1
- package/dist/types/compute-engine/numerics/numeric-bignum.d.ts +1 -1
- package/dist/types/compute-engine/numerics/numeric-complex.d.ts +12 -1
- package/dist/types/compute-engine/numerics/numeric.d.ts +1 -1
- package/dist/types/compute-engine/numerics/primes.d.ts +1 -1
- package/dist/types/compute-engine/numerics/random.d.ts +1 -1
- package/dist/types/compute-engine/numerics/rationals.d.ts +1 -1
- package/dist/types/compute-engine/numerics/richardson.d.ts +1 -1
- package/dist/types/compute-engine/numerics/special-functions.d.ts +78 -10
- package/dist/types/compute-engine/numerics/statistics.d.ts +1 -1
- package/dist/types/compute-engine/numerics/strings.d.ts +1 -1
- package/dist/types/compute-engine/numerics/types.d.ts +1 -1
- package/dist/types/compute-engine/numerics/unit-data.d.ts +1 -1
- package/dist/types/compute-engine/oeis.d.ts +1 -1
- package/dist/types/compute-engine/sequence.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/antiderivative.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/derivative.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/distribute.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/fu-cost.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/fu-transforms.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/fu.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/logic-utils.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-abs.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-divide.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-factorial.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-hyperbolic.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-infinity.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-log.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-logic.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-power.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-product.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-rules.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-sum.d.ts +1 -1
- package/dist/types/compute-engine/symbolic/simplify-trig.d.ts +1 -1
- package/dist/types/compute-engine/tensor/tensor-fields.d.ts +1 -1
- package/dist/types/compute-engine/tensor/tensors.d.ts +3 -3
- package/dist/types/compute-engine/types-definitions.d.ts +1 -1
- package/dist/types/compute-engine/types-engine.d.ts +19 -3
- package/dist/types/compute-engine/types-evaluation.d.ts +1 -1
- package/dist/types/compute-engine/types-expression.d.ts +17 -14
- package/dist/types/compute-engine/types-kernel-evaluation.d.ts +32 -1
- package/dist/types/compute-engine/types-kernel-serialization.d.ts +45 -3
- package/dist/types/compute-engine/types-serialization.d.ts +1 -1
- package/dist/types/compute-engine/types.d.ts +1 -1
- package/dist/types/compute-engine.d.ts +1 -1
- package/dist/types/core.d.ts +1 -1
- package/dist/types/identities.d.ts +3 -0
- package/dist/types/interval.d.ts +1 -1
- package/dist/types/latex-syntax.d.ts +2 -2
- package/dist/types/math-json/symbols.d.ts +1 -1
- package/dist/types/math-json/types.d.ts +1 -1
- package/dist/types/math-json/utils.d.ts +1 -1
- package/dist/types/math-json.d.ts +2 -2
- package/dist/types/numerics.d.ts +1 -1
- package/package.json +9 -3
package/dist/interval.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Compute Engine 0.
|
|
1
|
+
/** Compute Engine 0.59.0 */
|
|
2
2
|
|
|
3
3
|
// src/compute-engine/interval/util.ts
|
|
4
4
|
function ok(value) {
|
|
@@ -117,9 +117,18 @@ function negate(x) {
|
|
|
117
117
|
return ok({ lo: -xVal.hi, hi: -xVal.lo });
|
|
118
118
|
}
|
|
119
119
|
function _mul(a, b) {
|
|
120
|
-
const products = [
|
|
120
|
+
const products = [
|
|
121
|
+
_prod(a.lo, b.lo),
|
|
122
|
+
_prod(a.lo, b.hi),
|
|
123
|
+
_prod(a.hi, b.lo),
|
|
124
|
+
_prod(a.hi, b.hi)
|
|
125
|
+
];
|
|
121
126
|
return { lo: Math.min(...products), hi: Math.max(...products) };
|
|
122
127
|
}
|
|
128
|
+
function _prod(x, y) {
|
|
129
|
+
if (x === 0 || y === 0) return 0;
|
|
130
|
+
return x * y;
|
|
131
|
+
}
|
|
123
132
|
function mul(a, b) {
|
|
124
133
|
const unwrapped = unwrapOrPropagate(a, b);
|
|
125
134
|
if (!Array.isArray(unwrapped)) return unwrapped;
|
|
@@ -284,6 +293,7 @@ function fpexp(x, scale) {
|
|
|
284
293
|
return sum;
|
|
285
294
|
}
|
|
286
295
|
function fpln(x, scale) {
|
|
296
|
+
if (x <= 0n) throw new RangeError("fpln: input must be positive");
|
|
287
297
|
if (x === scale) return 0n;
|
|
288
298
|
const xNum = Number(x);
|
|
289
299
|
const scaleNum = Number(scale);
|
|
@@ -933,9 +943,11 @@ var BigDecimal = class _BigDecimal {
|
|
|
933
943
|
if (Number.isFinite(thisExp) && Number.isFinite(otherExp)) {
|
|
934
944
|
if (other.significand === 0n) return _BigDecimal.NAN;
|
|
935
945
|
if (this.significand === 0n) return fromRaw(0n, 0);
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
);
|
|
946
|
+
const ediff = thisExp - otherExp;
|
|
947
|
+
const num = ediff >= 0 ? this.significand * pow10(ediff) : this.significand;
|
|
948
|
+
const den = ediff >= 0 ? other.significand : other.significand * pow10(-ediff);
|
|
949
|
+
const q = num / den;
|
|
950
|
+
return this.sub(fromRaw(q, 0).mul(other));
|
|
939
951
|
}
|
|
940
952
|
if (thisExp !== thisExp || otherExp !== otherExp) return _BigDecimal.NAN;
|
|
941
953
|
if (!Number.isFinite(thisExp)) return _BigDecimal.NAN;
|
|
@@ -980,7 +992,10 @@ var BigDecimal = class _BigDecimal {
|
|
|
980
992
|
return this.pow(n.neg()).inv();
|
|
981
993
|
}
|
|
982
994
|
const absSig = this.significand < 0n ? -this.significand : this.significand;
|
|
983
|
-
const
|
|
995
|
+
const sigDigits = bigintDigits(absSig);
|
|
996
|
+
const dropped = sigDigits > 15 ? sigDigits - 15 : 0;
|
|
997
|
+
const lead = dropped > 0 ? Number(absSig / 10n ** BigInt(dropped)) : Number(absSig);
|
|
998
|
+
const thisLog10 = Math.log10(lead) + dropped + this.exponent;
|
|
984
999
|
const resultLog10 = Number(expValue) * thisLog10;
|
|
985
1000
|
if (resultLog10 > 9e15) {
|
|
986
1001
|
return this.significand < 0n && expValue % 2n !== 0n ? _BigDecimal.NEGATIVE_INFINITY : _BigDecimal.POSITIVE_INFINITY;
|
|
@@ -1013,7 +1028,19 @@ var BigDecimal = class _BigDecimal {
|
|
|
1013
1028
|
return _BigDecimal.POSITIVE_INFINITY;
|
|
1014
1029
|
}
|
|
1015
1030
|
if (this.significand < 0n) return _BigDecimal.NAN;
|
|
1016
|
-
|
|
1031
|
+
const baseSig = this.significand;
|
|
1032
|
+
const decExpBase = this.exponent + bigintDigits(baseSig) - 1;
|
|
1033
|
+
const nSig = n.significand < 0n ? -n.significand : n.significand;
|
|
1034
|
+
const decExpN = n.exponent + bigintDigits(nSig) - 1;
|
|
1035
|
+
const argMag = decExpN + Math.log10(Math.abs(decExpBase) * 2.303 + 3) + 1;
|
|
1036
|
+
const extra = Math.min(20, Math.max(2, Math.ceil(argMag) + 2));
|
|
1037
|
+
const savedPrec = _BigDecimal.precision;
|
|
1038
|
+
_BigDecimal.precision = savedPrec + extra;
|
|
1039
|
+
try {
|
|
1040
|
+
return n.mul(this.ln()).exp().toPrecision(savedPrec);
|
|
1041
|
+
} finally {
|
|
1042
|
+
_BigDecimal.precision = savedPrec;
|
|
1043
|
+
}
|
|
1017
1044
|
}
|
|
1018
1045
|
// ---------- Conversion methods ----------
|
|
1019
1046
|
/** Convert to a JavaScript number. May lose precision for large values. */
|
|
@@ -1254,6 +1281,20 @@ function fromFixedPoint(fp, scale, targetPrecision) {
|
|
|
1254
1281
|
const sig = negative ? -absFp : absFp;
|
|
1255
1282
|
return fromRaw(sig, resultExp);
|
|
1256
1283
|
}
|
|
1284
|
+
function decimalExponent(x) {
|
|
1285
|
+
const sig = x.significand < 0n ? -x.significand : x.significand;
|
|
1286
|
+
return x.exponent + bigintDigits(sig) - 1;
|
|
1287
|
+
}
|
|
1288
|
+
var MAX_SAFE_EXPONENT = BigInt(Number.MAX_SAFE_INTEGER);
|
|
1289
|
+
var _ln10Fp = null;
|
|
1290
|
+
var _ln10Scale = null;
|
|
1291
|
+
function ln10Fixed(scale) {
|
|
1292
|
+
if (_ln10Scale !== scale) {
|
|
1293
|
+
_ln10Fp = fpln(10n * scale, scale);
|
|
1294
|
+
_ln10Scale = scale;
|
|
1295
|
+
}
|
|
1296
|
+
return _ln10Fp;
|
|
1297
|
+
}
|
|
1257
1298
|
BigDecimal.prototype.sqrt = function() {
|
|
1258
1299
|
if (this.isNaN()) return BigDecimal.NAN;
|
|
1259
1300
|
if (this.isZero()) return BigDecimal.ZERO;
|
|
@@ -1264,9 +1305,13 @@ BigDecimal.prototype.sqrt = function() {
|
|
|
1264
1305
|
if (this.significand < 0n) return BigDecimal.NAN;
|
|
1265
1306
|
const targetPrec = BigDecimal.precision;
|
|
1266
1307
|
const workingPrec = targetPrec + 10;
|
|
1267
|
-
const
|
|
1308
|
+
const e = decimalExponent(this);
|
|
1309
|
+
const k = Math.floor(e / 2);
|
|
1310
|
+
const m = fromRaw(this.significand, this.exponent - 2 * k);
|
|
1311
|
+
const [fp, scale] = toFixedPoint(m, workingPrec);
|
|
1268
1312
|
const sqrtFp = fpsqrt(fp, scale);
|
|
1269
|
-
|
|
1313
|
+
const root = fromFixedPoint(sqrtFp, scale, targetPrec);
|
|
1314
|
+
return fromRaw(root.significand, root.exponent + k);
|
|
1270
1315
|
};
|
|
1271
1316
|
BigDecimal.prototype.cbrt = function() {
|
|
1272
1317
|
if (this.isNaN()) return BigDecimal.NAN;
|
|
@@ -1280,10 +1325,13 @@ BigDecimal.prototype.cbrt = function() {
|
|
|
1280
1325
|
}
|
|
1281
1326
|
const targetPrec = BigDecimal.precision;
|
|
1282
1327
|
const workingPrec = targetPrec + 10;
|
|
1283
|
-
const
|
|
1328
|
+
const e = decimalExponent(this);
|
|
1329
|
+
const k = Math.floor(e / 3);
|
|
1330
|
+
const m = fromRaw(this.significand, this.exponent - 3 * k);
|
|
1331
|
+
const [fp, scale] = toFixedPoint(m, workingPrec);
|
|
1284
1332
|
const C = fp * scale * scale;
|
|
1285
1333
|
let x;
|
|
1286
|
-
const numVal =
|
|
1334
|
+
const numVal = m.toNumber();
|
|
1287
1335
|
const scaleNum = Number(scale);
|
|
1288
1336
|
if (Number.isFinite(numVal) && numVal > 0 && Number.isFinite(scaleNum)) {
|
|
1289
1337
|
const approx = Math.cbrt(numVal);
|
|
@@ -1312,7 +1360,8 @@ BigDecimal.prototype.cbrt = function() {
|
|
|
1312
1360
|
const diffNext = bigintAbs(next * next * next - C);
|
|
1313
1361
|
if (diffNext < diffX) x = next;
|
|
1314
1362
|
}
|
|
1315
|
-
|
|
1363
|
+
const root = fromFixedPoint(x, scale, targetPrec);
|
|
1364
|
+
return fromRaw(root.significand, root.exponent + k);
|
|
1316
1365
|
};
|
|
1317
1366
|
BigDecimal.sqrt = function(x) {
|
|
1318
1367
|
return x.sqrt();
|
|
@@ -1327,11 +1376,27 @@ BigDecimal.prototype.exp = function() {
|
|
|
1327
1376
|
return BigDecimal.ZERO;
|
|
1328
1377
|
}
|
|
1329
1378
|
if (this.isZero()) return BigDecimal.ONE;
|
|
1379
|
+
if (decimalExponent(this) >= 17)
|
|
1380
|
+
return this.significand > 0n ? BigDecimal.POSITIVE_INFINITY : BigDecimal.ZERO;
|
|
1330
1381
|
const targetPrec = BigDecimal.precision;
|
|
1331
|
-
const
|
|
1332
|
-
const
|
|
1333
|
-
const
|
|
1334
|
-
|
|
1382
|
+
const absSig = this.significand < 0n ? -this.significand : this.significand;
|
|
1383
|
+
const magnitude = Math.max(0, this.exponent + bigintDigits(absSig));
|
|
1384
|
+
const workingPrec = targetPrec + 20 + magnitude;
|
|
1385
|
+
const [xFp, scale] = toFixedPoint(this, workingPrec);
|
|
1386
|
+
const l10 = ln10Fixed(scale);
|
|
1387
|
+
let k = xFp / l10;
|
|
1388
|
+
let rFp = xFp - k * l10;
|
|
1389
|
+
if (rFp < 0n) {
|
|
1390
|
+
k -= 1n;
|
|
1391
|
+
rFp += l10;
|
|
1392
|
+
}
|
|
1393
|
+
if (k > MAX_SAFE_EXPONENT || k < -MAX_SAFE_EXPONENT)
|
|
1394
|
+
return k > 0n ? BigDecimal.POSITIVE_INFINITY : BigDecimal.ZERO;
|
|
1395
|
+
const expR = fromFixedPoint(fpexp(rFp, scale), scale, targetPrec);
|
|
1396
|
+
const newExp = expR.exponent + Number(k);
|
|
1397
|
+
if (!Number.isSafeInteger(newExp))
|
|
1398
|
+
return k > 0n ? BigDecimal.POSITIVE_INFINITY : BigDecimal.ZERO;
|
|
1399
|
+
return fromRaw(expR.significand, newExp);
|
|
1335
1400
|
};
|
|
1336
1401
|
BigDecimal.prototype.ln = function() {
|
|
1337
1402
|
if (this.isNaN()) return BigDecimal.NAN;
|
|
@@ -1343,10 +1408,16 @@ BigDecimal.prototype.ln = function() {
|
|
|
1343
1408
|
if (this.significand < 0n) return BigDecimal.NAN;
|
|
1344
1409
|
if (this.eq(1)) return BigDecimal.ZERO;
|
|
1345
1410
|
const targetPrec = BigDecimal.precision;
|
|
1346
|
-
const
|
|
1347
|
-
const
|
|
1348
|
-
const
|
|
1349
|
-
|
|
1411
|
+
const sig = this.significand;
|
|
1412
|
+
const digits = bigintDigits(sig);
|
|
1413
|
+
const e = this.exponent + digits - 1;
|
|
1414
|
+
const m = fromRaw(sig, -(digits - 1));
|
|
1415
|
+
const eDigits = Math.abs(e).toString().length;
|
|
1416
|
+
const workingPrec = targetPrec + 20 + eDigits;
|
|
1417
|
+
const [mFp, scale] = toFixedPoint(m, workingPrec);
|
|
1418
|
+
const l10 = ln10Fixed(scale);
|
|
1419
|
+
const resultFp = fpln(mFp, scale) + BigInt(e) * l10;
|
|
1420
|
+
return fromFixedPoint(resultFp, scale, targetPrec);
|
|
1350
1421
|
};
|
|
1351
1422
|
BigDecimal.prototype.log = function(base) {
|
|
1352
1423
|
const b = base instanceof BigDecimal ? base : new BigDecimal(base);
|
|
@@ -1366,7 +1437,10 @@ BigDecimal.prototype.sin = function() {
|
|
|
1366
1437
|
if (!this.isFinite()) return BigDecimal.NAN;
|
|
1367
1438
|
if (this.isZero()) return BigDecimal.ZERO;
|
|
1368
1439
|
const targetPrec = BigDecimal.precision;
|
|
1369
|
-
const
|
|
1440
|
+
const e = decimalExponent(this);
|
|
1441
|
+
if (e < 0 && -2 * e >= targetPrec + 4) return this.toPrecision(targetPrec);
|
|
1442
|
+
const workingPrec = targetPrec + 15 + (e < 0 ? -e : 0);
|
|
1443
|
+
if (e > PI_DIGITS.length - workingPrec - 30) return BigDecimal.NAN;
|
|
1370
1444
|
const [fp, scale] = toFixedPoint(this, workingPrec);
|
|
1371
1445
|
const [sinFp] = fpsincos(fp, scale);
|
|
1372
1446
|
return fromFixedPoint(sinFp, scale, targetPrec);
|
|
@@ -1377,6 +1451,8 @@ BigDecimal.prototype.cos = function() {
|
|
|
1377
1451
|
if (this.isZero()) return BigDecimal.ONE;
|
|
1378
1452
|
const targetPrec = BigDecimal.precision;
|
|
1379
1453
|
const workingPrec = targetPrec + 15;
|
|
1454
|
+
const e = decimalExponent(this);
|
|
1455
|
+
if (e > PI_DIGITS.length - workingPrec - 30) return BigDecimal.NAN;
|
|
1380
1456
|
const [fp, scale] = toFixedPoint(this, workingPrec);
|
|
1381
1457
|
const [, cosFp] = fpsincos(fp, scale);
|
|
1382
1458
|
return fromFixedPoint(cosFp, scale, targetPrec);
|
|
@@ -1386,7 +1462,10 @@ BigDecimal.prototype.tan = function() {
|
|
|
1386
1462
|
if (!this.isFinite()) return BigDecimal.NAN;
|
|
1387
1463
|
if (this.isZero()) return BigDecimal.ZERO;
|
|
1388
1464
|
const targetPrec = BigDecimal.precision;
|
|
1389
|
-
const
|
|
1465
|
+
const e = decimalExponent(this);
|
|
1466
|
+
if (e < 0 && -2 * e >= targetPrec + 4) return this.toPrecision(targetPrec);
|
|
1467
|
+
const workingPrec = targetPrec + 15 + (e < 0 ? -e : 0);
|
|
1468
|
+
if (e > PI_DIGITS.length - workingPrec - 30) return BigDecimal.NAN;
|
|
1390
1469
|
const [fp, scale] = toFixedPoint(this, workingPrec);
|
|
1391
1470
|
const [sinFp, cosFp] = fpsincos(fp, scale);
|
|
1392
1471
|
if (cosFp === 0n) {
|
|
@@ -1404,7 +1483,9 @@ BigDecimal.prototype.atan = function() {
|
|
|
1404
1483
|
return piHalf.neg();
|
|
1405
1484
|
}
|
|
1406
1485
|
const targetPrec = BigDecimal.precision;
|
|
1407
|
-
const
|
|
1486
|
+
const e = decimalExponent(this);
|
|
1487
|
+
if (e < 0 && -2 * e >= targetPrec + 4) return this.toPrecision(targetPrec);
|
|
1488
|
+
const workingPrec = targetPrec + 15 + (e < 0 ? -e : 0);
|
|
1408
1489
|
const [fp, scale] = toFixedPoint(this, workingPrec);
|
|
1409
1490
|
const atanFp = fpatan(fp, scale);
|
|
1410
1491
|
return fromFixedPoint(atanFp, scale, targetPrec);
|
|
@@ -1421,7 +1502,9 @@ BigDecimal.prototype.asin = function() {
|
|
|
1421
1502
|
return this.significand > 0n ? piHalf : piHalf.neg();
|
|
1422
1503
|
}
|
|
1423
1504
|
const targetPrec = BigDecimal.precision;
|
|
1424
|
-
const
|
|
1505
|
+
const e = decimalExponent(this);
|
|
1506
|
+
if (e < 0 && -2 * e >= targetPrec + 4) return this.toPrecision(targetPrec);
|
|
1507
|
+
const workingPrec = targetPrec + 20 + (e < 0 ? -e : 0);
|
|
1425
1508
|
const [xFp, scale] = toFixedPoint(this, workingPrec);
|
|
1426
1509
|
const x2 = fpmul(xFp, xFp, scale);
|
|
1427
1510
|
const oneMinusX2 = scale - x2;
|
|
@@ -1484,6 +1567,23 @@ BigDecimal.prototype.sinh = function() {
|
|
|
1484
1567
|
if (this.significand > 0n) return BigDecimal.POSITIVE_INFINITY;
|
|
1485
1568
|
return BigDecimal.NEGATIVE_INFINITY;
|
|
1486
1569
|
}
|
|
1570
|
+
const targetPrec = BigDecimal.precision;
|
|
1571
|
+
const e = decimalExponent(this);
|
|
1572
|
+
if (e < 0) {
|
|
1573
|
+
if (-2 * e >= targetPrec + 4) return this.toPrecision(targetPrec);
|
|
1574
|
+
const saved = BigDecimal.precision;
|
|
1575
|
+
BigDecimal.precision = targetPrec - e + 5;
|
|
1576
|
+
try {
|
|
1577
|
+
const expX2 = this.exp();
|
|
1578
|
+
return expX2.sub(expX2.inv()).div(BigDecimal.TWO).toPrecision(targetPrec);
|
|
1579
|
+
} finally {
|
|
1580
|
+
BigDecimal.precision = saved;
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
if (Math.abs(this.toNumber()) > 1.16 * (targetPrec + 3)) {
|
|
1584
|
+
const h = this.abs().exp().div(BigDecimal.TWO);
|
|
1585
|
+
return this.significand > 0n ? h : h.neg();
|
|
1586
|
+
}
|
|
1487
1587
|
const expX = this.exp();
|
|
1488
1588
|
const expNegX = expX.inv();
|
|
1489
1589
|
return expX.sub(expNegX).div(BigDecimal.TWO);
|
|
@@ -1494,6 +1594,9 @@ BigDecimal.prototype.cosh = function() {
|
|
|
1494
1594
|
if (!this.isFinite()) {
|
|
1495
1595
|
return BigDecimal.POSITIVE_INFINITY;
|
|
1496
1596
|
}
|
|
1597
|
+
const targetPrec = BigDecimal.precision;
|
|
1598
|
+
if (Math.abs(this.toNumber()) > 1.16 * (targetPrec + 3))
|
|
1599
|
+
return this.abs().exp().div(BigDecimal.TWO);
|
|
1497
1600
|
const expX = this.exp();
|
|
1498
1601
|
const expNegX = expX.inv();
|
|
1499
1602
|
return expX.add(expNegX).div(BigDecimal.TWO);
|
|
@@ -1505,6 +1608,21 @@ BigDecimal.prototype.tanh = function() {
|
|
|
1505
1608
|
if (this.significand > 0n) return BigDecimal.ONE;
|
|
1506
1609
|
return BigDecimal.NEGATIVE_ONE;
|
|
1507
1610
|
}
|
|
1611
|
+
const targetPrec = BigDecimal.precision;
|
|
1612
|
+
const e = decimalExponent(this);
|
|
1613
|
+
if (e < 0) {
|
|
1614
|
+
if (-2 * e >= targetPrec + 4) return this.toPrecision(targetPrec);
|
|
1615
|
+
const saved = BigDecimal.precision;
|
|
1616
|
+
BigDecimal.precision = targetPrec - e + 5;
|
|
1617
|
+
try {
|
|
1618
|
+
const exp2x2 = this.mul(BigDecimal.TWO).exp();
|
|
1619
|
+
return exp2x2.sub(BigDecimal.ONE).div(exp2x2.add(BigDecimal.ONE)).toPrecision(targetPrec);
|
|
1620
|
+
} finally {
|
|
1621
|
+
BigDecimal.precision = saved;
|
|
1622
|
+
}
|
|
1623
|
+
}
|
|
1624
|
+
if (Math.abs(this.toNumber()) > 1.16 * (targetPrec + 3))
|
|
1625
|
+
return this.significand > 0n ? BigDecimal.ONE : BigDecimal.NEGATIVE_ONE;
|
|
1508
1626
|
const exp2x = this.mul(BigDecimal.TWO).exp();
|
|
1509
1627
|
return exp2x.sub(BigDecimal.ONE).div(exp2x.add(BigDecimal.ONE));
|
|
1510
1628
|
};
|
|
@@ -1550,9 +1668,14 @@ var lanczos_7_c = [
|
|
|
1550
1668
|
];
|
|
1551
1669
|
function gammaln(z) {
|
|
1552
1670
|
if (z < 0) return NaN;
|
|
1671
|
+
let shift = 0;
|
|
1672
|
+
while (z < 10) {
|
|
1673
|
+
shift += Math.log(z);
|
|
1674
|
+
z += 1;
|
|
1675
|
+
}
|
|
1553
1676
|
const pi = Math.PI;
|
|
1554
1677
|
const z3 = z * z * z;
|
|
1555
|
-
return z * Math.log(z) - z - 0.5 * Math.log(z) + 0.5 * Math.log(2 * pi) + 1 / (12 * z) - 1 / (360 * z3) + 1 / (1260 * z3 * z * z);
|
|
1678
|
+
return z * Math.log(z) - z - 0.5 * Math.log(z) + 0.5 * Math.log(2 * pi) + 1 / (12 * z) - 1 / (360 * z3) + 1 / (1260 * z3 * z * z) - shift;
|
|
1556
1679
|
}
|
|
1557
1680
|
function gamma(z) {
|
|
1558
1681
|
if (z < 0.5) return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z));
|
|
@@ -1564,20 +1687,43 @@ function gamma(z) {
|
|
|
1564
1687
|
return Math.sqrt(2 * Math.PI) * Math.pow(t, z + 0.5) * Math.exp(-t) * x;
|
|
1565
1688
|
}
|
|
1566
1689
|
function erfc(x) {
|
|
1567
|
-
|
|
1690
|
+
if (Number.isNaN(x)) return NaN;
|
|
1691
|
+
if (!Number.isFinite(x)) return x > 0 ? 0 : 2;
|
|
1692
|
+
if (x < 0) return 2 - erfc(-x);
|
|
1693
|
+
if (x < 2) return 1 - erf(x);
|
|
1694
|
+
const tiny = 1e-300;
|
|
1695
|
+
let f = x === 0 ? tiny : x;
|
|
1696
|
+
let c = f;
|
|
1697
|
+
let d = 0;
|
|
1698
|
+
for (let k = 1; k <= 500; k++) {
|
|
1699
|
+
const a = k / 2;
|
|
1700
|
+
d = x + a * d;
|
|
1701
|
+
if (d === 0) d = tiny;
|
|
1702
|
+
d = 1 / d;
|
|
1703
|
+
c = x + a / c;
|
|
1704
|
+
if (c === 0) c = tiny;
|
|
1705
|
+
const delta = c * d;
|
|
1706
|
+
f *= delta;
|
|
1707
|
+
if (Math.abs(delta - 1) < 1e-17) break;
|
|
1708
|
+
}
|
|
1709
|
+
return Math.exp(-x * x) / (Math.sqrt(Math.PI) * f);
|
|
1568
1710
|
}
|
|
1569
1711
|
function erf(x) {
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
const a4 = -1.453152027;
|
|
1574
|
-
const a5 = 1.061405429;
|
|
1575
|
-
const p = 0.3275911;
|
|
1712
|
+
if (Number.isNaN(x)) return NaN;
|
|
1713
|
+
if (x === 0) return 0;
|
|
1714
|
+
if (!Number.isFinite(x)) return x > 0 ? 1 : -1;
|
|
1576
1715
|
const sign2 = x < 0 ? -1 : 1;
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
const
|
|
1580
|
-
|
|
1716
|
+
const ax = Math.abs(x);
|
|
1717
|
+
if (ax >= 6) return sign2;
|
|
1718
|
+
const x2 = ax * ax;
|
|
1719
|
+
let term = ax;
|
|
1720
|
+
let sum = ax;
|
|
1721
|
+
for (let n = 1; n < 200; n++) {
|
|
1722
|
+
term *= 2 * x2 / (2 * n + 1);
|
|
1723
|
+
sum += term;
|
|
1724
|
+
if (term < sum * 1e-18) break;
|
|
1725
|
+
}
|
|
1726
|
+
return sign2 * (2 / Math.sqrt(Math.PI)) * Math.exp(-x2) * sum;
|
|
1581
1727
|
}
|
|
1582
1728
|
var BERNOULLI_2K = [
|
|
1583
1729
|
1 / 6,
|
|
@@ -1704,7 +1850,7 @@ function fresnelS(x) {
|
|
|
1704
1850
|
const t = x2 * x2;
|
|
1705
1851
|
return sign2 * x * x2 * polevl(t, SN) / polevl(t, SD);
|
|
1706
1852
|
}
|
|
1707
|
-
if (x <
|
|
1853
|
+
if (x < 36974) {
|
|
1708
1854
|
const x2 = x * x;
|
|
1709
1855
|
const t = Math.PI * x2;
|
|
1710
1856
|
const u = 1 / (t * t);
|
|
@@ -1729,7 +1875,7 @@ function fresnelC(x) {
|
|
|
1729
1875
|
const t = x2 * x2;
|
|
1730
1876
|
return sign2 * x * polevl(t, CN) / polevl(t, CD);
|
|
1731
1877
|
}
|
|
1732
|
-
if (x <
|
|
1878
|
+
if (x < 36974) {
|
|
1733
1879
|
const x2 = x * x;
|
|
1734
1880
|
const t = Math.PI * x2;
|
|
1735
1881
|
const u = 1 / (t * t);
|
|
@@ -1771,7 +1917,8 @@ function gcd(a, b) {
|
|
|
1771
1917
|
}
|
|
1772
1918
|
function lcm(a, b) {
|
|
1773
1919
|
if (a === 0 || b === 0) return 0;
|
|
1774
|
-
|
|
1920
|
+
let res = BigInt(a) * BigInt(b) / BigInt(gcd(a, b));
|
|
1921
|
+
if (res < 0n) res = -res;
|
|
1775
1922
|
return Number(res);
|
|
1776
1923
|
}
|
|
1777
1924
|
function factorial(n) {
|
|
@@ -3137,172 +3284,23 @@ var PRIMITIVE_TYPES = [
|
|
|
3137
3284
|
"error",
|
|
3138
3285
|
...EXPRESSION_TYPES
|
|
3139
3286
|
];
|
|
3287
|
+
var NUMERIC_TYPES_SET = new Set(
|
|
3288
|
+
NUMERIC_TYPES
|
|
3289
|
+
);
|
|
3290
|
+
var COLLECTION_TYPES_SET = new Set(
|
|
3291
|
+
COLLECTION_TYPES
|
|
3292
|
+
);
|
|
3293
|
+
var SCALAR_TYPES_SET = new Set(
|
|
3294
|
+
SCALAR_TYPES
|
|
3295
|
+
);
|
|
3296
|
+
var PRIMITIVE_TYPES_SET = new Set(
|
|
3297
|
+
PRIMITIVE_TYPES
|
|
3298
|
+
);
|
|
3140
3299
|
function isValidType(t) {
|
|
3141
|
-
if (typeof t === "string")
|
|
3142
|
-
return PRIMITIVE_TYPES.includes(t);
|
|
3300
|
+
if (typeof t === "string") return PRIMITIVE_TYPES_SET.has(t);
|
|
3143
3301
|
if (typeof t !== "object") return false;
|
|
3144
3302
|
if (!("kind" in t)) return false;
|
|
3145
|
-
return t.kind === "signature" || t.kind === "union" || t.kind === "intersection" || t.kind === "negation" || t.kind === "tuple" || t.kind === "list" || t.kind === "record" || t.kind === "dictionary" || t.kind === "set" || t.kind === "
|
|
3146
|
-
}
|
|
3147
|
-
|
|
3148
|
-
// src/common/type/serialize.ts
|
|
3149
|
-
var NEGATION_PRECEDENCE = 3;
|
|
3150
|
-
var UNION_PRECEDENCE = 1;
|
|
3151
|
-
var INTERSECTION_PRECEDENCE = 2;
|
|
3152
|
-
var LIST_PRECEDENCE = 4;
|
|
3153
|
-
var RECORD_PRECEDENCE = 5;
|
|
3154
|
-
var DICTIONARY_PRECEDENCE = 6;
|
|
3155
|
-
var SET_PRECEDENCE = 7;
|
|
3156
|
-
var COLLECTION_PRECEDENCE = 8;
|
|
3157
|
-
var TUPLE_PRECEDENCE = 9;
|
|
3158
|
-
var SIGNATURE_PRECEDENCE = 10;
|
|
3159
|
-
var VALUE_PRECEDENCE = 11;
|
|
3160
|
-
function typeToString(type, precedence = 0) {
|
|
3161
|
-
if (typeof type === "string") return type;
|
|
3162
|
-
let result = "";
|
|
3163
|
-
switch (type.kind) {
|
|
3164
|
-
case "value":
|
|
3165
|
-
if (typeof type.value === "string") result = `"${type.value}"`;
|
|
3166
|
-
else if (typeof type.value === "boolean")
|
|
3167
|
-
result = type.value ? "true" : "false";
|
|
3168
|
-
else result = type.value.toString();
|
|
3169
|
-
break;
|
|
3170
|
-
case "reference":
|
|
3171
|
-
result = type.name;
|
|
3172
|
-
break;
|
|
3173
|
-
case "negation":
|
|
3174
|
-
result = `!${typeToString(type.type, NEGATION_PRECEDENCE)}`;
|
|
3175
|
-
break;
|
|
3176
|
-
case "union":
|
|
3177
|
-
result = type.types.map((t) => typeToString(t, UNION_PRECEDENCE)).join(" | ");
|
|
3178
|
-
break;
|
|
3179
|
-
case "intersection":
|
|
3180
|
-
result = type.types.map((t) => typeToString(t, INTERSECTION_PRECEDENCE)).join(" & ");
|
|
3181
|
-
break;
|
|
3182
|
-
case "expression":
|
|
3183
|
-
result = `expression<${symbolName(type.operator)}>`;
|
|
3184
|
-
break;
|
|
3185
|
-
case "symbol":
|
|
3186
|
-
result = `symbol<${symbolName(type.name)}>`;
|
|
3187
|
-
break;
|
|
3188
|
-
case "numeric":
|
|
3189
|
-
if (Number.isFinite(type.lower) && Number.isFinite(type.upper)) {
|
|
3190
|
-
result = `${type.type}<${type.lower}..${type.upper}>`;
|
|
3191
|
-
} else if (Number.isFinite(type.lower)) {
|
|
3192
|
-
result = `${type.type}<${type.lower}..>`;
|
|
3193
|
-
} else if (Number.isFinite(type.upper)) {
|
|
3194
|
-
result = `${type.type}<..${type.upper}>`;
|
|
3195
|
-
} else {
|
|
3196
|
-
result = `${type.type}`;
|
|
3197
|
-
}
|
|
3198
|
-
break;
|
|
3199
|
-
case "list":
|
|
3200
|
-
if (type.dimensions && typeof type.elements === "string" && NUMERIC_TYPES.includes(type.elements)) {
|
|
3201
|
-
if (type.dimensions === void 0) {
|
|
3202
|
-
if (type.elements === "number") result = "tensor";
|
|
3203
|
-
} else if (type.dimensions.length === 1) {
|
|
3204
|
-
if (type.elements === "number") {
|
|
3205
|
-
if (type.dimensions[0] < 0) result = "vector";
|
|
3206
|
-
else result = `vector<${type.dimensions[0]}>`;
|
|
3207
|
-
} else {
|
|
3208
|
-
if (type.dimensions[0] < 0)
|
|
3209
|
-
result = `vector<${typeToString(type.elements)}>`;
|
|
3210
|
-
else
|
|
3211
|
-
result = `vector<${typeToString(type.elements)}^${type.dimensions[0]}>`;
|
|
3212
|
-
}
|
|
3213
|
-
} else if (type.dimensions.length === 2) {
|
|
3214
|
-
const dims = type.dimensions;
|
|
3215
|
-
if (type.elements === "number") {
|
|
3216
|
-
if (dims[0] < 0 && dims[1] < 0) result = "matrix";
|
|
3217
|
-
else result = `matrix<${dims[0]}x${dims[1]}>`;
|
|
3218
|
-
} else {
|
|
3219
|
-
if (dims[0] < 0 && dims[1] < 0)
|
|
3220
|
-
result = `matrix<${typeToString(type.elements)}>`;
|
|
3221
|
-
else
|
|
3222
|
-
result = `matrix<${typeToString(type.elements)}^(${dims[0]}x${dims[1]})>`;
|
|
3223
|
-
}
|
|
3224
|
-
}
|
|
3225
|
-
}
|
|
3226
|
-
if (!result) {
|
|
3227
|
-
const dimensions = type.dimensions ? type.dimensions.length === 1 ? `^${type.dimensions[0].toString()}` : `^(${type.dimensions.join("x")})` : "";
|
|
3228
|
-
result = `list<${typeToString(type.elements)}${dimensions}>`;
|
|
3229
|
-
}
|
|
3230
|
-
break;
|
|
3231
|
-
case "record":
|
|
3232
|
-
const elements = Object.entries(type.elements).map(([key, value]) => `${key}: ${typeToString(value)}`).join(", ");
|
|
3233
|
-
result = `record<${elements}>`;
|
|
3234
|
-
break;
|
|
3235
|
-
case "dictionary":
|
|
3236
|
-
result = `dictionary<${typeToString(type.values)}>`;
|
|
3237
|
-
break;
|
|
3238
|
-
case "set":
|
|
3239
|
-
result = `set<${typeToString(type.elements)}>`;
|
|
3240
|
-
break;
|
|
3241
|
-
case "collection":
|
|
3242
|
-
result = `collection<${typeToString(type.elements)}>`;
|
|
3243
|
-
break;
|
|
3244
|
-
case "indexed_collection":
|
|
3245
|
-
result = `indexed_collection<${typeToString(type.elements)}>`;
|
|
3246
|
-
break;
|
|
3247
|
-
case "tuple":
|
|
3248
|
-
if (type.elements.length === 0) result = "tuple";
|
|
3249
|
-
else if (type.elements.length === 1) {
|
|
3250
|
-
const [el] = type.elements;
|
|
3251
|
-
result = `tuple<${namedElement(el)}>`;
|
|
3252
|
-
} else {
|
|
3253
|
-
result = "tuple<" + type.elements.map((el) => namedElement(el)).join(", ") + ">";
|
|
3254
|
-
}
|
|
3255
|
-
break;
|
|
3256
|
-
case "signature":
|
|
3257
|
-
const args = type.args ? type.args.map((arg) => namedElement(arg)).join(", ") : "";
|
|
3258
|
-
const optArgs = type.optArgs ? type.optArgs.map((arg) => namedElement(arg) + "?").join(", ") : "";
|
|
3259
|
-
const varArg = type.variadicArg ? type.variadicMin === 0 ? `${namedElement(type.variadicArg)}*` : `${namedElement(type.variadicArg)}+` : "";
|
|
3260
|
-
const argsList = [args, optArgs, varArg].filter((s) => s).join(", ");
|
|
3261
|
-
result = `(${argsList}) -> ${typeToString(type.result)}`;
|
|
3262
|
-
break;
|
|
3263
|
-
default:
|
|
3264
|
-
result = "error";
|
|
3265
|
-
}
|
|
3266
|
-
if (precedence > 0 && precedence > getPrecedence(type.kind))
|
|
3267
|
-
return `(${result})`;
|
|
3268
|
-
return result;
|
|
3269
|
-
}
|
|
3270
|
-
function namedElement(el) {
|
|
3271
|
-
if (el.name) return `${el.name}: ${typeToString(el.type)}`;
|
|
3272
|
-
return typeToString(el.type);
|
|
3273
|
-
}
|
|
3274
|
-
function symbolName(name) {
|
|
3275
|
-
if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) return name;
|
|
3276
|
-
return `\`${name}\``;
|
|
3277
|
-
}
|
|
3278
|
-
function getPrecedence(kind) {
|
|
3279
|
-
switch (kind) {
|
|
3280
|
-
case "negation":
|
|
3281
|
-
return NEGATION_PRECEDENCE;
|
|
3282
|
-
case "union":
|
|
3283
|
-
return UNION_PRECEDENCE;
|
|
3284
|
-
case "intersection":
|
|
3285
|
-
return INTERSECTION_PRECEDENCE;
|
|
3286
|
-
case "list":
|
|
3287
|
-
return LIST_PRECEDENCE;
|
|
3288
|
-
case "record":
|
|
3289
|
-
return RECORD_PRECEDENCE;
|
|
3290
|
-
case "dictionary":
|
|
3291
|
-
return DICTIONARY_PRECEDENCE;
|
|
3292
|
-
case "set":
|
|
3293
|
-
return SET_PRECEDENCE;
|
|
3294
|
-
case "collection":
|
|
3295
|
-
case "indexed_collection":
|
|
3296
|
-
return COLLECTION_PRECEDENCE;
|
|
3297
|
-
case "tuple":
|
|
3298
|
-
return TUPLE_PRECEDENCE;
|
|
3299
|
-
case "signature":
|
|
3300
|
-
return SIGNATURE_PRECEDENCE;
|
|
3301
|
-
case "value":
|
|
3302
|
-
return VALUE_PRECEDENCE;
|
|
3303
|
-
default:
|
|
3304
|
-
return 0;
|
|
3305
|
-
}
|
|
3303
|
+
return t.kind === "signature" || t.kind === "union" || t.kind === "intersection" || t.kind === "negation" || t.kind === "value" || t.kind === "tuple" || t.kind === "list" || t.kind === "record" || t.kind === "dictionary" || t.kind === "set" || t.kind === "symbol" || t.kind === "expression" || t.kind === "numeric" || t.kind === "collection" || t.kind === "indexed_collection" || t.kind === "reference";
|
|
3306
3304
|
}
|
|
3307
3305
|
|
|
3308
3306
|
// src/common/type/lexer.ts
|
|
@@ -4012,19 +4010,13 @@ var Parser = class {
|
|
|
4012
4010
|
);
|
|
4013
4011
|
let dimensions;
|
|
4014
4012
|
if (this.match("<")) {
|
|
4015
|
-
dimensions = this.
|
|
4016
|
-
if (!dimensions) {
|
|
4017
|
-
dimensions = this.parseDimensions();
|
|
4018
|
-
}
|
|
4013
|
+
dimensions = this.parseDimensions();
|
|
4019
4014
|
if (!dimensions) {
|
|
4020
4015
|
const type = this.parseUnionType();
|
|
4021
4016
|
if (type) {
|
|
4022
4017
|
elementType = type;
|
|
4023
4018
|
if (this.match("^")) {
|
|
4024
|
-
dimensions = this.
|
|
4025
|
-
if (!dimensions) {
|
|
4026
|
-
dimensions = this.parseDimensions();
|
|
4027
|
-
}
|
|
4019
|
+
dimensions = this.parseCaretDimensions();
|
|
4028
4020
|
}
|
|
4029
4021
|
}
|
|
4030
4022
|
}
|
|
@@ -4065,19 +4057,13 @@ var Parser = class {
|
|
|
4065
4057
|
);
|
|
4066
4058
|
let dimensions;
|
|
4067
4059
|
if (this.match("<")) {
|
|
4068
|
-
dimensions = this.
|
|
4069
|
-
if (!dimensions) {
|
|
4070
|
-
dimensions = this.parseDimensions();
|
|
4071
|
-
}
|
|
4060
|
+
dimensions = this.parseDimensions();
|
|
4072
4061
|
if (!dimensions) {
|
|
4073
4062
|
const type = this.parseUnionType();
|
|
4074
4063
|
if (type) {
|
|
4075
4064
|
elementType = type;
|
|
4076
4065
|
if (this.match("^")) {
|
|
4077
|
-
dimensions = this.
|
|
4078
|
-
if (!dimensions) {
|
|
4079
|
-
dimensions = this.parseDimensions();
|
|
4080
|
-
}
|
|
4066
|
+
dimensions = this.parseCaretDimensions();
|
|
4081
4067
|
}
|
|
4082
4068
|
}
|
|
4083
4069
|
}
|
|
@@ -4108,16 +4094,30 @@ var Parser = class {
|
|
|
4108
4094
|
return this.createNode("tensor", { elementType });
|
|
4109
4095
|
}
|
|
4110
4096
|
parseDimensions() {
|
|
4111
|
-
const dimensions = [];
|
|
4112
4097
|
const firstDim = this.parseDimension();
|
|
4113
4098
|
if (!firstDim) return void 0;
|
|
4114
|
-
dimensions
|
|
4115
|
-
|
|
4116
|
-
const
|
|
4117
|
-
if (
|
|
4118
|
-
this.
|
|
4099
|
+
const dimensions = [firstDim];
|
|
4100
|
+
for (; ; ) {
|
|
4101
|
+
const tok = this.current;
|
|
4102
|
+
if (tok.type === "IDENTIFIER" && /^(x\d+)+$/.test(tok.value)) {
|
|
4103
|
+
this.advance();
|
|
4104
|
+
for (const m of tok.value.match(/x(\d+)/g))
|
|
4105
|
+
dimensions.push(
|
|
4106
|
+
this.createNode("dimension", {
|
|
4107
|
+
size: parseInt(m.slice(1))
|
|
4108
|
+
})
|
|
4109
|
+
);
|
|
4110
|
+
} else if (tok.type === "IDENTIFIER" && tok.value === "x") {
|
|
4111
|
+
const next = this.lexer.peekToken();
|
|
4112
|
+
if (next.type !== "NUMBER_LITERAL" && next.type !== "?")
|
|
4113
|
+
this.error(
|
|
4114
|
+
"Expected a positive integer literal or `?` after x. For example: `2x3` or `2x?`"
|
|
4115
|
+
);
|
|
4116
|
+
this.advance();
|
|
4117
|
+
dimensions.push(this.parseDimension());
|
|
4118
|
+
} else {
|
|
4119
|
+
break;
|
|
4119
4120
|
}
|
|
4120
|
-
dimensions.push(dim);
|
|
4121
4121
|
}
|
|
4122
4122
|
return dimensions;
|
|
4123
4123
|
}
|
|
@@ -4131,35 +4131,11 @@ var Parser = class {
|
|
|
4131
4131
|
}
|
|
4132
4132
|
return void 0;
|
|
4133
4133
|
}
|
|
4134
|
-
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
|
|
4139
|
-
this.createNode("dimension", { size: firstDim })
|
|
4140
|
-
);
|
|
4141
|
-
if (this.current.type === "IDENTIFIER" && this.current.value.startsWith("x")) {
|
|
4142
|
-
const dimString = this.current.value;
|
|
4143
|
-
const matches = dimString.match(/x(\d+)/g);
|
|
4144
|
-
if (matches && matches.join("") === dimString) {
|
|
4145
|
-
this.advance();
|
|
4146
|
-
for (const match of matches) {
|
|
4147
|
-
const dimValue = parseInt(match.substring(1));
|
|
4148
|
-
dimensions.push(
|
|
4149
|
-
this.createNode("dimension", { size: dimValue })
|
|
4150
|
-
);
|
|
4151
|
-
}
|
|
4152
|
-
} else if (dimString === "x" || dimString.startsWith("x")) {
|
|
4153
|
-
this.error(
|
|
4154
|
-
"Expected a positive integer literal or `?` after x. For example: `2x3` or `2x?`"
|
|
4155
|
-
);
|
|
4156
|
-
}
|
|
4157
|
-
}
|
|
4158
|
-
if (dimensions.length > 1) {
|
|
4159
|
-
return dimensions;
|
|
4160
|
-
}
|
|
4161
|
-
}
|
|
4162
|
-
return void 0;
|
|
4134
|
+
parseCaretDimensions() {
|
|
4135
|
+
const paren = this.match("(");
|
|
4136
|
+
const dimensions = this.parseDimensions();
|
|
4137
|
+
if (paren) this.expect(")");
|
|
4138
|
+
return dimensions;
|
|
4163
4139
|
}
|
|
4164
4140
|
parseTupleType() {
|
|
4165
4141
|
if (this.current.type === "IDENTIFIER" && this.current.value === "tuple") {
|
|
@@ -4344,6 +4320,18 @@ var Parser = class {
|
|
|
4344
4320
|
this.expect("..");
|
|
4345
4321
|
const upperBound = this.parseValue();
|
|
4346
4322
|
this.expect(">");
|
|
4323
|
+
const lower = lowerBound?.value ?? -Infinity;
|
|
4324
|
+
const upper = upperBound?.value ?? Infinity;
|
|
4325
|
+
if (Number.isNaN(lower) || Number.isNaN(upper))
|
|
4326
|
+
this.error(
|
|
4327
|
+
"Invalid numeric type",
|
|
4328
|
+
"Lower and upper bounds must be valid numbers"
|
|
4329
|
+
);
|
|
4330
|
+
if (lower > upper)
|
|
4331
|
+
this.error(
|
|
4332
|
+
`Invalid range: ${lower}..${upper}`,
|
|
4333
|
+
"The lower bound must be less than the upper bound"
|
|
4334
|
+
);
|
|
4347
4335
|
return this.createNode("numeric", {
|
|
4348
4336
|
baseType,
|
|
4349
4337
|
lowerBound,
|
|
@@ -4358,7 +4346,7 @@ var Parser = class {
|
|
|
4358
4346
|
parsePrimitiveType() {
|
|
4359
4347
|
if (this.current.type === "IDENTIFIER") {
|
|
4360
4348
|
const name = this.current.value;
|
|
4361
|
-
if (
|
|
4349
|
+
if (PRIMITIVE_TYPES_SET.has(name)) {
|
|
4362
4350
|
this.advance();
|
|
4363
4351
|
return this.createNode("primitive", { name });
|
|
4364
4352
|
}
|
|
@@ -4692,14 +4680,32 @@ function buildTypeFromAST(node, typeResolver) {
|
|
|
4692
4680
|
}
|
|
4693
4681
|
|
|
4694
4682
|
// src/common/type/parse.ts
|
|
4683
|
+
var TYPE_CACHE = /* @__PURE__ */ new Map();
|
|
4684
|
+
var TYPE_CACHE_MAX_SIZE = 2048;
|
|
4685
|
+
function deepFreeze(obj) {
|
|
4686
|
+
if (obj === null || typeof obj !== "object") return obj;
|
|
4687
|
+
if (Object.isFrozen(obj)) return obj;
|
|
4688
|
+
Object.freeze(obj);
|
|
4689
|
+
for (const value of Object.values(obj)) deepFreeze(value);
|
|
4690
|
+
return obj;
|
|
4691
|
+
}
|
|
4695
4692
|
function parseType(s, typeResolver) {
|
|
4696
4693
|
if (s === void 0) return void 0;
|
|
4697
4694
|
if (isValidType(s)) return s;
|
|
4698
4695
|
if (typeof s !== "string") return void 0;
|
|
4696
|
+
const cacheable = typeResolver === void 0;
|
|
4697
|
+
if (cacheable) {
|
|
4698
|
+
const cached = TYPE_CACHE.get(s);
|
|
4699
|
+
if (cached !== void 0) return cached;
|
|
4700
|
+
}
|
|
4699
4701
|
try {
|
|
4700
4702
|
const parser = new Parser(s, { typeResolver });
|
|
4701
4703
|
const ast = parser.parseType();
|
|
4702
4704
|
const type = buildTypeFromAST(ast, typeResolver);
|
|
4705
|
+
if (cacheable) {
|
|
4706
|
+
if (TYPE_CACHE.size >= TYPE_CACHE_MAX_SIZE) TYPE_CACHE.clear();
|
|
4707
|
+
TYPE_CACHE.set(s, deepFreeze(type));
|
|
4708
|
+
}
|
|
4703
4709
|
return type;
|
|
4704
4710
|
} catch (error) {
|
|
4705
4711
|
throw new Error(
|
|
@@ -4774,19 +4780,36 @@ var PRIMITIVE_SUBTYPES = {
|
|
|
4774
4780
|
color: [],
|
|
4775
4781
|
expression: EXPRESSION_TYPES
|
|
4776
4782
|
};
|
|
4783
|
+
var PRIMITIVE_SUBTYPES_CLOSURE = (() => {
|
|
4784
|
+
const closure = {};
|
|
4785
|
+
const closeOver = (t) => {
|
|
4786
|
+
if (closure[t]) return closure[t];
|
|
4787
|
+
const result = /* @__PURE__ */ new Set([t]);
|
|
4788
|
+
closure[t] = result;
|
|
4789
|
+
for (const sub2 of PRIMITIVE_SUBTYPES[t]) {
|
|
4790
|
+
if (sub2 === t) continue;
|
|
4791
|
+
for (const s of closeOver(sub2)) result.add(s);
|
|
4792
|
+
}
|
|
4793
|
+
return result;
|
|
4794
|
+
};
|
|
4795
|
+
for (const t of Object.keys(PRIMITIVE_SUBTYPES))
|
|
4796
|
+
closeOver(t);
|
|
4797
|
+
return closure;
|
|
4798
|
+
})();
|
|
4777
4799
|
function isPrimitiveSubtype(lhs, rhs) {
|
|
4778
4800
|
if (rhs === "any") return true;
|
|
4779
4801
|
if (lhs === "never") return true;
|
|
4780
4802
|
if (lhs === "unknown" || rhs === "unknown") return false;
|
|
4781
4803
|
if (lhs === rhs) return true;
|
|
4782
|
-
return
|
|
4804
|
+
return PRIMITIVE_SUBTYPES_CLOSURE[rhs].has(lhs);
|
|
4783
4805
|
}
|
|
4784
4806
|
function isSubtype(lhs, rhs) {
|
|
4785
|
-
if (typeof lhs === "string" && !
|
|
4807
|
+
if (typeof lhs === "string" && !PRIMITIVE_TYPES_SET.has(lhs))
|
|
4786
4808
|
lhs = parseType(lhs);
|
|
4787
|
-
if (typeof rhs === "string" && !
|
|
4809
|
+
if (typeof rhs === "string" && !PRIMITIVE_TYPES_SET.has(rhs))
|
|
4788
4810
|
rhs = parseType(rhs);
|
|
4789
4811
|
if (rhs === "any") return true;
|
|
4812
|
+
if (lhs === "never") return true;
|
|
4790
4813
|
if (rhs === "never") return false;
|
|
4791
4814
|
if (rhs === "error") return lhs === "error";
|
|
4792
4815
|
if (rhs === "nothing") return lhs === "nothing";
|
|
@@ -4801,7 +4824,7 @@ function isSubtype(lhs, rhs) {
|
|
|
4801
4824
|
if (typeof lhs.value === "number") {
|
|
4802
4825
|
if (Number.isInteger(lhs.value))
|
|
4803
4826
|
return isPrimitiveSubtype("integer", rhs);
|
|
4804
|
-
return isPrimitiveSubtype("
|
|
4827
|
+
return isPrimitiveSubtype("real", rhs);
|
|
4805
4828
|
}
|
|
4806
4829
|
if (typeof lhs.value === "boolean")
|
|
4807
4830
|
return isPrimitiveSubtype("boolean", rhs);
|
|
@@ -5031,7 +5054,7 @@ function isSubtype(lhs, rhs) {
|
|
|
5031
5054
|
}
|
|
5032
5055
|
function isNumeric(type) {
|
|
5033
5056
|
if (typeof type === "string")
|
|
5034
|
-
return
|
|
5057
|
+
return NUMERIC_TYPES_SET.has(type);
|
|
5035
5058
|
if (type.kind === "value") return typeof type.value === "number";
|
|
5036
5059
|
if (type.kind === "numeric") return true;
|
|
5037
5060
|
return false;
|
|
@@ -5039,7 +5062,7 @@ function isNumeric(type) {
|
|
|
5039
5062
|
function isScalar(type) {
|
|
5040
5063
|
if (isNumeric(type)) return true;
|
|
5041
5064
|
if (typeof type === "string")
|
|
5042
|
-
return
|
|
5065
|
+
return SCALAR_TYPES_SET.has(type);
|
|
5043
5066
|
if (type.kind === "value")
|
|
5044
5067
|
return ["string", "boolean", "number"].includes(typeof type.value);
|
|
5045
5068
|
return false;
|
|
@@ -5047,7 +5070,7 @@ function isScalar(type) {
|
|
|
5047
5070
|
function isCollection(type) {
|
|
5048
5071
|
if (isIndexedCollection(type)) return true;
|
|
5049
5072
|
if (typeof type === "string")
|
|
5050
|
-
return
|
|
5073
|
+
return COLLECTION_TYPES_SET.has(type);
|
|
5051
5074
|
return ["collection", "set", "record", "dictionary"].includes(type.kind);
|
|
5052
5075
|
}
|
|
5053
5076
|
function isIndexedCollection(type) {
|
|
@@ -5086,7 +5109,7 @@ function narrow2(a, b) {
|
|
|
5086
5109
|
if (b === "unknown") return a;
|
|
5087
5110
|
if (isSubtype(a, b)) return a;
|
|
5088
5111
|
if (isSubtype(b, a)) return b;
|
|
5089
|
-
return
|
|
5112
|
+
return "never";
|
|
5090
5113
|
}
|
|
5091
5114
|
function widen2(a, b) {
|
|
5092
5115
|
if (a === b) return a;
|
|
@@ -5120,16 +5143,17 @@ var LOSSY_SUPERTYPE = /* @__PURE__ */ new Set([
|
|
|
5120
5143
|
]);
|
|
5121
5144
|
function unionTypes(a, b) {
|
|
5122
5145
|
const members = [];
|
|
5146
|
+
const keys = /* @__PURE__ */ new Set();
|
|
5123
5147
|
const push = (t) => {
|
|
5124
5148
|
if (typeof t === "object" && t.kind === "union") {
|
|
5125
5149
|
for (const m of t.types) push(m);
|
|
5126
5150
|
return;
|
|
5127
5151
|
}
|
|
5128
5152
|
const key = typeof t === "string" ? t : JSON.stringify(t);
|
|
5129
|
-
if (!
|
|
5130
|
-
|
|
5131
|
-
))
|
|
5153
|
+
if (!keys.has(key)) {
|
|
5154
|
+
keys.add(key);
|
|
5132
5155
|
members.push(t);
|
|
5156
|
+
}
|
|
5133
5157
|
};
|
|
5134
5158
|
push(a);
|
|
5135
5159
|
push(b);
|
|
@@ -5146,6 +5170,32 @@ function widen(...types) {
|
|
|
5146
5170
|
if (types.length === 1) return types[0];
|
|
5147
5171
|
return types.reduce((a, b) => widen2(a, b));
|
|
5148
5172
|
}
|
|
5173
|
+
var SUPERTYPE_PROBE_ORDER = [
|
|
5174
|
+
"non_finite_number",
|
|
5175
|
+
"finite_integer",
|
|
5176
|
+
"integer",
|
|
5177
|
+
"finite_rational",
|
|
5178
|
+
"rational",
|
|
5179
|
+
"finite_real",
|
|
5180
|
+
"real",
|
|
5181
|
+
"imaginary",
|
|
5182
|
+
"finite_complex",
|
|
5183
|
+
"complex",
|
|
5184
|
+
"finite_number",
|
|
5185
|
+
"number",
|
|
5186
|
+
"list",
|
|
5187
|
+
"record",
|
|
5188
|
+
"dictionary",
|
|
5189
|
+
"set",
|
|
5190
|
+
"tuple",
|
|
5191
|
+
"indexed_collection",
|
|
5192
|
+
"collection",
|
|
5193
|
+
"scalar",
|
|
5194
|
+
"value",
|
|
5195
|
+
"function",
|
|
5196
|
+
"expression"
|
|
5197
|
+
];
|
|
5198
|
+
var PRIMITIVE_SUPERTYPE_CACHE = /* @__PURE__ */ new Map();
|
|
5149
5199
|
function superType(a, b) {
|
|
5150
5200
|
if (a === b) return a;
|
|
5151
5201
|
if (a === "any" || b === "any") return "any";
|
|
@@ -5155,34 +5205,185 @@ function superType(a, b) {
|
|
|
5155
5205
|
if (b === "unknown") return a;
|
|
5156
5206
|
if (a === "nothing") return b;
|
|
5157
5207
|
if (b === "nothing") return a;
|
|
5158
|
-
if (
|
|
5159
|
-
|
|
5160
|
-
|
|
5161
|
-
|
|
5162
|
-
|
|
5163
|
-
|
|
5164
|
-
|
|
5165
|
-
|
|
5166
|
-
|
|
5167
|
-
|
|
5168
|
-
|
|
5169
|
-
|
|
5170
|
-
|
|
5171
|
-
|
|
5172
|
-
|
|
5173
|
-
|
|
5174
|
-
|
|
5175
|
-
|
|
5176
|
-
if (commonSupertype(a, b, "collection")) return "collection";
|
|
5177
|
-
if (commonSupertype(a, b, "scalar")) return "scalar";
|
|
5178
|
-
if (commonSupertype(a, b, "value")) return "value";
|
|
5179
|
-
if (commonSupertype(a, b, "function")) return "function";
|
|
5180
|
-
if (commonSupertype(a, b, "expression")) return "expression";
|
|
5208
|
+
if (typeof a === "string" && typeof b === "string") {
|
|
5209
|
+
const key = a < b ? `${a}|${b}` : `${b}|${a}`;
|
|
5210
|
+
let result = PRIMITIVE_SUPERTYPE_CACHE.get(key);
|
|
5211
|
+
if (result === void 0) {
|
|
5212
|
+
result = "any";
|
|
5213
|
+
for (const ancestor of SUPERTYPE_PROBE_ORDER) {
|
|
5214
|
+
const subtypes = PRIMITIVE_SUBTYPES_CLOSURE[ancestor];
|
|
5215
|
+
if (subtypes.has(a) && subtypes.has(b)) {
|
|
5216
|
+
result = ancestor;
|
|
5217
|
+
break;
|
|
5218
|
+
}
|
|
5219
|
+
}
|
|
5220
|
+
PRIMITIVE_SUPERTYPE_CACHE.set(key, result);
|
|
5221
|
+
}
|
|
5222
|
+
return result;
|
|
5223
|
+
}
|
|
5224
|
+
for (const ancestor of SUPERTYPE_PROBE_ORDER)
|
|
5225
|
+
if (isSubtype(a, ancestor) && isSubtype(b, ancestor)) return ancestor;
|
|
5181
5226
|
return "any";
|
|
5182
5227
|
}
|
|
5183
|
-
|
|
5184
|
-
|
|
5185
|
-
|
|
5228
|
+
|
|
5229
|
+
// src/common/type/serialize.ts
|
|
5230
|
+
var NEGATION_PRECEDENCE = 3;
|
|
5231
|
+
var UNION_PRECEDENCE = 1;
|
|
5232
|
+
var INTERSECTION_PRECEDENCE = 2;
|
|
5233
|
+
var LIST_PRECEDENCE = 4;
|
|
5234
|
+
var RECORD_PRECEDENCE = 5;
|
|
5235
|
+
var DICTIONARY_PRECEDENCE = 6;
|
|
5236
|
+
var SET_PRECEDENCE = 7;
|
|
5237
|
+
var COLLECTION_PRECEDENCE = 8;
|
|
5238
|
+
var TUPLE_PRECEDENCE = 9;
|
|
5239
|
+
var SIGNATURE_PRECEDENCE = 10;
|
|
5240
|
+
var VALUE_PRECEDENCE = 11;
|
|
5241
|
+
function typeToString(type, precedence = 0) {
|
|
5242
|
+
if (typeof type === "string") return type;
|
|
5243
|
+
let result = "";
|
|
5244
|
+
switch (type.kind) {
|
|
5245
|
+
case "value":
|
|
5246
|
+
if (typeof type.value === "string") result = `"${type.value}"`;
|
|
5247
|
+
else if (typeof type.value === "boolean")
|
|
5248
|
+
result = type.value ? "true" : "false";
|
|
5249
|
+
else result = type.value.toString();
|
|
5250
|
+
break;
|
|
5251
|
+
case "reference":
|
|
5252
|
+
result = type.name;
|
|
5253
|
+
break;
|
|
5254
|
+
case "negation":
|
|
5255
|
+
result = `!${typeToString(type.type, NEGATION_PRECEDENCE)}`;
|
|
5256
|
+
break;
|
|
5257
|
+
case "union":
|
|
5258
|
+
result = type.types.map((t) => typeToString(t, UNION_PRECEDENCE)).join(" | ");
|
|
5259
|
+
break;
|
|
5260
|
+
case "intersection":
|
|
5261
|
+
result = type.types.map((t) => typeToString(t, INTERSECTION_PRECEDENCE)).join(" & ");
|
|
5262
|
+
break;
|
|
5263
|
+
case "expression":
|
|
5264
|
+
result = `expression<${symbolName(type.operator)}>`;
|
|
5265
|
+
break;
|
|
5266
|
+
case "symbol":
|
|
5267
|
+
result = `symbol<${symbolName(type.name)}>`;
|
|
5268
|
+
break;
|
|
5269
|
+
case "numeric":
|
|
5270
|
+
if (Number.isFinite(type.lower) && Number.isFinite(type.upper)) {
|
|
5271
|
+
result = `${type.type}<${type.lower}..${type.upper}>`;
|
|
5272
|
+
} else if (Number.isFinite(type.lower)) {
|
|
5273
|
+
result = `${type.type}<${type.lower}..>`;
|
|
5274
|
+
} else if (Number.isFinite(type.upper)) {
|
|
5275
|
+
result = `${type.type}<..${type.upper}>`;
|
|
5276
|
+
} else {
|
|
5277
|
+
result = `${type.type}`;
|
|
5278
|
+
}
|
|
5279
|
+
break;
|
|
5280
|
+
case "list":
|
|
5281
|
+
if (type.dimensions && typeof type.elements === "string" && NUMERIC_TYPES_SET.has(type.elements)) {
|
|
5282
|
+
if (type.dimensions === void 0) {
|
|
5283
|
+
if (type.elements === "number") result = "tensor";
|
|
5284
|
+
} else if (type.dimensions.length === 1) {
|
|
5285
|
+
if (type.elements === "number") {
|
|
5286
|
+
if (type.dimensions[0] < 0) result = "vector";
|
|
5287
|
+
else result = `vector<${type.dimensions[0]}>`;
|
|
5288
|
+
} else {
|
|
5289
|
+
if (type.dimensions[0] < 0)
|
|
5290
|
+
result = `vector<${typeToString(type.elements)}>`;
|
|
5291
|
+
else
|
|
5292
|
+
result = `vector<${typeToString(type.elements)}^${type.dimensions[0]}>`;
|
|
5293
|
+
}
|
|
5294
|
+
} else if (type.dimensions.length === 2) {
|
|
5295
|
+
const dims = type.dimensions;
|
|
5296
|
+
if (type.elements === "number") {
|
|
5297
|
+
if (dims[0] < 0 && dims[1] < 0) result = "matrix";
|
|
5298
|
+
else result = `matrix<${dims[0]}x${dims[1]}>`;
|
|
5299
|
+
} else {
|
|
5300
|
+
if (dims[0] < 0 && dims[1] < 0)
|
|
5301
|
+
result = `matrix<${typeToString(type.elements)}>`;
|
|
5302
|
+
else
|
|
5303
|
+
result = `matrix<${typeToString(type.elements)}^(${dims[0]}x${dims[1]})>`;
|
|
5304
|
+
}
|
|
5305
|
+
}
|
|
5306
|
+
}
|
|
5307
|
+
if (!result) {
|
|
5308
|
+
const dimensions = type.dimensions ? type.dimensions.length === 1 ? `^${type.dimensions[0].toString()}` : `^(${type.dimensions.join("x")})` : "";
|
|
5309
|
+
result = `list<${typeToString(type.elements)}${dimensions}>`;
|
|
5310
|
+
}
|
|
5311
|
+
break;
|
|
5312
|
+
case "record":
|
|
5313
|
+
const elements = Object.entries(type.elements).map(([key, value]) => `${key}: ${typeToString(value)}`).join(", ");
|
|
5314
|
+
result = `record<${elements}>`;
|
|
5315
|
+
break;
|
|
5316
|
+
case "dictionary":
|
|
5317
|
+
result = `dictionary<${typeToString(type.values)}>`;
|
|
5318
|
+
break;
|
|
5319
|
+
case "set":
|
|
5320
|
+
result = `set<${typeToString(type.elements)}>`;
|
|
5321
|
+
break;
|
|
5322
|
+
case "collection":
|
|
5323
|
+
result = `collection<${typeToString(type.elements)}>`;
|
|
5324
|
+
break;
|
|
5325
|
+
case "indexed_collection":
|
|
5326
|
+
result = `indexed_collection<${typeToString(type.elements)}>`;
|
|
5327
|
+
break;
|
|
5328
|
+
case "tuple":
|
|
5329
|
+
if (type.elements.length === 0) result = "tuple";
|
|
5330
|
+
else if (type.elements.length === 1) {
|
|
5331
|
+
const [el] = type.elements;
|
|
5332
|
+
result = `tuple<${namedElement(el)}>`;
|
|
5333
|
+
} else {
|
|
5334
|
+
result = "tuple<" + type.elements.map((el) => namedElement(el)).join(", ") + ">";
|
|
5335
|
+
}
|
|
5336
|
+
break;
|
|
5337
|
+
case "signature":
|
|
5338
|
+
const args = type.args ? type.args.map((arg) => namedElement(arg)).join(", ") : "";
|
|
5339
|
+
const optArgs = type.optArgs ? type.optArgs.map((arg) => namedElement(arg) + "?").join(", ") : "";
|
|
5340
|
+
const varArg = type.variadicArg ? type.variadicMin === 0 ? `${namedElement(type.variadicArg)}*` : `${namedElement(type.variadicArg)}+` : "";
|
|
5341
|
+
const argsList = [args, optArgs, varArg].filter((s) => s).join(", ");
|
|
5342
|
+
result = `(${argsList}) -> ${typeToString(type.result)}`;
|
|
5343
|
+
break;
|
|
5344
|
+
default:
|
|
5345
|
+
result = "error";
|
|
5346
|
+
}
|
|
5347
|
+
if (precedence > 0 && precedence > getPrecedence(type.kind))
|
|
5348
|
+
return `(${result})`;
|
|
5349
|
+
return result;
|
|
5350
|
+
}
|
|
5351
|
+
function namedElement(el) {
|
|
5352
|
+
if (el.name) return `${el.name}: ${typeToString(el.type)}`;
|
|
5353
|
+
return typeToString(el.type);
|
|
5354
|
+
}
|
|
5355
|
+
function symbolName(name) {
|
|
5356
|
+
if (/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) return name;
|
|
5357
|
+
return `\`${name}\``;
|
|
5358
|
+
}
|
|
5359
|
+
function getPrecedence(kind) {
|
|
5360
|
+
switch (kind) {
|
|
5361
|
+
case "negation":
|
|
5362
|
+
return NEGATION_PRECEDENCE;
|
|
5363
|
+
case "union":
|
|
5364
|
+
return UNION_PRECEDENCE;
|
|
5365
|
+
case "intersection":
|
|
5366
|
+
return INTERSECTION_PRECEDENCE;
|
|
5367
|
+
case "list":
|
|
5368
|
+
return LIST_PRECEDENCE;
|
|
5369
|
+
case "record":
|
|
5370
|
+
return RECORD_PRECEDENCE;
|
|
5371
|
+
case "dictionary":
|
|
5372
|
+
return DICTIONARY_PRECEDENCE;
|
|
5373
|
+
case "set":
|
|
5374
|
+
return SET_PRECEDENCE;
|
|
5375
|
+
case "collection":
|
|
5376
|
+
case "indexed_collection":
|
|
5377
|
+
return COLLECTION_PRECEDENCE;
|
|
5378
|
+
case "tuple":
|
|
5379
|
+
return TUPLE_PRECEDENCE;
|
|
5380
|
+
case "signature":
|
|
5381
|
+
return SIGNATURE_PRECEDENCE;
|
|
5382
|
+
case "value":
|
|
5383
|
+
return VALUE_PRECEDENCE;
|
|
5384
|
+
default:
|
|
5385
|
+
return 0;
|
|
5386
|
+
}
|
|
5186
5387
|
}
|
|
5187
5388
|
|
|
5188
5389
|
// src/common/type/boxed-type.ts
|
|
@@ -5242,6 +5443,12 @@ var BoxedType = class _BoxedType {
|
|
|
5242
5443
|
}
|
|
5243
5444
|
};
|
|
5244
5445
|
|
|
5446
|
+
// src/compute-engine/boxed-expression/constraint-subject.ts
|
|
5447
|
+
var EMPTY_FACT_INDEX = Object.freeze({
|
|
5448
|
+
bySubject: /* @__PURE__ */ new Map(),
|
|
5449
|
+
membership: /* @__PURE__ */ new Map()
|
|
5450
|
+
});
|
|
5451
|
+
|
|
5245
5452
|
// src/compute-engine/boxed-expression/stochastic-equal.ts
|
|
5246
5453
|
var WELL_KNOWN_POINTS = [
|
|
5247
5454
|
0,
|
|
@@ -5347,12 +5554,14 @@ function dictionaryFromExpression(expr) {
|
|
|
5347
5554
|
if (expr === null) return null;
|
|
5348
5555
|
if (isDictionaryObject(expr)) return expr;
|
|
5349
5556
|
const kv = keyValuePair(expr);
|
|
5350
|
-
if (kv)
|
|
5557
|
+
if (kv)
|
|
5558
|
+
return {
|
|
5559
|
+
dict: { [kv[0]]: expressionToDictionaryValue(kv[1]) ?? "Nothing" }
|
|
5560
|
+
};
|
|
5351
5561
|
if (operator(expr) === "Dictionary") {
|
|
5352
5562
|
const dict = {};
|
|
5353
|
-
const
|
|
5354
|
-
|
|
5355
|
-
const kv2 = keyValuePair(ops[i]);
|
|
5563
|
+
for (const op of operands(expr)) {
|
|
5564
|
+
const kv2 = keyValuePair(op);
|
|
5356
5565
|
if (kv2) {
|
|
5357
5566
|
dict[kv2[0]] = expressionToDictionaryValue(kv2[1]) ?? "Nothing";
|
|
5358
5567
|
}
|
|
@@ -7286,6 +7495,7 @@ var DEFINITIONS_CORE = [
|
|
|
7286
7495
|
}
|
|
7287
7496
|
}
|
|
7288
7497
|
if (!variable) return null;
|
|
7498
|
+
if (symbol(variable) === null) return null;
|
|
7289
7499
|
parser.skipSpace();
|
|
7290
7500
|
const fn = parser.parseExpression({ minPrec: 740 });
|
|
7291
7501
|
if (!fn) return null;
|
|
@@ -7472,7 +7682,7 @@ function parseTextRun(parser, style) {
|
|
|
7472
7682
|
if (runs.length === 1) body = runs[0];
|
|
7473
7683
|
else {
|
|
7474
7684
|
if (runs.every((x) => stringValue(x) !== null))
|
|
7475
|
-
body = "'" + runs.map((x) => stringValue(x)).join() + "'";
|
|
7685
|
+
body = "'" + runs.map((x) => stringValue(x)).join("") + "'";
|
|
7476
7686
|
else body = ["Text", ...runs];
|
|
7477
7687
|
}
|
|
7478
7688
|
return style ? ["Annotated", body, dictionaryFromEntries(style)] : body;
|
|
@@ -9005,6 +9215,8 @@ function serializeMultiply(serializer, expr) {
|
|
|
9005
9215
|
const h = operator(arg);
|
|
9006
9216
|
if (prevWasNumber && (h === "Divide" || h === "Rational")) {
|
|
9007
9217
|
result = latexTemplate(serializer.options.multiply, result, term);
|
|
9218
|
+
} else if (/^\d/.test(term)) {
|
|
9219
|
+
result = latexTemplate(serializer.options.multiply, result, term);
|
|
9008
9220
|
} else if (!serializer.options.invisibleMultiply) {
|
|
9009
9221
|
result = joinLatex([result, term]);
|
|
9010
9222
|
} else {
|
|
@@ -10450,7 +10662,8 @@ function parseTrig(op) {
|
|
|
10450
10662
|
minPrec: MULTIPLICATION_PRECEDENCE,
|
|
10451
10663
|
condition: (parser2) => trigCommands[parser2.peek] || (until?.condition?.(parser2) ?? false)
|
|
10452
10664
|
});
|
|
10453
|
-
const
|
|
10665
|
+
const isTwoArgArctan = args?.length === 2 && (fn === "Arctan" || Array.isArray(fn) && fn[0] === "InverseFunction" && fn[1] === "Tan");
|
|
10666
|
+
const head = isTwoArgArctan ? "Arctan2" : fn;
|
|
10454
10667
|
const appliedFn = args === null ? fn : typeof head === "string" ? [head, ...args] : ["Apply", head, ...args];
|
|
10455
10668
|
return sup === null ? appliedFn : ["Power", appliedFn, sup];
|
|
10456
10669
|
};
|
|
@@ -12737,6 +12950,30 @@ var POSSIBLE_EMOJI = `(?:${ZWJ_ELEMENT})(${ZWJ}${ZWJ_ELEMENT})*`;
|
|
|
12737
12950
|
var SOME_EMOJI = new RegExp(`(?:${POSSIBLE_EMOJI})+`, "u");
|
|
12738
12951
|
var EMOJIS = new RegExp(`^(?:${POSSIBLE_EMOJI})+$`, "u");
|
|
12739
12952
|
|
|
12953
|
+
// src/compute-engine/latex-syntax/parse.ts
|
|
12954
|
+
var PARSE_TOKEN_EXCLUDED = /* @__PURE__ */ new Set([
|
|
12955
|
+
...'!"#$%&(),/;:?@[]\\`|~'.split(""),
|
|
12956
|
+
"\\left",
|
|
12957
|
+
"\\bigl",
|
|
12958
|
+
"\\mleft"
|
|
12959
|
+
]);
|
|
12960
|
+
var TEX_UNIT_TOKENS = [
|
|
12961
|
+
"pt",
|
|
12962
|
+
"em",
|
|
12963
|
+
"mu",
|
|
12964
|
+
"ex",
|
|
12965
|
+
"mm",
|
|
12966
|
+
"cm",
|
|
12967
|
+
"in",
|
|
12968
|
+
"bp",
|
|
12969
|
+
"sp",
|
|
12970
|
+
"dd",
|
|
12971
|
+
"cc",
|
|
12972
|
+
"pc",
|
|
12973
|
+
"nc",
|
|
12974
|
+
"nd"
|
|
12975
|
+
].map((unit) => [...unit]);
|
|
12976
|
+
|
|
12740
12977
|
// src/compute-engine/boxed-expression/expand.ts
|
|
12741
12978
|
var binomials = [
|
|
12742
12979
|
[1],
|
|
@@ -13038,6 +13275,7 @@ function mod(a, b) {
|
|
|
13038
13275
|
const period = Math.abs(
|
|
13039
13276
|
bVal.lo === bVal.hi ? bVal.lo : Math.max(Math.abs(bVal.lo), Math.abs(bVal.hi))
|
|
13040
13277
|
);
|
|
13278
|
+
const divisorNegative = bVal.hi < 0;
|
|
13041
13279
|
const flo = Math.floor(aVal.lo / period);
|
|
13042
13280
|
const fhi = Math.floor(aVal.hi / period);
|
|
13043
13281
|
if (flo !== fhi) {
|
|
@@ -13045,6 +13283,11 @@ function mod(a, b) {
|
|
|
13045
13283
|
}
|
|
13046
13284
|
const modLo = aVal.lo - period * flo;
|
|
13047
13285
|
const modHi = aVal.hi - period * flo;
|
|
13286
|
+
if (divisorNegative) {
|
|
13287
|
+
if (modLo === 0)
|
|
13288
|
+
return { kind: "singular", at: aVal.lo, continuity: "right" };
|
|
13289
|
+
return ok({ lo: modLo - period, hi: modHi - period });
|
|
13290
|
+
}
|
|
13048
13291
|
return ok({ lo: Math.min(modLo, modHi), hi: Math.max(modLo, modHi) });
|
|
13049
13292
|
}
|
|
13050
13293
|
function remainder(a, b) {
|
|
@@ -13076,6 +13319,23 @@ function gamma2(x) {
|
|
|
13076
13319
|
const [xVal] = unwrapped;
|
|
13077
13320
|
return _gamma(xVal);
|
|
13078
13321
|
}
|
|
13322
|
+
var GAMMA_NEG_EXTREMA_X = [
|
|
13323
|
+
-0.504083008264455,
|
|
13324
|
+
-1.573498473162391,
|
|
13325
|
+
-2.610720868444145,
|
|
13326
|
+
-3.635293366436901,
|
|
13327
|
+
-4.653163765628266,
|
|
13328
|
+
-5.667162441556885,
|
|
13329
|
+
-6.678418213073426,
|
|
13330
|
+
-7.687788325031709,
|
|
13331
|
+
-8.695764163640956,
|
|
13332
|
+
-9.702672540001863
|
|
13333
|
+
];
|
|
13334
|
+
function gammaNegStripExtremum(lo) {
|
|
13335
|
+
const n = Math.floor(lo);
|
|
13336
|
+
const idx = -n - 1;
|
|
13337
|
+
return idx >= 0 && idx < GAMMA_NEG_EXTREMA_X.length ? GAMMA_NEG_EXTREMA_X[idx] : null;
|
|
13338
|
+
}
|
|
13079
13339
|
function _gamma(x) {
|
|
13080
13340
|
if (x.hi >= 0 && x.lo <= 0) {
|
|
13081
13341
|
return { kind: "singular", at: 0 };
|
|
@@ -13088,7 +13348,21 @@ function _gamma(x) {
|
|
|
13088
13348
|
}
|
|
13089
13349
|
const gLo = gamma(x.lo);
|
|
13090
13350
|
const gHi = gamma(x.hi);
|
|
13091
|
-
|
|
13351
|
+
let lo = Math.min(gLo, gHi);
|
|
13352
|
+
let hi = Math.max(gLo, gHi);
|
|
13353
|
+
const xStar = gammaNegStripExtremum(x.lo);
|
|
13354
|
+
if (xStar !== null) {
|
|
13355
|
+
if (xStar >= x.lo && xStar <= x.hi) {
|
|
13356
|
+
const g = gamma(xStar);
|
|
13357
|
+
lo = Math.min(lo, g);
|
|
13358
|
+
hi = Math.max(hi, g);
|
|
13359
|
+
}
|
|
13360
|
+
} else {
|
|
13361
|
+
const stripEven = Math.floor(x.lo) % 2 === 0;
|
|
13362
|
+
if (stripEven) lo = Math.min(lo, 0);
|
|
13363
|
+
else hi = Math.max(hi, 0);
|
|
13364
|
+
}
|
|
13365
|
+
return ok({ lo, hi });
|
|
13092
13366
|
}
|
|
13093
13367
|
if (x.lo >= GAMMA_MIN_X) {
|
|
13094
13368
|
return ok({ lo: gamma(x.lo), hi: gamma(x.hi) });
|
|
@@ -13119,7 +13393,15 @@ function _gammaln(x) {
|
|
|
13119
13393
|
}
|
|
13120
13394
|
const gLo = gammaln(x.lo);
|
|
13121
13395
|
const gHi = gammaln(x.hi);
|
|
13122
|
-
|
|
13396
|
+
let lo = Math.min(gLo, gHi);
|
|
13397
|
+
const hi = Math.max(gLo, gHi);
|
|
13398
|
+
const xStar = gammaNegStripExtremum(x.lo);
|
|
13399
|
+
if (xStar !== null) {
|
|
13400
|
+
if (xStar >= x.lo && xStar <= x.hi) lo = Math.min(lo, gammaln(xStar));
|
|
13401
|
+
} else {
|
|
13402
|
+
lo = -Infinity;
|
|
13403
|
+
}
|
|
13404
|
+
return ok({ lo, hi });
|
|
13123
13405
|
}
|
|
13124
13406
|
return ok({ lo: gammaln(x.lo), hi: gammaln(x.hi) });
|
|
13125
13407
|
}
|
|
@@ -13145,6 +13427,33 @@ function factorial22(x) {
|
|
|
13145
13427
|
return ok({ lo: Math.min(fLo, fHi), hi: Math.max(fLo, fHi) });
|
|
13146
13428
|
return ok({ lo: fLo, hi: fHi });
|
|
13147
13429
|
}
|
|
13430
|
+
var MAX_INT_ENUM_POINTS = 4096;
|
|
13431
|
+
function integerPoints(lo, hi, cap) {
|
|
13432
|
+
const a = Math.round(lo);
|
|
13433
|
+
const b = Math.round(hi);
|
|
13434
|
+
if (!Number.isFinite(a) || !Number.isFinite(b)) return null;
|
|
13435
|
+
if (b - a + 1 > cap) return null;
|
|
13436
|
+
const out = [];
|
|
13437
|
+
for (let i = a; i <= b; i++) out.push(i);
|
|
13438
|
+
return out;
|
|
13439
|
+
}
|
|
13440
|
+
function enumerateInteger2(a, b, f) {
|
|
13441
|
+
const xs = integerPoints(a.lo, a.hi, MAX_INT_ENUM_POINTS);
|
|
13442
|
+
const ys = integerPoints(b.lo, b.hi, MAX_INT_ENUM_POINTS);
|
|
13443
|
+
if (!xs || !ys || xs.length * ys.length > MAX_INT_ENUM_POINTS) return null;
|
|
13444
|
+
let lo = Infinity;
|
|
13445
|
+
let hi = -Infinity;
|
|
13446
|
+
for (const x of xs)
|
|
13447
|
+
for (const y of ys) {
|
|
13448
|
+
const v = f(x, y);
|
|
13449
|
+
if (Number.isFinite(v)) {
|
|
13450
|
+
if (v < lo) lo = v;
|
|
13451
|
+
if (v > hi) hi = v;
|
|
13452
|
+
}
|
|
13453
|
+
}
|
|
13454
|
+
if (lo === Infinity) return null;
|
|
13455
|
+
return ok({ lo, hi });
|
|
13456
|
+
}
|
|
13148
13457
|
function binomial(n, k) {
|
|
13149
13458
|
const uN = unwrapOrPropagate(n);
|
|
13150
13459
|
if (!Array.isArray(uN)) return uN;
|
|
@@ -13152,13 +13461,10 @@ function binomial(n, k) {
|
|
|
13152
13461
|
if (!Array.isArray(uK)) return uK;
|
|
13153
13462
|
const [nVal] = uN;
|
|
13154
13463
|
const [kVal] = uK;
|
|
13155
|
-
const
|
|
13156
|
-
|
|
13157
|
-
|
|
13158
|
-
|
|
13159
|
-
choose(Math.round(nVal.hi), Math.round(kVal.hi))
|
|
13160
|
-
];
|
|
13161
|
-
return ok({ lo: Math.min(...vals), hi: Math.max(...vals) });
|
|
13464
|
+
const enumerated = enumerateInteger2(nVal, kVal, choose);
|
|
13465
|
+
if (enumerated) return enumerated;
|
|
13466
|
+
const nMax = Math.round(nVal.hi);
|
|
13467
|
+
return ok({ lo: 0, hi: choose(nMax, Math.floor(nMax / 2)) });
|
|
13162
13468
|
}
|
|
13163
13469
|
function gcd3(a, b) {
|
|
13164
13470
|
const uA = unwrapOrPropagate(a);
|
|
@@ -13167,13 +13473,15 @@ function gcd3(a, b) {
|
|
|
13167
13473
|
if (!Array.isArray(uB)) return uB;
|
|
13168
13474
|
const [aVal] = uA;
|
|
13169
13475
|
const [bVal] = uB;
|
|
13170
|
-
const
|
|
13171
|
-
|
|
13172
|
-
|
|
13173
|
-
|
|
13174
|
-
|
|
13175
|
-
|
|
13176
|
-
|
|
13476
|
+
const enumerated = enumerateInteger2(aVal, bVal, gcd);
|
|
13477
|
+
if (enumerated) return enumerated;
|
|
13478
|
+
const m = Math.max(
|
|
13479
|
+
Math.abs(Math.round(aVal.lo)),
|
|
13480
|
+
Math.abs(Math.round(aVal.hi)),
|
|
13481
|
+
Math.abs(Math.round(bVal.lo)),
|
|
13482
|
+
Math.abs(Math.round(bVal.hi))
|
|
13483
|
+
);
|
|
13484
|
+
return ok({ lo: 0, hi: m });
|
|
13177
13485
|
}
|
|
13178
13486
|
function lcm3(a, b) {
|
|
13179
13487
|
const uA = unwrapOrPropagate(a);
|
|
@@ -13182,13 +13490,11 @@ function lcm3(a, b) {
|
|
|
13182
13490
|
if (!Array.isArray(uB)) return uB;
|
|
13183
13491
|
const [aVal] = uA;
|
|
13184
13492
|
const [bVal] = uB;
|
|
13185
|
-
const
|
|
13186
|
-
|
|
13187
|
-
|
|
13188
|
-
|
|
13189
|
-
|
|
13190
|
-
];
|
|
13191
|
-
return ok({ lo: Math.min(...vals), hi: Math.max(...vals) });
|
|
13493
|
+
const enumerated = enumerateInteger2(aVal, bVal, lcm);
|
|
13494
|
+
if (enumerated) return enumerated;
|
|
13495
|
+
const ma = Math.max(Math.abs(Math.round(aVal.lo)), Math.abs(Math.round(aVal.hi)));
|
|
13496
|
+
const mb = Math.max(Math.abs(Math.round(bVal.lo)), Math.abs(Math.round(bVal.hi)));
|
|
13497
|
+
return ok({ lo: 0, hi: ma * mb });
|
|
13192
13498
|
}
|
|
13193
13499
|
function chop2(x) {
|
|
13194
13500
|
const unwrapped = unwrapOrPropagate(x);
|
|
@@ -13580,7 +13886,6 @@ var SINC_EXTREMA = [
|
|
|
13580
13886
|
29.8116,
|
|
13581
13887
|
32.95639
|
|
13582
13888
|
];
|
|
13583
|
-
var SINC_GLOBAL_LO = -0.21724;
|
|
13584
13889
|
function sinc(x) {
|
|
13585
13890
|
const unwrapped = unwrapOrPropagate(x);
|
|
13586
13891
|
if (!Array.isArray(unwrapped)) return unwrapped;
|
|
@@ -13601,8 +13906,14 @@ function sinc(x) {
|
|
|
13601
13906
|
if (e >= xVal.lo && e <= xVal.hi) update(sincVal(e));
|
|
13602
13907
|
if (-e >= xVal.lo && -e <= xVal.hi) update(sincVal(-e));
|
|
13603
13908
|
}
|
|
13604
|
-
|
|
13605
|
-
|
|
13909
|
+
let minBeyondAbs = Infinity;
|
|
13910
|
+
if (xVal.hi > lastExtremum)
|
|
13911
|
+
minBeyondAbs = Math.min(minBeyondAbs, Math.max(xVal.lo, lastExtremum));
|
|
13912
|
+
if (xVal.lo < -lastExtremum)
|
|
13913
|
+
minBeyondAbs = Math.min(minBeyondAbs, -Math.min(xVal.hi, -lastExtremum));
|
|
13914
|
+
if (Number.isFinite(minBeyondAbs) && minBeyondAbs > 0) {
|
|
13915
|
+
update(1 / minBeyondAbs);
|
|
13916
|
+
update(-1 / minBeyondAbs);
|
|
13606
13917
|
}
|
|
13607
13918
|
return ok({ lo, hi });
|
|
13608
13919
|
}
|
|
@@ -13628,8 +13939,21 @@ function fresnelS2(x) {
|
|
|
13628
13939
|
if (e >= xVal.lo && e <= xVal.hi) update(fresnelS(e));
|
|
13629
13940
|
if (-e >= xVal.lo && -e <= xVal.hi) update(fresnelS(-e));
|
|
13630
13941
|
}
|
|
13942
|
+
fresnelConvergenceBound(xVal, FRESNEL_S_EXTREMA, fresnelS, update);
|
|
13631
13943
|
return ok({ lo, hi });
|
|
13632
13944
|
}
|
|
13945
|
+
function fresnelConvergenceBound(xVal, extrema, scalar, update) {
|
|
13946
|
+
const lastE = extrema[extrema.length - 1];
|
|
13947
|
+
const amp = Math.abs(scalar(lastE) - 0.5);
|
|
13948
|
+
if (xVal.hi > lastE) {
|
|
13949
|
+
update(0.5 + amp);
|
|
13950
|
+
update(0.5 - amp);
|
|
13951
|
+
}
|
|
13952
|
+
if (xVal.lo < -lastE) {
|
|
13953
|
+
update(-0.5 - amp);
|
|
13954
|
+
update(-0.5 + amp);
|
|
13955
|
+
}
|
|
13956
|
+
}
|
|
13633
13957
|
function fresnelC2(x) {
|
|
13634
13958
|
const unwrapped = unwrapOrPropagate(x);
|
|
13635
13959
|
if (!Array.isArray(unwrapped)) return unwrapped;
|
|
@@ -13646,6 +13970,7 @@ function fresnelC2(x) {
|
|
|
13646
13970
|
if (e >= xVal.lo && e <= xVal.hi) update(fresnelC(e));
|
|
13647
13971
|
if (-e >= xVal.lo && -e <= xVal.hi) update(fresnelC(-e));
|
|
13648
13972
|
}
|
|
13973
|
+
fresnelConvergenceBound(xVal, FRESNEL_C_EXTREMA, fresnelC, update);
|
|
13649
13974
|
return ok({ lo, hi });
|
|
13650
13975
|
}
|
|
13651
13976
|
|
|
@@ -13753,11 +14078,9 @@ function clamp(x, lo, hi) {
|
|
|
13753
14078
|
const unwrapped = unwrapOrPropagate(x, lo, hi);
|
|
13754
14079
|
if (!Array.isArray(unwrapped)) return unwrapped;
|
|
13755
14080
|
const [xVal, loVal, hiVal] = unwrapped;
|
|
13756
|
-
const
|
|
13757
|
-
const
|
|
13758
|
-
|
|
13759
|
-
return { kind: "empty" };
|
|
13760
|
-
}
|
|
14081
|
+
const lowered = { lo: Math.max(xVal.lo, loVal.lo), hi: Math.max(xVal.hi, loVal.hi) };
|
|
14082
|
+
const resultLo = Math.min(lowered.lo, hiVal.lo);
|
|
14083
|
+
const resultHi = Math.min(lowered.hi, hiVal.hi);
|
|
13761
14084
|
return { kind: "interval", value: { lo: resultLo, hi: resultHi } };
|
|
13762
14085
|
}
|
|
13763
14086
|
|
|
@@ -13863,7 +14186,7 @@ var IntervalArithmetic = {
|
|
|
13863
14186
|
};
|
|
13864
14187
|
|
|
13865
14188
|
// src/interval.ts
|
|
13866
|
-
var version = "0.
|
|
14189
|
+
var version = "0.59.0";
|
|
13867
14190
|
export {
|
|
13868
14191
|
IntervalArithmetic,
|
|
13869
14192
|
_mul,
|