@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.
Files changed (258) hide show
  1. package/dist/compile.esm.js +138 -633
  2. package/dist/compile.min.esm.js +71 -493
  3. package/dist/compile.min.umd.cjs +71 -493
  4. package/dist/compile.umd.cjs +138 -633
  5. package/dist/compute-engine.esm.js +227 -651
  6. package/dist/compute-engine.min.esm.js +68 -489
  7. package/dist/compute-engine.min.umd.cjs +68 -489
  8. package/dist/compute-engine.umd.cjs +227 -651
  9. package/dist/core.esm.js +226 -650
  10. package/dist/core.min.esm.js +66 -487
  11. package/dist/core.min.umd.cjs +67 -488
  12. package/dist/core.umd.cjs +226 -650
  13. package/dist/interval.esm.js +136 -60
  14. package/dist/interval.min.esm.js +7 -7
  15. package/dist/interval.min.umd.cjs +7 -7
  16. package/dist/interval.umd.cjs +136 -60
  17. package/dist/latex-syntax.esm.js +219 -74
  18. package/dist/latex-syntax.min.esm.js +7 -6
  19. package/dist/latex-syntax.min.umd.cjs +7 -6
  20. package/dist/latex-syntax.umd.cjs +219 -74
  21. package/dist/math-json.esm.js +2 -2
  22. package/dist/math-json.min.esm.js +2 -2
  23. package/dist/math-json.min.umd.cjs +2 -2
  24. package/dist/math-json.umd.cjs +2 -2
  25. package/dist/numerics.esm.js +2 -2
  26. package/dist/numerics.min.esm.js +2 -2
  27. package/dist/numerics.min.umd.cjs +2 -2
  28. package/dist/numerics.umd.cjs +2 -2
  29. package/dist/types/big-decimal/big-decimal.d.ts +1 -1
  30. package/dist/types/big-decimal/index.d.ts +1 -1
  31. package/dist/types/big-decimal/transcendentals.d.ts +1 -1
  32. package/dist/types/big-decimal/utils.d.ts +1 -1
  33. package/dist/types/common/ansi-codes.d.ts +1 -1
  34. package/dist/types/common/configuration-change.d.ts +1 -1
  35. package/dist/types/common/fuzzy-string-match.d.ts +1 -1
  36. package/dist/types/common/grapheme-splitter.d.ts +1 -1
  37. package/dist/types/common/interruptible.d.ts +1 -1
  38. package/dist/types/common/one-of.d.ts +1 -1
  39. package/dist/types/common/signals.d.ts +1 -1
  40. package/dist/types/common/type/ast-nodes.d.ts +1 -1
  41. package/dist/types/common/type/boxed-type.d.ts +1 -1
  42. package/dist/types/common/type/lexer.d.ts +1 -1
  43. package/dist/types/common/type/parse.d.ts +1 -1
  44. package/dist/types/common/type/parser.d.ts +1 -1
  45. package/dist/types/common/type/primitive.d.ts +1 -1
  46. package/dist/types/common/type/reduce.d.ts +1 -1
  47. package/dist/types/common/type/serialize.d.ts +1 -1
  48. package/dist/types/common/type/subtype.d.ts +1 -1
  49. package/dist/types/common/type/type-builder.d.ts +1 -1
  50. package/dist/types/common/type/types.d.ts +1 -1
  51. package/dist/types/common/type/utils.d.ts +1 -1
  52. package/dist/types/common/utils.d.ts +1 -1
  53. package/dist/types/compile.d.ts +1 -1
  54. package/dist/types/compute-engine/assume.d.ts +1 -1
  55. package/dist/types/compute-engine/boxed-expression/abstract-boxed-expression.d.ts +1 -1
  56. package/dist/types/compute-engine/boxed-expression/apply.d.ts +1 -1
  57. package/dist/types/compute-engine/boxed-expression/arithmetic-add.d.ts +1 -1
  58. package/dist/types/compute-engine/boxed-expression/arithmetic-mul-div.d.ts +1 -1
  59. package/dist/types/compute-engine/boxed-expression/arithmetic-power.d.ts +1 -1
  60. package/dist/types/compute-engine/boxed-expression/ascii-math.d.ts +1 -1
  61. package/dist/types/compute-engine/boxed-expression/box.d.ts +1 -1
  62. package/dist/types/compute-engine/boxed-expression/boxed-dictionary.d.ts +1 -1
  63. package/dist/types/compute-engine/boxed-expression/boxed-function.d.ts +1 -1
  64. package/dist/types/compute-engine/boxed-expression/boxed-number.d.ts +1 -1
  65. package/dist/types/compute-engine/boxed-expression/boxed-operator-definition.d.ts +1 -1
  66. package/dist/types/compute-engine/boxed-expression/boxed-patterns.d.ts +1 -1
  67. package/dist/types/compute-engine/boxed-expression/boxed-string.d.ts +1 -1
  68. package/dist/types/compute-engine/boxed-expression/boxed-symbol.d.ts +1 -1
  69. package/dist/types/compute-engine/boxed-expression/boxed-tensor.d.ts +1 -1
  70. package/dist/types/compute-engine/boxed-expression/boxed-value-definition.d.ts +1 -1
  71. package/dist/types/compute-engine/boxed-expression/cache.d.ts +1 -1
  72. package/dist/types/compute-engine/boxed-expression/canonical-utils.d.ts +1 -1
  73. package/dist/types/compute-engine/boxed-expression/canonical.d.ts +1 -1
  74. package/dist/types/compute-engine/boxed-expression/compare.d.ts +1 -1
  75. package/dist/types/compute-engine/boxed-expression/constants.d.ts +1 -1
  76. package/dist/types/compute-engine/boxed-expression/expand.d.ts +1 -1
  77. package/dist/types/compute-engine/boxed-expression/expression-map.d.ts +1 -1
  78. package/dist/types/compute-engine/boxed-expression/factor.d.ts +1 -1
  79. package/dist/types/compute-engine/boxed-expression/flatten.d.ts +1 -1
  80. package/dist/types/compute-engine/boxed-expression/hold.d.ts +1 -1
  81. package/dist/types/compute-engine/boxed-expression/inequality-bounds.d.ts +1 -1
  82. package/dist/types/compute-engine/boxed-expression/init-lazy-refs.d.ts +1 -1
  83. package/dist/types/compute-engine/boxed-expression/invisible-operator.d.ts +1 -1
  84. package/dist/types/compute-engine/boxed-expression/match.d.ts +1 -1
  85. package/dist/types/compute-engine/boxed-expression/negate.d.ts +1 -1
  86. package/dist/types/compute-engine/boxed-expression/numerics.d.ts +1 -1
  87. package/dist/types/compute-engine/boxed-expression/order.d.ts +1 -1
  88. package/dist/types/compute-engine/boxed-expression/pattern-utils.d.ts +1 -1
  89. package/dist/types/compute-engine/boxed-expression/polynomial-degree.d.ts +1 -1
  90. package/dist/types/compute-engine/boxed-expression/polynomials.d.ts +1 -1
  91. package/dist/types/compute-engine/boxed-expression/predicates.d.ts +1 -1
  92. package/dist/types/compute-engine/boxed-expression/rules.d.ts +1 -1
  93. package/dist/types/compute-engine/boxed-expression/serialize.d.ts +1 -1
  94. package/dist/types/compute-engine/boxed-expression/sgn.d.ts +1 -1
  95. package/dist/types/compute-engine/boxed-expression/simplify.d.ts +1 -1
  96. package/dist/types/compute-engine/boxed-expression/solve-linear-system.d.ts +1 -1
  97. package/dist/types/compute-engine/boxed-expression/solve.d.ts +1 -1
  98. package/dist/types/compute-engine/boxed-expression/stochastic-equal.d.ts +1 -1
  99. package/dist/types/compute-engine/boxed-expression/trigonometry.d.ts +1 -1
  100. package/dist/types/compute-engine/boxed-expression/type-guards.d.ts +1 -1
  101. package/dist/types/compute-engine/boxed-expression/utils.d.ts +1 -1
  102. package/dist/types/compute-engine/boxed-expression/validate.d.ts +1 -1
  103. package/dist/types/compute-engine/collection-utils.d.ts +1 -1
  104. package/dist/types/compute-engine/compilation/base-compiler.d.ts +1 -1
  105. package/dist/types/compute-engine/compilation/compile-expression.d.ts +2 -3
  106. package/dist/types/compute-engine/compilation/constant-folding.d.ts +1 -1
  107. package/dist/types/compute-engine/compilation/glsl-target.d.ts +1 -1
  108. package/dist/types/compute-engine/compilation/gpu-target.d.ts +1 -54
  109. package/dist/types/compute-engine/compilation/interval-javascript-target.d.ts +1 -1
  110. package/dist/types/compute-engine/compilation/javascript-target.d.ts +1 -1
  111. package/dist/types/compute-engine/compilation/python-target.d.ts +1 -1
  112. package/dist/types/compute-engine/compilation/types.d.ts +1 -67
  113. package/dist/types/compute-engine/compilation/wgsl-target.d.ts +1 -1
  114. package/dist/types/compute-engine/cost-function.d.ts +1 -1
  115. package/dist/types/compute-engine/engine-assumptions.d.ts +1 -1
  116. package/dist/types/compute-engine/engine-cache.d.ts +1 -1
  117. package/dist/types/compute-engine/engine-common-symbols.d.ts +1 -1
  118. package/dist/types/compute-engine/engine-compilation-targets.d.ts +1 -1
  119. package/dist/types/compute-engine/engine-configuration-lifecycle.d.ts +1 -1
  120. package/dist/types/compute-engine/engine-declarations.d.ts +1 -1
  121. package/dist/types/compute-engine/engine-expression-entrypoints.d.ts +1 -1
  122. package/dist/types/compute-engine/engine-extension-contracts.d.ts +1 -1
  123. package/dist/types/compute-engine/engine-library-bootstrap.d.ts +1 -1
  124. package/dist/types/compute-engine/engine-numeric-configuration.d.ts +1 -1
  125. package/dist/types/compute-engine/engine-runtime-state.d.ts +1 -1
  126. package/dist/types/compute-engine/engine-scope.d.ts +1 -1
  127. package/dist/types/compute-engine/engine-sequences.d.ts +1 -1
  128. package/dist/types/compute-engine/engine-simplification-rules.d.ts +1 -1
  129. package/dist/types/compute-engine/engine-startup-coordinator.d.ts +1 -1
  130. package/dist/types/compute-engine/engine-type-resolver.d.ts +1 -1
  131. package/dist/types/compute-engine/engine-validation-entrypoints.d.ts +1 -1
  132. package/dist/types/compute-engine/free-functions.d.ts +1 -1
  133. package/dist/types/compute-engine/function-utils.d.ts +1 -1
  134. package/dist/types/compute-engine/global-types.d.ts +1 -1
  135. package/dist/types/compute-engine/index.d.ts +2 -2
  136. package/dist/types/compute-engine/interval/arithmetic.d.ts +1 -1
  137. package/dist/types/compute-engine/interval/comparison.d.ts +1 -1
  138. package/dist/types/compute-engine/interval/elementary.d.ts +1 -1
  139. package/dist/types/compute-engine/interval/index.d.ts +1 -1
  140. package/dist/types/compute-engine/interval/trigonometric.d.ts +1 -1
  141. package/dist/types/compute-engine/interval/types.d.ts +1 -1
  142. package/dist/types/compute-engine/interval/util.d.ts +1 -1
  143. package/dist/types/compute-engine/latex-syntax/dictionary/default-dictionary.d.ts +1 -1
  144. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-algebra.d.ts +1 -1
  145. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-arithmetic.d.ts +1 -1
  146. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-calculus.d.ts +1 -1
  147. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-complex.d.ts +1 -1
  148. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-core.d.ts +1 -1
  149. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-linear-algebra.d.ts +1 -1
  150. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-logic.d.ts +1 -1
  151. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-other.d.ts +1 -1
  152. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-relational-operators.d.ts +1 -1
  153. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-sets.d.ts +1 -1
  154. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-statistics.d.ts +1 -1
  155. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-symbols.d.ts +1 -1
  156. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-trigonometry.d.ts +1 -1
  157. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-units.d.ts +1 -1
  158. package/dist/types/compute-engine/latex-syntax/dictionary/definitions.d.ts +1 -1
  159. package/dist/types/compute-engine/latex-syntax/dictionary/indexed-types.d.ts +1 -1
  160. package/dist/types/compute-engine/latex-syntax/latex-syntax.d.ts +1 -1
  161. package/dist/types/compute-engine/latex-syntax/parse-number.d.ts +1 -1
  162. package/dist/types/compute-engine/latex-syntax/parse-symbol.d.ts +1 -1
  163. package/dist/types/compute-engine/latex-syntax/parse.d.ts +1 -1
  164. package/dist/types/compute-engine/latex-syntax/serialize-dms.d.ts +1 -1
  165. package/dist/types/compute-engine/latex-syntax/serialize-number.d.ts +1 -1
  166. package/dist/types/compute-engine/latex-syntax/serializer-style.d.ts +1 -1
  167. package/dist/types/compute-engine/latex-syntax/serializer.d.ts +4 -2
  168. package/dist/types/compute-engine/latex-syntax/tokenizer.d.ts +1 -1
  169. package/dist/types/compute-engine/latex-syntax/types.d.ts +1 -1
  170. package/dist/types/compute-engine/latex-syntax/utils.d.ts +1 -1
  171. package/dist/types/compute-engine/library/arithmetic.d.ts +1 -1
  172. package/dist/types/compute-engine/library/calculus.d.ts +1 -1
  173. package/dist/types/compute-engine/library/collections.d.ts +1 -1
  174. package/dist/types/compute-engine/library/colors.d.ts +1 -1
  175. package/dist/types/compute-engine/library/combinatorics.d.ts +1 -1
  176. package/dist/types/compute-engine/library/complex.d.ts +1 -1
  177. package/dist/types/compute-engine/library/control-structures.d.ts +1 -1
  178. package/dist/types/compute-engine/library/core.d.ts +1 -1
  179. package/dist/types/compute-engine/library/fractals.d.ts +1 -1
  180. package/dist/types/compute-engine/library/library.d.ts +1 -1
  181. package/dist/types/compute-engine/library/linear-algebra.d.ts +1 -1
  182. package/dist/types/compute-engine/library/logic-analysis.d.ts +1 -1
  183. package/dist/types/compute-engine/library/logic.d.ts +1 -1
  184. package/dist/types/compute-engine/library/number-theory.d.ts +1 -1
  185. package/dist/types/compute-engine/library/polynomials.d.ts +1 -1
  186. package/dist/types/compute-engine/library/quantity-arithmetic.d.ts +1 -1
  187. package/dist/types/compute-engine/library/random-expression.d.ts +1 -1
  188. package/dist/types/compute-engine/library/relational-operator.d.ts +1 -1
  189. package/dist/types/compute-engine/library/sets.d.ts +1 -1
  190. package/dist/types/compute-engine/library/statistics.d.ts +1 -1
  191. package/dist/types/compute-engine/library/trigonometry.d.ts +1 -1
  192. package/dist/types/compute-engine/library/type-handlers.d.ts +1 -1
  193. package/dist/types/compute-engine/library/unit-data.d.ts +1 -1
  194. package/dist/types/compute-engine/library/units.d.ts +1 -1
  195. package/dist/types/compute-engine/library/utils.d.ts +1 -1
  196. package/dist/types/compute-engine/numeric-value/big-numeric-value.d.ts +1 -1
  197. package/dist/types/compute-engine/numeric-value/exact-numeric-value.d.ts +1 -1
  198. package/dist/types/compute-engine/numeric-value/machine-numeric-value.d.ts +1 -1
  199. package/dist/types/compute-engine/numeric-value/types.d.ts +1 -1
  200. package/dist/types/compute-engine/numerics/bigint.d.ts +1 -1
  201. package/dist/types/compute-engine/numerics/expression.d.ts +1 -1
  202. package/dist/types/compute-engine/numerics/interval.d.ts +1 -1
  203. package/dist/types/compute-engine/numerics/linear-algebra.d.ts +1 -1
  204. package/dist/types/compute-engine/numerics/monte-carlo.d.ts +1 -1
  205. package/dist/types/compute-engine/numerics/numeric-bigint.d.ts +1 -1
  206. package/dist/types/compute-engine/numerics/numeric-bignum.d.ts +1 -1
  207. package/dist/types/compute-engine/numerics/numeric-complex.d.ts +1 -1
  208. package/dist/types/compute-engine/numerics/numeric.d.ts +1 -1
  209. package/dist/types/compute-engine/numerics/primes.d.ts +1 -1
  210. package/dist/types/compute-engine/numerics/rationals.d.ts +1 -1
  211. package/dist/types/compute-engine/numerics/richardson.d.ts +1 -1
  212. package/dist/types/compute-engine/numerics/special-functions.d.ts +1 -1
  213. package/dist/types/compute-engine/numerics/statistics.d.ts +1 -1
  214. package/dist/types/compute-engine/numerics/strings.d.ts +1 -1
  215. package/dist/types/compute-engine/numerics/types.d.ts +1 -1
  216. package/dist/types/compute-engine/numerics/unit-data.d.ts +1 -1
  217. package/dist/types/compute-engine/oeis.d.ts +1 -1
  218. package/dist/types/compute-engine/sequence.d.ts +1 -1
  219. package/dist/types/compute-engine/symbolic/antiderivative.d.ts +1 -1
  220. package/dist/types/compute-engine/symbolic/derivative.d.ts +1 -1
  221. package/dist/types/compute-engine/symbolic/distribute.d.ts +1 -1
  222. package/dist/types/compute-engine/symbolic/fu-cost.d.ts +1 -1
  223. package/dist/types/compute-engine/symbolic/fu-transforms.d.ts +1 -1
  224. package/dist/types/compute-engine/symbolic/fu.d.ts +1 -1
  225. package/dist/types/compute-engine/symbolic/logic-utils.d.ts +1 -1
  226. package/dist/types/compute-engine/symbolic/simplify-abs.d.ts +1 -1
  227. package/dist/types/compute-engine/symbolic/simplify-divide.d.ts +1 -1
  228. package/dist/types/compute-engine/symbolic/simplify-factorial.d.ts +1 -1
  229. package/dist/types/compute-engine/symbolic/simplify-hyperbolic.d.ts +1 -1
  230. package/dist/types/compute-engine/symbolic/simplify-infinity.d.ts +1 -1
  231. package/dist/types/compute-engine/symbolic/simplify-log.d.ts +1 -1
  232. package/dist/types/compute-engine/symbolic/simplify-logic.d.ts +1 -1
  233. package/dist/types/compute-engine/symbolic/simplify-power.d.ts +1 -1
  234. package/dist/types/compute-engine/symbolic/simplify-product.d.ts +1 -1
  235. package/dist/types/compute-engine/symbolic/simplify-rules.d.ts +1 -1
  236. package/dist/types/compute-engine/symbolic/simplify-sum.d.ts +1 -1
  237. package/dist/types/compute-engine/symbolic/simplify-trig.d.ts +1 -1
  238. package/dist/types/compute-engine/tensor/tensor-fields.d.ts +1 -1
  239. package/dist/types/compute-engine/tensor/tensors.d.ts +1 -1
  240. package/dist/types/compute-engine/types-definitions.d.ts +1 -1
  241. package/dist/types/compute-engine/types-engine.d.ts +1 -1
  242. package/dist/types/compute-engine/types-evaluation.d.ts +1 -1
  243. package/dist/types/compute-engine/types-expression.d.ts +1 -1
  244. package/dist/types/compute-engine/types-kernel-evaluation.d.ts +1 -1
  245. package/dist/types/compute-engine/types-kernel-serialization.d.ts +1 -1
  246. package/dist/types/compute-engine/types-serialization.d.ts +1 -1
  247. package/dist/types/compute-engine/types.d.ts +1 -1
  248. package/dist/types/compute-engine.d.ts +2 -2
  249. package/dist/types/core.d.ts +1 -1
  250. package/dist/types/interval.d.ts +1 -1
  251. package/dist/types/latex-syntax.d.ts +2 -2
  252. package/dist/types/math-json/symbols.d.ts +1 -1
  253. package/dist/types/math-json/types.d.ts +1 -1
  254. package/dist/types/math-json/utils.d.ts +1 -1
  255. package/dist/types/math-json.d.ts +2 -2
  256. package/dist/types/numerics.d.ts +1 -1
  257. package/package.json +1 -1
  258. package/dist/types/compute-engine/compilation/fractal-orbit.d.ts +0 -19
