@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Compute Engine 0.55.
|
|
1
|
+
/** Compute Engine 0.55.6 */
|
|
2
2
|
(function(global,factory){typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'],factory):(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ComputeEngine = {}));})(this, (function (exports) { 'use strict';
|
|
3
3
|
var ComputeEngine = (() => {
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -11113,10 +11113,6 @@ var ComputeEngine = (() => {
|
|
|
11113
11113
|
// Lagrange notation
|
|
11114
11114
|
{
|
|
11115
11115
|
name: "Derivative",
|
|
11116
|
-
// @todo: Leibniz notation: {% latex " \\frac{d^n}{dx^n} f(x)" %}
|
|
11117
|
-
// @todo: Euler modified notation: This notation is used by Mathematica. The Euler notation uses `D` instead of
|
|
11118
|
-
// `\partial`: `\partial_{x} f`, `\partial_{x,y} f`
|
|
11119
|
-
// Newton notation (\dot{v}, \ddot{v}) is implemented below
|
|
11120
11116
|
serialize: (serializer, expr2) => {
|
|
11121
11117
|
const degree = machineValue(operand(expr2, 2)) ?? 1;
|
|
11122
11118
|
const base = serializer.serialize(operand(expr2, 1));
|
|
@@ -12154,14 +12150,18 @@ var ComputeEngine = (() => {
|
|
|
12154
12150
|
return ["Complement", lhs];
|
|
12155
12151
|
}
|
|
12156
12152
|
// precedence: 240,
|
|
12157
|
-
// @todo: serialize for the multiple argument case
|
|
12158
12153
|
},
|
|
12159
12154
|
{
|
|
12160
12155
|
name: "Complement",
|
|
12161
12156
|
latexTrigger: ["^", "<{>", "\\complement", "<}>"],
|
|
12162
|
-
kind: "postfix"
|
|
12157
|
+
kind: "postfix",
|
|
12163
12158
|
// precedence: 240,
|
|
12164
|
-
|
|
12159
|
+
serialize: (serializer, expr2) => {
|
|
12160
|
+
return joinLatex([
|
|
12161
|
+
serializer.serialize(operand(expr2, 1)),
|
|
12162
|
+
"^\\complement"
|
|
12163
|
+
]);
|
|
12164
|
+
}
|
|
12165
12165
|
},
|
|
12166
12166
|
{
|
|
12167
12167
|
name: "Intersection",
|
|
@@ -12248,7 +12248,6 @@ var ComputeEngine = (() => {
|
|
|
12248
12248
|
// commands like \rbrack a, b \rbrack which are unambiguous.
|
|
12249
12249
|
{
|
|
12250
12250
|
name: "Multiple",
|
|
12251
|
-
// @todo: parse
|
|
12252
12251
|
serialize: serializeSet
|
|
12253
12252
|
},
|
|
12254
12253
|
{
|
|
@@ -12257,14 +12256,28 @@ var ComputeEngine = (() => {
|
|
|
12257
12256
|
kind: "infix",
|
|
12258
12257
|
precedence: 350
|
|
12259
12258
|
},
|
|
12259
|
+
// \mid as a separator/operator (used in set-builder notation: {x \mid x > 0})
|
|
12260
|
+
// Low precedence so it binds loosely — everything on each side is parsed first
|
|
12261
|
+
{
|
|
12262
|
+
name: "Divides",
|
|
12263
|
+
latexTrigger: ["\\mid"],
|
|
12264
|
+
kind: "infix",
|
|
12265
|
+
precedence: 160
|
|
12266
|
+
},
|
|
12260
12267
|
{
|
|
12261
12268
|
name: "Set",
|
|
12262
12269
|
kind: "matchfix",
|
|
12263
12270
|
openTrigger: "{",
|
|
12264
12271
|
closeTrigger: "}",
|
|
12265
|
-
// @todo: the set syntax can also include conditions...
|
|
12266
12272
|
parse: (_parser, body) => {
|
|
12267
12273
|
if (isEmptySequence(body)) return "EmptySet";
|
|
12274
|
+
const h = operator(body);
|
|
12275
|
+
if (h === "Divides" || h === "Colon") {
|
|
12276
|
+
const expr2 = operand(body, 1);
|
|
12277
|
+
const condition = operand(body, 2);
|
|
12278
|
+
if (expr2 !== null && condition !== null)
|
|
12279
|
+
return ["Set", expr2, ["Condition", condition]];
|
|
12280
|
+
}
|
|
12268
12281
|
if (operator(body) == "Delimiter" && stringValue(operand(body, 2)) === ",") {
|
|
12269
12282
|
body = operand(body, 1);
|
|
12270
12283
|
}
|
|
@@ -12272,6 +12285,17 @@ var ComputeEngine = (() => {
|
|
|
12272
12285
|
return ["Set", ...operands(body)];
|
|
12273
12286
|
},
|
|
12274
12287
|
serialize: (serializer, expr2) => {
|
|
12288
|
+
if (nops(expr2) === 2 && operator(operand(expr2, 2)) === "Condition") {
|
|
12289
|
+
const condition = operand(expr2, 2);
|
|
12290
|
+
return joinLatex([
|
|
12291
|
+
"\\lbrace",
|
|
12292
|
+
serializer.serialize(operand(expr2, 1)),
|
|
12293
|
+
"\\mid",
|
|
12294
|
+
// Serialize the inner expression of the Condition wrapper
|
|
12295
|
+
serializer.serialize(operand(condition, 1)),
|
|
12296
|
+
"\\rbrace"
|
|
12297
|
+
]);
|
|
12298
|
+
}
|
|
12275
12299
|
return joinLatex([
|
|
12276
12300
|
"\\lbrace",
|
|
12277
12301
|
operands(expr2).map((x) => serializer.serialize(x)).join(", "),
|
|
@@ -12438,23 +12462,6 @@ var ComputeEngine = (() => {
|
|
|
12438
12462
|
if (expr2 === null) return "";
|
|
12439
12463
|
const h = operator(expr2);
|
|
12440
12464
|
if (!h) return "";
|
|
12441
|
-
if (h === "Set") {
|
|
12442
|
-
if (nops(expr2) === 0) return "\\emptyset";
|
|
12443
|
-
if (nops(expr2) === 2 && operator(operand(expr2, 2)) === "Condition") {
|
|
12444
|
-
return joinLatex([
|
|
12445
|
-
"\\left\\lbrace",
|
|
12446
|
-
serializer.serialize(operand(expr2, 1)),
|
|
12447
|
-
"\\middle\\mid",
|
|
12448
|
-
serializer.serialize(operand(expr2, 2)),
|
|
12449
|
-
"\\right\\rbrace"
|
|
12450
|
-
]);
|
|
12451
|
-
}
|
|
12452
|
-
return joinLatex([
|
|
12453
|
-
"\\left\\lbrace",
|
|
12454
|
-
...operands(expr2).map((x) => serializer.serialize(x) + " ,"),
|
|
12455
|
-
"\\right\\rbrace"
|
|
12456
|
-
]);
|
|
12457
|
-
}
|
|
12458
12465
|
if (h === "Multiple") {
|
|
12459
12466
|
}
|
|
12460
12467
|
if (h === "Range") {
|
|
@@ -13602,11 +13609,13 @@ var ComputeEngine = (() => {
|
|
|
13602
13609
|
if (!parser.match("_")) return null;
|
|
13603
13610
|
const base = parser.parseGroup();
|
|
13604
13611
|
if (operator(base) !== "To") return null;
|
|
13605
|
-
const expr2 = parser.
|
|
13612
|
+
const expr2 = parser.parseExpression({
|
|
13613
|
+
minPrec: MULTIPLICATION_PRECEDENCE
|
|
13614
|
+
});
|
|
13606
13615
|
if (!expr2) return null;
|
|
13607
13616
|
return [
|
|
13608
13617
|
"Limit",
|
|
13609
|
-
["Function", expr2
|
|
13618
|
+
["Function", expr2, operand(base, 1)],
|
|
13610
13619
|
operand(base, 2)
|
|
13611
13620
|
];
|
|
13612
13621
|
},
|
|
@@ -15903,12 +15912,52 @@ var ComputeEngine = (() => {
|
|
|
15903
15912
|
];
|
|
15904
15913
|
|
|
15905
15914
|
// src/compute-engine/latex-syntax/dictionary/definitions-other.ts
|
|
15915
|
+
var TEX_UNITS = [
|
|
15916
|
+
"pt",
|
|
15917
|
+
"em",
|
|
15918
|
+
"mu",
|
|
15919
|
+
"ex",
|
|
15920
|
+
"mm",
|
|
15921
|
+
"cm",
|
|
15922
|
+
"in",
|
|
15923
|
+
"bp",
|
|
15924
|
+
"sp",
|
|
15925
|
+
"dd",
|
|
15926
|
+
"cc",
|
|
15927
|
+
"pc",
|
|
15928
|
+
"nc",
|
|
15929
|
+
"nd"
|
|
15930
|
+
];
|
|
15931
|
+
function skipTexDimension(parser) {
|
|
15932
|
+
parser.skipSpace();
|
|
15933
|
+
if (parser.peek === "-" || parser.peek === "+") parser.nextToken();
|
|
15934
|
+
while (/^[\d.]$/.test(parser.peek)) parser.nextToken();
|
|
15935
|
+
for (const unit of TEX_UNITS) {
|
|
15936
|
+
if (parser.matchAll([...unit])) return;
|
|
15937
|
+
}
|
|
15938
|
+
}
|
|
15906
15939
|
function parseSingleArg(cmd) {
|
|
15907
15940
|
return (parser) => {
|
|
15908
15941
|
const arg = parser.parseGroup();
|
|
15909
15942
|
return arg === null ? [cmd] : [cmd, arg];
|
|
15910
15943
|
};
|
|
15911
15944
|
}
|
|
15945
|
+
function parseMathStyleSwitch(mathStyle) {
|
|
15946
|
+
return (parser) => {
|
|
15947
|
+
const body = parser.parseExpression();
|
|
15948
|
+
if (body !== null && !isEmptySequence(body))
|
|
15949
|
+
return ["Annotated", body, { dict: { mathStyle } }];
|
|
15950
|
+
return "Nothing";
|
|
15951
|
+
};
|
|
15952
|
+
}
|
|
15953
|
+
function parseSizeSwitch(size) {
|
|
15954
|
+
return (parser) => {
|
|
15955
|
+
const body = parser.parseExpression();
|
|
15956
|
+
if (body !== null && !isEmptySequence(body))
|
|
15957
|
+
return ["Annotated", body, { dict: { size } }];
|
|
15958
|
+
return "Nothing";
|
|
15959
|
+
};
|
|
15960
|
+
}
|
|
15912
15961
|
var DEFINITIONS_OTHERS = [
|
|
15913
15962
|
{
|
|
15914
15963
|
name: "Overscript",
|
|
@@ -16148,80 +16197,71 @@ var ComputeEngine = (() => {
|
|
|
16148
16197
|
},
|
|
16149
16198
|
{
|
|
16150
16199
|
latexTrigger: ["\\displaystyle"],
|
|
16151
|
-
parse: (
|
|
16152
|
-
// @todo: parse as ['Annotated'...]
|
|
16200
|
+
parse: parseMathStyleSwitch("normal")
|
|
16153
16201
|
},
|
|
16154
16202
|
{
|
|
16155
16203
|
latexTrigger: ["\\textstyle"],
|
|
16156
|
-
parse: (
|
|
16157
|
-
// @todo: parse as ['Annotated'...]
|
|
16204
|
+
parse: parseMathStyleSwitch("compact")
|
|
16158
16205
|
},
|
|
16159
16206
|
{
|
|
16160
16207
|
latexTrigger: ["\\scriptstyle"],
|
|
16161
|
-
parse: (
|
|
16162
|
-
// @todo: parse as ['Annotated'...]
|
|
16208
|
+
parse: parseMathStyleSwitch("script")
|
|
16163
16209
|
},
|
|
16164
16210
|
{
|
|
16165
16211
|
latexTrigger: ["\\scriptscriptstyle"],
|
|
16166
|
-
parse: (
|
|
16167
|
-
// @todo: parse as ['Annotated'...]
|
|
16212
|
+
parse: parseMathStyleSwitch("scriptscript")
|
|
16168
16213
|
},
|
|
16169
16214
|
{
|
|
16170
16215
|
latexTrigger: ["\\color"],
|
|
16171
16216
|
parse: (parser) => {
|
|
16172
|
-
parser.
|
|
16217
|
+
const color = parser.parseStringGroup();
|
|
16218
|
+
if (color !== null) {
|
|
16219
|
+
const body = parser.parseExpression();
|
|
16220
|
+
if (body !== null && !isEmptySequence(body))
|
|
16221
|
+
return ["Annotated", body, { dict: { color } }];
|
|
16222
|
+
}
|
|
16173
16223
|
return "Nothing";
|
|
16174
16224
|
}
|
|
16175
16225
|
},
|
|
16176
16226
|
{
|
|
16177
16227
|
latexTrigger: ["\\tiny"],
|
|
16178
|
-
parse: ()
|
|
16179
|
-
// @todo: parse as ['Annotated'...]
|
|
16228
|
+
parse: parseSizeSwitch(1)
|
|
16180
16229
|
},
|
|
16181
16230
|
{
|
|
16182
16231
|
latexTrigger: ["\\scriptsize"],
|
|
16183
|
-
parse: ()
|
|
16184
|
-
// @todo: parse as ['Annotated'...]
|
|
16232
|
+
parse: parseSizeSwitch(2)
|
|
16185
16233
|
},
|
|
16186
16234
|
{
|
|
16187
16235
|
latexTrigger: ["\\footnotesize"],
|
|
16188
|
-
parse: ()
|
|
16189
|
-
// @todo: parse as ['Annotated'...]
|
|
16236
|
+
parse: parseSizeSwitch(3)
|
|
16190
16237
|
},
|
|
16191
16238
|
{
|
|
16192
16239
|
latexTrigger: ["\\small"],
|
|
16193
|
-
parse: ()
|
|
16194
|
-
// @todo: parse as ['Annotated'...]
|
|
16240
|
+
parse: parseSizeSwitch(4)
|
|
16195
16241
|
},
|
|
16196
16242
|
{
|
|
16197
16243
|
latexTrigger: ["\\normalsize"],
|
|
16198
|
-
parse: ()
|
|
16199
|
-
// @todo: parse as ['Annotated'...]
|
|
16244
|
+
parse: parseSizeSwitch(5)
|
|
16200
16245
|
},
|
|
16201
16246
|
{
|
|
16202
16247
|
latexTrigger: ["\\large"],
|
|
16203
|
-
parse: ()
|
|
16204
|
-
// @todo: parse as ['Annotated'...]
|
|
16248
|
+
parse: parseSizeSwitch(6)
|
|
16205
16249
|
},
|
|
16206
16250
|
{
|
|
16207
16251
|
latexTrigger: ["\\Large"],
|
|
16208
|
-
parse: ()
|
|
16209
|
-
// @todo: parse as ['Annotated'...]
|
|
16252
|
+
parse: parseSizeSwitch(7)
|
|
16210
16253
|
},
|
|
16211
16254
|
{
|
|
16212
16255
|
latexTrigger: ["\\LARGE"],
|
|
16213
|
-
parse: ()
|
|
16214
|
-
// @todo: parse as ['Annotated'...]
|
|
16256
|
+
parse: parseSizeSwitch(8)
|
|
16215
16257
|
},
|
|
16216
16258
|
{
|
|
16217
16259
|
latexTrigger: ["\\huge"],
|
|
16218
|
-
parse: ()
|
|
16219
|
-
// @todo: parse as ['Annotated'...]
|
|
16260
|
+
parse: parseSizeSwitch(9)
|
|
16220
16261
|
},
|
|
16221
16262
|
{
|
|
16222
16263
|
latexTrigger: ["\\Huge"],
|
|
16223
|
-
parse: ()
|
|
16224
|
-
// @todo: parse as ['Annotated'...]
|
|
16264
|
+
parse: parseSizeSwitch(10)
|
|
16225
16265
|
},
|
|
16226
16266
|
{
|
|
16227
16267
|
name: "Annotated",
|
|
@@ -16233,6 +16273,10 @@ var ComputeEngine = (() => {
|
|
|
16233
16273
|
result = joinLatex(["{\\displaystyle", result, "}"]);
|
|
16234
16274
|
else if (dict.dict.mathStyle === "compact")
|
|
16235
16275
|
result = joinLatex(["{\\textstyle", result, "}"]);
|
|
16276
|
+
else if (dict.dict.mathStyle === "script")
|
|
16277
|
+
result = joinLatex(["{\\scriptstyle", result, "}"]);
|
|
16278
|
+
else if (dict.dict.mathStyle === "scriptscript")
|
|
16279
|
+
result = joinLatex(["{\\scriptscriptstyle", result, "}"]);
|
|
16236
16280
|
const v = dict.dict.size;
|
|
16237
16281
|
if (v !== null && v >= 1 && v <= 10) {
|
|
16238
16282
|
result = joinLatex([
|
|
@@ -16320,6 +16364,28 @@ var ComputeEngine = (() => {
|
|
|
16320
16364
|
latexTrigger: ["\\enspace"],
|
|
16321
16365
|
parse: () => ["HorizontalSpacing", 9]
|
|
16322
16366
|
},
|
|
16367
|
+
{
|
|
16368
|
+
latexTrigger: ["\\hspace"],
|
|
16369
|
+
parse: (parser) => {
|
|
16370
|
+
if (parser.peek === "*") parser.nextToken();
|
|
16371
|
+
parser.parseStringGroup();
|
|
16372
|
+
return ["HorizontalSpacing", 0];
|
|
16373
|
+
}
|
|
16374
|
+
},
|
|
16375
|
+
{
|
|
16376
|
+
latexTrigger: ["\\hskip"],
|
|
16377
|
+
parse: (parser) => {
|
|
16378
|
+
skipTexDimension(parser);
|
|
16379
|
+
return ["HorizontalSpacing", 0];
|
|
16380
|
+
}
|
|
16381
|
+
},
|
|
16382
|
+
{
|
|
16383
|
+
latexTrigger: ["\\kern"],
|
|
16384
|
+
parse: (parser) => {
|
|
16385
|
+
skipTexDimension(parser);
|
|
16386
|
+
return ["HorizontalSpacing", 0];
|
|
16387
|
+
}
|
|
16388
|
+
},
|
|
16323
16389
|
{
|
|
16324
16390
|
latexTrigger: ["\\phantom"],
|
|
16325
16391
|
parse: (parser) => {
|
|
@@ -16370,7 +16436,17 @@ var ComputeEngine = (() => {
|
|
|
16370
16436
|
// `["HorizontalSpacing", expr, 'op'|'bin'|rel]` -> indicate a spacing around and expression, i.e. `\mathbin{x}`, etc...
|
|
16371
16437
|
serialize: (serializer, expr2) => {
|
|
16372
16438
|
if (operand(expr2, 2) !== null) {
|
|
16373
|
-
|
|
16439
|
+
const cls = stringValue(operand(expr2, 2));
|
|
16440
|
+
const inner = serializer.serialize(operand(expr2, 1));
|
|
16441
|
+
if (cls === "bin") return `\\mathbin{${inner}}`;
|
|
16442
|
+
if (cls === "op") return `\\mathop{${inner}}`;
|
|
16443
|
+
if (cls === "rel") return `\\mathrel{${inner}}`;
|
|
16444
|
+
if (cls === "ord") return `\\mathord{${inner}}`;
|
|
16445
|
+
if (cls === "open") return `\\mathopen{${inner}}`;
|
|
16446
|
+
if (cls === "close") return `\\mathclose{${inner}}`;
|
|
16447
|
+
if (cls === "punct") return `\\mathpunct{${inner}}`;
|
|
16448
|
+
if (cls === "inner") return `\\mathinner{${inner}}`;
|
|
16449
|
+
return inner;
|
|
16374
16450
|
}
|
|
16375
16451
|
const v = machineValue(operand(expr2, 1));
|
|
16376
16452
|
if (v === null) return "";
|
|
@@ -16761,25 +16837,47 @@ var ComputeEngine = (() => {
|
|
|
16761
16837
|
result.arguments = entry.arguments;
|
|
16762
16838
|
return result;
|
|
16763
16839
|
}
|
|
16840
|
+
function serializeTabularBody(serializer, body) {
|
|
16841
|
+
if (!body) return "";
|
|
16842
|
+
if (operator(body) !== "List") return serializer.serialize(body);
|
|
16843
|
+
const rows = operands(body);
|
|
16844
|
+
if (rows.length === 0) return "";
|
|
16845
|
+
if (!rows.every((row) => operator(row) === "List"))
|
|
16846
|
+
return serializer.serialize(body);
|
|
16847
|
+
return rows.map(
|
|
16848
|
+
(row) => operands(row).map((cell) => serializer.serialize(cell)).join(" & ")
|
|
16849
|
+
).join(" \\\\\n");
|
|
16850
|
+
}
|
|
16764
16851
|
function makeSerializeHandler(entry, latexTrigger, idTrigger) {
|
|
16765
16852
|
if (typeof entry.serialize === "function") return entry.serialize;
|
|
16766
16853
|
const kind = entry["kind"] ?? "expression";
|
|
16767
16854
|
if (kind === "environment") {
|
|
16768
16855
|
const envName = entry["symbolTrigger"] ?? entry.name ?? "unknown";
|
|
16769
|
-
return (serializer, expr2) =>
|
|
16770
|
-
|
|
16771
|
-
|
|
16772
|
-
|
|
16773
|
-
|
|
16856
|
+
return (serializer, expr2) => {
|
|
16857
|
+
const body = operand(expr2, 1);
|
|
16858
|
+
return joinLatex([
|
|
16859
|
+
`\\begin{${envName}}`,
|
|
16860
|
+
serializeTabularBody(serializer, body),
|
|
16861
|
+
`\\end{${envName}}`
|
|
16862
|
+
]);
|
|
16863
|
+
};
|
|
16774
16864
|
}
|
|
16775
16865
|
if (isMatchfixEntry(entry)) {
|
|
16776
16866
|
const openDelim = typeof entry.openTrigger === "string" ? DEFAULT_DELIMITER[entry.openTrigger] : tokensToString(entry.openTrigger);
|
|
16777
16867
|
const closeDelim = typeof entry.closeTrigger === "string" ? DEFAULT_DELIMITER[entry.closeTrigger] : tokensToString(entry.closeTrigger);
|
|
16778
|
-
return (serializer, expr2) =>
|
|
16779
|
-
|
|
16780
|
-
serializer.serialize(operand(expr2, 1))
|
|
16781
|
-
|
|
16782
|
-
|
|
16868
|
+
return (serializer, expr2) => {
|
|
16869
|
+
const style = serializer.groupStyle(expr2, serializer.level + 1);
|
|
16870
|
+
const inner = serializer.serialize(operand(expr2, 1));
|
|
16871
|
+
if (style === "scaled")
|
|
16872
|
+
return joinLatex([`\\left${openDelim}`, inner, `\\right${closeDelim}`]);
|
|
16873
|
+
if (style === "big")
|
|
16874
|
+
return joinLatex([
|
|
16875
|
+
`\\Bigl${openDelim}`,
|
|
16876
|
+
inner,
|
|
16877
|
+
`\\Bigr${closeDelim}`
|
|
16878
|
+
]);
|
|
16879
|
+
return joinLatex([openDelim, inner, closeDelim]);
|
|
16880
|
+
};
|
|
16783
16881
|
}
|
|
16784
16882
|
let latex = entry.serialize;
|
|
16785
16883
|
if (latex === void 0 && latexTrigger) latex = tokensToString(latexTrigger);
|
|
@@ -17664,6 +17762,16 @@ var ComputeEngine = (() => {
|
|
|
17664
17762
|
}
|
|
17665
17763
|
|
|
17666
17764
|
// src/compute-engine/latex-syntax/parse.ts
|
|
17765
|
+
var _symbolToUnicode = null;
|
|
17766
|
+
function getSymbolToUnicode() {
|
|
17767
|
+
if (!_symbolToUnicode) {
|
|
17768
|
+
_symbolToUnicode = /* @__PURE__ */ new Map();
|
|
17769
|
+
for (const [, latex, codepoint] of SYMBOLS2) {
|
|
17770
|
+
_symbolToUnicode.set(latex, String.fromCodePoint(codepoint));
|
|
17771
|
+
}
|
|
17772
|
+
}
|
|
17773
|
+
return _symbolToUnicode;
|
|
17774
|
+
}
|
|
17667
17775
|
var DELIMITER_SHORTHAND2 = {
|
|
17668
17776
|
"(": ["\\lparen", "("],
|
|
17669
17777
|
")": ["\\rparen", ")"],
|
|
@@ -18111,6 +18219,35 @@ var ComputeEngine = (() => {
|
|
|
18111
18219
|
this.nextToken();
|
|
18112
18220
|
this.skipVisualSpace();
|
|
18113
18221
|
}
|
|
18222
|
+
if (this.match("\\hspace")) {
|
|
18223
|
+
this.match("*");
|
|
18224
|
+
this.parseStringGroup();
|
|
18225
|
+
this.skipVisualSpace();
|
|
18226
|
+
}
|
|
18227
|
+
if (this.match("\\hskip") || this.match("\\kern")) {
|
|
18228
|
+
this.skipSpace();
|
|
18229
|
+
this.match("-") || this.match("+");
|
|
18230
|
+
while (/^[\d.]$/.test(this.peek)) this.nextToken();
|
|
18231
|
+
for (const unit of [
|
|
18232
|
+
"pt",
|
|
18233
|
+
"em",
|
|
18234
|
+
"mu",
|
|
18235
|
+
"ex",
|
|
18236
|
+
"mm",
|
|
18237
|
+
"cm",
|
|
18238
|
+
"in",
|
|
18239
|
+
"bp",
|
|
18240
|
+
"sp",
|
|
18241
|
+
"dd",
|
|
18242
|
+
"cc",
|
|
18243
|
+
"pc",
|
|
18244
|
+
"nc",
|
|
18245
|
+
"nd"
|
|
18246
|
+
]) {
|
|
18247
|
+
if (this.matchAll([...unit])) break;
|
|
18248
|
+
}
|
|
18249
|
+
this.skipVisualSpace();
|
|
18250
|
+
}
|
|
18114
18251
|
this.skipSpace();
|
|
18115
18252
|
}
|
|
18116
18253
|
match(token) {
|
|
@@ -18448,7 +18585,8 @@ var ComputeEngine = (() => {
|
|
|
18448
18585
|
} else if (token === "<space>") {
|
|
18449
18586
|
result += " ";
|
|
18450
18587
|
} else if (token[0] === "\\") {
|
|
18451
|
-
|
|
18588
|
+
const unicode = getSymbolToUnicode().get(token);
|
|
18589
|
+
result += unicode ?? token;
|
|
18452
18590
|
} else {
|
|
18453
18591
|
result += token;
|
|
18454
18592
|
}
|
|
@@ -19808,7 +19946,7 @@ var ComputeEngine = (() => {
|
|
|
19808
19946
|
sansserif: (s) => `\\mathsf{${s}}`,
|
|
19809
19947
|
monospace: (s) => `\\mathtt{${s}}`
|
|
19810
19948
|
};
|
|
19811
|
-
var
|
|
19949
|
+
var Serializer5 = class {
|
|
19812
19950
|
options;
|
|
19813
19951
|
dictionary;
|
|
19814
19952
|
level = -1;
|
|
@@ -19823,11 +19961,18 @@ var ComputeEngine = (() => {
|
|
|
19823
19961
|
/**
|
|
19824
19962
|
* Serialize the expression, and if the expression is an operator
|
|
19825
19963
|
* of precedence less than or equal to prec, wrap it in some parens.
|
|
19826
|
-
*
|
|
19964
|
+
*
|
|
19965
|
+
* Skip wrapping for matchfix operators (Abs, Floor, Ceil, Norm, etc.)
|
|
19966
|
+
* and Delimiter since they already have visible delimiters.
|
|
19827
19967
|
*/
|
|
19828
19968
|
wrap(expr2, prec) {
|
|
19829
19969
|
if (expr2 === null || expr2 === void 0) return "";
|
|
19830
19970
|
if (prec === void 0) {
|
|
19971
|
+
const name2 = operator(expr2);
|
|
19972
|
+
if (name2) {
|
|
19973
|
+
const def = this.dictionary.ids.get(name2);
|
|
19974
|
+
if (def?.kind === "matchfix") return this.serialize(expr2);
|
|
19975
|
+
}
|
|
19831
19976
|
return this.wrapString(
|
|
19832
19977
|
this.serialize(expr2),
|
|
19833
19978
|
this.options.groupStyle(expr2, this.level + 1)
|
|
@@ -20121,7 +20266,7 @@ var ComputeEngine = (() => {
|
|
|
20121
20266
|
return body;
|
|
20122
20267
|
}
|
|
20123
20268
|
function serializeLatex(expr2, dict, options) {
|
|
20124
|
-
const serializer = new
|
|
20269
|
+
const serializer = new Serializer5(dict, options);
|
|
20125
20270
|
return serializer.serialize(expr2);
|
|
20126
20271
|
}
|
|
20127
20272
|
|
|
@@ -42160,12 +42305,14 @@ ${e.message}
|
|
|
42160
42305
|
canonical: canonicalBlock,
|
|
42161
42306
|
evaluate: evaluateBlock
|
|
42162
42307
|
},
|
|
42163
|
-
// A condition expression tests for one or more conditions of an expression
|
|
42164
|
-
//
|
|
42308
|
+
// A condition expression tests for one or more conditions of an expression.
|
|
42309
|
+
// Two forms:
|
|
42310
|
+
// ['Condition', value, "positive"] — tests value against named condition(s)
|
|
42311
|
+
// ['Condition', predicate] — set-builder predicate (e.g. x > 0)
|
|
42165
42312
|
Condition: {
|
|
42166
42313
|
description: "Test whether a value satisfies one or more conditions.",
|
|
42167
42314
|
lazy: true,
|
|
42168
|
-
signature: "(
|
|
42315
|
+
signature: "(expression, symbol?) -> boolean",
|
|
42169
42316
|
evaluate: ([value, conds], { engine }) => {
|
|
42170
42317
|
let conditions = [];
|
|
42171
42318
|
if (isSymbol2(conds)) {
|
|
@@ -54839,8 +54986,7 @@ Error in definition of "${name}"`,
|
|
|
54839
54986
|
vars: options?.vars,
|
|
54840
54987
|
imports: options?.imports,
|
|
54841
54988
|
preamble: options?.preamble,
|
|
54842
|
-
realOnly: options?.realOnly
|
|
54843
|
-
hints: options?.hints
|
|
54989
|
+
realOnly: options?.realOnly
|
|
54844
54990
|
});
|
|
54845
54991
|
} catch (e) {
|
|
54846
54992
|
if (options?.fallback ?? true) {
|
|
@@ -61340,43 +61486,6 @@ Error in definition of "${name}"`,
|
|
|
61340
61486
|
return b;
|
|
61341
61487
|
}
|
|
61342
61488
|
|
|
61343
|
-
// src/compute-engine/compilation/fractal-orbit.ts
|
|
61344
|
-
function toBigDecimal(v) {
|
|
61345
|
-
if (typeof v === "object" && "hi" in v)
|
|
61346
|
-
return new BigDecimal(v.hi).add(new BigDecimal(v.lo));
|
|
61347
|
-
return new BigDecimal(v);
|
|
61348
|
-
}
|
|
61349
|
-
function hpToNumber(v) {
|
|
61350
|
-
if (typeof v === "number") return v;
|
|
61351
|
-
if (typeof v === "string") return Number(v);
|
|
61352
|
-
return v.hi + v.lo;
|
|
61353
|
-
}
|
|
61354
|
-
function computeReferenceOrbit(center, maxIter, precision) {
|
|
61355
|
-
const prevPrecision = BigDecimal.precision;
|
|
61356
|
-
BigDecimal.precision = precision;
|
|
61357
|
-
try {
|
|
61358
|
-
const cr = toBigDecimal(center[0]);
|
|
61359
|
-
const ci = toBigDecimal(center[1]);
|
|
61360
|
-
let zr = BigDecimal.ZERO;
|
|
61361
|
-
let zi = BigDecimal.ZERO;
|
|
61362
|
-
const ESCAPE = new BigDecimal(256);
|
|
61363
|
-
const points = [];
|
|
61364
|
-
for (let i = 0; i < maxIter; i++) {
|
|
61365
|
-
points.push(zr.toNumber(), zi.toNumber());
|
|
61366
|
-
const zr2 = zr.mul(zr).toPrecision(precision);
|
|
61367
|
-
const zi2 = zi.mul(zi).toPrecision(precision);
|
|
61368
|
-
const mag2 = zr2.add(zi2);
|
|
61369
|
-
if (mag2.cmp(ESCAPE) > 0) break;
|
|
61370
|
-
const new_zi = zr.mul(zi).toPrecision(precision).mul(2).add(ci);
|
|
61371
|
-
zr = zr2.sub(zi2).add(cr);
|
|
61372
|
-
zi = new_zi;
|
|
61373
|
-
}
|
|
61374
|
-
return new Float32Array(points);
|
|
61375
|
-
} finally {
|
|
61376
|
-
BigDecimal.precision = prevPrecision;
|
|
61377
|
-
}
|
|
61378
|
-
}
|
|
61379
|
-
|
|
61380
61489
|
// src/compute-engine/compilation/gpu-target.ts
|
|
61381
61490
|
var GPU_OPERATORS = {
|
|
61382
61491
|
Add: ["+", 11],
|
|
@@ -61460,13 +61569,6 @@ Error in definition of "${name}"`,
|
|
|
61460
61569
|
];
|
|
61461
61570
|
return lines.join("\n");
|
|
61462
61571
|
}
|
|
61463
|
-
function selectFractalStrategy(target) {
|
|
61464
|
-
const radius = target.hints?.viewport?.radius;
|
|
61465
|
-
if (radius === void 0) return "single";
|
|
61466
|
-
if (radius > 1e-6) return "single";
|
|
61467
|
-
if (radius > 1e-14) return "double";
|
|
61468
|
-
return "perturbation";
|
|
61469
|
-
}
|
|
61470
61572
|
var GPU_FUNCTIONS = {
|
|
61471
61573
|
// Variadic arithmetic (for function-call form, e.g., with vectors)
|
|
61472
61574
|
Add: (args, compile3, target) => {
|
|
@@ -61962,32 +62064,12 @@ Error in definition of "${name}"`,
|
|
|
61962
62064
|
if (c === null || maxIter === null)
|
|
61963
62065
|
throw new Error("Mandelbrot: missing arguments");
|
|
61964
62066
|
const iterCode = compileIntArg(maxIter, compile3, target);
|
|
61965
|
-
const strategy = selectFractalStrategy(target);
|
|
61966
|
-
if (strategy === "double") {
|
|
61967
|
-
const dpCoord = target?.language === "wgsl" ? "_dp_coord(v_uv)" : "_dp_coord()";
|
|
61968
|
-
return `_fractal_mandelbrot_dp(${dpCoord}, ${iterCode})`;
|
|
61969
|
-
}
|
|
61970
|
-
if (strategy === "perturbation") {
|
|
61971
|
-
const ptDelta = target?.language === "wgsl" ? "_pt_delta(v_uv)" : "_pt_delta()";
|
|
61972
|
-
return `_fractal_mandelbrot_pt(${ptDelta}, ${iterCode})`;
|
|
61973
|
-
}
|
|
61974
62067
|
return `_fractal_mandelbrot(${compile3(c)}, ${iterCode})`;
|
|
61975
62068
|
},
|
|
61976
62069
|
Julia: ([z, c, maxIter], compile3, target) => {
|
|
61977
62070
|
if (z === null || c === null || maxIter === null)
|
|
61978
62071
|
throw new Error("Julia: missing arguments");
|
|
61979
62072
|
const iterCode = compileIntArg(maxIter, compile3, target);
|
|
61980
|
-
const strategy = selectFractalStrategy(target);
|
|
61981
|
-
if (strategy === "double") {
|
|
61982
|
-
const dpCoord = target?.language === "wgsl" ? "_dp_coord(v_uv)" : "_dp_coord()";
|
|
61983
|
-
const cCode = compile3(c);
|
|
61984
|
-
return `_fractal_julia_dp(${dpCoord}, vec4(${cCode}, vec2(0.0)), ${iterCode})`;
|
|
61985
|
-
}
|
|
61986
|
-
if (strategy === "perturbation") {
|
|
61987
|
-
const ptDelta = target?.language === "wgsl" ? "_pt_delta(v_uv)" : "_pt_delta()";
|
|
61988
|
-
const cCode = compile3(c);
|
|
61989
|
-
return `_fractal_julia_pt(${ptDelta}, ${cCode}, ${iterCode})`;
|
|
61990
|
-
}
|
|
61991
62073
|
return `_fractal_julia(${compile3(z)}, ${compile3(c)}, ${iterCode})`;
|
|
61992
62074
|
},
|
|
61993
62075
|
// Vector/Matrix operations
|
|
@@ -62584,232 +62666,6 @@ fn _gpu_besselJ(n_in: i32, x_in: f32) -> f32 {
|
|
|
62584
62666
|
for (var k2: i32 = 2; k2 <= M; k2 += 2) { norm += 2.0 * vals[k2]; }
|
|
62585
62667
|
return sgn * vals[n] / norm;
|
|
62586
62668
|
}
|
|
62587
|
-
`;
|
|
62588
|
-
var GPU_DS_ARITHMETIC_PREAMBLE_GLSL = `
|
|
62589
|
-
// Split a float into high and low parts for exact multiplication
|
|
62590
|
-
vec2 ds_split(float a) {
|
|
62591
|
-
const float SPLIT = 4097.0; // 2^12 + 1
|
|
62592
|
-
float t = SPLIT * a;
|
|
62593
|
-
float hi = t - (t - a);
|
|
62594
|
-
float lo = a - hi;
|
|
62595
|
-
return vec2(hi, lo);
|
|
62596
|
-
}
|
|
62597
|
-
|
|
62598
|
-
// Create a double-single from a single float
|
|
62599
|
-
vec2 ds_from(float a) {
|
|
62600
|
-
return vec2(a, 0.0);
|
|
62601
|
-
}
|
|
62602
|
-
|
|
62603
|
-
// Error-free addition (Knuth TwoSum)
|
|
62604
|
-
vec2 ds_add(vec2 a, vec2 b) {
|
|
62605
|
-
float s = a.x + b.x;
|
|
62606
|
-
float v = s - a.x;
|
|
62607
|
-
float e = (a.x - (s - v)) + (b.x - v);
|
|
62608
|
-
float lo = (a.y + b.y) + e;
|
|
62609
|
-
float hi = s + lo;
|
|
62610
|
-
lo = lo - (hi - s);
|
|
62611
|
-
return vec2(hi, lo);
|
|
62612
|
-
}
|
|
62613
|
-
|
|
62614
|
-
// Double-single subtraction
|
|
62615
|
-
vec2 ds_sub(vec2 a, vec2 b) {
|
|
62616
|
-
return ds_add(a, vec2(-b.x, -b.y));
|
|
62617
|
-
}
|
|
62618
|
-
|
|
62619
|
-
// Error-free multiplication (Dekker TwoProduct)
|
|
62620
|
-
vec2 ds_mul(vec2 a, vec2 b) {
|
|
62621
|
-
float p = a.x * b.x;
|
|
62622
|
-
vec2 sa = ds_split(a.x);
|
|
62623
|
-
vec2 sb = ds_split(b.x);
|
|
62624
|
-
float err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;
|
|
62625
|
-
err += a.x * b.y + a.y * b.x;
|
|
62626
|
-
float hi = p + err;
|
|
62627
|
-
float lo = err - (hi - p);
|
|
62628
|
-
return vec2(hi, lo);
|
|
62629
|
-
}
|
|
62630
|
-
|
|
62631
|
-
// Optimized self-multiply
|
|
62632
|
-
vec2 ds_sqr(vec2 a) {
|
|
62633
|
-
float p = a.x * a.x;
|
|
62634
|
-
vec2 sa = ds_split(a.x);
|
|
62635
|
-
float err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;
|
|
62636
|
-
err += 2.0 * a.x * a.y;
|
|
62637
|
-
float hi = p + err;
|
|
62638
|
-
float lo = err - (hi - p);
|
|
62639
|
-
return vec2(hi, lo);
|
|
62640
|
-
}
|
|
62641
|
-
|
|
62642
|
-
// Compare magnitude: returns -1, 0, or 1
|
|
62643
|
-
float ds_cmp(vec2 a, vec2 b) {
|
|
62644
|
-
float d = a.x - b.x;
|
|
62645
|
-
if (d != 0.0) return sign(d);
|
|
62646
|
-
return sign(a.y - b.y);
|
|
62647
|
-
}
|
|
62648
|
-
`;
|
|
62649
|
-
var GPU_DS_ARITHMETIC_PREAMBLE_WGSL = `
|
|
62650
|
-
fn ds_split(a: f32) -> vec2f {
|
|
62651
|
-
const SPLIT: f32 = 4097.0;
|
|
62652
|
-
let t = SPLIT * a;
|
|
62653
|
-
let hi = t - (t - a);
|
|
62654
|
-
let lo = a - hi;
|
|
62655
|
-
return vec2f(hi, lo);
|
|
62656
|
-
}
|
|
62657
|
-
|
|
62658
|
-
fn ds_from(a: f32) -> vec2f {
|
|
62659
|
-
return vec2f(a, 0.0);
|
|
62660
|
-
}
|
|
62661
|
-
|
|
62662
|
-
fn ds_add(a: vec2f, b: vec2f) -> vec2f {
|
|
62663
|
-
let s = a.x + b.x;
|
|
62664
|
-
let v = s - a.x;
|
|
62665
|
-
let e = (a.x - (s - v)) + (b.x - v);
|
|
62666
|
-
let lo_t = (a.y + b.y) + e;
|
|
62667
|
-
let hi = s + lo_t;
|
|
62668
|
-
let lo = lo_t - (hi - s);
|
|
62669
|
-
return vec2f(hi, lo);
|
|
62670
|
-
}
|
|
62671
|
-
|
|
62672
|
-
fn ds_sub(a: vec2f, b: vec2f) -> vec2f {
|
|
62673
|
-
return ds_add(a, vec2f(-b.x, -b.y));
|
|
62674
|
-
}
|
|
62675
|
-
|
|
62676
|
-
fn ds_mul(a: vec2f, b: vec2f) -> vec2f {
|
|
62677
|
-
let p = a.x * b.x;
|
|
62678
|
-
let sa = ds_split(a.x);
|
|
62679
|
-
let sb = ds_split(b.x);
|
|
62680
|
-
var err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;
|
|
62681
|
-
err += a.x * b.y + a.y * b.x;
|
|
62682
|
-
let hi = p + err;
|
|
62683
|
-
let lo = err - (hi - p);
|
|
62684
|
-
return vec2f(hi, lo);
|
|
62685
|
-
}
|
|
62686
|
-
|
|
62687
|
-
fn ds_sqr(a: vec2f) -> vec2f {
|
|
62688
|
-
let p = a.x * a.x;
|
|
62689
|
-
let sa = ds_split(a.x);
|
|
62690
|
-
var err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;
|
|
62691
|
-
err += 2.0 * a.x * a.y;
|
|
62692
|
-
let hi = p + err;
|
|
62693
|
-
let lo = err - (hi - p);
|
|
62694
|
-
return vec2f(hi, lo);
|
|
62695
|
-
}
|
|
62696
|
-
|
|
62697
|
-
fn ds_cmp(a: vec2f, b: vec2f) -> f32 {
|
|
62698
|
-
let d = a.x - b.x;
|
|
62699
|
-
if (d != 0.0) { return sign(d); }
|
|
62700
|
-
return sign(a.y - b.y);
|
|
62701
|
-
}
|
|
62702
|
-
`;
|
|
62703
|
-
var GPU_FRACTAL_DP_PREAMBLE_GLSL = `
|
|
62704
|
-
uniform float _dp_cx_hi;
|
|
62705
|
-
uniform float _dp_cx_lo;
|
|
62706
|
-
uniform float _dp_cy_hi;
|
|
62707
|
-
uniform float _dp_cy_lo;
|
|
62708
|
-
uniform float _dp_w;
|
|
62709
|
-
uniform float _dp_h;
|
|
62710
|
-
|
|
62711
|
-
vec4 _dp_coord() {
|
|
62712
|
-
// Per-pixel offset from center \u2014 small, so float-precise
|
|
62713
|
-
float dx = (v_uv.x - 0.5) * _dp_w;
|
|
62714
|
-
float dy = (v_uv.y - 0.5) * _dp_h;
|
|
62715
|
-
// Combine center (hi+lo) + delta with emulated double precision
|
|
62716
|
-
vec2 cre = ds_add(vec2(_dp_cx_hi, _dp_cx_lo), ds_from(dx));
|
|
62717
|
-
vec2 cim = ds_add(vec2(_dp_cy_hi, _dp_cy_lo), ds_from(dy));
|
|
62718
|
-
return vec4(cre.x, cim.x, cre.y, cim.y);
|
|
62719
|
-
}
|
|
62720
|
-
|
|
62721
|
-
float _fractal_mandelbrot_dp(vec4 c, int maxIter) {
|
|
62722
|
-
// c = (re_hi, im_hi, re_lo, im_lo)
|
|
62723
|
-
vec2 cr = vec2(c.x, c.z); // real part as ds
|
|
62724
|
-
vec2 ci = vec2(c.y, c.w); // imag part as ds
|
|
62725
|
-
vec2 zr = vec2(0.0, 0.0);
|
|
62726
|
-
vec2 zi = vec2(0.0, 0.0);
|
|
62727
|
-
for (int i = 0; i < maxIter; i++) {
|
|
62728
|
-
vec2 zr2 = ds_sqr(zr);
|
|
62729
|
-
vec2 zi2 = ds_sqr(zi);
|
|
62730
|
-
// |z|^2 > 4.0 ?
|
|
62731
|
-
vec2 mag2 = ds_add(zr2, zi2);
|
|
62732
|
-
if (mag2.x > 4.0)
|
|
62733
|
-
return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62734
|
-
// z = z^2 + c
|
|
62735
|
-
vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci); // 2*zr*zi + ci
|
|
62736
|
-
zr = ds_add(ds_sub(zr2, zi2), cr); // zr^2 - zi^2 + cr
|
|
62737
|
-
zi = new_zi;
|
|
62738
|
-
}
|
|
62739
|
-
return 1.0;
|
|
62740
|
-
}
|
|
62741
|
-
|
|
62742
|
-
float _fractal_julia_dp(vec4 z_in, vec4 c, int maxIter) {
|
|
62743
|
-
vec2 zr = vec2(z_in.x, z_in.z);
|
|
62744
|
-
vec2 zi = vec2(z_in.y, z_in.w);
|
|
62745
|
-
vec2 cr = vec2(c.x, c.z);
|
|
62746
|
-
vec2 ci = vec2(c.y, c.w);
|
|
62747
|
-
for (int i = 0; i < maxIter; i++) {
|
|
62748
|
-
vec2 zr2 = ds_sqr(zr);
|
|
62749
|
-
vec2 zi2 = ds_sqr(zi);
|
|
62750
|
-
vec2 mag2 = ds_add(zr2, zi2);
|
|
62751
|
-
if (mag2.x > 4.0)
|
|
62752
|
-
return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62753
|
-
vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
62754
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
62755
|
-
zi = new_zi;
|
|
62756
|
-
}
|
|
62757
|
-
return 1.0;
|
|
62758
|
-
}
|
|
62759
|
-
`;
|
|
62760
|
-
var GPU_FRACTAL_DP_PREAMBLE_WGSL = `
|
|
62761
|
-
@group(0) @binding(10) var<uniform> _dp_cx_hi: f32;
|
|
62762
|
-
@group(0) @binding(11) var<uniform> _dp_cx_lo: f32;
|
|
62763
|
-
@group(0) @binding(12) var<uniform> _dp_cy_hi: f32;
|
|
62764
|
-
@group(0) @binding(13) var<uniform> _dp_cy_lo: f32;
|
|
62765
|
-
@group(0) @binding(14) var<uniform> _dp_w: f32;
|
|
62766
|
-
@group(0) @binding(15) var<uniform> _dp_h: f32;
|
|
62767
|
-
|
|
62768
|
-
fn _dp_coord(uv: vec2f) -> vec4f {
|
|
62769
|
-
let dx = (uv.x - 0.5) * _dp_w;
|
|
62770
|
-
let dy = (uv.y - 0.5) * _dp_h;
|
|
62771
|
-
let cre = ds_add(vec2f(_dp_cx_hi, _dp_cx_lo), ds_from(dx));
|
|
62772
|
-
let cim = ds_add(vec2f(_dp_cy_hi, _dp_cy_lo), ds_from(dy));
|
|
62773
|
-
return vec4f(cre.x, cim.x, cre.y, cim.y);
|
|
62774
|
-
}
|
|
62775
|
-
|
|
62776
|
-
fn _fractal_mandelbrot_dp(c: vec4f, maxIter: i32) -> f32 {
|
|
62777
|
-
let cr = vec2f(c.x, c.z);
|
|
62778
|
-
let ci = vec2f(c.y, c.w);
|
|
62779
|
-
var zr = vec2f(0.0, 0.0);
|
|
62780
|
-
var zi = vec2f(0.0, 0.0);
|
|
62781
|
-
for (var i: i32 = 0; i < maxIter; i++) {
|
|
62782
|
-
let zr2 = ds_sqr(zr);
|
|
62783
|
-
let zi2 = ds_sqr(zi);
|
|
62784
|
-
let mag2 = ds_add(zr2, zi2);
|
|
62785
|
-
if (mag2.x > 4.0) {
|
|
62786
|
-
return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62787
|
-
}
|
|
62788
|
-
let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
62789
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
62790
|
-
zi = new_zi;
|
|
62791
|
-
}
|
|
62792
|
-
return 1.0;
|
|
62793
|
-
}
|
|
62794
|
-
|
|
62795
|
-
fn _fractal_julia_dp(z_in: vec4f, c: vec4f, maxIter: i32) -> f32 {
|
|
62796
|
-
var zr = vec2f(z_in.x, z_in.z);
|
|
62797
|
-
var zi = vec2f(z_in.y, z_in.w);
|
|
62798
|
-
let cr = vec2f(c.x, c.z);
|
|
62799
|
-
let ci = vec2f(c.y, c.w);
|
|
62800
|
-
for (var i: i32 = 0; i < maxIter; i++) {
|
|
62801
|
-
let zr2 = ds_sqr(zr);
|
|
62802
|
-
let zi2 = ds_sqr(zi);
|
|
62803
|
-
let mag2 = ds_add(zr2, zi2);
|
|
62804
|
-
if (mag2.x > 4.0) {
|
|
62805
|
-
return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62806
|
-
}
|
|
62807
|
-
let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
62808
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
62809
|
-
zi = new_zi;
|
|
62810
|
-
}
|
|
62811
|
-
return 1.0;
|
|
62812
|
-
}
|
|
62813
62669
|
`;
|
|
62814
62670
|
var GPU_FRACTAL_PREAMBLE_GLSL = `
|
|
62815
62671
|
float _fractal_mandelbrot(vec2 c, int maxIter) {
|
|
@@ -62853,208 +62709,6 @@ fn _fractal_julia(z_in: vec2f, c: vec2f, maxIter: i32) -> f32 {
|
|
|
62853
62709
|
}
|
|
62854
62710
|
return 1.0;
|
|
62855
62711
|
}
|
|
62856
|
-
`;
|
|
62857
|
-
var GPU_FRACTAL_PT_PREAMBLE_GLSL = `
|
|
62858
|
-
uniform sampler2D _refOrbit;
|
|
62859
|
-
uniform int _refOrbitLen;
|
|
62860
|
-
uniform int _refOrbitTexWidth;
|
|
62861
|
-
uniform float _pt_offset_x;
|
|
62862
|
-
uniform float _pt_offset_y;
|
|
62863
|
-
uniform float _pt_w;
|
|
62864
|
-
uniform float _pt_h;
|
|
62865
|
-
|
|
62866
|
-
vec2 _pt_delta() {
|
|
62867
|
-
float dx = _pt_offset_x + (v_uv.x - 0.5) * _pt_w;
|
|
62868
|
-
float dy = _pt_offset_y + (v_uv.y - 0.5) * _pt_h;
|
|
62869
|
-
return vec2(dx, dy);
|
|
62870
|
-
}
|
|
62871
|
-
|
|
62872
|
-
vec2 _pt_fetch_orbit(int i) {
|
|
62873
|
-
int y = i / _refOrbitTexWidth;
|
|
62874
|
-
int x = i - y * _refOrbitTexWidth;
|
|
62875
|
-
return texelFetch(_refOrbit, ivec2(x, y), 0).rg;
|
|
62876
|
-
}
|
|
62877
|
-
|
|
62878
|
-
float _fractal_mandelbrot_pt(vec2 delta_c, int maxIter) {
|
|
62879
|
-
float dr = 0.0;
|
|
62880
|
-
float di = 0.0;
|
|
62881
|
-
int orbitLen = min(maxIter, _refOrbitLen);
|
|
62882
|
-
for (int i = 0; i < orbitLen; i++) {
|
|
62883
|
-
vec2 Zn = _pt_fetch_orbit(i);
|
|
62884
|
-
// delta_{n+1} = 2*Z_n*delta_n + delta_n^2 + delta_c
|
|
62885
|
-
float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
62886
|
-
float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
62887
|
-
dr = new_dr;
|
|
62888
|
-
di = new_di;
|
|
62889
|
-
// Full z = Z_{n+1} + delta for escape check
|
|
62890
|
-
vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);
|
|
62891
|
-
float zr = Zn1.x + dr;
|
|
62892
|
-
float zi = Zn1.y + di;
|
|
62893
|
-
float mag2 = zr * zr + zi * zi;
|
|
62894
|
-
if (mag2 > 4.0)
|
|
62895
|
-
return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62896
|
-
// Glitch detection: |delta|^2 > |Z|^2
|
|
62897
|
-
float dmag2 = dr * dr + di * di;
|
|
62898
|
-
float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
62899
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
62900
|
-
// Rebase to absolute coordinates and continue with single-float
|
|
62901
|
-
float abs_zr = Zn1.x + dr;
|
|
62902
|
-
float abs_zi = Zn1.y + di;
|
|
62903
|
-
// Reconstruct absolute c from reference + delta
|
|
62904
|
-
// (Use ds_from for the concept, but single-float suffices for fallback)
|
|
62905
|
-
float cx = abs_zr - dr + delta_c.x;
|
|
62906
|
-
float cy = abs_zi - di + delta_c.y;
|
|
62907
|
-
for (int j = i + 1; j < maxIter; j++) {
|
|
62908
|
-
float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;
|
|
62909
|
-
abs_zi = 2.0 * abs_zr * abs_zi + cy;
|
|
62910
|
-
abs_zr = new_zr;
|
|
62911
|
-
mag2 = abs_zr * abs_zr + abs_zi * abs_zi;
|
|
62912
|
-
if (mag2 > 4.0)
|
|
62913
|
-
return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62914
|
-
}
|
|
62915
|
-
return 1.0;
|
|
62916
|
-
}
|
|
62917
|
-
}
|
|
62918
|
-
return 1.0;
|
|
62919
|
-
}
|
|
62920
|
-
|
|
62921
|
-
float _fractal_julia_pt(vec2 z_delta, vec2 delta_c, int maxIter) {
|
|
62922
|
-
float dr = z_delta.x;
|
|
62923
|
-
float di = z_delta.y;
|
|
62924
|
-
int orbitLen = min(maxIter, _refOrbitLen);
|
|
62925
|
-
for (int i = 0; i < orbitLen; i++) {
|
|
62926
|
-
vec2 Zn = _pt_fetch_orbit(i);
|
|
62927
|
-
float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
62928
|
-
float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
62929
|
-
dr = new_dr;
|
|
62930
|
-
di = new_di;
|
|
62931
|
-
vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);
|
|
62932
|
-
float zr = Zn1.x + dr;
|
|
62933
|
-
float zi = Zn1.y + di;
|
|
62934
|
-
float mag2 = zr * zr + zi * zi;
|
|
62935
|
-
if (mag2 > 4.0)
|
|
62936
|
-
return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62937
|
-
float dmag2 = dr * dr + di * di;
|
|
62938
|
-
float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
62939
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
62940
|
-
float abs_zr = Zn1.x + dr;
|
|
62941
|
-
float abs_zi = Zn1.y + di;
|
|
62942
|
-
float cx = delta_c.x;
|
|
62943
|
-
float cy = delta_c.y;
|
|
62944
|
-
for (int j = i + 1; j < maxIter; j++) {
|
|
62945
|
-
float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;
|
|
62946
|
-
abs_zi = 2.0 * abs_zr * abs_zi + cy;
|
|
62947
|
-
abs_zr = new_zr;
|
|
62948
|
-
mag2 = abs_zr * abs_zr + abs_zi * abs_zi;
|
|
62949
|
-
if (mag2 > 4.0)
|
|
62950
|
-
return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
62951
|
-
}
|
|
62952
|
-
return 1.0;
|
|
62953
|
-
}
|
|
62954
|
-
}
|
|
62955
|
-
return 1.0;
|
|
62956
|
-
}
|
|
62957
|
-
`;
|
|
62958
|
-
var GPU_FRACTAL_PT_PREAMBLE_WGSL = `
|
|
62959
|
-
@group(0) @binding(1) var _refOrbit: texture_2d<f32>;
|
|
62960
|
-
var<uniform> _refOrbitLen: i32;
|
|
62961
|
-
var<uniform> _refOrbitTexWidth: i32;
|
|
62962
|
-
var<uniform> _pt_offset_x: f32;
|
|
62963
|
-
var<uniform> _pt_offset_y: f32;
|
|
62964
|
-
var<uniform> _pt_w: f32;
|
|
62965
|
-
var<uniform> _pt_h: f32;
|
|
62966
|
-
|
|
62967
|
-
fn _pt_delta(uv: vec2f) -> vec2f {
|
|
62968
|
-
let dx = _pt_offset_x + (uv.x - 0.5) * _pt_w;
|
|
62969
|
-
let dy = _pt_offset_y + (uv.y - 0.5) * _pt_h;
|
|
62970
|
-
return vec2f(dx, dy);
|
|
62971
|
-
}
|
|
62972
|
-
|
|
62973
|
-
fn _pt_fetch_orbit(i: i32) -> vec2f {
|
|
62974
|
-
let y = i / _refOrbitTexWidth;
|
|
62975
|
-
let x = i - y * _refOrbitTexWidth;
|
|
62976
|
-
return textureLoad(_refOrbit, vec2i(x, y), 0).rg;
|
|
62977
|
-
}
|
|
62978
|
-
|
|
62979
|
-
fn _fractal_mandelbrot_pt(delta_c: vec2f, maxIter: i32) -> f32 {
|
|
62980
|
-
var dr: f32 = 0.0;
|
|
62981
|
-
var di: f32 = 0.0;
|
|
62982
|
-
let orbitLen = min(maxIter, _refOrbitLen);
|
|
62983
|
-
for (var i: i32 = 0; i < orbitLen; i++) {
|
|
62984
|
-
let Zn = _pt_fetch_orbit(i);
|
|
62985
|
-
let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
62986
|
-
let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
62987
|
-
dr = new_dr;
|
|
62988
|
-
di = new_di;
|
|
62989
|
-
var Zn1 = vec2f(0.0);
|
|
62990
|
-
if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }
|
|
62991
|
-
let zr = Zn1.x + dr;
|
|
62992
|
-
let zi = Zn1.y + di;
|
|
62993
|
-
var mag2 = zr * zr + zi * zi;
|
|
62994
|
-
if (mag2 > 4.0) {
|
|
62995
|
-
return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
62996
|
-
}
|
|
62997
|
-
let dmag2 = dr * dr + di * di;
|
|
62998
|
-
let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
62999
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
63000
|
-
var f_zr = Zn1.x + dr;
|
|
63001
|
-
var f_zi = Zn1.y + di;
|
|
63002
|
-
let cx = delta_c.x;
|
|
63003
|
-
let cy = delta_c.y;
|
|
63004
|
-
for (var j: i32 = i + 1; j < maxIter; j++) {
|
|
63005
|
-
let t_zr = f_zr * f_zr - f_zi * f_zi + cx;
|
|
63006
|
-
f_zi = 2.0 * f_zr * f_zi + cy;
|
|
63007
|
-
f_zr = t_zr;
|
|
63008
|
-
mag2 = f_zr * f_zr + f_zi * f_zi;
|
|
63009
|
-
if (mag2 > 4.0) {
|
|
63010
|
-
return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
63011
|
-
}
|
|
63012
|
-
}
|
|
63013
|
-
return 1.0;
|
|
63014
|
-
}
|
|
63015
|
-
}
|
|
63016
|
-
return 1.0;
|
|
63017
|
-
}
|
|
63018
|
-
|
|
63019
|
-
fn _fractal_julia_pt(z_delta: vec2f, delta_c: vec2f, maxIter: i32) -> f32 {
|
|
63020
|
-
var dr = z_delta.x;
|
|
63021
|
-
var di = z_delta.y;
|
|
63022
|
-
let orbitLen = min(maxIter, _refOrbitLen);
|
|
63023
|
-
for (var i: i32 = 0; i < orbitLen; i++) {
|
|
63024
|
-
let Zn = _pt_fetch_orbit(i);
|
|
63025
|
-
let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
63026
|
-
let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
63027
|
-
dr = new_dr;
|
|
63028
|
-
di = new_di;
|
|
63029
|
-
var Zn1 = vec2f(0.0);
|
|
63030
|
-
if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }
|
|
63031
|
-
let zr = Zn1.x + dr;
|
|
63032
|
-
let zi = Zn1.y + di;
|
|
63033
|
-
var mag2 = zr * zr + zi * zi;
|
|
63034
|
-
if (mag2 > 4.0) {
|
|
63035
|
-
return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
63036
|
-
}
|
|
63037
|
-
let dmag2 = dr * dr + di * di;
|
|
63038
|
-
let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
63039
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
63040
|
-
var f_zr = Zn1.x + dr;
|
|
63041
|
-
var f_zi = Zn1.y + di;
|
|
63042
|
-
let cx = delta_c.x;
|
|
63043
|
-
let cy = delta_c.y;
|
|
63044
|
-
for (var j: i32 = i + 1; j < maxIter; j++) {
|
|
63045
|
-
let t_zr = f_zr * f_zr - f_zi * f_zi + cx;
|
|
63046
|
-
f_zi = 2.0 * f_zr * f_zi + cy;
|
|
63047
|
-
f_zr = t_zr;
|
|
63048
|
-
mag2 = f_zr * f_zr + f_zi * f_zi;
|
|
63049
|
-
if (mag2 > 4.0) {
|
|
63050
|
-
return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
63051
|
-
}
|
|
63052
|
-
}
|
|
63053
|
-
return 1.0;
|
|
63054
|
-
}
|
|
63055
|
-
}
|
|
63056
|
-
return 1.0;
|
|
63057
|
-
}
|
|
63058
62712
|
`;
|
|
63059
62713
|
var GPU_COLOR_PREAMBLE_GLSL = `
|
|
63060
62714
|
float _gpu_srgb_to_linear(float c) {
|
|
@@ -63494,7 +63148,6 @@ fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
|
|
|
63494
63148
|
const constants = this.getConstants();
|
|
63495
63149
|
const v2 = this.languageId === "wgsl" ? "vec2f" : "vec2";
|
|
63496
63150
|
const target = this.createTarget({
|
|
63497
|
-
hints: options.hints,
|
|
63498
63151
|
functions: (id) => {
|
|
63499
63152
|
if (userFunctions && id in userFunctions) {
|
|
63500
63153
|
const fn = userFunctions[id];
|
|
@@ -63533,89 +63186,12 @@ fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
|
|
|
63533
63186
|
if (code.includes("_gpu_besselJ"))
|
|
63534
63187
|
preamble += this.languageId === "wgsl" ? GPU_BESSELJ_PREAMBLE_WGSL : GPU_BESSELJ_PREAMBLE_GLSL;
|
|
63535
63188
|
if (code.includes("_fractal_")) {
|
|
63536
|
-
|
|
63537
|
-
preamble += this.languageId === "wgsl" ? GPU_DS_ARITHMETIC_PREAMBLE_WGSL : GPU_DS_ARITHMETIC_PREAMBLE_GLSL;
|
|
63538
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PT_PREAMBLE_WGSL : GPU_FRACTAL_PT_PREAMBLE_GLSL;
|
|
63539
|
-
} else if (code.includes("_fractal_mandelbrot_dp") || code.includes("_fractal_julia_dp")) {
|
|
63540
|
-
preamble += this.languageId === "wgsl" ? GPU_DS_ARITHMETIC_PREAMBLE_WGSL : GPU_DS_ARITHMETIC_PREAMBLE_GLSL;
|
|
63541
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_DP_PREAMBLE_WGSL : GPU_FRACTAL_DP_PREAMBLE_GLSL;
|
|
63542
|
-
} else {
|
|
63543
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PREAMBLE_WGSL : GPU_FRACTAL_PREAMBLE_GLSL;
|
|
63544
|
-
}
|
|
63189
|
+
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PREAMBLE_WGSL : GPU_FRACTAL_PREAMBLE_GLSL;
|
|
63545
63190
|
}
|
|
63546
63191
|
if (code.includes("_gpu_srgb_to") || code.includes("_gpu_oklab") || code.includes("_gpu_oklch") || code.includes("_gpu_color_mix") || code.includes("_gpu_apca")) {
|
|
63547
63192
|
preamble += this.languageId === "wgsl" ? GPU_COLOR_PREAMBLE_WGSL : GPU_COLOR_PREAMBLE_GLSL;
|
|
63548
63193
|
}
|
|
63549
63194
|
if (preamble) result.preamble = preamble;
|
|
63550
|
-
if (code.includes("_fractal_") && options.hints?.viewport) {
|
|
63551
|
-
const strategy = selectFractalStrategy(target);
|
|
63552
|
-
const radius = options.hints.viewport.radius;
|
|
63553
|
-
switch (strategy) {
|
|
63554
|
-
case "single":
|
|
63555
|
-
result.staleWhen = { radiusBelow: 1e-6 };
|
|
63556
|
-
break;
|
|
63557
|
-
case "double":
|
|
63558
|
-
result.staleWhen = { radiusBelow: 1e-14, radiusAbove: 1e-5 };
|
|
63559
|
-
break;
|
|
63560
|
-
case "perturbation":
|
|
63561
|
-
result.staleWhen = {
|
|
63562
|
-
radiusAbove: 1e-5,
|
|
63563
|
-
radiusBelow: radius * 0.01,
|
|
63564
|
-
centerDistance: radius * 2
|
|
63565
|
-
};
|
|
63566
|
-
break;
|
|
63567
|
-
}
|
|
63568
|
-
}
|
|
63569
|
-
if ((code.includes("_fractal_mandelbrot_dp") || code.includes("_fractal_julia_dp")) && options.hints?.viewport) {
|
|
63570
|
-
const cx = hpToNumber(options.hints.viewport.center[0]);
|
|
63571
|
-
const cy = hpToNumber(options.hints.viewport.center[1]);
|
|
63572
|
-
const size = options.hints.viewport.radius * 2;
|
|
63573
|
-
const cx_hi = Math.fround(cx);
|
|
63574
|
-
const cy_hi = Math.fround(cy);
|
|
63575
|
-
result.uniforms = {
|
|
63576
|
-
...result.uniforms,
|
|
63577
|
-
_dp_cx_hi: cx_hi,
|
|
63578
|
-
_dp_cx_lo: cx - cx_hi,
|
|
63579
|
-
_dp_cy_hi: cy_hi,
|
|
63580
|
-
_dp_cy_lo: cy - cy_hi,
|
|
63581
|
-
_dp_w: size,
|
|
63582
|
-
_dp_h: size
|
|
63583
|
-
};
|
|
63584
|
-
}
|
|
63585
|
-
if ((code.includes("_fractal_mandelbrot_pt") || code.includes("_fractal_julia_pt")) && options.hints?.viewport) {
|
|
63586
|
-
const viewport = options.hints.viewport;
|
|
63587
|
-
const size = viewport.radius * 2;
|
|
63588
|
-
result.uniforms = {
|
|
63589
|
-
...result.uniforms,
|
|
63590
|
-
_pt_offset_x: 0,
|
|
63591
|
-
_pt_offset_y: 0,
|
|
63592
|
-
_pt_w: size,
|
|
63593
|
-
_pt_h: size
|
|
63594
|
-
};
|
|
63595
|
-
const digits = Math.max(50, Math.ceil(-Math.log10(viewport.radius)) + 10);
|
|
63596
|
-
const maxIter = 1e3;
|
|
63597
|
-
const orbit = computeReferenceOrbit(
|
|
63598
|
-
viewport.center,
|
|
63599
|
-
maxIter,
|
|
63600
|
-
digits
|
|
63601
|
-
);
|
|
63602
|
-
const orbitLen = orbit.length / 2;
|
|
63603
|
-
const texWidth = Math.min(orbitLen, 4096);
|
|
63604
|
-
const texHeight = Math.ceil(orbitLen / texWidth);
|
|
63605
|
-
result.textures = {
|
|
63606
|
-
_refOrbit: {
|
|
63607
|
-
data: orbit,
|
|
63608
|
-
width: texWidth,
|
|
63609
|
-
height: texHeight,
|
|
63610
|
-
format: "rg32f"
|
|
63611
|
-
}
|
|
63612
|
-
};
|
|
63613
|
-
result.uniforms = {
|
|
63614
|
-
...result.uniforms,
|
|
63615
|
-
_refOrbitLen: orbitLen,
|
|
63616
|
-
_refOrbitTexWidth: texWidth
|
|
63617
|
-
};
|
|
63618
|
-
}
|
|
63619
63195
|
return result;
|
|
63620
63196
|
}
|
|
63621
63197
|
compileToSource(expr2, _options = {}) {
|
|
@@ -69020,14 +68596,14 @@ ${code}`;
|
|
|
69020
68596
|
_setDefaultEngineFactory(() => new ComputeEngine());
|
|
69021
68597
|
|
|
69022
68598
|
// src/compute-engine.ts
|
|
69023
|
-
var version = "0.55.
|
|
68599
|
+
var version = "0.55.6";
|
|
69024
68600
|
ComputeEngine._latexSyntaxFactory = () => new LatexSyntax();
|
|
69025
68601
|
_setDefaultEngineFactory(
|
|
69026
68602
|
() => new ComputeEngine({ latexSyntax: new LatexSyntax() })
|
|
69027
68603
|
);
|
|
69028
68604
|
globalThis[/* @__PURE__ */ Symbol.for("io.cortexjs.compute-engine")] = {
|
|
69029
68605
|
ComputeEngine: ComputeEngine.prototype.constructor,
|
|
69030
|
-
version: "0.55.
|
|
68606
|
+
version: "0.55.6"
|
|
69031
68607
|
};
|
|
69032
68608
|
return __toCommonJS(compute_engine_exports);
|
|
69033
68609
|
})();
|