@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/compile.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Compile 0.55.
|
|
1
|
+
/** Compile 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.Compile = {}));})(this, (function (exports) { 'use strict';
|
|
3
3
|
var Compile = (() => {
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -6273,10 +6273,6 @@ var Compile = (() => {
|
|
|
6273
6273
|
// Lagrange notation
|
|
6274
6274
|
{
|
|
6275
6275
|
name: "Derivative",
|
|
6276
|
-
// @todo: Leibniz notation: {% latex " \\frac{d^n}{dx^n} f(x)" %}
|
|
6277
|
-
// @todo: Euler modified notation: This notation is used by Mathematica. The Euler notation uses `D` instead of
|
|
6278
|
-
// `\partial`: `\partial_{x} f`, `\partial_{x,y} f`
|
|
6279
|
-
// Newton notation (\dot{v}, \ddot{v}) is implemented below
|
|
6280
6276
|
serialize: (serializer, expr) => {
|
|
6281
6277
|
const degree = machineValue(operand(expr, 2)) ?? 1;
|
|
6282
6278
|
const base = serializer.serialize(operand(expr, 1));
|
|
@@ -7314,14 +7310,18 @@ var Compile = (() => {
|
|
|
7314
7310
|
return ["Complement", lhs];
|
|
7315
7311
|
}
|
|
7316
7312
|
// precedence: 240,
|
|
7317
|
-
// @todo: serialize for the multiple argument case
|
|
7318
7313
|
},
|
|
7319
7314
|
{
|
|
7320
7315
|
name: "Complement",
|
|
7321
7316
|
latexTrigger: ["^", "<{>", "\\complement", "<}>"],
|
|
7322
|
-
kind: "postfix"
|
|
7317
|
+
kind: "postfix",
|
|
7323
7318
|
// precedence: 240,
|
|
7324
|
-
|
|
7319
|
+
serialize: (serializer, expr) => {
|
|
7320
|
+
return joinLatex([
|
|
7321
|
+
serializer.serialize(operand(expr, 1)),
|
|
7322
|
+
"^\\complement"
|
|
7323
|
+
]);
|
|
7324
|
+
}
|
|
7325
7325
|
},
|
|
7326
7326
|
{
|
|
7327
7327
|
name: "Intersection",
|
|
@@ -7408,7 +7408,6 @@ var Compile = (() => {
|
|
|
7408
7408
|
// commands like \rbrack a, b \rbrack which are unambiguous.
|
|
7409
7409
|
{
|
|
7410
7410
|
name: "Multiple",
|
|
7411
|
-
// @todo: parse
|
|
7412
7411
|
serialize: serializeSet
|
|
7413
7412
|
},
|
|
7414
7413
|
{
|
|
@@ -7417,14 +7416,28 @@ var Compile = (() => {
|
|
|
7417
7416
|
kind: "infix",
|
|
7418
7417
|
precedence: 350
|
|
7419
7418
|
},
|
|
7419
|
+
// \mid as a separator/operator (used in set-builder notation: {x \mid x > 0})
|
|
7420
|
+
// Low precedence so it binds loosely — everything on each side is parsed first
|
|
7421
|
+
{
|
|
7422
|
+
name: "Divides",
|
|
7423
|
+
latexTrigger: ["\\mid"],
|
|
7424
|
+
kind: "infix",
|
|
7425
|
+
precedence: 160
|
|
7426
|
+
},
|
|
7420
7427
|
{
|
|
7421
7428
|
name: "Set",
|
|
7422
7429
|
kind: "matchfix",
|
|
7423
7430
|
openTrigger: "{",
|
|
7424
7431
|
closeTrigger: "}",
|
|
7425
|
-
// @todo: the set syntax can also include conditions...
|
|
7426
7432
|
parse: (_parser, body) => {
|
|
7427
7433
|
if (isEmptySequence(body)) return "EmptySet";
|
|
7434
|
+
const h = operator(body);
|
|
7435
|
+
if (h === "Divides" || h === "Colon") {
|
|
7436
|
+
const expr = operand(body, 1);
|
|
7437
|
+
const condition = operand(body, 2);
|
|
7438
|
+
if (expr !== null && condition !== null)
|
|
7439
|
+
return ["Set", expr, ["Condition", condition]];
|
|
7440
|
+
}
|
|
7428
7441
|
if (operator(body) == "Delimiter" && stringValue(operand(body, 2)) === ",") {
|
|
7429
7442
|
body = operand(body, 1);
|
|
7430
7443
|
}
|
|
@@ -7432,6 +7445,17 @@ var Compile = (() => {
|
|
|
7432
7445
|
return ["Set", ...operands(body)];
|
|
7433
7446
|
},
|
|
7434
7447
|
serialize: (serializer, expr) => {
|
|
7448
|
+
if (nops(expr) === 2 && operator(operand(expr, 2)) === "Condition") {
|
|
7449
|
+
const condition = operand(expr, 2);
|
|
7450
|
+
return joinLatex([
|
|
7451
|
+
"\\lbrace",
|
|
7452
|
+
serializer.serialize(operand(expr, 1)),
|
|
7453
|
+
"\\mid",
|
|
7454
|
+
// Serialize the inner expression of the Condition wrapper
|
|
7455
|
+
serializer.serialize(operand(condition, 1)),
|
|
7456
|
+
"\\rbrace"
|
|
7457
|
+
]);
|
|
7458
|
+
}
|
|
7435
7459
|
return joinLatex([
|
|
7436
7460
|
"\\lbrace",
|
|
7437
7461
|
operands(expr).map((x) => serializer.serialize(x)).join(", "),
|
|
@@ -7598,23 +7622,6 @@ var Compile = (() => {
|
|
|
7598
7622
|
if (expr === null) return "";
|
|
7599
7623
|
const h = operator(expr);
|
|
7600
7624
|
if (!h) return "";
|
|
7601
|
-
if (h === "Set") {
|
|
7602
|
-
if (nops(expr) === 0) return "\\emptyset";
|
|
7603
|
-
if (nops(expr) === 2 && operator(operand(expr, 2)) === "Condition") {
|
|
7604
|
-
return joinLatex([
|
|
7605
|
-
"\\left\\lbrace",
|
|
7606
|
-
serializer.serialize(operand(expr, 1)),
|
|
7607
|
-
"\\middle\\mid",
|
|
7608
|
-
serializer.serialize(operand(expr, 2)),
|
|
7609
|
-
"\\right\\rbrace"
|
|
7610
|
-
]);
|
|
7611
|
-
}
|
|
7612
|
-
return joinLatex([
|
|
7613
|
-
"\\left\\lbrace",
|
|
7614
|
-
...operands(expr).map((x) => serializer.serialize(x) + " ,"),
|
|
7615
|
-
"\\right\\rbrace"
|
|
7616
|
-
]);
|
|
7617
|
-
}
|
|
7618
7625
|
if (h === "Multiple") {
|
|
7619
7626
|
}
|
|
7620
7627
|
if (h === "Range") {
|
|
@@ -8732,11 +8739,13 @@ var Compile = (() => {
|
|
|
8732
8739
|
if (!parser.match("_")) return null;
|
|
8733
8740
|
const base = parser.parseGroup();
|
|
8734
8741
|
if (operator(base) !== "To") return null;
|
|
8735
|
-
const expr = parser.
|
|
8742
|
+
const expr = parser.parseExpression({
|
|
8743
|
+
minPrec: MULTIPLICATION_PRECEDENCE
|
|
8744
|
+
});
|
|
8736
8745
|
if (!expr) return null;
|
|
8737
8746
|
return [
|
|
8738
8747
|
"Limit",
|
|
8739
|
-
["Function", expr
|
|
8748
|
+
["Function", expr, operand(base, 1)],
|
|
8740
8749
|
operand(base, 2)
|
|
8741
8750
|
];
|
|
8742
8751
|
},
|
|
@@ -10940,12 +10949,52 @@ var Compile = (() => {
|
|
|
10940
10949
|
];
|
|
10941
10950
|
|
|
10942
10951
|
// src/compute-engine/latex-syntax/dictionary/definitions-other.ts
|
|
10952
|
+
var TEX_UNITS = [
|
|
10953
|
+
"pt",
|
|
10954
|
+
"em",
|
|
10955
|
+
"mu",
|
|
10956
|
+
"ex",
|
|
10957
|
+
"mm",
|
|
10958
|
+
"cm",
|
|
10959
|
+
"in",
|
|
10960
|
+
"bp",
|
|
10961
|
+
"sp",
|
|
10962
|
+
"dd",
|
|
10963
|
+
"cc",
|
|
10964
|
+
"pc",
|
|
10965
|
+
"nc",
|
|
10966
|
+
"nd"
|
|
10967
|
+
];
|
|
10968
|
+
function skipTexDimension(parser) {
|
|
10969
|
+
parser.skipSpace();
|
|
10970
|
+
if (parser.peek === "-" || parser.peek === "+") parser.nextToken();
|
|
10971
|
+
while (/^[\d.]$/.test(parser.peek)) parser.nextToken();
|
|
10972
|
+
for (const unit of TEX_UNITS) {
|
|
10973
|
+
if (parser.matchAll([...unit])) return;
|
|
10974
|
+
}
|
|
10975
|
+
}
|
|
10943
10976
|
function parseSingleArg(cmd) {
|
|
10944
10977
|
return (parser) => {
|
|
10945
10978
|
const arg = parser.parseGroup();
|
|
10946
10979
|
return arg === null ? [cmd] : [cmd, arg];
|
|
10947
10980
|
};
|
|
10948
10981
|
}
|
|
10982
|
+
function parseMathStyleSwitch(mathStyle) {
|
|
10983
|
+
return (parser) => {
|
|
10984
|
+
const body = parser.parseExpression();
|
|
10985
|
+
if (body !== null && !isEmptySequence(body))
|
|
10986
|
+
return ["Annotated", body, { dict: { mathStyle } }];
|
|
10987
|
+
return "Nothing";
|
|
10988
|
+
};
|
|
10989
|
+
}
|
|
10990
|
+
function parseSizeSwitch(size) {
|
|
10991
|
+
return (parser) => {
|
|
10992
|
+
const body = parser.parseExpression();
|
|
10993
|
+
if (body !== null && !isEmptySequence(body))
|
|
10994
|
+
return ["Annotated", body, { dict: { size } }];
|
|
10995
|
+
return "Nothing";
|
|
10996
|
+
};
|
|
10997
|
+
}
|
|
10949
10998
|
var DEFINITIONS_OTHERS = [
|
|
10950
10999
|
{
|
|
10951
11000
|
name: "Overscript",
|
|
@@ -11185,80 +11234,71 @@ var Compile = (() => {
|
|
|
11185
11234
|
},
|
|
11186
11235
|
{
|
|
11187
11236
|
latexTrigger: ["\\displaystyle"],
|
|
11188
|
-
parse: (
|
|
11189
|
-
// @todo: parse as ['Annotated'...]
|
|
11237
|
+
parse: parseMathStyleSwitch("normal")
|
|
11190
11238
|
},
|
|
11191
11239
|
{
|
|
11192
11240
|
latexTrigger: ["\\textstyle"],
|
|
11193
|
-
parse: (
|
|
11194
|
-
// @todo: parse as ['Annotated'...]
|
|
11241
|
+
parse: parseMathStyleSwitch("compact")
|
|
11195
11242
|
},
|
|
11196
11243
|
{
|
|
11197
11244
|
latexTrigger: ["\\scriptstyle"],
|
|
11198
|
-
parse: (
|
|
11199
|
-
// @todo: parse as ['Annotated'...]
|
|
11245
|
+
parse: parseMathStyleSwitch("script")
|
|
11200
11246
|
},
|
|
11201
11247
|
{
|
|
11202
11248
|
latexTrigger: ["\\scriptscriptstyle"],
|
|
11203
|
-
parse: (
|
|
11204
|
-
// @todo: parse as ['Annotated'...]
|
|
11249
|
+
parse: parseMathStyleSwitch("scriptscript")
|
|
11205
11250
|
},
|
|
11206
11251
|
{
|
|
11207
11252
|
latexTrigger: ["\\color"],
|
|
11208
11253
|
parse: (parser) => {
|
|
11209
|
-
parser.
|
|
11254
|
+
const color = parser.parseStringGroup();
|
|
11255
|
+
if (color !== null) {
|
|
11256
|
+
const body = parser.parseExpression();
|
|
11257
|
+
if (body !== null && !isEmptySequence(body))
|
|
11258
|
+
return ["Annotated", body, { dict: { color } }];
|
|
11259
|
+
}
|
|
11210
11260
|
return "Nothing";
|
|
11211
11261
|
}
|
|
11212
11262
|
},
|
|
11213
11263
|
{
|
|
11214
11264
|
latexTrigger: ["\\tiny"],
|
|
11215
|
-
parse: ()
|
|
11216
|
-
// @todo: parse as ['Annotated'...]
|
|
11265
|
+
parse: parseSizeSwitch(1)
|
|
11217
11266
|
},
|
|
11218
11267
|
{
|
|
11219
11268
|
latexTrigger: ["\\scriptsize"],
|
|
11220
|
-
parse: ()
|
|
11221
|
-
// @todo: parse as ['Annotated'...]
|
|
11269
|
+
parse: parseSizeSwitch(2)
|
|
11222
11270
|
},
|
|
11223
11271
|
{
|
|
11224
11272
|
latexTrigger: ["\\footnotesize"],
|
|
11225
|
-
parse: ()
|
|
11226
|
-
// @todo: parse as ['Annotated'...]
|
|
11273
|
+
parse: parseSizeSwitch(3)
|
|
11227
11274
|
},
|
|
11228
11275
|
{
|
|
11229
11276
|
latexTrigger: ["\\small"],
|
|
11230
|
-
parse: ()
|
|
11231
|
-
// @todo: parse as ['Annotated'...]
|
|
11277
|
+
parse: parseSizeSwitch(4)
|
|
11232
11278
|
},
|
|
11233
11279
|
{
|
|
11234
11280
|
latexTrigger: ["\\normalsize"],
|
|
11235
|
-
parse: ()
|
|
11236
|
-
// @todo: parse as ['Annotated'...]
|
|
11281
|
+
parse: parseSizeSwitch(5)
|
|
11237
11282
|
},
|
|
11238
11283
|
{
|
|
11239
11284
|
latexTrigger: ["\\large"],
|
|
11240
|
-
parse: ()
|
|
11241
|
-
// @todo: parse as ['Annotated'...]
|
|
11285
|
+
parse: parseSizeSwitch(6)
|
|
11242
11286
|
},
|
|
11243
11287
|
{
|
|
11244
11288
|
latexTrigger: ["\\Large"],
|
|
11245
|
-
parse: ()
|
|
11246
|
-
// @todo: parse as ['Annotated'...]
|
|
11289
|
+
parse: parseSizeSwitch(7)
|
|
11247
11290
|
},
|
|
11248
11291
|
{
|
|
11249
11292
|
latexTrigger: ["\\LARGE"],
|
|
11250
|
-
parse: ()
|
|
11251
|
-
// @todo: parse as ['Annotated'...]
|
|
11293
|
+
parse: parseSizeSwitch(8)
|
|
11252
11294
|
},
|
|
11253
11295
|
{
|
|
11254
11296
|
latexTrigger: ["\\huge"],
|
|
11255
|
-
parse: ()
|
|
11256
|
-
// @todo: parse as ['Annotated'...]
|
|
11297
|
+
parse: parseSizeSwitch(9)
|
|
11257
11298
|
},
|
|
11258
11299
|
{
|
|
11259
11300
|
latexTrigger: ["\\Huge"],
|
|
11260
|
-
parse: ()
|
|
11261
|
-
// @todo: parse as ['Annotated'...]
|
|
11301
|
+
parse: parseSizeSwitch(10)
|
|
11262
11302
|
},
|
|
11263
11303
|
{
|
|
11264
11304
|
name: "Annotated",
|
|
@@ -11270,6 +11310,10 @@ var Compile = (() => {
|
|
|
11270
11310
|
result = joinLatex(["{\\displaystyle", result, "}"]);
|
|
11271
11311
|
else if (dict.dict.mathStyle === "compact")
|
|
11272
11312
|
result = joinLatex(["{\\textstyle", result, "}"]);
|
|
11313
|
+
else if (dict.dict.mathStyle === "script")
|
|
11314
|
+
result = joinLatex(["{\\scriptstyle", result, "}"]);
|
|
11315
|
+
else if (dict.dict.mathStyle === "scriptscript")
|
|
11316
|
+
result = joinLatex(["{\\scriptscriptstyle", result, "}"]);
|
|
11273
11317
|
const v = dict.dict.size;
|
|
11274
11318
|
if (v !== null && v >= 1 && v <= 10) {
|
|
11275
11319
|
result = joinLatex([
|
|
@@ -11357,6 +11401,28 @@ var Compile = (() => {
|
|
|
11357
11401
|
latexTrigger: ["\\enspace"],
|
|
11358
11402
|
parse: () => ["HorizontalSpacing", 9]
|
|
11359
11403
|
},
|
|
11404
|
+
{
|
|
11405
|
+
latexTrigger: ["\\hspace"],
|
|
11406
|
+
parse: (parser) => {
|
|
11407
|
+
if (parser.peek === "*") parser.nextToken();
|
|
11408
|
+
parser.parseStringGroup();
|
|
11409
|
+
return ["HorizontalSpacing", 0];
|
|
11410
|
+
}
|
|
11411
|
+
},
|
|
11412
|
+
{
|
|
11413
|
+
latexTrigger: ["\\hskip"],
|
|
11414
|
+
parse: (parser) => {
|
|
11415
|
+
skipTexDimension(parser);
|
|
11416
|
+
return ["HorizontalSpacing", 0];
|
|
11417
|
+
}
|
|
11418
|
+
},
|
|
11419
|
+
{
|
|
11420
|
+
latexTrigger: ["\\kern"],
|
|
11421
|
+
parse: (parser) => {
|
|
11422
|
+
skipTexDimension(parser);
|
|
11423
|
+
return ["HorizontalSpacing", 0];
|
|
11424
|
+
}
|
|
11425
|
+
},
|
|
11360
11426
|
{
|
|
11361
11427
|
latexTrigger: ["\\phantom"],
|
|
11362
11428
|
parse: (parser) => {
|
|
@@ -11407,7 +11473,17 @@ var Compile = (() => {
|
|
|
11407
11473
|
// `["HorizontalSpacing", expr, 'op'|'bin'|rel]` -> indicate a spacing around and expression, i.e. `\mathbin{x}`, etc...
|
|
11408
11474
|
serialize: (serializer, expr) => {
|
|
11409
11475
|
if (operand(expr, 2) !== null) {
|
|
11410
|
-
|
|
11476
|
+
const cls = stringValue(operand(expr, 2));
|
|
11477
|
+
const inner = serializer.serialize(operand(expr, 1));
|
|
11478
|
+
if (cls === "bin") return `\\mathbin{${inner}}`;
|
|
11479
|
+
if (cls === "op") return `\\mathop{${inner}}`;
|
|
11480
|
+
if (cls === "rel") return `\\mathrel{${inner}}`;
|
|
11481
|
+
if (cls === "ord") return `\\mathord{${inner}}`;
|
|
11482
|
+
if (cls === "open") return `\\mathopen{${inner}}`;
|
|
11483
|
+
if (cls === "close") return `\\mathclose{${inner}}`;
|
|
11484
|
+
if (cls === "punct") return `\\mathpunct{${inner}}`;
|
|
11485
|
+
if (cls === "inner") return `\\mathinner{${inner}}`;
|
|
11486
|
+
return inner;
|
|
11411
11487
|
}
|
|
11412
11488
|
const v = machineValue(operand(expr, 1));
|
|
11413
11489
|
if (v === null) return "";
|
|
@@ -15099,8 +15175,7 @@ ${lines.join("\n")}`;
|
|
|
15099
15175
|
vars: options?.vars,
|
|
15100
15176
|
imports: options?.imports,
|
|
15101
15177
|
preamble: options?.preamble,
|
|
15102
|
-
realOnly: options?.realOnly
|
|
15103
|
-
hints: options?.hints
|
|
15178
|
+
realOnly: options?.realOnly
|
|
15104
15179
|
});
|
|
15105
15180
|
} catch (e) {
|
|
15106
15181
|
if (options?.fallback ?? true) {
|
|
@@ -20782,43 +20857,6 @@ ${lines.join("\n")}`;
|
|
|
20782
20857
|
return b;
|
|
20783
20858
|
}
|
|
20784
20859
|
|
|
20785
|
-
// src/compute-engine/compilation/fractal-orbit.ts
|
|
20786
|
-
function toBigDecimal(v) {
|
|
20787
|
-
if (typeof v === "object" && "hi" in v)
|
|
20788
|
-
return new BigDecimal(v.hi).add(new BigDecimal(v.lo));
|
|
20789
|
-
return new BigDecimal(v);
|
|
20790
|
-
}
|
|
20791
|
-
function hpToNumber(v) {
|
|
20792
|
-
if (typeof v === "number") return v;
|
|
20793
|
-
if (typeof v === "string") return Number(v);
|
|
20794
|
-
return v.hi + v.lo;
|
|
20795
|
-
}
|
|
20796
|
-
function computeReferenceOrbit(center, maxIter, precision) {
|
|
20797
|
-
const prevPrecision = BigDecimal.precision;
|
|
20798
|
-
BigDecimal.precision = precision;
|
|
20799
|
-
try {
|
|
20800
|
-
const cr = toBigDecimal(center[0]);
|
|
20801
|
-
const ci = toBigDecimal(center[1]);
|
|
20802
|
-
let zr = BigDecimal.ZERO;
|
|
20803
|
-
let zi = BigDecimal.ZERO;
|
|
20804
|
-
const ESCAPE = new BigDecimal(256);
|
|
20805
|
-
const points = [];
|
|
20806
|
-
for (let i = 0; i < maxIter; i++) {
|
|
20807
|
-
points.push(zr.toNumber(), zi.toNumber());
|
|
20808
|
-
const zr2 = zr.mul(zr).toPrecision(precision);
|
|
20809
|
-
const zi2 = zi.mul(zi).toPrecision(precision);
|
|
20810
|
-
const mag2 = zr2.add(zi2);
|
|
20811
|
-
if (mag2.cmp(ESCAPE) > 0) break;
|
|
20812
|
-
const new_zi = zr.mul(zi).toPrecision(precision).mul(2).add(ci);
|
|
20813
|
-
zr = zr2.sub(zi2).add(cr);
|
|
20814
|
-
zi = new_zi;
|
|
20815
|
-
}
|
|
20816
|
-
return new Float32Array(points);
|
|
20817
|
-
} finally {
|
|
20818
|
-
BigDecimal.precision = prevPrecision;
|
|
20819
|
-
}
|
|
20820
|
-
}
|
|
20821
|
-
|
|
20822
20860
|
// src/compute-engine/compilation/gpu-target.ts
|
|
20823
20861
|
var GPU_OPERATORS = {
|
|
20824
20862
|
Add: ["+", 11],
|
|
@@ -20902,13 +20940,6 @@ ${lines.join("\n")}`;
|
|
|
20902
20940
|
];
|
|
20903
20941
|
return lines.join("\n");
|
|
20904
20942
|
}
|
|
20905
|
-
function selectFractalStrategy(target) {
|
|
20906
|
-
const radius = target.hints?.viewport?.radius;
|
|
20907
|
-
if (radius === void 0) return "single";
|
|
20908
|
-
if (radius > 1e-6) return "single";
|
|
20909
|
-
if (radius > 1e-14) return "double";
|
|
20910
|
-
return "perturbation";
|
|
20911
|
-
}
|
|
20912
20943
|
var GPU_FUNCTIONS = {
|
|
20913
20944
|
// Variadic arithmetic (for function-call form, e.g., with vectors)
|
|
20914
20945
|
Add: (args, compile2, target) => {
|
|
@@ -21404,32 +21435,12 @@ ${lines.join("\n")}`;
|
|
|
21404
21435
|
if (c === null || maxIter === null)
|
|
21405
21436
|
throw new Error("Mandelbrot: missing arguments");
|
|
21406
21437
|
const iterCode = compileIntArg(maxIter, compile2, target);
|
|
21407
|
-
const strategy = selectFractalStrategy(target);
|
|
21408
|
-
if (strategy === "double") {
|
|
21409
|
-
const dpCoord = target?.language === "wgsl" ? "_dp_coord(v_uv)" : "_dp_coord()";
|
|
21410
|
-
return `_fractal_mandelbrot_dp(${dpCoord}, ${iterCode})`;
|
|
21411
|
-
}
|
|
21412
|
-
if (strategy === "perturbation") {
|
|
21413
|
-
const ptDelta = target?.language === "wgsl" ? "_pt_delta(v_uv)" : "_pt_delta()";
|
|
21414
|
-
return `_fractal_mandelbrot_pt(${ptDelta}, ${iterCode})`;
|
|
21415
|
-
}
|
|
21416
21438
|
return `_fractal_mandelbrot(${compile2(c)}, ${iterCode})`;
|
|
21417
21439
|
},
|
|
21418
21440
|
Julia: ([z, c, maxIter], compile2, target) => {
|
|
21419
21441
|
if (z === null || c === null || maxIter === null)
|
|
21420
21442
|
throw new Error("Julia: missing arguments");
|
|
21421
21443
|
const iterCode = compileIntArg(maxIter, compile2, target);
|
|
21422
|
-
const strategy = selectFractalStrategy(target);
|
|
21423
|
-
if (strategy === "double") {
|
|
21424
|
-
const dpCoord = target?.language === "wgsl" ? "_dp_coord(v_uv)" : "_dp_coord()";
|
|
21425
|
-
const cCode = compile2(c);
|
|
21426
|
-
return `_fractal_julia_dp(${dpCoord}, vec4(${cCode}, vec2(0.0)), ${iterCode})`;
|
|
21427
|
-
}
|
|
21428
|
-
if (strategy === "perturbation") {
|
|
21429
|
-
const ptDelta = target?.language === "wgsl" ? "_pt_delta(v_uv)" : "_pt_delta()";
|
|
21430
|
-
const cCode = compile2(c);
|
|
21431
|
-
return `_fractal_julia_pt(${ptDelta}, ${cCode}, ${iterCode})`;
|
|
21432
|
-
}
|
|
21433
21444
|
return `_fractal_julia(${compile2(z)}, ${compile2(c)}, ${iterCode})`;
|
|
21434
21445
|
},
|
|
21435
21446
|
// Vector/Matrix operations
|
|
@@ -22026,232 +22037,6 @@ fn _gpu_besselJ(n_in: i32, x_in: f32) -> f32 {
|
|
|
22026
22037
|
for (var k2: i32 = 2; k2 <= M; k2 += 2) { norm += 2.0 * vals[k2]; }
|
|
22027
22038
|
return sgn * vals[n] / norm;
|
|
22028
22039
|
}
|
|
22029
|
-
`;
|
|
22030
|
-
var GPU_DS_ARITHMETIC_PREAMBLE_GLSL = `
|
|
22031
|
-
// Split a float into high and low parts for exact multiplication
|
|
22032
|
-
vec2 ds_split(float a) {
|
|
22033
|
-
const float SPLIT = 4097.0; // 2^12 + 1
|
|
22034
|
-
float t = SPLIT * a;
|
|
22035
|
-
float hi = t - (t - a);
|
|
22036
|
-
float lo = a - hi;
|
|
22037
|
-
return vec2(hi, lo);
|
|
22038
|
-
}
|
|
22039
|
-
|
|
22040
|
-
// Create a double-single from a single float
|
|
22041
|
-
vec2 ds_from(float a) {
|
|
22042
|
-
return vec2(a, 0.0);
|
|
22043
|
-
}
|
|
22044
|
-
|
|
22045
|
-
// Error-free addition (Knuth TwoSum)
|
|
22046
|
-
vec2 ds_add(vec2 a, vec2 b) {
|
|
22047
|
-
float s = a.x + b.x;
|
|
22048
|
-
float v = s - a.x;
|
|
22049
|
-
float e = (a.x - (s - v)) + (b.x - v);
|
|
22050
|
-
float lo = (a.y + b.y) + e;
|
|
22051
|
-
float hi = s + lo;
|
|
22052
|
-
lo = lo - (hi - s);
|
|
22053
|
-
return vec2(hi, lo);
|
|
22054
|
-
}
|
|
22055
|
-
|
|
22056
|
-
// Double-single subtraction
|
|
22057
|
-
vec2 ds_sub(vec2 a, vec2 b) {
|
|
22058
|
-
return ds_add(a, vec2(-b.x, -b.y));
|
|
22059
|
-
}
|
|
22060
|
-
|
|
22061
|
-
// Error-free multiplication (Dekker TwoProduct)
|
|
22062
|
-
vec2 ds_mul(vec2 a, vec2 b) {
|
|
22063
|
-
float p = a.x * b.x;
|
|
22064
|
-
vec2 sa = ds_split(a.x);
|
|
22065
|
-
vec2 sb = ds_split(b.x);
|
|
22066
|
-
float err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;
|
|
22067
|
-
err += a.x * b.y + a.y * b.x;
|
|
22068
|
-
float hi = p + err;
|
|
22069
|
-
float lo = err - (hi - p);
|
|
22070
|
-
return vec2(hi, lo);
|
|
22071
|
-
}
|
|
22072
|
-
|
|
22073
|
-
// Optimized self-multiply
|
|
22074
|
-
vec2 ds_sqr(vec2 a) {
|
|
22075
|
-
float p = a.x * a.x;
|
|
22076
|
-
vec2 sa = ds_split(a.x);
|
|
22077
|
-
float err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;
|
|
22078
|
-
err += 2.0 * a.x * a.y;
|
|
22079
|
-
float hi = p + err;
|
|
22080
|
-
float lo = err - (hi - p);
|
|
22081
|
-
return vec2(hi, lo);
|
|
22082
|
-
}
|
|
22083
|
-
|
|
22084
|
-
// Compare magnitude: returns -1, 0, or 1
|
|
22085
|
-
float ds_cmp(vec2 a, vec2 b) {
|
|
22086
|
-
float d = a.x - b.x;
|
|
22087
|
-
if (d != 0.0) return sign(d);
|
|
22088
|
-
return sign(a.y - b.y);
|
|
22089
|
-
}
|
|
22090
|
-
`;
|
|
22091
|
-
var GPU_DS_ARITHMETIC_PREAMBLE_WGSL = `
|
|
22092
|
-
fn ds_split(a: f32) -> vec2f {
|
|
22093
|
-
const SPLIT: f32 = 4097.0;
|
|
22094
|
-
let t = SPLIT * a;
|
|
22095
|
-
let hi = t - (t - a);
|
|
22096
|
-
let lo = a - hi;
|
|
22097
|
-
return vec2f(hi, lo);
|
|
22098
|
-
}
|
|
22099
|
-
|
|
22100
|
-
fn ds_from(a: f32) -> vec2f {
|
|
22101
|
-
return vec2f(a, 0.0);
|
|
22102
|
-
}
|
|
22103
|
-
|
|
22104
|
-
fn ds_add(a: vec2f, b: vec2f) -> vec2f {
|
|
22105
|
-
let s = a.x + b.x;
|
|
22106
|
-
let v = s - a.x;
|
|
22107
|
-
let e = (a.x - (s - v)) + (b.x - v);
|
|
22108
|
-
let lo_t = (a.y + b.y) + e;
|
|
22109
|
-
let hi = s + lo_t;
|
|
22110
|
-
let lo = lo_t - (hi - s);
|
|
22111
|
-
return vec2f(hi, lo);
|
|
22112
|
-
}
|
|
22113
|
-
|
|
22114
|
-
fn ds_sub(a: vec2f, b: vec2f) -> vec2f {
|
|
22115
|
-
return ds_add(a, vec2f(-b.x, -b.y));
|
|
22116
|
-
}
|
|
22117
|
-
|
|
22118
|
-
fn ds_mul(a: vec2f, b: vec2f) -> vec2f {
|
|
22119
|
-
let p = a.x * b.x;
|
|
22120
|
-
let sa = ds_split(a.x);
|
|
22121
|
-
let sb = ds_split(b.x);
|
|
22122
|
-
var err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;
|
|
22123
|
-
err += a.x * b.y + a.y * b.x;
|
|
22124
|
-
let hi = p + err;
|
|
22125
|
-
let lo = err - (hi - p);
|
|
22126
|
-
return vec2f(hi, lo);
|
|
22127
|
-
}
|
|
22128
|
-
|
|
22129
|
-
fn ds_sqr(a: vec2f) -> vec2f {
|
|
22130
|
-
let p = a.x * a.x;
|
|
22131
|
-
let sa = ds_split(a.x);
|
|
22132
|
-
var err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;
|
|
22133
|
-
err += 2.0 * a.x * a.y;
|
|
22134
|
-
let hi = p + err;
|
|
22135
|
-
let lo = err - (hi - p);
|
|
22136
|
-
return vec2f(hi, lo);
|
|
22137
|
-
}
|
|
22138
|
-
|
|
22139
|
-
fn ds_cmp(a: vec2f, b: vec2f) -> f32 {
|
|
22140
|
-
let d = a.x - b.x;
|
|
22141
|
-
if (d != 0.0) { return sign(d); }
|
|
22142
|
-
return sign(a.y - b.y);
|
|
22143
|
-
}
|
|
22144
|
-
`;
|
|
22145
|
-
var GPU_FRACTAL_DP_PREAMBLE_GLSL = `
|
|
22146
|
-
uniform float _dp_cx_hi;
|
|
22147
|
-
uniform float _dp_cx_lo;
|
|
22148
|
-
uniform float _dp_cy_hi;
|
|
22149
|
-
uniform float _dp_cy_lo;
|
|
22150
|
-
uniform float _dp_w;
|
|
22151
|
-
uniform float _dp_h;
|
|
22152
|
-
|
|
22153
|
-
vec4 _dp_coord() {
|
|
22154
|
-
// Per-pixel offset from center \u2014 small, so float-precise
|
|
22155
|
-
float dx = (v_uv.x - 0.5) * _dp_w;
|
|
22156
|
-
float dy = (v_uv.y - 0.5) * _dp_h;
|
|
22157
|
-
// Combine center (hi+lo) + delta with emulated double precision
|
|
22158
|
-
vec2 cre = ds_add(vec2(_dp_cx_hi, _dp_cx_lo), ds_from(dx));
|
|
22159
|
-
vec2 cim = ds_add(vec2(_dp_cy_hi, _dp_cy_lo), ds_from(dy));
|
|
22160
|
-
return vec4(cre.x, cim.x, cre.y, cim.y);
|
|
22161
|
-
}
|
|
22162
|
-
|
|
22163
|
-
float _fractal_mandelbrot_dp(vec4 c, int maxIter) {
|
|
22164
|
-
// c = (re_hi, im_hi, re_lo, im_lo)
|
|
22165
|
-
vec2 cr = vec2(c.x, c.z); // real part as ds
|
|
22166
|
-
vec2 ci = vec2(c.y, c.w); // imag part as ds
|
|
22167
|
-
vec2 zr = vec2(0.0, 0.0);
|
|
22168
|
-
vec2 zi = vec2(0.0, 0.0);
|
|
22169
|
-
for (int i = 0; i < maxIter; i++) {
|
|
22170
|
-
vec2 zr2 = ds_sqr(zr);
|
|
22171
|
-
vec2 zi2 = ds_sqr(zi);
|
|
22172
|
-
// |z|^2 > 4.0 ?
|
|
22173
|
-
vec2 mag2 = ds_add(zr2, zi2);
|
|
22174
|
-
if (mag2.x > 4.0)
|
|
22175
|
-
return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
22176
|
-
// z = z^2 + c
|
|
22177
|
-
vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci); // 2*zr*zi + ci
|
|
22178
|
-
zr = ds_add(ds_sub(zr2, zi2), cr); // zr^2 - zi^2 + cr
|
|
22179
|
-
zi = new_zi;
|
|
22180
|
-
}
|
|
22181
|
-
return 1.0;
|
|
22182
|
-
}
|
|
22183
|
-
|
|
22184
|
-
float _fractal_julia_dp(vec4 z_in, vec4 c, int maxIter) {
|
|
22185
|
-
vec2 zr = vec2(z_in.x, z_in.z);
|
|
22186
|
-
vec2 zi = vec2(z_in.y, z_in.w);
|
|
22187
|
-
vec2 cr = vec2(c.x, c.z);
|
|
22188
|
-
vec2 ci = vec2(c.y, c.w);
|
|
22189
|
-
for (int i = 0; i < maxIter; i++) {
|
|
22190
|
-
vec2 zr2 = ds_sqr(zr);
|
|
22191
|
-
vec2 zi2 = ds_sqr(zi);
|
|
22192
|
-
vec2 mag2 = ds_add(zr2, zi2);
|
|
22193
|
-
if (mag2.x > 4.0)
|
|
22194
|
-
return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
22195
|
-
vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
22196
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
22197
|
-
zi = new_zi;
|
|
22198
|
-
}
|
|
22199
|
-
return 1.0;
|
|
22200
|
-
}
|
|
22201
|
-
`;
|
|
22202
|
-
var GPU_FRACTAL_DP_PREAMBLE_WGSL = `
|
|
22203
|
-
@group(0) @binding(10) var<uniform> _dp_cx_hi: f32;
|
|
22204
|
-
@group(0) @binding(11) var<uniform> _dp_cx_lo: f32;
|
|
22205
|
-
@group(0) @binding(12) var<uniform> _dp_cy_hi: f32;
|
|
22206
|
-
@group(0) @binding(13) var<uniform> _dp_cy_lo: f32;
|
|
22207
|
-
@group(0) @binding(14) var<uniform> _dp_w: f32;
|
|
22208
|
-
@group(0) @binding(15) var<uniform> _dp_h: f32;
|
|
22209
|
-
|
|
22210
|
-
fn _dp_coord(uv: vec2f) -> vec4f {
|
|
22211
|
-
let dx = (uv.x - 0.5) * _dp_w;
|
|
22212
|
-
let dy = (uv.y - 0.5) * _dp_h;
|
|
22213
|
-
let cre = ds_add(vec2f(_dp_cx_hi, _dp_cx_lo), ds_from(dx));
|
|
22214
|
-
let cim = ds_add(vec2f(_dp_cy_hi, _dp_cy_lo), ds_from(dy));
|
|
22215
|
-
return vec4f(cre.x, cim.x, cre.y, cim.y);
|
|
22216
|
-
}
|
|
22217
|
-
|
|
22218
|
-
fn _fractal_mandelbrot_dp(c: vec4f, maxIter: i32) -> f32 {
|
|
22219
|
-
let cr = vec2f(c.x, c.z);
|
|
22220
|
-
let ci = vec2f(c.y, c.w);
|
|
22221
|
-
var zr = vec2f(0.0, 0.0);
|
|
22222
|
-
var zi = vec2f(0.0, 0.0);
|
|
22223
|
-
for (var i: i32 = 0; i < maxIter; i++) {
|
|
22224
|
-
let zr2 = ds_sqr(zr);
|
|
22225
|
-
let zi2 = ds_sqr(zi);
|
|
22226
|
-
let mag2 = ds_add(zr2, zi2);
|
|
22227
|
-
if (mag2.x > 4.0) {
|
|
22228
|
-
return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
22229
|
-
}
|
|
22230
|
-
let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
22231
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
22232
|
-
zi = new_zi;
|
|
22233
|
-
}
|
|
22234
|
-
return 1.0;
|
|
22235
|
-
}
|
|
22236
|
-
|
|
22237
|
-
fn _fractal_julia_dp(z_in: vec4f, c: vec4f, maxIter: i32) -> f32 {
|
|
22238
|
-
var zr = vec2f(z_in.x, z_in.z);
|
|
22239
|
-
var zi = vec2f(z_in.y, z_in.w);
|
|
22240
|
-
let cr = vec2f(c.x, c.z);
|
|
22241
|
-
let ci = vec2f(c.y, c.w);
|
|
22242
|
-
for (var i: i32 = 0; i < maxIter; i++) {
|
|
22243
|
-
let zr2 = ds_sqr(zr);
|
|
22244
|
-
let zi2 = ds_sqr(zi);
|
|
22245
|
-
let mag2 = ds_add(zr2, zi2);
|
|
22246
|
-
if (mag2.x > 4.0) {
|
|
22247
|
-
return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
22248
|
-
}
|
|
22249
|
-
let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);
|
|
22250
|
-
zr = ds_add(ds_sub(zr2, zi2), cr);
|
|
22251
|
-
zi = new_zi;
|
|
22252
|
-
}
|
|
22253
|
-
return 1.0;
|
|
22254
|
-
}
|
|
22255
22040
|
`;
|
|
22256
22041
|
var GPU_FRACTAL_PREAMBLE_GLSL = `
|
|
22257
22042
|
float _fractal_mandelbrot(vec2 c, int maxIter) {
|
|
@@ -22295,208 +22080,6 @@ fn _fractal_julia(z_in: vec2f, c: vec2f, maxIter: i32) -> f32 {
|
|
|
22295
22080
|
}
|
|
22296
22081
|
return 1.0;
|
|
22297
22082
|
}
|
|
22298
|
-
`;
|
|
22299
|
-
var GPU_FRACTAL_PT_PREAMBLE_GLSL = `
|
|
22300
|
-
uniform sampler2D _refOrbit;
|
|
22301
|
-
uniform int _refOrbitLen;
|
|
22302
|
-
uniform int _refOrbitTexWidth;
|
|
22303
|
-
uniform float _pt_offset_x;
|
|
22304
|
-
uniform float _pt_offset_y;
|
|
22305
|
-
uniform float _pt_w;
|
|
22306
|
-
uniform float _pt_h;
|
|
22307
|
-
|
|
22308
|
-
vec2 _pt_delta() {
|
|
22309
|
-
float dx = _pt_offset_x + (v_uv.x - 0.5) * _pt_w;
|
|
22310
|
-
float dy = _pt_offset_y + (v_uv.y - 0.5) * _pt_h;
|
|
22311
|
-
return vec2(dx, dy);
|
|
22312
|
-
}
|
|
22313
|
-
|
|
22314
|
-
vec2 _pt_fetch_orbit(int i) {
|
|
22315
|
-
int y = i / _refOrbitTexWidth;
|
|
22316
|
-
int x = i - y * _refOrbitTexWidth;
|
|
22317
|
-
return texelFetch(_refOrbit, ivec2(x, y), 0).rg;
|
|
22318
|
-
}
|
|
22319
|
-
|
|
22320
|
-
float _fractal_mandelbrot_pt(vec2 delta_c, int maxIter) {
|
|
22321
|
-
float dr = 0.0;
|
|
22322
|
-
float di = 0.0;
|
|
22323
|
-
int orbitLen = min(maxIter, _refOrbitLen);
|
|
22324
|
-
for (int i = 0; i < orbitLen; i++) {
|
|
22325
|
-
vec2 Zn = _pt_fetch_orbit(i);
|
|
22326
|
-
// delta_{n+1} = 2*Z_n*delta_n + delta_n^2 + delta_c
|
|
22327
|
-
float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
22328
|
-
float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
22329
|
-
dr = new_dr;
|
|
22330
|
-
di = new_di;
|
|
22331
|
-
// Full z = Z_{n+1} + delta for escape check
|
|
22332
|
-
vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);
|
|
22333
|
-
float zr = Zn1.x + dr;
|
|
22334
|
-
float zi = Zn1.y + di;
|
|
22335
|
-
float mag2 = zr * zr + zi * zi;
|
|
22336
|
-
if (mag2 > 4.0)
|
|
22337
|
-
return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
22338
|
-
// Glitch detection: |delta|^2 > |Z|^2
|
|
22339
|
-
float dmag2 = dr * dr + di * di;
|
|
22340
|
-
float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
22341
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
22342
|
-
// Rebase to absolute coordinates and continue with single-float
|
|
22343
|
-
float abs_zr = Zn1.x + dr;
|
|
22344
|
-
float abs_zi = Zn1.y + di;
|
|
22345
|
-
// Reconstruct absolute c from reference + delta
|
|
22346
|
-
// (Use ds_from for the concept, but single-float suffices for fallback)
|
|
22347
|
-
float cx = abs_zr - dr + delta_c.x;
|
|
22348
|
-
float cy = abs_zi - di + delta_c.y;
|
|
22349
|
-
for (int j = i + 1; j < maxIter; j++) {
|
|
22350
|
-
float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;
|
|
22351
|
-
abs_zi = 2.0 * abs_zr * abs_zi + cy;
|
|
22352
|
-
abs_zr = new_zr;
|
|
22353
|
-
mag2 = abs_zr * abs_zr + abs_zi * abs_zi;
|
|
22354
|
-
if (mag2 > 4.0)
|
|
22355
|
-
return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
22356
|
-
}
|
|
22357
|
-
return 1.0;
|
|
22358
|
-
}
|
|
22359
|
-
}
|
|
22360
|
-
return 1.0;
|
|
22361
|
-
}
|
|
22362
|
-
|
|
22363
|
-
float _fractal_julia_pt(vec2 z_delta, vec2 delta_c, int maxIter) {
|
|
22364
|
-
float dr = z_delta.x;
|
|
22365
|
-
float di = z_delta.y;
|
|
22366
|
-
int orbitLen = min(maxIter, _refOrbitLen);
|
|
22367
|
-
for (int i = 0; i < orbitLen; i++) {
|
|
22368
|
-
vec2 Zn = _pt_fetch_orbit(i);
|
|
22369
|
-
float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
22370
|
-
float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
22371
|
-
dr = new_dr;
|
|
22372
|
-
di = new_di;
|
|
22373
|
-
vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);
|
|
22374
|
-
float zr = Zn1.x + dr;
|
|
22375
|
-
float zi = Zn1.y + di;
|
|
22376
|
-
float mag2 = zr * zr + zi * zi;
|
|
22377
|
-
if (mag2 > 4.0)
|
|
22378
|
-
return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
22379
|
-
float dmag2 = dr * dr + di * di;
|
|
22380
|
-
float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
22381
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
22382
|
-
float abs_zr = Zn1.x + dr;
|
|
22383
|
-
float abs_zi = Zn1.y + di;
|
|
22384
|
-
float cx = delta_c.x;
|
|
22385
|
-
float cy = delta_c.y;
|
|
22386
|
-
for (int j = i + 1; j < maxIter; j++) {
|
|
22387
|
-
float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;
|
|
22388
|
-
abs_zi = 2.0 * abs_zr * abs_zi + cy;
|
|
22389
|
-
abs_zr = new_zr;
|
|
22390
|
-
mag2 = abs_zr * abs_zr + abs_zi * abs_zi;
|
|
22391
|
-
if (mag2 > 4.0)
|
|
22392
|
-
return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);
|
|
22393
|
-
}
|
|
22394
|
-
return 1.0;
|
|
22395
|
-
}
|
|
22396
|
-
}
|
|
22397
|
-
return 1.0;
|
|
22398
|
-
}
|
|
22399
|
-
`;
|
|
22400
|
-
var GPU_FRACTAL_PT_PREAMBLE_WGSL = `
|
|
22401
|
-
@group(0) @binding(1) var _refOrbit: texture_2d<f32>;
|
|
22402
|
-
var<uniform> _refOrbitLen: i32;
|
|
22403
|
-
var<uniform> _refOrbitTexWidth: i32;
|
|
22404
|
-
var<uniform> _pt_offset_x: f32;
|
|
22405
|
-
var<uniform> _pt_offset_y: f32;
|
|
22406
|
-
var<uniform> _pt_w: f32;
|
|
22407
|
-
var<uniform> _pt_h: f32;
|
|
22408
|
-
|
|
22409
|
-
fn _pt_delta(uv: vec2f) -> vec2f {
|
|
22410
|
-
let dx = _pt_offset_x + (uv.x - 0.5) * _pt_w;
|
|
22411
|
-
let dy = _pt_offset_y + (uv.y - 0.5) * _pt_h;
|
|
22412
|
-
return vec2f(dx, dy);
|
|
22413
|
-
}
|
|
22414
|
-
|
|
22415
|
-
fn _pt_fetch_orbit(i: i32) -> vec2f {
|
|
22416
|
-
let y = i / _refOrbitTexWidth;
|
|
22417
|
-
let x = i - y * _refOrbitTexWidth;
|
|
22418
|
-
return textureLoad(_refOrbit, vec2i(x, y), 0).rg;
|
|
22419
|
-
}
|
|
22420
|
-
|
|
22421
|
-
fn _fractal_mandelbrot_pt(delta_c: vec2f, maxIter: i32) -> f32 {
|
|
22422
|
-
var dr: f32 = 0.0;
|
|
22423
|
-
var di: f32 = 0.0;
|
|
22424
|
-
let orbitLen = min(maxIter, _refOrbitLen);
|
|
22425
|
-
for (var i: i32 = 0; i < orbitLen; i++) {
|
|
22426
|
-
let Zn = _pt_fetch_orbit(i);
|
|
22427
|
-
let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
22428
|
-
let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
22429
|
-
dr = new_dr;
|
|
22430
|
-
di = new_di;
|
|
22431
|
-
var Zn1 = vec2f(0.0);
|
|
22432
|
-
if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }
|
|
22433
|
-
let zr = Zn1.x + dr;
|
|
22434
|
-
let zi = Zn1.y + di;
|
|
22435
|
-
var mag2 = zr * zr + zi * zi;
|
|
22436
|
-
if (mag2 > 4.0) {
|
|
22437
|
-
return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
22438
|
-
}
|
|
22439
|
-
let dmag2 = dr * dr + di * di;
|
|
22440
|
-
let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
22441
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
22442
|
-
var f_zr = Zn1.x + dr;
|
|
22443
|
-
var f_zi = Zn1.y + di;
|
|
22444
|
-
let cx = delta_c.x;
|
|
22445
|
-
let cy = delta_c.y;
|
|
22446
|
-
for (var j: i32 = i + 1; j < maxIter; j++) {
|
|
22447
|
-
let t_zr = f_zr * f_zr - f_zi * f_zi + cx;
|
|
22448
|
-
f_zi = 2.0 * f_zr * f_zi + cy;
|
|
22449
|
-
f_zr = t_zr;
|
|
22450
|
-
mag2 = f_zr * f_zr + f_zi * f_zi;
|
|
22451
|
-
if (mag2 > 4.0) {
|
|
22452
|
-
return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
22453
|
-
}
|
|
22454
|
-
}
|
|
22455
|
-
return 1.0;
|
|
22456
|
-
}
|
|
22457
|
-
}
|
|
22458
|
-
return 1.0;
|
|
22459
|
-
}
|
|
22460
|
-
|
|
22461
|
-
fn _fractal_julia_pt(z_delta: vec2f, delta_c: vec2f, maxIter: i32) -> f32 {
|
|
22462
|
-
var dr = z_delta.x;
|
|
22463
|
-
var di = z_delta.y;
|
|
22464
|
-
let orbitLen = min(maxIter, _refOrbitLen);
|
|
22465
|
-
for (var i: i32 = 0; i < orbitLen; i++) {
|
|
22466
|
-
let Zn = _pt_fetch_orbit(i);
|
|
22467
|
-
let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;
|
|
22468
|
-
let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;
|
|
22469
|
-
dr = new_dr;
|
|
22470
|
-
di = new_di;
|
|
22471
|
-
var Zn1 = vec2f(0.0);
|
|
22472
|
-
if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }
|
|
22473
|
-
let zr = Zn1.x + dr;
|
|
22474
|
-
let zi = Zn1.y + di;
|
|
22475
|
-
var mag2 = zr * zr + zi * zi;
|
|
22476
|
-
if (mag2 > 4.0) {
|
|
22477
|
-
return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
22478
|
-
}
|
|
22479
|
-
let dmag2 = dr * dr + di * di;
|
|
22480
|
-
let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;
|
|
22481
|
-
if (dmag2 > Zmag2 && Zmag2 > 0.0) {
|
|
22482
|
-
var f_zr = Zn1.x + dr;
|
|
22483
|
-
var f_zi = Zn1.y + di;
|
|
22484
|
-
let cx = delta_c.x;
|
|
22485
|
-
let cy = delta_c.y;
|
|
22486
|
-
for (var j: i32 = i + 1; j < maxIter; j++) {
|
|
22487
|
-
let t_zr = f_zr * f_zr - f_zi * f_zi + cx;
|
|
22488
|
-
f_zi = 2.0 * f_zr * f_zi + cy;
|
|
22489
|
-
f_zr = t_zr;
|
|
22490
|
-
mag2 = f_zr * f_zr + f_zi * f_zi;
|
|
22491
|
-
if (mag2 > 4.0) {
|
|
22492
|
-
return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);
|
|
22493
|
-
}
|
|
22494
|
-
}
|
|
22495
|
-
return 1.0;
|
|
22496
|
-
}
|
|
22497
|
-
}
|
|
22498
|
-
return 1.0;
|
|
22499
|
-
}
|
|
22500
22083
|
`;
|
|
22501
22084
|
var GPU_COLOR_PREAMBLE_GLSL = `
|
|
22502
22085
|
float _gpu_srgb_to_linear(float c) {
|
|
@@ -22936,7 +22519,6 @@ fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
|
|
|
22936
22519
|
const constants = this.getConstants();
|
|
22937
22520
|
const v2 = this.languageId === "wgsl" ? "vec2f" : "vec2";
|
|
22938
22521
|
const target = this.createTarget({
|
|
22939
|
-
hints: options.hints,
|
|
22940
22522
|
functions: (id) => {
|
|
22941
22523
|
if (userFunctions && id in userFunctions) {
|
|
22942
22524
|
const fn = userFunctions[id];
|
|
@@ -22975,89 +22557,12 @@ fn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {
|
|
|
22975
22557
|
if (code.includes("_gpu_besselJ"))
|
|
22976
22558
|
preamble += this.languageId === "wgsl" ? GPU_BESSELJ_PREAMBLE_WGSL : GPU_BESSELJ_PREAMBLE_GLSL;
|
|
22977
22559
|
if (code.includes("_fractal_")) {
|
|
22978
|
-
|
|
22979
|
-
preamble += this.languageId === "wgsl" ? GPU_DS_ARITHMETIC_PREAMBLE_WGSL : GPU_DS_ARITHMETIC_PREAMBLE_GLSL;
|
|
22980
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PT_PREAMBLE_WGSL : GPU_FRACTAL_PT_PREAMBLE_GLSL;
|
|
22981
|
-
} else if (code.includes("_fractal_mandelbrot_dp") || code.includes("_fractal_julia_dp")) {
|
|
22982
|
-
preamble += this.languageId === "wgsl" ? GPU_DS_ARITHMETIC_PREAMBLE_WGSL : GPU_DS_ARITHMETIC_PREAMBLE_GLSL;
|
|
22983
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_DP_PREAMBLE_WGSL : GPU_FRACTAL_DP_PREAMBLE_GLSL;
|
|
22984
|
-
} else {
|
|
22985
|
-
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PREAMBLE_WGSL : GPU_FRACTAL_PREAMBLE_GLSL;
|
|
22986
|
-
}
|
|
22560
|
+
preamble += this.languageId === "wgsl" ? GPU_FRACTAL_PREAMBLE_WGSL : GPU_FRACTAL_PREAMBLE_GLSL;
|
|
22987
22561
|
}
|
|
22988
22562
|
if (code.includes("_gpu_srgb_to") || code.includes("_gpu_oklab") || code.includes("_gpu_oklch") || code.includes("_gpu_color_mix") || code.includes("_gpu_apca")) {
|
|
22989
22563
|
preamble += this.languageId === "wgsl" ? GPU_COLOR_PREAMBLE_WGSL : GPU_COLOR_PREAMBLE_GLSL;
|
|
22990
22564
|
}
|
|
22991
22565
|
if (preamble) result.preamble = preamble;
|
|
22992
|
-
if (code.includes("_fractal_") && options.hints?.viewport) {
|
|
22993
|
-
const strategy = selectFractalStrategy(target);
|
|
22994
|
-
const radius = options.hints.viewport.radius;
|
|
22995
|
-
switch (strategy) {
|
|
22996
|
-
case "single":
|
|
22997
|
-
result.staleWhen = { radiusBelow: 1e-6 };
|
|
22998
|
-
break;
|
|
22999
|
-
case "double":
|
|
23000
|
-
result.staleWhen = { radiusBelow: 1e-14, radiusAbove: 1e-5 };
|
|
23001
|
-
break;
|
|
23002
|
-
case "perturbation":
|
|
23003
|
-
result.staleWhen = {
|
|
23004
|
-
radiusAbove: 1e-5,
|
|
23005
|
-
radiusBelow: radius * 0.01,
|
|
23006
|
-
centerDistance: radius * 2
|
|
23007
|
-
};
|
|
23008
|
-
break;
|
|
23009
|
-
}
|
|
23010
|
-
}
|
|
23011
|
-
if ((code.includes("_fractal_mandelbrot_dp") || code.includes("_fractal_julia_dp")) && options.hints?.viewport) {
|
|
23012
|
-
const cx = hpToNumber(options.hints.viewport.center[0]);
|
|
23013
|
-
const cy = hpToNumber(options.hints.viewport.center[1]);
|
|
23014
|
-
const size = options.hints.viewport.radius * 2;
|
|
23015
|
-
const cx_hi = Math.fround(cx);
|
|
23016
|
-
const cy_hi = Math.fround(cy);
|
|
23017
|
-
result.uniforms = {
|
|
23018
|
-
...result.uniforms,
|
|
23019
|
-
_dp_cx_hi: cx_hi,
|
|
23020
|
-
_dp_cx_lo: cx - cx_hi,
|
|
23021
|
-
_dp_cy_hi: cy_hi,
|
|
23022
|
-
_dp_cy_lo: cy - cy_hi,
|
|
23023
|
-
_dp_w: size,
|
|
23024
|
-
_dp_h: size
|
|
23025
|
-
};
|
|
23026
|
-
}
|
|
23027
|
-
if ((code.includes("_fractal_mandelbrot_pt") || code.includes("_fractal_julia_pt")) && options.hints?.viewport) {
|
|
23028
|
-
const viewport = options.hints.viewport;
|
|
23029
|
-
const size = viewport.radius * 2;
|
|
23030
|
-
result.uniforms = {
|
|
23031
|
-
...result.uniforms,
|
|
23032
|
-
_pt_offset_x: 0,
|
|
23033
|
-
_pt_offset_y: 0,
|
|
23034
|
-
_pt_w: size,
|
|
23035
|
-
_pt_h: size
|
|
23036
|
-
};
|
|
23037
|
-
const digits = Math.max(50, Math.ceil(-Math.log10(viewport.radius)) + 10);
|
|
23038
|
-
const maxIter = 1e3;
|
|
23039
|
-
const orbit = computeReferenceOrbit(
|
|
23040
|
-
viewport.center,
|
|
23041
|
-
maxIter,
|
|
23042
|
-
digits
|
|
23043
|
-
);
|
|
23044
|
-
const orbitLen = orbit.length / 2;
|
|
23045
|
-
const texWidth = Math.min(orbitLen, 4096);
|
|
23046
|
-
const texHeight = Math.ceil(orbitLen / texWidth);
|
|
23047
|
-
result.textures = {
|
|
23048
|
-
_refOrbit: {
|
|
23049
|
-
data: orbit,
|
|
23050
|
-
width: texWidth,
|
|
23051
|
-
height: texHeight,
|
|
23052
|
-
format: "rg32f"
|
|
23053
|
-
}
|
|
23054
|
-
};
|
|
23055
|
-
result.uniforms = {
|
|
23056
|
-
...result.uniforms,
|
|
23057
|
-
_refOrbitLen: orbitLen,
|
|
23058
|
-
_refOrbitTexWidth: texWidth
|
|
23059
|
-
};
|
|
23060
|
-
}
|
|
23061
22566
|
return result;
|
|
23062
22567
|
}
|
|
23063
22568
|
compileToSource(expr, _options = {}) {
|
|
@@ -25392,7 +24897,7 @@ ${code}`;
|
|
|
25392
24897
|
}
|
|
25393
24898
|
|
|
25394
24899
|
// src/compile.ts
|
|
25395
|
-
var version = "0.55.
|
|
24900
|
+
var version = "0.55.6";
|
|
25396
24901
|
return __toCommonJS(compile_exports);
|
|
25397
24902
|
})();
|
|
25398
24903
|
/*! Bundled license information:
|