@cortex-js/compute-engine 0.55.5 → 0.55.6
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/dist/compile.esm.js +138 -633
- package/dist/compile.min.esm.js +71 -493
- package/dist/compile.min.umd.cjs +71 -493
- package/dist/compile.umd.cjs +138 -633
- package/dist/compute-engine.esm.js +227 -651
- package/dist/compute-engine.min.esm.js +68 -489
- package/dist/compute-engine.min.umd.cjs +68 -489
- package/dist/compute-engine.umd.cjs +227 -651
- package/dist/core.esm.js +226 -650
- package/dist/core.min.esm.js +66 -487
- package/dist/core.min.umd.cjs +67 -488
- package/dist/core.umd.cjs +226 -650
- package/dist/interval.esm.js +136 -60
- package/dist/interval.min.esm.js +7 -7
- package/dist/interval.min.umd.cjs +7 -7
- package/dist/interval.umd.cjs +136 -60
- package/dist/latex-syntax.esm.js +219 -74
- package/dist/latex-syntax.min.esm.js +7 -6
- package/dist/latex-syntax.min.umd.cjs +7 -6
- package/dist/latex-syntax.umd.cjs +219 -74
- package/dist/math-json.esm.js +2 -2
- package/dist/math-json.min.esm.js +2 -2
- package/dist/math-json.min.umd.cjs +2 -2
- package/dist/math-json.umd.cjs +2 -2
- package/dist/numerics.esm.js +2 -2
- package/dist/numerics.min.esm.js +2 -2
- package/dist/numerics.min.umd.cjs +2 -2
- package/dist/numerics.umd.cjs +2 -2
- 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 -1
- package/dist/types/common/type/parser.d.ts +1 -1
- package/dist/types/common/type/primitive.d.ts +1 -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 +1 -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 +1 -1
- 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 +1 -1
- 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/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 +1 -1
- 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/rules.d.ts +1 -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 +2 -3
- package/dist/types/compute-engine/compilation/constant-folding.d.ts +1 -1
- package/dist/types/compute-engine/compilation/glsl-target.d.ts +1 -1
- package/dist/types/compute-engine/compilation/gpu-target.d.ts +1 -54
- package/dist/types/compute-engine/compilation/interval-javascript-target.d.ts +1 -1
- 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 -67
- 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 +1 -1
- 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/global-types.d.ts +1 -1
- package/dist/types/compute-engine/index.d.ts +2 -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 +1 -1
- package/dist/types/compute-engine/interval/index.d.ts +1 -1
- 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-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 +1 -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 +1 -1
- 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 -1
- package/dist/types/compute-engine/latex-syntax/serializer-style.d.ts +1 -1
- package/dist/types/compute-engine/latex-syntax/serializer.d.ts +4 -2
- 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 +1 -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 +1 -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 +1 -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/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 +1 -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/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 +1 -1
- 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 +1 -1
- package/dist/types/compute-engine/types-definitions.d.ts +1 -1
- package/dist/types/compute-engine/types-engine.d.ts +1 -1
- package/dist/types/compute-engine/types-evaluation.d.ts +1 -1
- package/dist/types/compute-engine/types-expression.d.ts +1 -1
- package/dist/types/compute-engine/types-kernel-evaluation.d.ts +1 -1
- package/dist/types/compute-engine/types-kernel-serialization.d.ts +1 -1
- 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 +2 -2
- package/dist/types/core.d.ts +1 -1
- 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 +1 -1
- package/dist/types/compute-engine/compilation/fractal-orbit.d.ts +0 -19
package/dist/core.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Compute Engine 0.55.
|
|
1
|
+
/** Compute Engine 0.55.6 */
|
|
2
2
|
|
|
3
3
|
// node_modules/complex-esm/dist/src/complex.js
|
|
4
4
|
var cosh = Math.cosh || function(x) {
|
|
@@ -11037,10 +11037,6 @@ var DEFINITIONS_CORE = [
|
|
|
11037
11037
|
// Lagrange notation
|
|
11038
11038
|
{
|
|
11039
11039
|
name: "Derivative",
|
|
11040
|
-
// @todo: Leibniz notation: {% latex " \\frac{d^n}{dx^n} f(x)" %}
|
|
11041
|
-
// @todo: Euler modified notation: This notation is used by Mathematica. The Euler notation uses `D` instead of
|
|
11042
|
-
// `\partial`: `\partial_{x} f`, `\partial_{x,y} f`
|
|
11043
|
-
// Newton notation (\dot{v}, \ddot{v}) is implemented below
|
|
11044
11040
|
serialize: (serializer, expr2) => {
|
|
11045
11041
|
const degree = machineValue(operand(expr2, 2)) ?? 1;
|
|
11046
11042
|
const base = serializer.serialize(operand(expr2, 1));
|
|
@@ -12078,14 +12074,18 @@ var DEFINITIONS_SETS = [
|
|
|
12078
12074
|
return ["Complement", lhs];
|
|
12079
12075
|
}
|
|
12080
12076
|
// precedence: 240,
|
|
12081
|
-
// @todo: serialize for the multiple argument case
|
|
12082
12077
|
},
|
|
12083
12078
|
{
|
|
12084
12079
|
name: "Complement",
|
|
12085
12080
|
latexTrigger: ["^", "<{>", "\\complement", "<}>"],
|
|
12086
|
-
kind: "postfix"
|
|
12081
|
+
kind: "postfix",
|
|
12087
12082
|
// precedence: 240,
|
|
12088
|
-
|
|
12083
|
+
serialize: (serializer, expr2) => {
|
|
12084
|
+
return joinLatex([
|
|
12085
|
+
serializer.serialize(operand(expr2, 1)),
|
|
12086
|
+
"^\\complement"
|
|
12087
|
+
]);
|
|
12088
|
+
}
|
|
12089
12089
|
},
|
|
12090
12090
|
{
|
|
12091
12091
|
name: "Intersection",
|
|
@@ -12172,7 +12172,6 @@ var DEFINITIONS_SETS = [
|
|
|
12172
12172
|
// commands like \rbrack a, b \rbrack which are unambiguous.
|
|
12173
12173
|
{
|
|
12174
12174
|
name: "Multiple",
|
|
12175
|
-
// @todo: parse
|
|
12176
12175
|
serialize: serializeSet
|
|
12177
12176
|
},
|
|
12178
12177
|
{
|
|
@@ -12181,14 +12180,28 @@ var DEFINITIONS_SETS = [
|
|
|
12181
12180
|
kind: "infix",
|
|
12182
12181
|
precedence: 350
|
|
12183
12182
|
},
|
|
12183
|
+
// \mid as a separator/operator (used in set-builder notation: {x \mid x > 0})
|
|
12184
|
+
// Low precedence so it binds loosely — everything on each side is parsed first
|
|
12185
|
+
{
|
|
12186
|
+
name: "Divides",
|
|
12187
|
+
latexTrigger: ["\\mid"],
|
|
12188
|
+
kind: "infix",
|
|
12189
|
+
precedence: 160
|
|
12190
|
+
},
|
|
12184
12191
|
{
|
|
12185
12192
|
name: "Set",
|
|
12186
12193
|
kind: "matchfix",
|
|
12187
12194
|
openTrigger: "{",
|
|
12188
12195
|
closeTrigger: "}",
|
|
12189
|
-
// @todo: the set syntax can also include conditions...
|
|
12190
12196
|
parse: (_parser, body) => {
|
|
12191
12197
|
if (isEmptySequence(body)) return "EmptySet";
|
|
12198
|
+
const h = operator(body);
|
|
12199
|
+
if (h === "Divides" || h === "Colon") {
|
|
12200
|
+
const expr2 = operand(body, 1);
|
|
12201
|
+
const condition = operand(body, 2);
|
|
12202
|
+
if (expr2 !== null && condition !== null)
|
|
12203
|
+
return ["Set", expr2, ["Condition", condition]];
|
|
12204
|
+
}
|
|
12192
12205
|
if (operator(body) == "Delimiter" && stringValue(operand(body, 2)) === ",") {
|
|
12193
12206
|
body = operand(body, 1);
|
|
12194
12207
|
}
|
|
@@ -12196,6 +12209,17 @@ var DEFINITIONS_SETS = [
|
|
|
12196
12209
|
return ["Set", ...operands(body)];
|
|
12197
12210
|
},
|
|
12198
12211
|
serialize: (serializer, expr2) => {
|
|
12212
|
+
if (nops(expr2) === 2 && operator(operand(expr2, 2)) === "Condition") {
|
|
12213
|
+
const condition = operand(expr2, 2);
|
|
12214
|
+
return joinLatex([
|
|
12215
|
+
"\\lbrace",
|
|
12216
|
+
serializer.serialize(operand(expr2, 1)),
|
|
12217
|
+
"\\mid",
|
|
12218
|
+
// Serialize the inner expression of the Condition wrapper
|
|
12219
|
+
serializer.serialize(operand(condition, 1)),
|
|
12220
|
+
"\\rbrace"
|
|
12221
|
+
]);
|
|
12222
|
+
}
|
|
12199
12223
|
return joinLatex([
|
|
12200
12224
|
"\\lbrace",
|
|
12201
12225
|
operands(expr2).map((x) => serializer.serialize(x)).join(", "),
|
|
@@ -12362,23 +12386,6 @@ function serializeSet(serializer, expr2) {
|
|
|
12362
12386
|
if (expr2 === null) return "";
|
|
12363
12387
|
const h = operator(expr2);
|
|
12364
12388
|
if (!h) return "";
|
|
12365
|
-
if (h === "Set") {
|
|
12366
|
-
if (nops(expr2) === 0) return "\\emptyset";
|
|
12367
|
-
if (nops(expr2) === 2 && operator(operand(expr2, 2)) === "Condition") {
|
|
12368
|
-
return joinLatex([
|
|
12369
|
-
"\\left\\lbrace",
|
|
12370
|
-
serializer.serialize(operand(expr2, 1)),
|
|
12371
|
-
"\\middle\\mid",
|
|
12372
|
-
serializer.serialize(operand(expr2, 2)),
|
|
12373
|
-
"\\right\\rbrace"
|
|
12374
|
-
]);
|
|
12375
|
-
}
|
|
12376
|
-
return joinLatex([
|
|
12377
|
-
"\\left\\lbrace",
|
|
12378
|
-
...operands(expr2).map((x) => serializer.serialize(x) + " ,"),
|
|
12379
|
-
"\\right\\rbrace"
|
|
12380
|
-
]);
|
|
12381
|
-
}
|
|
12382
12389
|
if (h === "Multiple") {
|
|
12383
12390
|
}
|
|
12384
12391
|
if (h === "Range") {
|
|
@@ -13526,11 +13533,13 @@ var DEFINITIONS_ARITHMETIC = [
|
|
|
13526
13533
|
if (!parser.match("_")) return null;
|
|
13527
13534
|
const base = parser.parseGroup();
|
|
13528
13535
|
if (operator(base) !== "To") return null;
|
|
13529
|
-
const expr2 = parser.
|
|
13536
|
+
const expr2 = parser.parseExpression({
|
|
13537
|
+
minPrec: MULTIPLICATION_PRECEDENCE
|
|
13538
|
+
});
|
|
13530
13539
|
if (!expr2) return null;
|
|
13531
13540
|
return [
|
|
13532
13541
|
"Limit",
|
|
13533
|
-
["Function", expr2
|
|
13542
|
+
["Function", expr2, operand(base, 1)],
|
|
13534
13543
|
operand(base, 2)
|
|
13535
13544
|
];
|
|
13536
13545
|
},
|
|
@@ -15827,12 +15836,52 @@ var DEFINITIONS_UNITS = [
|
|
|
15827
15836
|
];
|
|
15828
15837
|
|
|
15829
15838
|
// src/compute-engine/latex-syntax/dictionary/definitions-other.ts
|
|
15839
|
+
var TEX_UNITS = [
|
|
15840
|
+
"pt",
|
|
15841
|
+
"em",
|
|
15842
|
+
"mu",
|
|
15843
|
+
"ex",
|
|
15844
|
+
"mm",
|
|
15845
|
+
"cm",
|
|
15846
|
+
"in",
|
|
15847
|
+
"bp",
|
|
15848
|
+
"sp",
|
|
15849
|
+
"dd",
|
|
15850
|
+
"cc",
|
|
15851
|
+
"pc",
|
|
15852
|
+
"nc",
|
|
15853
|
+
"nd"
|
|
15854
|
+
];
|
|
15855
|
+
function skipTexDimension(parser) {
|
|
15856
|
+
parser.skipSpace();
|
|
15857
|
+
if (parser.peek === "-" || parser.peek === "+") parser.nextToken();
|
|
15858
|
+
while (/^[\d.]$/.test(parser.peek)) parser.nextToken();
|
|
15859
|
+
for (const unit of TEX_UNITS) {
|
|
15860
|
+
if (parser.matchAll([...unit])) return;
|
|
15861
|
+
}
|
|
15862
|
+
}
|
|
15830
15863
|
function parseSingleArg(cmd) {
|
|
15831
15864
|
return (parser) => {
|
|
15832
15865
|
const arg = parser.parseGroup();
|
|
15833
15866
|
return arg === null ? [cmd] : [cmd, arg];
|
|
15834
15867
|
};
|
|
15835
15868
|
}
|
|
15869
|
+
function parseMathStyleSwitch(mathStyle) {
|
|
15870
|
+
return (parser) => {
|
|
15871
|
+
const body = parser.parseExpression();
|
|
15872
|
+
if (body !== null && !isEmptySequence(body))
|
|
15873
|
+
return ["Annotated", body, { dict: { mathStyle } }];
|
|
15874
|
+
return "Nothing";
|
|
15875
|
+
};
|
|
15876
|
+
}
|
|
15877
|
+
function parseSizeSwitch(size) {
|
|
15878
|
+
return (parser) => {
|
|
15879
|
+
const body = parser.parseExpression();
|
|
15880
|
+
if (body !== null && !isEmptySequence(body))
|
|
15881
|
+
return ["Annotated", body, { dict: { size } }];
|
|
15882
|
+
return "Nothing";
|
|
15883
|
+
};
|
|
15884
|
+
}
|
|
15836
15885
|
var DEFINITIONS_OTHERS = [
|
|
15837
15886
|
{
|
|
15838
15887
|
name: "Overscript",
|
|
@@ -16072,80 +16121,71 @@ var DEFINITIONS_OTHERS = [
|
|
|
16072
16121
|
},
|
|
16073
16122
|
{
|
|
16074
16123
|
latexTrigger: ["\\displaystyle"],
|
|
16075
|
-
parse: (
|
|
16076
|
-
// @todo: parse as ['Annotated'...]
|
|
16124
|
+
parse: parseMathStyleSwitch("normal")
|
|
16077
16125
|
},
|
|
16078
16126
|
{
|
|
16079
16127
|
latexTrigger: ["\\textstyle"],
|
|
16080
|
-
parse: (
|
|
16081
|
-
// @todo: parse as ['Annotated'...]
|
|
16128
|
+
parse: parseMathStyleSwitch("compact")
|
|
16082
16129
|
},
|
|
16083
16130
|
{
|
|
16084
16131
|
latexTrigger: ["\\scriptstyle"],
|
|
16085
|
-
parse: (
|
|
16086
|
-
// @todo: parse as ['Annotated'...]
|
|
16132
|
+
parse: parseMathStyleSwitch("script")
|
|
16087
16133
|
},
|
|
16088
16134
|
{
|
|
16089
16135
|
latexTrigger: ["\\scriptscriptstyle"],
|
|
16090
|
-
parse: (
|
|
16091
|
-
// @todo: parse as ['Annotated'...]
|
|
16136
|
+
parse: parseMathStyleSwitch("scriptscript")
|
|
16092
16137
|
},
|
|
16093
16138
|
{
|
|
16094
16139
|
latexTrigger: ["\\color"],
|
|
16095
16140
|
parse: (parser) => {
|
|
16096
|
-
parser.
|
|
16141
|
+
const color = parser.parseStringGroup();
|
|
16142
|
+
if (color !== null) {
|
|
16143
|
+
const body = parser.parseExpression();
|
|
16144
|
+
if (body !== null && !isEmptySequence(body))
|
|
16145
|
+
return ["Annotated", body, { dict: { color } }];
|
|
16146
|
+
}
|
|
16097
16147
|
return "Nothing";
|
|
16098
16148
|
}
|
|
16099
16149
|
},
|
|
16100
16150
|
{
|
|
16101
16151
|
latexTrigger: ["\\tiny"],
|
|
16102
|
-
parse: ()
|
|
16103
|
-
// @todo: parse as ['Annotated'...]
|
|
16152
|
+
parse: parseSizeSwitch(1)
|
|
16104
16153
|
},
|
|
16105
16154
|
{
|
|
16106
16155
|
latexTrigger: ["\\scriptsize"],
|
|
16107
|
-
parse: ()
|
|
16108
|
-
// @todo: parse as ['Annotated'...]
|
|
16156
|
+
parse: parseSizeSwitch(2)
|
|
16109
16157
|
},
|
|
16110
16158
|
{
|
|
16111
16159
|
latexTrigger: ["\\footnotesize"],
|
|
16112
|
-
parse: ()
|
|
16113
|
-
// @todo: parse as ['Annotated'...]
|
|
16160
|
+
parse: parseSizeSwitch(3)
|
|
16114
16161
|
},
|
|
16115
16162
|
{
|
|
16116
16163
|
latexTrigger: ["\\small"],
|
|
16117
|
-
parse: ()
|
|
16118
|
-
// @todo: parse as ['Annotated'...]
|
|
16164
|
+
parse: parseSizeSwitch(4)
|
|
16119
16165
|
},
|
|
16120
16166
|
{
|
|
16121
16167
|
latexTrigger: ["\\normalsize"],
|
|
16122
|
-
parse: ()
|
|
16123
|
-
// @todo: parse as ['Annotated'...]
|
|
16168
|
+
parse: parseSizeSwitch(5)
|
|
16124
16169
|
},
|
|
16125
16170
|
{
|
|
16126
16171
|
latexTrigger: ["\\large"],
|
|
16127
|
-
parse: ()
|
|
16128
|
-
// @todo: parse as ['Annotated'...]
|
|
16172
|
+
parse: parseSizeSwitch(6)
|
|
16129
16173
|
},
|
|
16130
16174
|
{
|
|
16131
16175
|
latexTrigger: ["\\Large"],
|
|
16132
|
-
parse: ()
|
|
16133
|
-
// @todo: parse as ['Annotated'...]
|
|
16176
|
+
parse: parseSizeSwitch(7)
|
|
16134
16177
|
},
|
|
16135
16178
|
{
|
|
16136
16179
|
latexTrigger: ["\\LARGE"],
|
|
16137
|
-
parse: ()
|
|
16138
|
-
// @todo: parse as ['Annotated'...]
|
|
16180
|
+
parse: parseSizeSwitch(8)
|
|
16139
16181
|
},
|
|
16140
16182
|
{
|
|
16141
16183
|
latexTrigger: ["\\huge"],
|
|
16142
|
-
parse: ()
|
|
16143
|
-
// @todo: parse as ['Annotated'...]
|
|
16184
|
+
parse: parseSizeSwitch(9)
|
|
16144
16185
|
},
|
|
16145
16186
|
{
|
|
16146
16187
|
latexTrigger: ["\\Huge"],
|
|
16147
|
-
parse: ()
|
|
16148
|
-
// @todo: parse as ['Annotated'...]
|
|
16188
|
+
parse: parseSizeSwitch(10)
|
|
16149
16189
|
},
|
|
16150
16190
|
{
|
|
16151
16191
|
name: "Annotated",
|
|
@@ -16157,6 +16197,10 @@ var DEFINITIONS_OTHERS = [
|
|
|
16157
16197
|
result = joinLatex(["{\\displaystyle", result, "}"]);
|
|
16158
16198
|
else if (dict.dict.mathStyle === "compact")
|
|
16159
16199
|
result = joinLatex(["{\\textstyle", result, "}"]);
|
|
16200
|
+
else if (dict.dict.mathStyle === "script")
|
|
16201
|
+
result = joinLatex(["{\\scriptstyle", result, "}"]);
|
|
16202
|
+
else if (dict.dict.mathStyle === "scriptscript")
|
|
16203
|
+
result = joinLatex(["{\\scriptscriptstyle", result, "}"]);
|
|
16160
16204
|
const v = dict.dict.size;
|
|
16161
16205
|
if (v !== null && v >= 1 && v <= 10) {
|
|
16162
16206
|
result = joinLatex([
|
|
@@ -16244,6 +16288,28 @@ var DEFINITIONS_OTHERS = [
|
|
|
16244
16288
|
latexTrigger: ["\\enspace"],
|
|
16245
16289
|
parse: () => ["HorizontalSpacing", 9]
|
|
16246
16290
|
},
|
|
16291
|
+
{
|
|
16292
|
+
latexTrigger: ["\\hspace"],
|
|
16293
|
+
parse: (parser) => {
|
|
16294
|
+
if (parser.peek === "*") parser.nextToken();
|
|
16295
|
+
parser.parseStringGroup();
|
|
16296
|
+
return ["HorizontalSpacing", 0];
|
|
16297
|
+
}
|
|
16298
|
+
},
|
|
16299
|
+
{
|
|
16300
|
+
latexTrigger: ["\\hskip"],
|
|
16301
|
+
parse: (parser) => {
|
|
16302
|
+
skipTexDimension(parser);
|
|
16303
|
+
return ["HorizontalSpacing", 0];
|
|
16304
|
+
}
|
|
16305
|
+
},
|
|
16306
|
+
{
|
|
16307
|
+
latexTrigger: ["\\kern"],
|
|
16308
|
+
parse: (parser) => {
|
|
16309
|
+
skipTexDimension(parser);
|
|
16310
|
+
return ["HorizontalSpacing", 0];
|
|
16311
|
+
}
|
|
16312
|
+
},
|
|
16247
16313
|
{
|
|
16248
16314
|
latexTrigger: ["\\phantom"],
|
|
16249
16315
|
parse: (parser) => {
|
|
@@ -16294,7 +16360,17 @@ var DEFINITIONS_OTHERS = [
|
|
|
16294
16360
|
// `["HorizontalSpacing", expr, 'op'|'bin'|rel]` -> indicate a spacing around and expression, i.e. `\mathbin{x}`, etc...
|
|
16295
16361
|
serialize: (serializer, expr2) => {
|
|
16296
16362
|
if (operand(expr2, 2) !== null) {
|
|
16297
|
-
|
|
16363
|
+
const cls = stringValue(operand(expr2, 2));
|
|
16364
|
+
const inner = serializer.serialize(operand(expr2, 1));
|
|
16365
|
+
if (cls === "bin") return `\\mathbin{${inner}}`;
|
|
16366
|
+
if (cls === "op") return `\\mathop{${inner}}`;
|
|
16367
|
+
if (cls === "rel") return `\\mathrel{${inner}}`;
|
|
16368
|
+
if (cls === "ord") return `\\mathord{${inner}}`;
|
|
16369
|
+
if (cls === "open") return `\\mathopen{${inner}}`;
|
|
16370
|
+
if (cls === "close") return `\\mathclose{${inner}}`;
|
|
16371
|
+
if (cls === "punct") return `\\mathpunct{${inner}}`;
|
|
16372
|
+
if (cls === "inner") return `\\mathinner{${inner}}`;
|
|
16373
|
+
return inner;
|
|
16298
16374
|
}
|
|
16299
16375
|
const v = machineValue(operand(expr2, 1));
|
|
16300
16376
|
if (v === null) return "";
|
|
@@ -16685,25 +16761,47 @@ function makeIndexedEntry(entry, onError) {
|
|
|
16685
16761
|
result.arguments = entry.arguments;
|
|
16686
16762
|
return result;
|
|
16687
16763
|
}
|
|
16764
|
+
function serializeTabularBody(serializer, body) {
|
|
16765
|
+
if (!body) return "";
|
|
16766
|
+
if (operator(body) !== "List") return serializer.serialize(body);
|
|
16767
|
+
const rows = operands(body);
|
|
16768
|
+
if (rows.length === 0) return "";
|
|
16769
|
+
if (!rows.every((row) => operator(row) === "List"))
|
|
16770
|
+
return serializer.serialize(body);
|
|
16771
|
+
return rows.map(
|
|
16772
|
+
(row) => operands(row).map((cell) => serializer.serialize(cell)).join(" & ")
|
|
16773
|
+
).join(" \\\\\n");
|
|
16774
|
+
}
|
|
16688
16775
|
function makeSerializeHandler(entry, latexTrigger, idTrigger) {
|
|
16689
16776
|
if (typeof entry.serialize === "function") return entry.serialize;
|
|
16690
16777
|
const kind = entry["kind"] ?? "expression";
|
|
16691
16778
|
if (kind === "environment") {
|
|
16692
16779
|
const envName = entry["symbolTrigger"] ?? entry.name ?? "unknown";
|
|
16693
|
-
return (serializer, expr2) =>
|
|
16694
|
-
|
|
16695
|
-
|
|
16696
|
-
|
|
16697
|
-
|
|
16780
|
+
return (serializer, expr2) => {
|
|
16781
|
+
const body = operand(expr2, 1);
|
|
16782
|
+
return joinLatex([
|
|
16783
|
+
`\\begin{${envName}}`,
|
|
16784
|
+
serializeTabularBody(serializer, body),
|
|
16785
|
+
`\\end{${envName}}`
|
|
16786
|
+
]);
|
|
16787
|
+
};
|
|
16698
16788
|
}
|
|
16699
16789
|
if (isMatchfixEntry(entry)) {
|
|
16700
16790
|
const openDelim = typeof entry.openTrigger === "string" ? DEFAULT_DELIMITER[entry.openTrigger] : tokensToString(entry.openTrigger);
|
|
16701
16791
|
const closeDelim = typeof entry.closeTrigger === "string" ? DEFAULT_DELIMITER[entry.closeTrigger] : tokensToString(entry.closeTrigger);
|
|
16702
|
-
return (serializer, expr2) =>
|
|
16703
|
-
|
|
16704
|
-
serializer.serialize(operand(expr2, 1))
|
|
16705
|
-
|
|
16706
|
-
|
|
16792
|
+
return (serializer, expr2) => {
|
|
16793
|
+
const style = serializer.groupStyle(expr2, serializer.level + 1);
|
|
16794
|
+
const inner = serializer.serialize(operand(expr2, 1));
|
|
16795
|
+
if (style === "scaled")
|
|
16796
|
+
return joinLatex([`\\left${openDelim}`, inner, `\\right${closeDelim}`]);
|
|
16797
|
+
if (style === "big")
|
|
16798
|
+
return joinLatex([
|
|
16799
|
+
`\\Bigl${openDelim}`,
|
|
16800
|
+
inner,
|
|
16801
|
+
`\\Bigr${closeDelim}`
|
|
16802
|
+
]);
|
|
16803
|
+
return joinLatex([openDelim, inner, closeDelim]);
|
|
16804
|
+
};
|
|
16707
16805
|
}
|
|
16708
16806
|
let latex = entry.serialize;
|
|
16709
16807
|
if (latex === void 0 && latexTrigger) latex = tokensToString(latexTrigger);
|
|
@@ -17588,6 +17686,16 @@ function parseNumber(parser, fmt) {
|
|
|
17588
17686
|
}
|
|
17589
17687
|
|
|
17590
17688
|
// src/compute-engine/latex-syntax/parse.ts
|
|
17689
|
+
var _symbolToUnicode = null;
|
|
17690
|
+
function getSymbolToUnicode() {
|
|
17691
|
+
if (!_symbolToUnicode) {
|
|
17692
|
+
_symbolToUnicode = /* @__PURE__ */ new Map();
|
|
17693
|
+
for (const [, latex, codepoint] of SYMBOLS2) {
|
|
17694
|
+
_symbolToUnicode.set(latex, String.fromCodePoint(codepoint));
|
|
17695
|
+
}
|
|
17696
|
+
}
|
|
17697
|
+
return _symbolToUnicode;
|
|
17698
|
+
}
|
|
17591
17699
|
var DELIMITER_SHORTHAND2 = {
|
|
17592
17700
|
"(": ["\\lparen", "("],
|
|
17593
17701
|
")": ["\\rparen", ")"],
|
|
@@ -18035,6 +18143,35 @@ var _Parser = class __Parser {
|
|
|
18035
18143
|
this.nextToken();
|
|
18036
18144
|
this.skipVisualSpace();
|
|
18037
18145
|
}
|
|
18146
|
+
if (this.match("\\hspace")) {
|
|
18147
|
+
this.match("*");
|
|
18148
|
+
this.parseStringGroup();
|
|
18149
|
+
this.skipVisualSpace();
|
|
18150
|
+
}
|
|
18151
|
+
if (this.match("\\hskip") || this.match("\\kern")) {
|
|
18152
|
+
this.skipSpace();
|
|
18153
|
+
this.match("-") || this.match("+");
|
|
18154
|
+
while (/^[\d.]$/.test(this.peek)) this.nextToken();
|
|
18155
|
+
for (const unit of [
|
|
18156
|
+
"pt",
|
|
18157
|
+
"em",
|
|
18158
|
+
"mu",
|
|
18159
|
+
"ex",
|
|
18160
|
+
"mm",
|
|
18161
|
+
"cm",
|
|
18162
|
+
"in",
|
|
18163
|
+
"bp",
|
|
18164
|
+
"sp",
|
|
18165
|
+
"dd",
|
|
18166
|
+
"cc",
|
|
18167
|
+
"pc",
|
|
18168
|
+
"nc",
|
|
18169
|
+
"nd"
|
|
18170
|
+
]) {
|
|
18171
|
+
if (this.matchAll([...unit])) break;
|
|
18172
|
+
}
|
|
18173
|
+
this.skipVisualSpace();
|
|
18174
|
+
}
|
|
18038
18175
|
this.skipSpace();
|
|
18039
18176
|
}
|
|
18040
18177
|
match(token) {
|
|
@@ -18372,7 +18509,8 @@ var _Parser = class __Parser {
|
|
|
18372
18509
|
} else if (token === "<space>") {
|
|
18373
18510
|
result += " ";
|
|
18374
18511
|
} else if (token[0] === "\\") {
|
|
18375
|
-
|
|
18512
|
+
const unicode = getSymbolToUnicode().get(token);
|
|
18513
|
+
result += unicode ?? token;
|
|
18376
18514
|
} else {
|
|
18377
18515
|
result += token;
|
|
18378
18516
|
}
|
|
@@ -19732,7 +19870,7 @@ var STYLE_MODIFIERS = {
|
|
|
19732
19870
|
sansserif: (s) => `\\mathsf{${s}}`,
|
|
19733
19871
|
monospace: (s) => `\\mathtt{${s}}`
|
|
19734
19872
|
};
|
|
19735
|
-
var
|
|
19873
|
+
var Serializer5 = class {
|
|
19736
19874
|
options;
|
|
19737
19875
|
dictionary;
|
|
19738
19876
|
level = -1;
|
|
@@ -19747,11 +19885,18 @@ var Serializer4 = class {
|
|
|
19747
19885
|
/**
|
|
19748
19886
|
* Serialize the expression, and if the expression is an operator
|
|
19749
19887
|
* of precedence less than or equal to prec, wrap it in some parens.
|
|
19750
|
-
*
|
|
19888
|
+
*
|
|
19889
|
+
* Skip wrapping for matchfix operators (Abs, Floor, Ceil, Norm, etc.)
|
|
19890
|
+
* and Delimiter since they already have visible delimiters.
|
|
19751
19891
|
*/
|
|
19752
19892
|
wrap(expr2, prec) {
|
|
19753
19893
|
if (expr2 === null || expr2 === void 0) return "";
|
|
19754
19894
|
if (prec === void 0) {
|
|
19895
|
+
const name2 = operator(expr2);
|
|
19896
|
+
if (name2) {
|
|
19897
|
+
const def = this.dictionary.ids.get(name2);
|
|
19898
|
+
if (def?.kind === "matchfix") return this.serialize(expr2);
|
|
19899
|
+
}
|
|
19755
19900
|
return this.wrapString(
|
|
19756
19901
|
this.serialize(expr2),
|
|
19757
19902
|
this.options.groupStyle(expr2, this.level + 1)
|
|
@@ -20045,7 +20190,7 @@ function serializeSymbol2(s, style = "auto") {
|
|
|
20045
20190
|
return body;
|
|
20046
20191
|
}
|
|
20047
20192
|
function serializeLatex(expr2, dict, options) {
|
|
20048
|
-
const serializer = new
|
|
20193
|
+
const serializer = new Serializer5(dict, options);
|
|
20049
20194
|
return serializer.serialize(expr2);
|
|
20050
20195
|
}
|
|
20051
20196
|
|
|
@@ -42084,12 +42229,14 @@ var CONTROL_STRUCTURES_LIBRARY = [
|
|
|
42084
42229
|
canonical: canonicalBlock,
|
|
42085
42230
|
evaluate: evaluateBlock
|
|
42086
42231
|
},
|
|
42087
|
-
// A condition expression tests for one or more conditions of an expression
|
|
42088
|
-
//
|
|
42232
|
+
// A condition expression tests for one or more conditions of an expression.
|
|
42233
|
+
// Two forms:
|
|
42234
|
+
// ['Condition', value, "positive"] — tests value against named condition(s)
|
|
42235
|
+
// ['Condition', predicate] — set-builder predicate (e.g. x > 0)
|
|
42089
42236
|
Condition: {
|
|
42090
42237
|
description: "Test whether a value satisfies one or more conditions.",
|
|
42091
42238
|
lazy: true,
|
|
42092
|
-
signature: "(
|
|
42239
|
+
signature: "(expression, symbol?) -> boolean",
|
|
42093
42240
|
evaluate: ([value, conds], { engine }) => {
|
|
42094
42241
|
let conditions = [];
|
|
42095
42242
|
if (isSymbol2(conds)) {
|
|
@@ -54763,8 +54910,7 @@ function compile(expr2, options) {
|
|
|
54763
54910
|
vars: options?.vars,
|
|
54764
54911
|
imports: options?.imports,
|
|
54765
54912
|
preamble: options?.preamble,
|
|
54766
|
-
realOnly: options?.realOnly
|
|
54767
|
-
hints: options?.hints
|
|
54913
|
+
realOnly: options?.realOnly
|
|
54768
54914
|
});
|
|
54769
54915
|
} catch (e) {
|
|
54770
54916
|
if (options?.fallback ?? true) {
|
|
@@ -61264,43 +61410,6 @@ function fibonacci(n) {
|
|
|
61264
61410
|
return b;
|
|
61265
61411
|
}
|
|
61266
61412
|
|
|
61267
|
-
// src/compute-engine/compilation/fractal-orbit.ts
|
|
61268
|
-
function toBigDecimal(v) {
|
|
61269
|
-
if (typeof v === "object" && "hi" in v)
|
|
61270
|
-
return new BigDecimal(v.hi).add(new BigDecimal(v.lo));
|
|
61271
|
-
return new BigDecimal(v);
|
|
61272
|
-
}
|
|
61273
|
-
function hpToNumber(v) {
|
|
61274
|
-
if (typeof v === "number") return v;
|
|
61275
|
-
if (typeof v === "string") return Number(v);
|
|
61276
|
-
return v.hi + v.lo;
|
|
61277
|
-
}
|
|
61278
|
-
function computeReferenceOrbit(center, maxIter, precision) {
|
|
61279
|
-
const prevPrecision = BigDecimal.precision;
|
|
61280
|
-
BigDecimal.precision = precision;
|
|
61281
|
-
try {
|
|
61282
|
-
const cr = toBigDecimal(center[0]);
|
|
61283
|
-
const ci = toBigDecimal(center[1]);
|
|
61284
|
-
let zr = BigDecimal.ZERO;
|
|
61285
|
-
let zi = BigDecimal.ZERO;
|
|
61286
|
-
const ESCAPE = new BigDecimal(256);
|
|
61287
|
-
const points = [];
|
|
61288
|
-
for (let i = 0; i < maxIter; i++) {
|
|
61289
|
-
points.push(zr.toNumber(), zi.toNumber());
|
|
61290
|
-
const zr2 = zr.mul(zr).toPrecision(precision);
|
|
61291
|
-
const zi2 = zi.mul(zi).toPrecision(precision);
|
|
61292
|
-
const mag2 = zr2.add(zi2);
|
|
61293
|
-
if (mag2.cmp(ESCAPE) > 0) break;
|
|
61294
|
-
const new_zi = zr.mul(zi).toPrecision(precision).mul(2).add(ci);
|
|
61295
|
-
zr = zr2.sub(zi2).add(cr);
|
|
61296
|
-
zi = new_zi;
|
|
61297
|
-
}
|
|
61298
|
-
return new Float32Array(points);
|
|
61299
|
-
} finally {
|
|
61300
|
-
BigDecimal.precision = prevPrecision;
|
|
61301
|
-
}
|
|
61302
|
-
}
|
|
61303
|
-
|
|
61304
61413
|
// src/compute-engine/compilation/gpu-target.ts
|
|
61305
61414
|
var GPU_OPERATORS = {
|
|
61306
61415
|
Add: ["+", 11],
|
|
@@ -61384,13 +61493,6 @@ function compileGPUSumProduct(kind, args, _compile2, target) {
|
|
|
61384
61493
|
];
|
|
61385
61494
|
return lines.join("\n");
|
|
61386
61495
|
}
|
|
61387
|
-
function selectFractalStrategy(target) {
|
|
61388
|
-
const radius = target.hints?.viewport?.radius;
|
|
61389
|
-
if (radius === void 0) return "single";
|
|
61390
|
-
if (radius > 1e-6) return "single";
|
|
61391
|
-
if (radius > 1e-14) return "double";
|
|
61392
|
-
return "perturbation";
|
|
61393
|
-
}
|
|
61394
61496
|
var GPU_FUNCTIONS = {
|
|
61395
61497
|
// Variadic arithmetic (for function-call form, e.g., with vectors)
|
|
61396
61498
|
Add: (args, compile3, target) => {
|
|
@@ -61886,32 +61988,12 @@ var GPU_FUNCTIONS = {
|
|
|
61886
61988
|
if (c === null || maxIter === null)
|
|
61887
61989
|
throw new Error("Mandelbrot: missing arguments");
|
|
61888
61990
|
const iterCode = compileIntArg(maxIter, compile3, target);
|
|
61889
|
-
const strategy = selectFractalStrategy(target);
|
|
61890
|
-
if (strategy === "double") {
|
|
61891
|
-
const dpCoord = target?.language === "wgsl" ? "_dp_coord(v_uv)" : "_dp_coord()";
|
|
61892
|
-
return `_fractal_mandelbrot_dp(${dpCoord}, ${iterCode})`;
|
|
61893
|
-
}
|
|
61894
|
-
if (strategy === "perturbation") {
|
|
61895
|
-
const ptDelta = target?.language === "wgsl" ? "_pt_delta(v_uv)" : "_pt_delta()";
|
|
61896
|
-
return `_fractal_mandelbrot_pt(${ptDelta}, ${iterCode})`;
|
|
61897
|
-
}
|
|
61898
61991
|
return `_fractal_mandelbrot(${compile3(c)}, ${iterCode})`;
|
|
61899
61992
|
},
|
|
61900
61993
|
Julia: ([z, c, maxIter], compile3, target) => {
|
|
61901
61994
|
if (z === null || c === null || maxIter === null)
|
|
61902
61995
|
throw new Error("Julia: missing arguments");
|
|
61903
61996
|
const iterCode = compileIntArg(maxIter, compile3, target);
|
|
61904
|
-
const strategy = selectFractalStrategy(target);
|
|
61905
|
-
if (strategy === "double") {
|
|
61906
|
-
const dpCoord = target?.language === "wgsl" ? "_dp_coord(v_uv)" : "_dp_coord()";
|
|
61907
|
-
const cCode = compile3(c);
|
|
61908
|
-
return `_fractal_julia_dp(${dpCoord}, vec4(${cCode}, vec2(0.0)), ${iterCode})`;
|
|
61909
|
-
}
|
|
61910
|
-
if (strategy === "perturbation") {
|
|
61911
|
-
const ptDelta = target?.language === "wgsl" ? "_pt_delta(v_uv)" : "_pt_delta()";
|
|
61912
|
-
const cCode = compile3(c);
|
|
61913
|
-
return `_fractal_julia_pt(${ptDelta}, ${cCode}, ${iterCode})`;
|
|
61914
|
-
}
|
|
61915
61997
|
return `_fractal_julia(${compile3(z)}, ${compile3(c)}, ${iterCode})`;
|
|
61916
61998
|
},
|
|
61917
61999
|
// Vector/Matrix operations
|
|
@@ -62509,232 +62591,6 @@ fn _gpu_besselJ(n_in: i32, x_in: f32) -> f32 {
|
|
|
62509
62591
|
return sgn * vals[n] / norm;
|
|
62510
62592
|
}
|
|
62511
62593
|
`;
|
|
62512
|
-
var GPU_DS_ARITHMETIC_PREAMBLE_GLSL = `
|
|
62513
|
-
// Split a float into high and low parts for exact multiplication
|
|
62514
|
-
vec2 ds_split(float a) {
|
|
62515
|
-
const float SPLIT = 4097.0; // 2^12 + 1
|
|
62516
|
-
float t = SPLIT * a;
|
|
62517
|
-
float hi = t - (t - a);
|
|
62518
|
-
float lo = a - hi;
|
|
62519
|
-
return vec2(hi, lo);
|
|
62520
|
-
}
|
|
62521
|
-
|
|
62522
|
-
// Create a double-single from a single float
|
|
62523
|
-
vec2 ds_from(float a) {
|
|
62524
|
-
return vec2(a, 0.0);
|
|
62525
|
-
}
|
|
62526
|
-
|
|
62527
|
-
// Error-free addition (Knuth TwoSum)
|
|
62528
|
-
vec2 ds_add(vec2 a, vec2 b) {
|
|
62529
|
-
float s = a.x + b.x;
|
|
62530
|
-
float v = s - a.x;
|
|
62531
|
-
float e = (a.x - (s - v)) + (b.x - v);
|
|
62532
|
-
float lo = (a.y + b.y) + e;
|
|
62533
|
-
float hi = s + lo;
|
|
62534
|
-
lo = lo - (hi - s);
|
|
62535
|
-
return vec2(hi, lo);
|
|
62536
|
-
}
|
|
62537
|
-
|
|
62538
|
-
// Double-single subtraction
|
|
62539
|
-
vec2 ds_sub(vec2 a, vec2 b) {
|
|
62540
|
-
return ds_add(a, vec2(-b.x, -b.y));
|
|
62541
|
-
}
|
|
62542
|
-
|
|
62543
|
-
// Error-free multiplication (Dekker TwoProduct)
|
|
62544
|
-
vec2 ds_mul(vec2 a, vec2 b) {
|
|
62545
|
-
float p = a.x * b.x;
|
|
62546
|
-
vec2 sa = ds_split(a.x);
|
|
62547
|
-
vec2 sb = ds_split(b.x);
|
|
62548
|
-
float err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;
|
|
62549
|
-
err += a.x * b.y + a.y * b.x;
|
|
62550
|
-
float hi = p + err;
|
|
62551
|
-
float lo = err - (hi - p);
|
|
62552
|
-
return vec2(hi, lo);
|
|
62553
|
-
}
|
|
62554
|
-
|
|
62555
|
-
// Optimized self-multiply
|
|
62556
|
-
vec2 ds_sqr(vec2 a) {
|
|
62557
|
-
float p = a.x * a.x;
|
|
62558
|
-
vec2 sa = ds_split(a.x);
|
|
62559
|
-
float err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;
|
|
62560
|
-
err += 2.0 * a.x * a.y;
|
|
62561
|
-
float hi = p + err;
|
|
62562
|
-
float lo = err - (hi - p);
|
|
62563
|
-
return vec2(hi, lo);
|
|
62564
|
-
}
|
|
62565
|
-
|
|
62566
|
-
// Compare magnitude: returns -1, 0, or 1
|
|
62567
|
-
float ds_cmp(vec2 a, vec2 b) {
|
|
62568
|
-
float d = a.x - b.x;
|
|
62569
|
-
if (d != 0.0) return sign(d);
|
|
62570
|
-
return sign(a.y - b.y);
|
|
62571
|
-
}
|
|
62572
|
-
`;
|
|
62573
|
-
var GPU_DS_ARITHMETIC_PREAMBLE_WGSL = `
|
|
62574
|
-
fn ds_split(a: f32) -> vec2f {
|
|
62575
|
-
const SPLIT: f32 = 4097.0;
|
|
62576
|
-
let t = SPLIT * a;
|
|
62577
|
-
let hi = t - (t - a);
|
|
62578
|
-
let lo = a - hi;
|
|
62579
|
-
return vec2f(hi, lo);
|
|
62580
|
-
}
|
|
62581
|
-
|
|
62582
|
-
fn ds_from(a: f32) -> vec2f {
|
|
62583
|
-
return vec2f(a, 0.0);
|
|
62584
|
-
}
|
|
62585
|
-
|
|
62586
|
-
fn ds_add(a: vec2f, b: vec2f) -> vec2f {
|
|
62587
|
-
let s = a.x + b.x;
|
|
62588
|
-
let v = s - a.x;
|
|
62589
|
-
let e = (a.x - (s - v)) + (b.x - v);
|
|
62590
|
-
let lo_t = (a.y + b.y) + e;
|
|
62591
|
-
let hi = s + lo_t;
|
|
62592
|
-
let lo = lo_t - (hi - s);
|
|
62593
|
-
return vec2f(hi, lo);
|
|
62594
|
-
}
|
|
62595
|
-
|
|
62596
|
-
fn ds_sub(a: vec2f, b: vec2f) -> vec2f {
|
|
62597
|
-
return ds_add(a, vec2f(-b.x, -b.y));
|
|
62598
|
-
}
|
|
62599
|
-
|
|
62600
|
-
fn ds_mul(a: vec2f, b: vec2f) -> vec2f {
|
|
62601
|
-
let p = a.x * b.x;
|
|
62602
|
-
let sa = ds_split(a.x);
|
|
62603
|
-
let sb = ds_split(b.x);
|
|
62604
|
-
var err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;
|
|
62605
|
-
err += a.x * b.y + a.y * b.x;
|
|
62606
|
-
let hi = p + err;
|
|
62607
|
-
let lo = err - (hi - p);
|
|
62608
|
-
return vec2f(hi, lo);
|
|
62609
|
-
}
|
|
62610
|
-
|
|
62611
|
-
fn ds_sqr(a: vec2f) -> vec2f {
|
|
62612
|
-
let p = a.x * a.x;
|
|
62613
|
-
let sa = ds_split(a.x);
|
|
62614
|
-
var err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;
|
|
62615
|
-
err += 2.0 * a.x * a.y;
|
|
62616
|
-
let hi = p + err;
|
|
62617
|
-
let lo = err - (hi - p);
|
|
62618
|
-
return vec2f(hi, lo);
|
|
62619
|
-
}
|
|
62620
|
-
|
|
62621
|
-
fn ds_cmp(a: vec2f, b: vec2f) -> f32 {
|
|
62622
|
-
let d = a.x - b.x;
|
|
62623
|
-
if (d != 0.0) { return sign(d); }
|
|
62624
|
-
return sign(a.y - b.y);
|
|
62625
|
-
}
|
|
62626
|
-
`;
|
|
62627
|
-
var GPU_FRACTAL_DP_PREAMBLE_GLSL = `
|
|
62628
|
-
uniform float _dp_cx_hi;
|
|
62629
|
-
uniform float _dp_cx_lo;
|
|
62630
|
-
uniform float _dp_cy_hi;
|
|
62631
|
-
uniform float _dp_cy_lo;
|
|
62632
|
-
uniform float _dp_w;
|
|
62633
|
-
uniform float _dp_h;
|
|
62634
|
-
|
|
62635
|
-
vec4 _dp_coord() {
|
|
62636
|
-
// Per-pixel offset from center \u2014 small, so float-precise
|
|
62637
|
-
float dx = (v_uv.x - 0.5) * _dp_w;
|
|
62638
|
-
float dy = (v_uv.y - 0.5) * _dp_h;
|
|
62639
|
-
// Combine center (hi+lo) + delta with emulated double precision
|
|
62640
|
-
vec2 cre = ds_add(vec2(_dp_cx_hi, _dp_cx_lo), ds_from(dx));
|
|
62641
|
-
vec2 cim = ds_add(vec2(_dp_cy_hi, _dp_cy_lo), ds_from(dy));
|
|
62642
|
-
return vec4(cre.x, cim.x, cre.y, cim.y);
|
|
62643
|
-
}
|
|
62644
|
-
|
|
62645
|
-
float _fractal_mandelbrot_dp(vec4 c, int maxIter) {
|
|
62646
|
-
// c = (re_hi, im_hi, re_lo, im_lo)
|
|
62647
|
-
vec2 cr = vec2(c.x, c.z); // real part as ds
|
|
62648
|
-
vec2 ci = vec2(c.y, c.w); // imag part as ds
|
|
62649
|
-
vec2 zr = vec2(0.0, 0.0);
|
|
62650
|
-
vec2 zi = vec2(0.0, 0.0);
|
|
62651
|
-
for (int i = 0; i < maxIter; i++) {
|
|
62652
|
-
vec2 zr2 = ds_sqr(zr);
|
|
62653
|
-
vec2 zi2 = ds_sqr(zi);
|
|
62654
|
-
// |z|^2 > 4.0 ?
|
|
62655
|
-
vec2 mag2 = ds_add(zr2, zi2);
|
|
62656
|
-
if (mag2.x > 4.0)
|
|
62657
|
-
return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62658
|
-
// z = z^2 + c
|
|
62659
|
-
vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci); // 2*zr*zi + ci
|
|
62660
|
-
zr = ds_add(ds_sub(zr2, zi2), cr); // zr^2 - zi^2 + cr
|
|
62661
|
-
zi = new_zi;
|
|
62662
|
-
}
|
|
62663
|
-
return 1.0;
|
|
62664
|
-
}
|
|
62665
|
-
|
|
62666
|
-
float _fractal_julia_dp(vec4 z_in, vec4 c, int maxIter) {
|
|
62667
|
-
vec2 zr = vec2(z_in.x, z_in.z);
|
|
62668
|
-
vec2 zi = vec2(z_in.y, z_in.w);
|
|
62669
|
-
vec2 cr = vec2(c.x, c.z);
|
|
62670
|
-
vec2 ci = vec2(c.y, c.w);
|
|
62671
|
-
for (int i = 0; i < maxIter; i++) {
|
|
62672
|
-
vec2 zr2 = ds_sqr(zr);
|
|
62673
|
-
vec2 zi2 = ds_sqr(zi);
|
|
62674
|
-
vec2 mag2 = ds_add(zr2, zi2);
|
|
62675
|
-
if (mag2.x > 4.0)
|
|
62676
|
-
return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62677
|
-
vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
62678
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
62679
|
-
zi = new_zi;
|
|
62680
|
-
}
|
|
62681
|
-
return 1.0;
|
|
62682
|
-
}
|
|
62683
|
-
`;
|
|
62684
|
-
var GPU_FRACTAL_DP_PREAMBLE_WGSL = `
|
|
62685
|
-
@group(0) @binding(10) var<uniform> _dp_cx_hi: f32;
|
|
62686
|
-
@group(0) @binding(11) var<uniform> _dp_cx_lo: f32;
|
|
62687
|
-
@group(0) @binding(12) var<uniform> _dp_cy_hi: f32;
|
|
62688
|
-
@group(0) @binding(13) var<uniform> _dp_cy_lo: f32;
|
|
62689
|
-
@group(0) @binding(14) var<uniform> _dp_w: f32;
|
|
62690
|
-
@group(0) @binding(15) var<uniform> _dp_h: f32;
|
|
62691
|
-
|
|
62692
|
-
fn _dp_coord(uv: vec2f) -> vec4f {
|
|
62693
|
-
let dx = (uv.x - 0.5) * _dp_w;
|
|
62694
|
-
let dy = (uv.y - 0.5) * _dp_h;
|
|
62695
|
-
let cre = ds_add(vec2f(_dp_cx_hi, _dp_cx_lo), ds_from(dx));
|
|
62696
|
-
let cim = ds_add(vec2f(_dp_cy_hi, _dp_cy_lo), ds_from(dy));
|
|
62697
|
-
return vec4f(cre.x, cim.x, cre.y, cim.y);
|
|
62698
|
-
}
|
|
62699
|
-
|
|
62700
|
-
fn _fractal_mandelbrot_dp(c: vec4f, maxIter: i32) -> f32 {
|
|
62701
|
-
let cr = vec2f(c.x, c.z);
|
|
62702
|
-
let ci = vec2f(c.y, c.w);
|
|
62703
|
-
var zr = vec2f(0.0, 0.0);
|
|
62704
|
-
var zi = vec2f(0.0, 0.0);
|
|
62705
|
-
for (var i: i32 = 0; i < maxIter; i++) {
|
|
62706
|
-
let zr2 = ds_sqr(zr);
|
|
62707
|
-
let zi2 = ds_sqr(zi);
|
|
62708
|
-
let mag2 = ds_add(zr2, zi2);
|
|
62709
|
-
if (mag2.x > 4.0) {
|
|
62710
|
-
return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62711
|
-
}
|
|
62712
|
-
let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
62713
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
62714
|
-
zi = new_zi;
|
|
62715
|
-
}
|
|
62716
|
-
return 1.0;
|
|
62717
|
-
}
|
|
62718
|
-
|
|
62719
|
-
fn _fractal_julia_dp(z_in: vec4f, c: vec4f, maxIter: i32) -> f32 {
|
|
62720
|
-
var zr = vec2f(z_in.x, z_in.z);
|
|
62721
|
-
var zi = vec2f(z_in.y, z_in.w);
|
|
62722
|
-
let cr = vec2f(c.x, c.z);
|
|
62723
|
-
let ci = vec2f(c.y, c.w);
|
|
62724
|
-
for (var i: i32 = 0; i < maxIter; i++) {
|
|
62725
|
-
let zr2 = ds_sqr(zr);
|
|
62726
|
-
let zi2 = ds_sqr(zi);
|
|
62727
|
-
let mag2 = ds_add(zr2, zi2);
|
|
62728
|
-
if (mag2.x > 4.0) {
|
|
62729
|
-
return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62730
|
-
}
|
|
62731
|
-
let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
62732
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
62733
|
-
zi = new_zi;
|
|
62734
|
-
}
|
|
62735
|
-
return 1.0;
|
|
62736
|
-
}
|
|
62737
|
-
`;
|
|
62738
62594
|
var GPU_FRACTAL_PREAMBLE_GLSL = `
|
|
62739
62595
|
float _fractal_mandelbrot(vec2 c, int maxIter) {
|
|
62740
62596
|
vec2 z = vec2(0.0, 0.0);
|
|
@@ -62778,208 +62634,6 @@ fn _fractal_julia(z_in: vec2f, c: vec2f, maxIter: i32) -> f32 {
|
|
|
62778
62634
|
return 1.0;
|
|
62779
62635
|
}
|
|
62780
62636
|
`;
|
|
62781
|
-
var GPU_FRACTAL_PT_PREAMBLE_GLSL = `
|
|
62782
|
-
uniform sampler2D _refOrbit;
|
|
62783
|
-
uniform int _refOrbitLen;
|
|
62784
|
-
uniform int _refOrbitTexWidth;
|
|
62785
|
-
uniform float _pt_offset_x;
|
|
62786
|
-
uniform float _pt_offset_y;
|
|
62787
|
-
uniform float _pt_w;
|
|
62788
|
-
uniform float _pt_h;
|
|
62789
|
-
|
|
62790
|
-
vec2 _pt_delta() {
|
|
62791
|
-
float dx = _pt_offset_x + (v_uv.x - 0.5) * _pt_w;
|
|
62792
|
-
float dy = _pt_offset_y + (v_uv.y - 0.5) * _pt_h;
|
|
62793
|
-
return vec2(dx, dy);
|
|
62794
|
-
}
|
|
62795
|
-
|
|
62796
|
-
vec2 _pt_fetch_orbit(int i) {
|
|
62797
|
-
int y = i / _refOrbitTexWidth;
|
|
62798
|
-
int x = i - y * _refOrbitTexWidth;
|
|
62799
|
-
return texelFetch(_refOrbit, ivec2(x, y), 0).rg;
|
|
62800
|
-
}
|
|
62801
|
-
|
|
62802
|
-
float _fractal_mandelbrot_pt(vec2 delta_c, int maxIter) {
|
|
62803
|
-
float dr = 0.0;
|
|
62804
|
-
float di = 0.0;
|
|
62805
|
-
int orbitLen = min(maxIter, _refOrbitLen);
|
|
62806
|
-
for (int i = 0; i < orbitLen; i++) {
|
|
62807
|
-
vec2 Zn = _pt_fetch_orbit(i);
|
|
62808
|
-
// delta_{n+1} = 2*Z_n*delta_n + delta_n^2 + delta_c
|
|
62809
|
-
float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
62810
|
-
float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
62811
|
-
dr = new_dr;
|
|
62812
|
-
di = new_di;
|
|
62813
|
-
// Full z = Z_{n+1} + delta for escape check
|
|
62814
|
-
vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);
|
|
62815
|
-
float zr = Zn1.x + dr;
|
|
62816
|
-
float zi = Zn1.y + di;
|
|
62817
|
-
float mag2 = zr * zr + zi * zi;
|
|
62818
|
-
if (mag2 > 4.0)
|
|
62819
|
-
return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62820
|
-
// Glitch detection: |delta|^2 > |Z|^2
|
|
62821
|
-
float dmag2 = dr * dr + di * di;
|
|
62822
|
-
float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
62823
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
62824
|
-
// Rebase to absolute coordinates and continue with single-float
|
|
62825
|
-
float abs_zr = Zn1.x + dr;
|
|
62826
|
-
float abs_zi = Zn1.y + di;
|
|
62827
|
-
// Reconstruct absolute c from reference + delta
|
|
62828
|
-
// (Use ds_from for the concept, but single-float suffices for fallback)
|
|
62829
|
-
float cx = abs_zr - dr + delta_c.x;
|
|
62830
|
-
float cy = abs_zi - di + delta_c.y;
|
|
62831
|
-
for (int j = i + 1; j < maxIter; j++) {
|
|
62832
|
-
float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;
|
|
62833
|
-
abs_zi = 2.0 * abs_zr * abs_zi + cy;
|
|
62834
|
-
abs_zr = new_zr;
|
|
62835
|
-
mag2 = abs_zr * abs_zr + abs_zi * abs_zi;
|
|
62836
|
-
if (mag2 > 4.0)
|
|
62837
|
-
return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62838
|
-
}
|
|
62839
|
-
return 1.0;
|
|
62840
|
-
}
|
|
62841
|
-
}
|
|
62842
|
-
return 1.0;
|
|
62843
|
-
}
|
|
62844
|
-
|
|
62845
|
-
float _fractal_julia_pt(vec2 z_delta, vec2 delta_c, int maxIter) {
|
|
62846
|
-
float dr = z_delta.x;
|
|
62847
|
-
float di = z_delta.y;
|
|
62848
|
-
int orbitLen = min(maxIter, _refOrbitLen);
|
|
62849
|
-
for (int i = 0; i < orbitLen; i++) {
|
|
62850
|
-
vec2 Zn = _pt_fetch_orbit(i);
|
|
62851
|
-
float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
62852
|
-
float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
62853
|
-
dr = new_dr;
|
|
62854
|
-
di = new_di;
|
|
62855
|
-
vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);
|
|
62856
|
-
float zr = Zn1.x + dr;
|
|
62857
|
-
float zi = Zn1.y + di;
|
|
62858
|
-
float mag2 = zr * zr + zi * zi;
|
|
62859
|
-
if (mag2 > 4.0)
|
|
62860
|
-
return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62861
|
-
float dmag2 = dr * dr + di * di;
|
|
62862
|
-
float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
62863
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
62864
|
-
float abs_zr = Zn1.x + dr;
|
|
62865
|
-
float abs_zi = Zn1.y + di;
|
|
62866
|
-
float cx = delta_c.x;
|
|
62867
|
-
float cy = delta_c.y;
|
|
62868
|
-
for (int j = i + 1; j < maxIter; j++) {
|
|
62869
|
-
float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;
|
|
62870
|
-
abs_zi = 2.0 * abs_zr * abs_zi + cy;
|
|
62871
|
-
abs_zr = new_zr;
|
|
62872
|
-
mag2 = abs_zr * abs_zr + abs_zi * abs_zi;
|
|
62873
|
-
if (mag2 > 4.0)
|
|
62874
|
-
return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62875
|
-
}
|
|
62876
|
-
return 1.0;
|
|
62877
|
-
}
|
|
62878
|
-
}
|
|
62879
|
-
return 1.0;
|
|
62880
|
-
}
|
|
62881
|
-
`;
|
|
62882
|
-
var GPU_FRACTAL_PT_PREAMBLE_WGSL = `
|
|
62883
|
-
@group(0) @binding(1) var _refOrbit: texture_2d<f32>;
|
|
62884
|
-
var<uniform> _refOrbitLen: i32;
|
|
62885
|
-
var<uniform> _refOrbitTexWidth: i32;
|
|
62886
|
-
var<uniform> _pt_offset_x: f32;
|
|
62887
|
-
var<uniform> _pt_offset_y: f32;
|
|
62888
|
-
var<uniform> _pt_w: f32;
|
|
62889
|
-
var<uniform> _pt_h: f32;
|
|
62890
|
-
|
|
62891
|
-
fn _pt_delta(uv: vec2f) -> vec2f {
|
|
62892
|
-
let dx = _pt_offset_x + (uv.x - 0.5) * _pt_w;
|
|
62893
|
-
let dy = _pt_offset_y + (uv.y - 0.5) * _pt_h;
|
|
62894
|
-
return vec2f(dx, dy);
|
|
62895
|
-
}
|
|
62896
|
-
|
|
62897
|
-
fn _pt_fetch_orbit(i: i32) -> vec2f {
|
|
62898
|
-
let y = i / _refOrbitTexWidth;
|
|
62899
|
-
let x = i - y * _refOrbitTexWidth;
|
|
62900
|
-
return textureLoad(_refOrbit, vec2i(x, y), 0).rg;
|
|
62901
|
-
}
|
|
62902
|
-
|
|
62903
|
-
fn _fractal_mandelbrot_pt(delta_c: vec2f, maxIter: i32) -> f32 {
|
|
62904
|
-
var dr: f32 = 0.0;
|
|
62905
|
-
var di: f32 = 0.0;
|
|
62906
|
-
let orbitLen = min(maxIter, _refOrbitLen);
|
|
62907
|
-
for (var i: i32 = 0; i < orbitLen; i++) {
|
|
62908
|
-
let Zn = _pt_fetch_orbit(i);
|
|
62909
|
-
let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
62910
|
-
let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
62911
|
-
dr = new_dr;
|
|
62912
|
-
di = new_di;
|
|
62913
|
-
var Zn1 = vec2f(0.0);
|
|
62914
|
-
if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }
|
|
62915
|
-
let zr = Zn1.x + dr;
|
|
62916
|
-
let zi = Zn1.y + di;
|
|
62917
|
-
var mag2 = zr * zr + zi * zi;
|
|
62918
|
-
if (mag2 > 4.0) {
|
|
62919
|
-
return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62920
|
-
}
|
|
62921
|
-
let dmag2 = dr * dr + di * di;
|
|
62922
|
-
let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
62923
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
62924
|
-
var f_zr = Zn1.x + dr;
|
|
62925
|
-
var f_zi = Zn1.y + di;
|
|
62926
|
-
let cx = delta_c.x;
|
|
62927
|
-
let cy = delta_c.y;
|
|
62928
|
-
for (var j: i32 = i + 1; j < maxIter; j++) {
|
|
62929
|
-
let t_zr = f_zr * f_zr - f_zi * f_zi + cx;
|
|
62930
|
-
f_zi = 2.0 * f_zr * f_zi + cy;
|
|
62931
|
-
f_zr = t_zr;
|
|
62932
|
-
mag2 = f_zr * f_zr + f_zi * f_zi;
|
|
62933
|
-
if (mag2 > 4.0) {
|
|
62934
|
-
return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62935
|
-
}
|
|
62936
|
-
}
|
|
62937
|
-
return 1.0;
|
|
62938
|
-
}
|
|
62939
|
-
}
|
|
62940
|
-
return 1.0;
|
|
62941
|
-
}
|
|
62942
|
-
|
|
62943
|
-
fn _fractal_julia_pt(z_delta: vec2f, delta_c: vec2f, maxIter: i32) -> f32 {
|
|
62944
|
-
var dr = z_delta.x;
|
|
62945
|
-
var di = z_delta.y;
|
|
62946
|
-
let orbitLen = min(maxIter, _refOrbitLen);
|
|
62947
|
-
for (var i: i32 = 0; i < orbitLen; i++) {
|
|
62948
|
-
let Zn = _pt_fetch_orbit(i);
|
|
62949
|
-
let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
62950
|
-
let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
62951
|
-
dr = new_dr;
|
|
62952
|
-
di = new_di;
|
|
62953
|
-
var Zn1 = vec2f(0.0);
|
|
62954
|
-
if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }
|
|
62955
|
-
let zr = Zn1.x + dr;
|
|
62956
|
-
let zi = Zn1.y + di;
|
|
62957
|
-
var mag2 = zr * zr + zi * zi;
|
|
62958
|
-
if (mag2 > 4.0) {
|
|
62959
|
-
return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62960
|
-
}
|
|
62961
|
-
let dmag2 = dr * dr + di * di;
|
|
62962
|
-
let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
62963
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
62964
|
-
var f_zr = Zn1.x + dr;
|
|
62965
|
-
var f_zi = Zn1.y + di;
|
|
62966
|
-
let cx = delta_c.x;
|
|
62967
|
-
let cy = delta_c.y;
|
|
62968
|
-
for (var j: i32 = i + 1; j < maxIter; j++) {
|
|
62969
|
-
let t_zr = f_zr * f_zr - f_zi * f_zi + cx;
|
|
62970
|
-
f_zi = 2.0 * f_zr * f_zi + cy;
|
|
62971
|
-
f_zr = t_zr;
|
|
62972
|
-
mag2 = f_zr * f_zr + f_zi * f_zi;
|
|
62973
|
-
if (mag2 > 4.0) {
|
|
62974
|
-
return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62975
|
-
}
|
|
62976
|
-
}
|
|
62977
|
-
return 1.0;
|
|
62978
|
-
}
|
|
62979
|
-
}
|
|
62980
|
-
return 1.0;
|
|
62981
|
-
}
|
|
62982
|
-
`;
|
|
62983
62637
|
var GPU_COLOR_PREAMBLE_GLSL = `
|
|
62984
62638
|
float _gpu_srgb_to_linear(float c) {
|
|
62985
62639
|
if (c <= 0.04045) return c / 12.92;
|
|
@@ -63418,7 +63072,6 @@ var GPUShaderTarget = class {
|
|
|
63418
63072
|
const constants = this.getConstants();
|
|
63419
63073
|
const v2 = this.languageId === "wgsl" ? "vec2f" : "vec2";
|
|
63420
63074
|
const target = this.createTarget({
|
|
63421
|
-
hints: options.hints,
|
|
63422
63075
|
functions: (id) => {
|
|
63423
63076
|
if (userFunctions && id in userFunctions) {
|
|
63424
63077
|
const fn = userFunctions[id];
|
|
@@ -63457,89 +63110,12 @@ var GPUShaderTarget = class {
|
|
|
63457
63110
|
if (code.includes("_gpu_besselJ"))
|
|
63458
63111
|
preamble += this.languageId === "wgsl" ? GPU_BESSELJ_PREAMBLE_WGSL : GPU_BESSELJ_PREAMBLE_GLSL;
|
|
63459
63112
|
if (code.includes("_fractal_")) {
|
|
63460
|
-
|
|
63461
|
-
preamble += this.languageId === "wgsl" ? GPU_DS_ARITHMETIC_PREAMBLE_WGSL : GPU_DS_ARITHMETIC_PREAMBLE_GLSL;
|
|
63462
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PT_PREAMBLE_WGSL : GPU_FRACTAL_PT_PREAMBLE_GLSL;
|
|
63463
|
-
} else if (code.includes("_fractal_mandelbrot_dp") || code.includes("_fractal_julia_dp")) {
|
|
63464
|
-
preamble += this.languageId === "wgsl" ? GPU_DS_ARITHMETIC_PREAMBLE_WGSL : GPU_DS_ARITHMETIC_PREAMBLE_GLSL;
|
|
63465
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_DP_PREAMBLE_WGSL : GPU_FRACTAL_DP_PREAMBLE_GLSL;
|
|
63466
|
-
} else {
|
|
63467
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PREAMBLE_WGSL : GPU_FRACTAL_PREAMBLE_GLSL;
|
|
63468
|
-
}
|
|
63113
|
+
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PREAMBLE_WGSL : GPU_FRACTAL_PREAMBLE_GLSL;
|
|
63469
63114
|
}
|
|
63470
63115
|
if (code.includes("_gpu_srgb_to") || code.includes("_gpu_oklab") || code.includes("_gpu_oklch") || code.includes("_gpu_color_mix") || code.includes("_gpu_apca")) {
|
|
63471
63116
|
preamble += this.languageId === "wgsl" ? GPU_COLOR_PREAMBLE_WGSL : GPU_COLOR_PREAMBLE_GLSL;
|
|
63472
63117
|
}
|
|
63473
63118
|
if (preamble) result.preamble = preamble;
|
|
63474
|
-
if (code.includes("_fractal_") && options.hints?.viewport) {
|
|
63475
|
-
const strategy = selectFractalStrategy(target);
|
|
63476
|
-
const radius = options.hints.viewport.radius;
|
|
63477
|
-
switch (strategy) {
|
|
63478
|
-
case "single":
|
|
63479
|
-
result.staleWhen = { radiusBelow: 1e-6 };
|
|
63480
|
-
break;
|
|
63481
|
-
case "double":
|
|
63482
|
-
result.staleWhen = { radiusBelow: 1e-14, radiusAbove: 1e-5 };
|
|
63483
|
-
break;
|
|
63484
|
-
case "perturbation":
|
|
63485
|
-
result.staleWhen = {
|
|
63486
|
-
radiusAbove: 1e-5,
|
|
63487
|
-
radiusBelow: radius * 0.01,
|
|
63488
|
-
centerDistance: radius * 2
|
|
63489
|
-
};
|
|
63490
|
-
break;
|
|
63491
|
-
}
|
|
63492
|
-
}
|
|
63493
|
-
if ((code.includes("_fractal_mandelbrot_dp") || code.includes("_fractal_julia_dp")) && options.hints?.viewport) {
|
|
63494
|
-
const cx = hpToNumber(options.hints.viewport.center[0]);
|
|
63495
|
-
const cy = hpToNumber(options.hints.viewport.center[1]);
|
|
63496
|
-
const size = options.hints.viewport.radius * 2;
|
|
63497
|
-
const cx_hi = Math.fround(cx);
|
|
63498
|
-
const cy_hi = Math.fround(cy);
|
|
63499
|
-
result.uniforms = {
|
|
63500
|
-
...result.uniforms,
|
|
63501
|
-
_dp_cx_hi: cx_hi,
|
|
63502
|
-
_dp_cx_lo: cx - cx_hi,
|
|
63503
|
-
_dp_cy_hi: cy_hi,
|
|
63504
|
-
_dp_cy_lo: cy - cy_hi,
|
|
63505
|
-
_dp_w: size,
|
|
63506
|
-
_dp_h: size
|
|
63507
|
-
};
|
|
63508
|
-
}
|
|
63509
|
-
if ((code.includes("_fractal_mandelbrot_pt") || code.includes("_fractal_julia_pt")) && options.hints?.viewport) {
|
|
63510
|
-
const viewport = options.hints.viewport;
|
|
63511
|
-
const size = viewport.radius * 2;
|
|
63512
|
-
result.uniforms = {
|
|
63513
|
-
...result.uniforms,
|
|
63514
|
-
_pt_offset_x: 0,
|
|
63515
|
-
_pt_offset_y: 0,
|
|
63516
|
-
_pt_w: size,
|
|
63517
|
-
_pt_h: size
|
|
63518
|
-
};
|
|
63519
|
-
const digits = Math.max(50, Math.ceil(-Math.log10(viewport.radius)) + 10);
|
|
63520
|
-
const maxIter = 1e3;
|
|
63521
|
-
const orbit = computeReferenceOrbit(
|
|
63522
|
-
viewport.center,
|
|
63523
|
-
maxIter,
|
|
63524
|
-
digits
|
|
63525
|
-
);
|
|
63526
|
-
const orbitLen = orbit.length / 2;
|
|
63527
|
-
const texWidth = Math.min(orbitLen, 4096);
|
|
63528
|
-
const texHeight = Math.ceil(orbitLen / texWidth);
|
|
63529
|
-
result.textures = {
|
|
63530
|
-
_refOrbit: {
|
|
63531
|
-
data: orbit,
|
|
63532
|
-
width: texWidth,
|
|
63533
|
-
height: texHeight,
|
|
63534
|
-
format: "rg32f"
|
|
63535
|
-
}
|
|
63536
|
-
};
|
|
63537
|
-
result.uniforms = {
|
|
63538
|
-
...result.uniforms,
|
|
63539
|
-
_refOrbitLen: orbitLen,
|
|
63540
|
-
_refOrbitTexWidth: texWidth
|
|
63541
|
-
};
|
|
63542
|
-
}
|
|
63543
63119
|
return result;
|
|
63544
63120
|
}
|
|
63545
63121
|
compileToSource(expr2, _options = {}) {
|
|
@@ -68522,7 +68098,7 @@ var ComputeEngine = class _ComputeEngine {
|
|
|
68522
68098
|
_setDefaultEngineFactory(() => new ComputeEngine());
|
|
68523
68099
|
|
|
68524
68100
|
// src/core.ts
|
|
68525
|
-
var version = "0.55.
|
|
68101
|
+
var version = "0.55.6";
|
|
68526
68102
|
export {
|
|
68527
68103
|
ComputeEngine,
|
|
68528
68104
|
N,
|