@@ -1,4 +1,4 @@
1
- /** Compute Engine 0.55.5 */
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
- // @todo: serialize for the multiple argument case
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.parseArguments("implicit");
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[0], operand(base, 1)],
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: () => "Nothing"
16152
- // @todo: parse as ['Annotated'...]
16200
+ parse: parseMathStyleSwitch("normal")
16153
16201
  },
16154
16202
  {
16155
16203
  latexTrigger: ["\\textstyle"],
16156
- parse: () => "Nothing"
16157
- // @todo: parse as ['Annotated'...]
16204
+ parse: parseMathStyleSwitch("compact")
16158
16205
  },
16159
16206
  {
16160
16207
  latexTrigger: ["\\scriptstyle"],
16161
- parse: () => "Nothing"
16162
- // @todo: parse as ['Annotated'...]
16208
+ parse: parseMathStyleSwitch("script")
16163
16209
  },
16164
16210
  {
16165
16211
  latexTrigger: ["\\scriptscriptstyle"],
16166
- parse: () => "Nothing"
16167
- // @todo: parse as ['Annotated'...]
16212
+ parse: parseMathStyleSwitch("scriptscript")
16168
16213
  },
16169
16214
  {
16170
16215
  latexTrigger: ["\\color"],
16171
16216
  parse: (parser) => {
16172
- parser.parseGroup();
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: () => "Nothing"
16179
- // @todo: parse as ['Annotated'...]
16228
+ parse: parseSizeSwitch(1)
16180
16229
  },
16181
16230
  {
16182
16231
  latexTrigger: ["\\scriptsize"],
16183
- parse: () => "Nothing"
16184
- // @todo: parse as ['Annotated'...]
16232
+ parse: parseSizeSwitch(2)
16185
16233
  },
16186
16234
  {
16187
16235
  latexTrigger: ["\\footnotesize"],
16188
- parse: () => "Nothing"
16189
- // @todo: parse as ['Annotated'...]
16236
+ parse: parseSizeSwitch(3)
16190
16237
  },
16191
16238
  {
16192
16239
  latexTrigger: ["\\small"],
16193
- parse: () => "Nothing"
16194
- // @todo: parse as ['Annotated'...]
16240
+ parse: parseSizeSwitch(4)
16195
16241
  },
16196
16242
  {
16197
16243
  latexTrigger: ["\\normalsize"],
16198
- parse: () => "Nothing"
16199
- // @todo: parse as ['Annotated'...]
16244
+ parse: parseSizeSwitch(5)
16200
16245
  },
16201
16246
  {
16202
16247
  latexTrigger: ["\\large"],
16203
- parse: () => "Nothing"
16204
- // @todo: parse as ['Annotated'...]
16248
+ parse: parseSizeSwitch(6)
16205
16249
  },
16206
16250
  {
16207
16251
  latexTrigger: ["\\Large"],
16208
- parse: () => "Nothing"
16209
- // @todo: parse as ['Annotated'...]
16252
+ parse: parseSizeSwitch(7)
16210
16253
  },
16211
16254
  {
16212
16255
  latexTrigger: ["\\LARGE"],
16213
- parse: () => "Nothing"
16214
- // @todo: parse as ['Annotated'...]
16256
+ parse: parseSizeSwitch(8)
16215
16257
  },
16216
16258
  {
16217
16259
  latexTrigger: ["\\huge"],
16218
- parse: () => "Nothing"
16219
- // @todo: parse as ['Annotated'...]
16260
+ parse: parseSizeSwitch(9)
16220
16261
  },
16221
16262
  {
16222
16263
  latexTrigger: ["\\Huge"],
16223
- parse: () => "Nothing"
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
- return serializer.serialize(operand(expr2, 1));
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) => joinLatex([
16770
- `\\begin{${envName}}`,
16771
- serializer.serialize(operand(expr2, 1)),
16772
- `\\end{${envName}}`
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) => joinLatex([
16779
- openDelim,
16780
- serializer.serialize(operand(expr2, 1)),
16781
- closeDelim
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
- result += token;
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 Serializer4 = class {
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
- * @todo: don't wrap Abs, Floor, Ceil, Delimiter
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 Serializer4(dict, options);
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
- // ['Condition', value, "positive"]
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: "(value, symbol) -> boolean",
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
- if (code.includes("_fractal_mandelbrot_pt") || code.includes("_fractal_julia_pt")) {
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.5";
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.5"
68606
+ version: "0.55.6"
69031
68607
  };
69032
68608
  return __toCommonJS(compute_engine_exports);
69033
68609
  })();