@cortex-js/compute-engine 0.55.5 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/dist/compile.esm.js +912 -770
  2. package/dist/compile.min.esm.js +300 -523
  3. package/dist/compile.min.umd.cjs +301 -524
  4. package/dist/compile.umd.cjs +912 -770
  5. package/dist/compute-engine.esm.js +1517 -902
  6. package/dist/compute-engine.min.esm.js +300 -522
  7. package/dist/compute-engine.min.umd.cjs +300 -522
  8. package/dist/compute-engine.umd.cjs +1517 -902
  9. package/dist/core.esm.js +1516 -901
  10. package/dist/core.min.esm.js +299 -521
  11. package/dist/core.min.umd.cjs +299 -521
  12. package/dist/core.umd.cjs +1516 -901
  13. package/dist/interval.esm.js +268 -63
  14. package/dist/interval.min.esm.js +7 -7
  15. package/dist/interval.min.umd.cjs +7 -7
  16. package/dist/interval.umd.cjs +268 -63
  17. package/dist/latex-syntax.esm.js +371 -77
  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 +371 -77
  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 +4 -2
  26. package/dist/numerics.min.esm.js +3 -3
  27. package/dist/numerics.min.umd.cjs +3 -3
  28. package/dist/numerics.umd.cjs +4 -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 +2 -2
  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 +15 -58
  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 +25 -3
  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 +23 -3
  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 +4 -3
  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-colors.d.ts +10 -0
  148. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-complex.d.ts +1 -1
  149. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-core.d.ts +1 -1
  150. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-linear-algebra.d.ts +1 -1
  151. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-logic.d.ts +1 -1
  152. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-other.d.ts +1 -1
  153. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-relational-operators.d.ts +1 -1
  154. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-sets.d.ts +1 -1
  155. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-statistics.d.ts +1 -1
  156. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-symbols.d.ts +1 -1
  157. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-trigonometry.d.ts +1 -1
  158. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-units.d.ts +1 -1
  159. package/dist/types/compute-engine/latex-syntax/dictionary/definitions.d.ts +1 -1
  160. package/dist/types/compute-engine/latex-syntax/dictionary/indexed-types.d.ts +9 -1
  161. package/dist/types/compute-engine/latex-syntax/latex-syntax.d.ts +1 -1
  162. package/dist/types/compute-engine/latex-syntax/parse-number.d.ts +1 -1
  163. package/dist/types/compute-engine/latex-syntax/parse-symbol.d.ts +1 -1
  164. package/dist/types/compute-engine/latex-syntax/parse.d.ts +1 -1
  165. package/dist/types/compute-engine/latex-syntax/serialize-dms.d.ts +1 -1
  166. package/dist/types/compute-engine/latex-syntax/serialize-number.d.ts +1 -1
  167. package/dist/types/compute-engine/latex-syntax/serializer-style.d.ts +1 -1
  168. package/dist/types/compute-engine/latex-syntax/serializer.d.ts +4 -2
  169. package/dist/types/compute-engine/latex-syntax/tokenizer.d.ts +1 -1
  170. package/dist/types/compute-engine/latex-syntax/types.d.ts +1 -1
  171. package/dist/types/compute-engine/latex-syntax/utils.d.ts +1 -1
  172. package/dist/types/compute-engine/library/arithmetic.d.ts +1 -1
  173. package/dist/types/compute-engine/library/calculus.d.ts +1 -1
  174. package/dist/types/compute-engine/library/collections.d.ts +1 -1
  175. package/dist/types/compute-engine/library/colors.d.ts +1 -1
  176. package/dist/types/compute-engine/library/combinatorics.d.ts +1 -1
  177. package/dist/types/compute-engine/library/complex.d.ts +1 -1
  178. package/dist/types/compute-engine/library/control-structures.d.ts +1 -1
  179. package/dist/types/compute-engine/library/core.d.ts +1 -1
  180. package/dist/types/compute-engine/library/fractals.d.ts +1 -1
  181. package/dist/types/compute-engine/library/library.d.ts +1 -1
  182. package/dist/types/compute-engine/library/linear-algebra.d.ts +1 -1
  183. package/dist/types/compute-engine/library/logic-analysis.d.ts +1 -1
  184. package/dist/types/compute-engine/library/logic.d.ts +1 -1
  185. package/dist/types/compute-engine/library/number-theory.d.ts +1 -1
  186. package/dist/types/compute-engine/library/polynomials.d.ts +1 -1
  187. package/dist/types/compute-engine/library/quantity-arithmetic.d.ts +1 -1
  188. package/dist/types/compute-engine/library/random-expression.d.ts +1 -1
  189. package/dist/types/compute-engine/library/relational-operator.d.ts +1 -1
  190. package/dist/types/compute-engine/library/sets.d.ts +1 -1
  191. package/dist/types/compute-engine/library/statistics.d.ts +1 -1
  192. package/dist/types/compute-engine/library/trigonometry.d.ts +1 -1
  193. package/dist/types/compute-engine/library/type-handlers.d.ts +1 -1
  194. package/dist/types/compute-engine/library/unit-data.d.ts +1 -1
  195. package/dist/types/compute-engine/library/units.d.ts +1 -1
  196. package/dist/types/compute-engine/library/utils.d.ts +1 -1
  197. package/dist/types/compute-engine/numeric-value/big-numeric-value.d.ts +1 -1
  198. package/dist/types/compute-engine/numeric-value/exact-numeric-value.d.ts +1 -1
  199. package/dist/types/compute-engine/numeric-value/machine-numeric-value.d.ts +1 -1
  200. package/dist/types/compute-engine/numeric-value/types.d.ts +1 -1
  201. package/dist/types/compute-engine/numerics/bigint.d.ts +1 -1
  202. package/dist/types/compute-engine/numerics/expression.d.ts +1 -1
  203. package/dist/types/compute-engine/numerics/interval.d.ts +1 -1
  204. package/dist/types/compute-engine/numerics/linear-algebra.d.ts +1 -1
  205. package/dist/types/compute-engine/numerics/monte-carlo.d.ts +1 -1
  206. package/dist/types/compute-engine/numerics/numeric-bigint.d.ts +1 -1
  207. package/dist/types/compute-engine/numerics/numeric-bignum.d.ts +1 -1
  208. package/dist/types/compute-engine/numerics/numeric-complex.d.ts +1 -1
  209. package/dist/types/compute-engine/numerics/numeric.d.ts +1 -1
  210. package/dist/types/compute-engine/numerics/primes.d.ts +1 -1
  211. package/dist/types/compute-engine/numerics/rationals.d.ts +1 -1
  212. package/dist/types/compute-engine/numerics/richardson.d.ts +1 -1
  213. package/dist/types/compute-engine/numerics/special-functions.d.ts +1 -1
  214. package/dist/types/compute-engine/numerics/statistics.d.ts +1 -1
  215. package/dist/types/compute-engine/numerics/strings.d.ts +1 -1
  216. package/dist/types/compute-engine/numerics/types.d.ts +1 -1
  217. package/dist/types/compute-engine/numerics/unit-data.d.ts +1 -1
  218. package/dist/types/compute-engine/oeis.d.ts +1 -1
  219. package/dist/types/compute-engine/sequence.d.ts +1 -1
  220. package/dist/types/compute-engine/symbolic/antiderivative.d.ts +1 -1
  221. package/dist/types/compute-engine/symbolic/derivative.d.ts +1 -1
  222. package/dist/types/compute-engine/symbolic/distribute.d.ts +1 -1
  223. package/dist/types/compute-engine/symbolic/fu-cost.d.ts +1 -1
  224. package/dist/types/compute-engine/symbolic/fu-transforms.d.ts +1 -1
  225. package/dist/types/compute-engine/symbolic/fu.d.ts +1 -1
  226. package/dist/types/compute-engine/symbolic/logic-utils.d.ts +1 -1
  227. package/dist/types/compute-engine/symbolic/simplify-abs.d.ts +1 -1
  228. package/dist/types/compute-engine/symbolic/simplify-divide.d.ts +1 -1
  229. package/dist/types/compute-engine/symbolic/simplify-factorial.d.ts +1 -1
  230. package/dist/types/compute-engine/symbolic/simplify-hyperbolic.d.ts +1 -1
  231. package/dist/types/compute-engine/symbolic/simplify-infinity.d.ts +1 -1
  232. package/dist/types/compute-engine/symbolic/simplify-log.d.ts +1 -1
  233. package/dist/types/compute-engine/symbolic/simplify-logic.d.ts +1 -1
  234. package/dist/types/compute-engine/symbolic/simplify-power.d.ts +1 -1
  235. package/dist/types/compute-engine/symbolic/simplify-product.d.ts +1 -1
  236. package/dist/types/compute-engine/symbolic/simplify-rules.d.ts +1 -1
  237. package/dist/types/compute-engine/symbolic/simplify-sum.d.ts +1 -1
  238. package/dist/types/compute-engine/symbolic/simplify-trig.d.ts +1 -1
  239. package/dist/types/compute-engine/tensor/tensor-fields.d.ts +1 -1
  240. package/dist/types/compute-engine/tensor/tensors.d.ts +1 -1
  241. package/dist/types/compute-engine/types-definitions.d.ts +1 -1
  242. package/dist/types/compute-engine/types-engine.d.ts +6 -2
  243. package/dist/types/compute-engine/types-evaluation.d.ts +1 -1
  244. package/dist/types/compute-engine/types-expression.d.ts +1 -1
  245. package/dist/types/compute-engine/types-kernel-evaluation.d.ts +1 -1
  246. package/dist/types/compute-engine/types-kernel-serialization.d.ts +1 -1
  247. package/dist/types/compute-engine/types-serialization.d.ts +1 -1
  248. package/dist/types/compute-engine/types.d.ts +1 -1
  249. package/dist/types/compute-engine.d.ts +2 -3
  250. package/dist/types/core.d.ts +1 -1
  251. package/dist/types/interval.d.ts +1 -1
  252. package/dist/types/latex-syntax.d.ts +2 -2
  253. package/dist/types/math-json/symbols.d.ts +1 -1
  254. package/dist/types/math-json/types.d.ts +1 -1
  255. package/dist/types/math-json/utils.d.ts +1 -1
  256. package/dist/types/math-json.d.ts +2 -2
  257. package/dist/types/numerics.d.ts +1 -1
  258. package/package.json +2 -2
  259. package/dist/types/compute-engine/compilation/fractal-orbit.d.ts +0 -19
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { CompiledFunctions } from './types';
3
3
  import { GPUShaderTarget } from './gpu-target';
4
4
  /**
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { CompileTarget, CompiledOperators, CompiledFunctions, LanguageTarget, CompilationOptions, CompilationResult } from './types';
3
3
  /**
4
4
  * GPU shader operators shared by GLSL and WGSL.
@@ -108,45 +108,6 @@ export declare const GPU_BESSELJ_PREAMBLE_GLSL = "\nfloat _gpu_factorial(int n)
108
108
  * GPU Bessel J function preamble (WGSL syntax).
109
109
  */
110
110
  export declare const GPU_BESSELJ_PREAMBLE_WGSL = "\nfn _gpu_factorial(n: i32) -> f32 {\n var f: f32 = 1.0;\n for (var i: i32 = 2; i <= n; i++) { f *= f32(i); }\n return f;\n}\n\nfn _gpu_besselJ_series(n_in: i32, x: f32) -> f32 {\n let halfX = x / 2.0;\n let negQ = -(x * x) / 4.0;\n var term: f32 = 1.0;\n for (var i: i32 = 1; i <= n_in; i++) { term /= f32(i); }\n var s = term;\n for (var k: i32 = 1; k <= 60; k++) {\n term *= negQ / (f32(k) * f32(n_in + k));\n s += term;\n if (abs(term) < abs(s) * 1e-7) { break; }\n }\n return s * pow(halfX, f32(n_in));\n}\n\nfn _gpu_besselJ_asymptotic(n_in: i32, x: f32) -> f32 {\n let mu = 4.0 * f32(n_in) * f32(n_in);\n var P: f32 = 1.0;\n var Q: f32 = 0.0;\n var ak: f32 = 1.0;\n let e8x = 8.0 * x;\n for (var k: i32 = 1; k <= 12; k++) {\n let twokm1 = f32(2 * k - 1);\n ak *= mu - twokm1 * twokm1;\n let denom = _gpu_factorial(k) * pow(e8x, f32(k));\n let contrib = ak / denom;\n if (k == 1 || k == 3 || k == 5 || k == 7 || k == 9 || k == 11) {\n if (((k - 1) / 2) % 2 == 0) { Q += contrib; }\n else { Q -= contrib; }\n } else {\n if ((k / 2) % 2 == 1) { P -= contrib; }\n else { P += contrib; }\n }\n if (abs(contrib) < 1e-7) { break; }\n }\n let chi = x - (f32(n_in) / 2.0 + 0.25) * 3.14159265358979;\n return sqrt(2.0 / (3.14159265358979 * x)) * (P * cos(chi) - Q * sin(chi));\n}\n\nfn _gpu_besselJ(n_in: i32, x_in: f32) -> f32 {\n var n = n_in;\n var x = x_in;\n if (x == 0.0) { return select(0.0, 1.0, n == 0); }\n var sgn: f32 = 1.0;\n if (n < 0) {\n n = -n;\n if (n % 2 != 0) { sgn = -1.0; }\n }\n if (x < 0.0) {\n x = -x;\n if (n % 2 != 0) { sgn *= -1.0; }\n }\n if (x > 25.0 + f32(n * n) / 2.0) { return sgn * _gpu_besselJ_asymptotic(n, x); }\n if (x < 5.0 + f32(n)) { return sgn * _gpu_besselJ_series(n, x); }\n // Miller's backward recurrence\n var M = max(n + 20, i32(ceil(x)) + 30);\n if (M > 200) { return sgn * _gpu_besselJ_series(n, x); }\n var vals: array<f32, 201>;\n var jp1: f32 = 0.0;\n var jk: f32 = 1.0;\n vals[M] = jk;\n for (var k: i32 = M; k >= 1; k--) {\n let jm1 = (2.0 * f32(k) / x) * jk - jp1;\n jp1 = jk;\n jk = jm1;\n vals[k - 1] = jk;\n }\n var norm = vals[0];\n for (var k2: i32 = 2; k2 <= M; k2 += 2) { norm += 2.0 * vals[k2]; }\n return sgn * vals[n] / norm;\n}\n";
111
- /**
112
- * Double-single (DS) emulated double-precision arithmetic preamble (GLSL).
113
- *
114
- * A "double-single" number is stored as vec2(hi, lo) where value = hi + lo,
115
- * giving ~48 bits of mantissa from two 32-bit floats.
116
- * Algorithms: Dekker (1971) / Knuth (1997).
117
- */
118
- export declare const GPU_DS_ARITHMETIC_PREAMBLE_GLSL = "\n// Split a float into high and low parts for exact multiplication\nvec2 ds_split(float a) {\n const float SPLIT = 4097.0; // 2^12 + 1\n float t = SPLIT * a;\n float hi = t - (t - a);\n float lo = a - hi;\n return vec2(hi, lo);\n}\n\n// Create a double-single from a single float\nvec2 ds_from(float a) {\n return vec2(a, 0.0);\n}\n\n// Error-free addition (Knuth TwoSum)\nvec2 ds_add(vec2 a, vec2 b) {\n float s = a.x + b.x;\n float v = s - a.x;\n float e = (a.x - (s - v)) + (b.x - v);\n float lo = (a.y + b.y) + e;\n float hi = s + lo;\n lo = lo - (hi - s);\n return vec2(hi, lo);\n}\n\n// Double-single subtraction\nvec2 ds_sub(vec2 a, vec2 b) {\n return ds_add(a, vec2(-b.x, -b.y));\n}\n\n// Error-free multiplication (Dekker TwoProduct)\nvec2 ds_mul(vec2 a, vec2 b) {\n float p = a.x * b.x;\n vec2 sa = ds_split(a.x);\n vec2 sb = ds_split(b.x);\n float err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;\n err += a.x * b.y + a.y * b.x;\n float hi = p + err;\n float lo = err - (hi - p);\n return vec2(hi, lo);\n}\n\n// Optimized self-multiply\nvec2 ds_sqr(vec2 a) {\n float p = a.x * a.x;\n vec2 sa = ds_split(a.x);\n float err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;\n err += 2.0 * a.x * a.y;\n float hi = p + err;\n float lo = err - (hi - p);\n return vec2(hi, lo);\n}\n\n// Compare magnitude: returns -1, 0, or 1\nfloat ds_cmp(vec2 a, vec2 b) {\n float d = a.x - b.x;\n if (d != 0.0) return sign(d);\n return sign(a.y - b.y);\n}\n";
119
- /**
120
- * Double-single (DS) emulated double-precision arithmetic preamble (WGSL).
121
- *
122
- * A "double-single" number is stored as vec2f(hi, lo) where value = hi + lo,
123
- * giving ~48 bits of mantissa from two 32-bit floats.
124
- * Algorithms: Dekker (1971) / Knuth (1997).
125
- */
126
- export declare const GPU_DS_ARITHMETIC_PREAMBLE_WGSL = "\nfn ds_split(a: f32) -> vec2f {\n const SPLIT: f32 = 4097.0;\n let t = SPLIT * a;\n let hi = t - (t - a);\n let lo = a - hi;\n return vec2f(hi, lo);\n}\n\nfn ds_from(a: f32) -> vec2f {\n return vec2f(a, 0.0);\n}\n\nfn ds_add(a: vec2f, b: vec2f) -> vec2f {\n let s = a.x + b.x;\n let v = s - a.x;\n let e = (a.x - (s - v)) + (b.x - v);\n let lo_t = (a.y + b.y) + e;\n let hi = s + lo_t;\n let lo = lo_t - (hi - s);\n return vec2f(hi, lo);\n}\n\nfn ds_sub(a: vec2f, b: vec2f) -> vec2f {\n return ds_add(a, vec2f(-b.x, -b.y));\n}\n\nfn ds_mul(a: vec2f, b: vec2f) -> vec2f {\n let p = a.x * b.x;\n let sa = ds_split(a.x);\n let sb = ds_split(b.x);\n var err = ((sa.x * sb.x - p) + sa.x * sb.y + sa.y * sb.x) + sa.y * sb.y;\n err += a.x * b.y + a.y * b.x;\n let hi = p + err;\n let lo = err - (hi - p);\n return vec2f(hi, lo);\n}\n\nfn ds_sqr(a: vec2f) -> vec2f {\n let p = a.x * a.x;\n let sa = ds_split(a.x);\n var err = ((sa.x * sa.x - p) + 2.0 * sa.x * sa.y) + sa.y * sa.y;\n err += 2.0 * a.x * a.y;\n let hi = p + err;\n let lo = err - (hi - p);\n return vec2f(hi, lo);\n}\n\nfn ds_cmp(a: vec2f, b: vec2f) -> f32 {\n let d = a.x - b.x;\n if (d != 0.0) { return sign(d); }\n return sign(a.y - b.y);\n}\n";
127
- /**
128
- * Double-precision fractal preamble (GLSL syntax).
129
- *
130
- * Emulated double-precision (double-single) Mandelbrot and Julia iterations.
131
- * Complex numbers are packed as vec4(re_hi, im_hi, re_lo, im_lo).
132
- * Requires GPU_DS_ARITHMETIC_PREAMBLE_GLSL to be included first.
133
- *
134
- * Coordinate computation:
135
- * The shader template provides single-precision x,y via mix(), which lose
136
- * distinguishability at deep zoom. Instead, _dp_coord() computes coordinates
137
- * from the viewport UV (v_uv) and center/size uniforms. The per-pixel delta
138
- * from center is small enough for float to distinguish adjacent pixels, and
139
- * ds_add combines it with the center for ~48-bit total precision.
140
- */
141
- export declare const GPU_FRACTAL_DP_PREAMBLE_GLSL = "\nuniform float _dp_cx_hi;\nuniform float _dp_cx_lo;\nuniform float _dp_cy_hi;\nuniform float _dp_cy_lo;\nuniform float _dp_w;\nuniform float _dp_h;\n\nvec4 _dp_coord() {\n // Per-pixel offset from center \u2014 small, so float-precise\n float dx = (v_uv.x - 0.5) * _dp_w;\n float dy = (v_uv.y - 0.5) * _dp_h;\n // Combine center (hi+lo) + delta with emulated double precision\n vec2 cre = ds_add(vec2(_dp_cx_hi, _dp_cx_lo), ds_from(dx));\n vec2 cim = ds_add(vec2(_dp_cy_hi, _dp_cy_lo), ds_from(dy));\n return vec4(cre.x, cim.x, cre.y, cim.y);\n}\n\nfloat _fractal_mandelbrot_dp(vec4 c, int maxIter) {\n // c = (re_hi, im_hi, re_lo, im_lo)\n vec2 cr = vec2(c.x, c.z); // real part as ds\n vec2 ci = vec2(c.y, c.w); // imag part as ds\n vec2 zr = vec2(0.0, 0.0);\n vec2 zi = vec2(0.0, 0.0);\n for (int i = 0; i < maxIter; i++) {\n vec2 zr2 = ds_sqr(zr);\n vec2 zi2 = ds_sqr(zi);\n // |z|^2 > 4.0 ?\n vec2 mag2 = ds_add(zr2, zi2);\n if (mag2.x > 4.0)\n return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);\n // z = z^2 + c\n vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci); // 2*zr*zi + ci\n zr = ds_add(ds_sub(zr2, zi2), cr); // zr^2 - zi^2 + cr\n zi = new_zi;\n }\n return 1.0;\n}\n\nfloat _fractal_julia_dp(vec4 z_in, vec4 c, int maxIter) {\n vec2 zr = vec2(z_in.x, z_in.z);\n vec2 zi = vec2(z_in.y, z_in.w);\n vec2 cr = vec2(c.x, c.z);\n vec2 ci = vec2(c.y, c.w);\n for (int i = 0; i < maxIter; i++) {\n vec2 zr2 = ds_sqr(zr);\n vec2 zi2 = ds_sqr(zi);\n vec2 mag2 = ds_add(zr2, zi2);\n if (mag2.x > 4.0)\n return clamp((float(i) - log2(log2(mag2.x)) + 4.0) / float(maxIter), 0.0, 1.0);\n vec2 new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);\n zr = ds_add(ds_sub(zr2, zi2), cr);\n zi = new_zi;\n }\n return 1.0;\n}\n";
142
- /**
143
- * Double-precision fractal preamble (WGSL syntax).
144
- *
145
- * Emulated double-precision (double-single) Mandelbrot and Julia iterations.
146
- * Complex numbers are packed as vec4f(re_hi, im_hi, re_lo, im_lo).
147
- * Requires GPU_DS_ARITHMETIC_PREAMBLE_WGSL to be included first.
148
- */
149
- export declare const GPU_FRACTAL_DP_PREAMBLE_WGSL = "\n@group(0) @binding(10) var<uniform> _dp_cx_hi: f32;\n@group(0) @binding(11) var<uniform> _dp_cx_lo: f32;\n@group(0) @binding(12) var<uniform> _dp_cy_hi: f32;\n@group(0) @binding(13) var<uniform> _dp_cy_lo: f32;\n@group(0) @binding(14) var<uniform> _dp_w: f32;\n@group(0) @binding(15) var<uniform> _dp_h: f32;\n\nfn _dp_coord(uv: vec2f) -> vec4f {\n let dx = (uv.x - 0.5) * _dp_w;\n let dy = (uv.y - 0.5) * _dp_h;\n let cre = ds_add(vec2f(_dp_cx_hi, _dp_cx_lo), ds_from(dx));\n let cim = ds_add(vec2f(_dp_cy_hi, _dp_cy_lo), ds_from(dy));\n return vec4f(cre.x, cim.x, cre.y, cim.y);\n}\n\nfn _fractal_mandelbrot_dp(c: vec4f, maxIter: i32) -> f32 {\n let cr = vec2f(c.x, c.z);\n let ci = vec2f(c.y, c.w);\n var zr = vec2f(0.0, 0.0);\n var zi = vec2f(0.0, 0.0);\n for (var i: i32 = 0; i < maxIter; i++) {\n let zr2 = ds_sqr(zr);\n let zi2 = ds_sqr(zi);\n let mag2 = ds_add(zr2, zi2);\n if (mag2.x > 4.0) {\n return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);\n zr = ds_add(ds_sub(zr2, zi2), cr);\n zi = new_zi;\n }\n return 1.0;\n}\n\nfn _fractal_julia_dp(z_in: vec4f, c: vec4f, maxIter: i32) -> f32 {\n var zr = vec2f(z_in.x, z_in.z);\n var zi = vec2f(z_in.y, z_in.w);\n let cr = vec2f(c.x, c.z);\n let ci = vec2f(c.y, c.w);\n for (var i: i32 = 0; i < maxIter; i++) {\n let zr2 = ds_sqr(zr);\n let zi2 = ds_sqr(zi);\n let mag2 = ds_add(zr2, zi2);\n if (mag2.x > 4.0) {\n return clamp((f32(i) - log2(log2(mag2.x)) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n let new_zi = ds_add(ds_mul(ds_add(zr, zr), zi), ci);\n zr = ds_add(ds_sub(zr2, zi2), cr);\n zi = new_zi;\n }\n return 1.0;\n}\n";
150
111
  /**
151
112
  * Fractal preamble (GLSL syntax).
152
113
  *
@@ -159,33 +120,29 @@ export declare const GPU_FRACTAL_PREAMBLE_GLSL = "\nfloat _fractal_mandelbrot(ve
159
120
  * Fractal preamble (WGSL syntax).
160
121
  */
161
122
  export declare const GPU_FRACTAL_PREAMBLE_WGSL = "\nfn _fractal_mandelbrot(c: vec2f, maxIter: i32) -> f32 {\n var z = vec2f(0.0, 0.0);\n for (var i: i32 = 0; i < maxIter; i++) {\n z = vec2f(z.x*z.x - z.y*z.y + c.x, 2.0*z.x*z.y + c.y);\n if (dot(z, z) > 4.0) {\n return clamp((f32(i) - log2(log2(dot(z, z))) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n }\n return 1.0;\n}\n\nfn _fractal_julia(z_in: vec2f, c: vec2f, maxIter: i32) -> f32 {\n var z = z_in;\n for (var i: i32 = 0; i < maxIter; i++) {\n z = vec2f(z.x*z.x - z.y*z.y + c.x, 2.0*z.x*z.y + c.y);\n if (dot(z, z) > 4.0) {\n return clamp((f32(i) - log2(log2(dot(z, z))) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n }\n return 1.0;\n}\n";
162
- /**
163
- * Perturbation-theory fractal preamble (GLSL syntax).
164
- *
165
- * Provides `_fractal_mandelbrot_pt` and `_fractal_julia_pt` which iterate
166
- * a perturbation delta relative to a precomputed reference orbit stored in
167
- * a RG32F texture. Includes glitch detection with single-float fallback.
168
- */
169
- export declare const GPU_FRACTAL_PT_PREAMBLE_GLSL = "\nuniform sampler2D _refOrbit;\nuniform int _refOrbitLen;\nuniform int _refOrbitTexWidth;\nuniform float _pt_offset_x;\nuniform float _pt_offset_y;\nuniform float _pt_w;\nuniform float _pt_h;\n\nvec2 _pt_delta() {\n float dx = _pt_offset_x + (v_uv.x - 0.5) * _pt_w;\n float dy = _pt_offset_y + (v_uv.y - 0.5) * _pt_h;\n return vec2(dx, dy);\n}\n\nvec2 _pt_fetch_orbit(int i) {\n int y = i / _refOrbitTexWidth;\n int x = i - y * _refOrbitTexWidth;\n return texelFetch(_refOrbit, ivec2(x, y), 0).rg;\n}\n\nfloat _fractal_mandelbrot_pt(vec2 delta_c, int maxIter) {\n float dr = 0.0;\n float di = 0.0;\n int orbitLen = min(maxIter, _refOrbitLen);\n for (int i = 0; i < orbitLen; i++) {\n vec2 Zn = _pt_fetch_orbit(i);\n // delta_{n+1} = 2*Z_n*delta_n + delta_n^2 + delta_c\n float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;\n float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;\n dr = new_dr;\n di = new_di;\n // Full z = Z_{n+1} + delta for escape check\n vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);\n float zr = Zn1.x + dr;\n float zi = Zn1.y + di;\n float mag2 = zr * zr + zi * zi;\n if (mag2 > 4.0)\n return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);\n // Glitch detection: |delta|^2 > |Z|^2\n float dmag2 = dr * dr + di * di;\n float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;\n if (dmag2 > Zmag2 && Zmag2 > 0.0) {\n // Rebase to absolute coordinates and continue with single-float\n float abs_zr = Zn1.x + dr;\n float abs_zi = Zn1.y + di;\n // Reconstruct absolute c from reference + delta\n // (Use ds_from for the concept, but single-float suffices for fallback)\n float cx = abs_zr - dr + delta_c.x;\n float cy = abs_zi - di + delta_c.y;\n for (int j = i + 1; j < maxIter; j++) {\n float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;\n abs_zi = 2.0 * abs_zr * abs_zi + cy;\n abs_zr = new_zr;\n mag2 = abs_zr * abs_zr + abs_zi * abs_zi;\n if (mag2 > 4.0)\n return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);\n }\n return 1.0;\n }\n }\n return 1.0;\n}\n\nfloat _fractal_julia_pt(vec2 z_delta, vec2 delta_c, int maxIter) {\n float dr = z_delta.x;\n float di = z_delta.y;\n int orbitLen = min(maxIter, _refOrbitLen);\n for (int i = 0; i < orbitLen; i++) {\n vec2 Zn = _pt_fetch_orbit(i);\n float new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;\n float new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;\n dr = new_dr;\n di = new_di;\n vec2 Zn1 = (i + 1 < orbitLen) ? _pt_fetch_orbit(i + 1) : vec2(0.0);\n float zr = Zn1.x + dr;\n float zi = Zn1.y + di;\n float mag2 = zr * zr + zi * zi;\n if (mag2 > 4.0)\n return clamp((float(i) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);\n float dmag2 = dr * dr + di * di;\n float Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;\n if (dmag2 > Zmag2 && Zmag2 > 0.0) {\n float abs_zr = Zn1.x + dr;\n float abs_zi = Zn1.y + di;\n float cx = delta_c.x;\n float cy = delta_c.y;\n for (int j = i + 1; j < maxIter; j++) {\n float new_zr = abs_zr * abs_zr - abs_zi * abs_zi + cx;\n abs_zi = 2.0 * abs_zr * abs_zi + cy;\n abs_zr = new_zr;\n mag2 = abs_zr * abs_zr + abs_zi * abs_zi;\n if (mag2 > 4.0)\n return clamp((float(j) - log2(log2(mag2)) + 4.0) / float(maxIter), 0.0, 1.0);\n }\n return 1.0;\n }\n }\n return 1.0;\n}\n";
170
- /**
171
- * Perturbation-theory fractal preamble (WGSL syntax).
172
- *
173
- * Same logic as the GLSL version, adapted for WGSL syntax.
174
- */
175
- export declare const GPU_FRACTAL_PT_PREAMBLE_WGSL = "\n@group(0) @binding(1) var _refOrbit: texture_2d<f32>;\nvar<uniform> _refOrbitLen: i32;\nvar<uniform> _refOrbitTexWidth: i32;\nvar<uniform> _pt_offset_x: f32;\nvar<uniform> _pt_offset_y: f32;\nvar<uniform> _pt_w: f32;\nvar<uniform> _pt_h: f32;\n\nfn _pt_delta(uv: vec2f) -> vec2f {\n let dx = _pt_offset_x + (uv.x - 0.5) * _pt_w;\n let dy = _pt_offset_y + (uv.y - 0.5) * _pt_h;\n return vec2f(dx, dy);\n}\n\nfn _pt_fetch_orbit(i: i32) -> vec2f {\n let y = i / _refOrbitTexWidth;\n let x = i - y * _refOrbitTexWidth;\n return textureLoad(_refOrbit, vec2i(x, y), 0).rg;\n}\n\nfn _fractal_mandelbrot_pt(delta_c: vec2f, maxIter: i32) -> f32 {\n var dr: f32 = 0.0;\n var di: f32 = 0.0;\n let orbitLen = min(maxIter, _refOrbitLen);\n for (var i: i32 = 0; i < orbitLen; i++) {\n let Zn = _pt_fetch_orbit(i);\n let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;\n let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;\n dr = new_dr;\n di = new_di;\n var Zn1 = vec2f(0.0);\n if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }\n let zr = Zn1.x + dr;\n let zi = Zn1.y + di;\n var mag2 = zr * zr + zi * zi;\n if (mag2 > 4.0) {\n return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n let dmag2 = dr * dr + di * di;\n let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;\n if (dmag2 > Zmag2 && Zmag2 > 0.0) {\n var f_zr = Zn1.x + dr;\n var f_zi = Zn1.y + di;\n let cx = delta_c.x;\n let cy = delta_c.y;\n for (var j: i32 = i + 1; j < maxIter; j++) {\n let t_zr = f_zr * f_zr - f_zi * f_zi + cx;\n f_zi = 2.0 * f_zr * f_zi + cy;\n f_zr = t_zr;\n mag2 = f_zr * f_zr + f_zi * f_zi;\n if (mag2 > 4.0) {\n return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n }\n return 1.0;\n }\n }\n return 1.0;\n}\n\nfn _fractal_julia_pt(z_delta: vec2f, delta_c: vec2f, maxIter: i32) -> f32 {\n var dr = z_delta.x;\n var di = z_delta.y;\n let orbitLen = min(maxIter, _refOrbitLen);\n for (var i: i32 = 0; i < orbitLen; i++) {\n let Zn = _pt_fetch_orbit(i);\n let new_dr = 2.0 * (Zn.x * dr - Zn.y * di) + dr * dr - di * di + delta_c.x;\n let new_di = 2.0 * (Zn.x * di + Zn.y * dr) + 2.0 * dr * di + delta_c.y;\n dr = new_dr;\n di = new_di;\n var Zn1 = vec2f(0.0);\n if (i + 1 < orbitLen) { Zn1 = _pt_fetch_orbit(i + 1); }\n let zr = Zn1.x + dr;\n let zi = Zn1.y + di;\n var mag2 = zr * zr + zi * zi;\n if (mag2 > 4.0) {\n return clamp((f32(i) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n let dmag2 = dr * dr + di * di;\n let Zmag2 = Zn.x * Zn.x + Zn.y * Zn.y;\n if (dmag2 > Zmag2 && Zmag2 > 0.0) {\n var f_zr = Zn1.x + dr;\n var f_zi = Zn1.y + di;\n let cx = delta_c.x;\n let cy = delta_c.y;\n for (var j: i32 = i + 1; j < maxIter; j++) {\n let t_zr = f_zr * f_zr - f_zi * f_zi + cx;\n f_zi = 2.0 * f_zr * f_zi + cy;\n f_zr = t_zr;\n mag2 = f_zr * f_zr + f_zi * f_zi;\n if (mag2 > 4.0) {\n return clamp((f32(j) - log2(log2(mag2)) + 4.0) / f32(maxIter), 0.0, 1.0);\n }\n }\n return 1.0;\n }\n }\n return 1.0;\n}\n";
176
123
  /**
177
124
  * GPU color space conversion preamble (GLSL syntax).
178
125
  *
179
- * Provides sRGB OKLab OKLCh conversions, color mixing in OKLCh
180
- * with shorter-arc hue interpolation, and APCA contrast calculation.
126
+ * Canonical color value: vec3 OKLCh `(L, C, H_deg)` same convention as the
127
+ * interpreted/JS-runtime layer. Shaders that write to a sRGB framebuffer must
128
+ * wrap the final color in `_gpu_oklch_to_srgb()` at the boundary.
129
+ *
130
+ * Hue is in degrees throughout (matching the boxed-expression convention).
131
+ * `_gpu_color_mix` interpolates directly in OKLCh — no sRGB pinch — and
132
+ * special-cases achromatic endpoints (C ≈ 0) so e.g. mixing red with white
133
+ * preserves red's hue rather than drifting through arbitrary hues.
181
134
  *
182
135
  * WGSL targets must adapt syntax (vec3f, atan2→atan2, etc.).
183
136
  */
184
- export declare const GPU_COLOR_PREAMBLE_GLSL = "\nfloat _gpu_srgb_to_linear(float c) {\n if (c <= 0.04045) return c / 12.92;\n return pow((c + 0.055) / 1.055, 2.4);\n}\n\nfloat _gpu_linear_to_srgb(float c) {\n if (c <= 0.0031308) return 12.92 * c;\n return 1.055 * pow(c, 1.0 / 2.4) - 0.055;\n}\n\nvec3 _gpu_srgb_to_oklab(vec3 rgb) {\n float r = _gpu_srgb_to_linear(rgb.x);\n float g = _gpu_srgb_to_linear(rgb.y);\n float b = _gpu_srgb_to_linear(rgb.z);\n float l_ = pow(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b, 1.0 / 3.0);\n float m_ = pow(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b, 1.0 / 3.0);\n float s_ = pow(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b, 1.0 / 3.0);\n return vec3(\n 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_\n );\n}\n\nvec3 _gpu_oklab_to_srgb(vec3 lab) {\n float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n float s_ = lab.x - 0.0894841775 * lab.y - 1.291485548 * lab.z;\n float l = l_ * l_ * l_;\n float m = m_ * m_ * m_;\n float s = s_ * s_ * s_;\n float r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n float g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n float b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n return clamp(vec3(_gpu_linear_to_srgb(r), _gpu_linear_to_srgb(g), _gpu_linear_to_srgb(b)), 0.0, 1.0);\n}\n\nvec3 _gpu_oklab_to_oklch(vec3 lab) {\n float C = length(lab.yz);\n float H = atan(lab.z, lab.y);\n return vec3(lab.x, C, H);\n}\n\nvec3 _gpu_oklch_to_oklab(vec3 lch) {\n return vec3(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));\n}\n\nvec3 _gpu_color_mix(vec3 rgb1, vec3 rgb2, float t) {\n vec3 lch1 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb1));\n vec3 lch2 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb2));\n float L = mix(lch1.x, lch2.x, t);\n float C = mix(lch1.y, lch2.y, t);\n float dh = lch2.z - lch1.z;\n const float PI = 3.14159265359;\n if (dh > PI) dh -= 2.0 * PI;\n if (dh < -PI) dh += 2.0 * PI;\n float H = lch1.z + dh * t;\n return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(vec3(L, C, H)));\n}\n\nfloat _gpu_apca(vec3 bg, vec3 fg) {\n float bgR = _gpu_srgb_to_linear(bg.x);\n float bgG = _gpu_srgb_to_linear(bg.y);\n float bgB = _gpu_srgb_to_linear(bg.z);\n float fgR = _gpu_srgb_to_linear(fg.x);\n float fgG = _gpu_srgb_to_linear(fg.y);\n float fgB = _gpu_srgb_to_linear(fg.z);\n float bgY = 0.2126729 * bgR + 0.7151522 * bgG + 0.0721750 * bgB;\n float fgY = 0.2126729 * fgR + 0.7151522 * fgG + 0.0721750 * fgB;\n float bgC = pow(bgY, 0.56);\n float fgC = pow(fgY, 0.57);\n float contrast = (bgC > fgC)\n ? (bgC - fgC) * 1.14\n : (bgC - fgC) * 1.14;\n return contrast * 100.0;\n}\n";
137
+ export declare const GPU_COLOR_PREAMBLE_GLSL = "\nfloat _gpu_srgb_to_linear(float c) {\n if (c <= 0.04045) return c / 12.92;\n return pow((c + 0.055) / 1.055, 2.4);\n}\n\nfloat _gpu_linear_to_srgb(float c) {\n if (c <= 0.0031308) return 12.92 * c;\n return 1.055 * pow(c, 1.0 / 2.4) - 0.055;\n}\n\nvec3 _gpu_srgb_to_oklab(vec3 rgb) {\n float r = _gpu_srgb_to_linear(rgb.x);\n float g = _gpu_srgb_to_linear(rgb.y);\n float b = _gpu_srgb_to_linear(rgb.z);\n float l_ = pow(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b, 1.0 / 3.0);\n float m_ = pow(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b, 1.0 / 3.0);\n float s_ = pow(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b, 1.0 / 3.0);\n return vec3(\n 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_\n );\n}\n\nvec3 _gpu_oklab_to_srgb(vec3 lab) {\n float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n float s_ = lab.x - 0.0894841775 * lab.y - 1.291485548 * lab.z;\n float l = l_ * l_ * l_;\n float m = m_ * m_ * m_;\n float s = s_ * s_ * s_;\n float r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n float g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n float b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n return clamp(vec3(_gpu_linear_to_srgb(r), _gpu_linear_to_srgb(g), _gpu_linear_to_srgb(b)), 0.0, 1.0);\n}\n\nvec3 _gpu_oklab_to_oklch(vec3 lab) {\n float C = length(lab.yz);\n float H = atan(lab.z, lab.y) * (180.0 / 3.14159265359);\n if (H < 0.0) H += 360.0;\n return vec3(lab.x, C, H);\n}\n\nvec3 _gpu_oklch_to_oklab(vec3 lch) {\n float h_rad = lch.z * (3.14159265359 / 180.0);\n return vec3(lch.x, lch.y * cos(h_rad), lch.y * sin(h_rad));\n}\n\nvec3 _gpu_srgb_to_oklch(vec3 rgb) {\n return _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb));\n}\n\nvec3 _gpu_oklch_to_srgb(vec3 lch) {\n return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(lch));\n}\n\n// HSL conversion. Hue in degrees, saturation/lightness in 0-1.\nvec3 _gpu_hsl_to_rgb(vec3 hsl) {\n float h = hsl.x;\n float s = hsl.y;\n float l = hsl.z;\n float c = (1.0 - abs(2.0 * l - 1.0)) * s;\n float h6 = h / 60.0;\n float x = c * (1.0 - abs(mod(h6, 2.0) - 1.0));\n float r = 0.0;\n float g = 0.0;\n float b = 0.0;\n if (h6 < 1.0) { r = c; g = x; b = 0.0; }\n else if (h6 < 2.0) { r = x; g = c; b = 0.0; }\n else if (h6 < 3.0) { r = 0.0; g = c; b = x; }\n else if (h6 < 4.0) { r = 0.0; g = x; b = c; }\n else if (h6 < 5.0) { r = x; g = 0.0; b = c; }\n else { r = c; g = 0.0; b = x; }\n float m = l - c / 2.0;\n return vec3(r + m, g + m, b + m);\n}\n\nvec3 _gpu_rgb_to_hsl(vec3 rgb) {\n float maxc = max(max(rgb.x, rgb.y), rgb.z);\n float minc = min(min(rgb.x, rgb.y), rgb.z);\n float l = (maxc + minc) / 2.0;\n float d = maxc - minc;\n if (d < 1e-6) return vec3(0.0, 0.0, l);\n float s = d / (1.0 - abs(2.0 * l - 1.0));\n float h;\n if (maxc == rgb.x) h = mod((rgb.y - rgb.z) / d, 6.0);\n else if (maxc == rgb.y) h = (rgb.z - rgb.x) / d + 2.0;\n else h = (rgb.x - rgb.y) / d + 4.0;\n h *= 60.0;\n if (h < 0.0) h += 360.0;\n return vec3(h, s, l);\n}\n\n// HSV conversion. Hue in degrees, saturation/value in 0-1.\nvec3 _gpu_hsv_to_rgb(vec3 hsv) {\n float h = hsv.x;\n float s = hsv.y;\n float v = hsv.z;\n float c = v * s;\n float h6 = h / 60.0;\n float x = c * (1.0 - abs(mod(h6, 2.0) - 1.0));\n float r = 0.0;\n float g = 0.0;\n float b = 0.0;\n if (h6 < 1.0) { r = c; g = x; b = 0.0; }\n else if (h6 < 2.0) { r = x; g = c; b = 0.0; }\n else if (h6 < 3.0) { r = 0.0; g = c; b = x; }\n else if (h6 < 4.0) { r = 0.0; g = x; b = c; }\n else if (h6 < 5.0) { r = x; g = 0.0; b = c; }\n else { r = c; g = 0.0; b = x; }\n float m = v - c;\n return vec3(r + m, g + m, b + m);\n}\n\nvec3 _gpu_rgb_to_hsv(vec3 rgb) {\n float maxc = max(max(rgb.x, rgb.y), rgb.z);\n float minc = min(min(rgb.x, rgb.y), rgb.z);\n float v = maxc;\n float d = maxc - minc;\n if (d < 1e-6) return vec3(0.0, 0.0, v);\n float s = (maxc < 1e-6) ? 0.0 : d / maxc;\n float h;\n if (maxc == rgb.x) h = mod((rgb.y - rgb.z) / d, 6.0);\n else if (maxc == rgb.y) h = (rgb.z - rgb.x) / d + 2.0;\n else h = (rgb.x - rgb.y) / d + 4.0;\n h *= 60.0;\n if (h < 0.0) h += 360.0;\n return vec3(h, s, v);\n}\n\nvec3 _gpu_color_mix(vec3 lch1, vec3 lch2, float t) {\n float L = mix(lch1.x, lch2.x, t);\n float C = mix(lch1.y, lch2.y, t);\n bool a1 = lch1.y < 1e-6;\n bool a2 = lch2.y < 1e-6;\n float H;\n if (a1 && a2) {\n H = lch1.z;\n } else if (a1) {\n H = lch2.z;\n } else if (a2) {\n H = lch1.z;\n } else {\n float dh = lch2.z - lch1.z;\n if (dh > 180.0) dh -= 360.0;\n if (dh < -180.0) dh += 360.0;\n H = lch1.z + dh * t;\n if (H < 0.0) H += 360.0;\n if (H >= 360.0) H -= 360.0;\n }\n return vec3(L, C, H);\n}\n\nfloat _gpu_apca(vec3 lch_bg, vec3 lch_fg) {\n vec3 bg = _gpu_oklch_to_srgb(lch_bg);\n vec3 fg = _gpu_oklch_to_srgb(lch_fg);\n float bgR = _gpu_srgb_to_linear(bg.x);\n float bgG = _gpu_srgb_to_linear(bg.y);\n float bgB = _gpu_srgb_to_linear(bg.z);\n float fgR = _gpu_srgb_to_linear(fg.x);\n float fgG = _gpu_srgb_to_linear(fg.y);\n float fgB = _gpu_srgb_to_linear(fg.z);\n float bgY = 0.2126729 * bgR + 0.7151522 * bgG + 0.0721750 * bgB;\n float fgY = 0.2126729 * fgR + 0.7151522 * fgG + 0.0721750 * fgB;\n float bgC = pow(bgY, 0.56);\n float fgC = pow(fgY, 0.57);\n float contrast = (bgC - fgC) * 1.14;\n return contrast * 100.0;\n}\n";
185
138
  /**
186
139
  * GPU color space conversion preamble (WGSL syntax).
140
+ *
141
+ * Same convention as the GLSL preamble: canonical color value is `vec3f`
142
+ * OKLCh `(L, C, H_deg)`. Shaders writing to a sRGB framebuffer must wrap
143
+ * their final color in `_gpu_oklch_to_srgb()`.
187
144
  */
188
- export declare const GPU_COLOR_PREAMBLE_WGSL = "\nfn _gpu_srgb_to_linear(c: f32) -> f32 {\n if (c <= 0.04045) { return c / 12.92; }\n return pow((c + 0.055) / 1.055, 2.4);\n}\n\nfn _gpu_linear_to_srgb(c: f32) -> f32 {\n if (c <= 0.0031308) { return 12.92 * c; }\n return 1.055 * pow(c, 1.0 / 2.4) - 0.055;\n}\n\nfn _gpu_srgb_to_oklab(rgb: vec3f) -> vec3f {\n let r = _gpu_srgb_to_linear(rgb.x);\n let g = _gpu_srgb_to_linear(rgb.y);\n let b = _gpu_srgb_to_linear(rgb.z);\n let l_ = pow(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b, 1.0 / 3.0);\n let m_ = pow(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b, 1.0 / 3.0);\n let s_ = pow(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b, 1.0 / 3.0);\n return vec3f(\n 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_\n );\n}\n\nfn _gpu_oklab_to_srgb(lab: vec3f) -> vec3f {\n let l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n let m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n let s_ = lab.x - 0.0894841775 * lab.y - 1.291485548 * lab.z;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n let b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n return clamp(vec3f(_gpu_linear_to_srgb(r), _gpu_linear_to_srgb(g), _gpu_linear_to_srgb(b)), vec3f(0.0), vec3f(1.0));\n}\n\nfn _gpu_oklab_to_oklch(lab: vec3f) -> vec3f {\n let C = length(lab.yz);\n let H = atan2(lab.z, lab.y);\n return vec3f(lab.x, C, H);\n}\n\nfn _gpu_oklch_to_oklab(lch: vec3f) -> vec3f {\n return vec3f(lch.x, lch.y * cos(lch.z), lch.y * sin(lch.z));\n}\n\nfn _gpu_color_mix(rgb1: vec3f, rgb2: vec3f, t: f32) -> vec3f {\n let lch1 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb1));\n let lch2 = _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb2));\n let L = mix(lch1.x, lch2.x, t);\n let C = mix(lch1.y, lch2.y, t);\n let PI = 3.14159265359;\n var dh = lch2.z - lch1.z;\n if (dh > PI) { dh -= 2.0 * PI; }\n if (dh < -PI) { dh += 2.0 * PI; }\n let H = lch1.z + dh * t;\n return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(vec3f(L, C, H)));\n}\n\nfn _gpu_apca(bg: vec3f, fg: vec3f) -> f32 {\n let bgR = _gpu_srgb_to_linear(bg.x);\n let bgG = _gpu_srgb_to_linear(bg.y);\n let bgB = _gpu_srgb_to_linear(bg.z);\n let fgR = _gpu_srgb_to_linear(fg.x);\n let fgG = _gpu_srgb_to_linear(fg.y);\n let fgB = _gpu_srgb_to_linear(fg.z);\n let bgY = 0.2126729 * bgR + 0.7151522 * bgG + 0.0721750 * bgB;\n let fgY = 0.2126729 * fgR + 0.7151522 * fgG + 0.0721750 * fgB;\n let bgC = pow(bgY, 0.56);\n let fgC = pow(fgY, 0.57);\n let contrast = (bgC - fgC) * 1.14;\n return contrast * 100.0;\n}\n";
145
+ export declare const GPU_COLOR_PREAMBLE_WGSL = "\nfn _gpu_srgb_to_linear(c: f32) -> f32 {\n if (c <= 0.04045) { return c / 12.92; }\n return pow((c + 0.055) / 1.055, 2.4);\n}\n\nfn _gpu_linear_to_srgb(c: f32) -> f32 {\n if (c <= 0.0031308) { return 12.92 * c; }\n return 1.055 * pow(c, 1.0 / 2.4) - 0.055;\n}\n\nfn _gpu_srgb_to_oklab(rgb: vec3f) -> vec3f {\n let r = _gpu_srgb_to_linear(rgb.x);\n let g = _gpu_srgb_to_linear(rgb.y);\n let b = _gpu_srgb_to_linear(rgb.z);\n let l_ = pow(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b, 1.0 / 3.0);\n let m_ = pow(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b, 1.0 / 3.0);\n let s_ = pow(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b, 1.0 / 3.0);\n return vec3f(\n 0.2104542553 * l_ + 0.793617785 * m_ - 0.0040720468 * s_,\n 1.9779984951 * l_ - 2.428592205 * m_ + 0.4505937099 * s_,\n 0.0259040371 * l_ + 0.7827717662 * m_ - 0.808675766 * s_\n );\n}\n\nfn _gpu_oklab_to_srgb(lab: vec3f) -> vec3f {\n let l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n let m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n let s_ = lab.x - 0.0894841775 * lab.y - 1.291485548 * lab.z;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n let r = 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\n let g = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\n let b = -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s;\n return clamp(vec3f(_gpu_linear_to_srgb(r), _gpu_linear_to_srgb(g), _gpu_linear_to_srgb(b)), vec3f(0.0), vec3f(1.0));\n}\n\nfn _gpu_oklab_to_oklch(lab: vec3f) -> vec3f {\n let C = length(lab.yz);\n var H = atan2(lab.z, lab.y) * (180.0 / 3.14159265359);\n if (H < 0.0) { H = H + 360.0; }\n return vec3f(lab.x, C, H);\n}\n\nfn _gpu_oklch_to_oklab(lch: vec3f) -> vec3f {\n let h_rad = lch.z * (3.14159265359 / 180.0);\n return vec3f(lch.x, lch.y * cos(h_rad), lch.y * sin(h_rad));\n}\n\nfn _gpu_srgb_to_oklch(rgb: vec3f) -> vec3f {\n return _gpu_oklab_to_oklch(_gpu_srgb_to_oklab(rgb));\n}\n\nfn _gpu_oklch_to_srgb(lch: vec3f) -> vec3f {\n return _gpu_oklab_to_srgb(_gpu_oklch_to_oklab(lch));\n}\n\nfn _gpu_hsl_to_rgb(hsl: vec3f) -> vec3f {\n let h = hsl.x;\n let s = hsl.y;\n let l = hsl.z;\n let c = (1.0 - abs(2.0 * l - 1.0)) * s;\n let h6 = h / 60.0;\n let x = c * (1.0 - abs((h6 - 2.0 * floor(h6 / 2.0)) - 1.0));\n var r: f32 = 0.0;\n var g: f32 = 0.0;\n var b: f32 = 0.0;\n if (h6 < 1.0) { r = c; g = x; b = 0.0; }\n else if (h6 < 2.0) { r = x; g = c; b = 0.0; }\n else if (h6 < 3.0) { r = 0.0; g = c; b = x; }\n else if (h6 < 4.0) { r = 0.0; g = x; b = c; }\n else if (h6 < 5.0) { r = x; g = 0.0; b = c; }\n else { r = c; g = 0.0; b = x; }\n let m = l - c / 2.0;\n return vec3f(r + m, g + m, b + m);\n}\n\nfn _gpu_rgb_to_hsl(rgb: vec3f) -> vec3f {\n let maxc = max(max(rgb.x, rgb.y), rgb.z);\n let minc = min(min(rgb.x, rgb.y), rgb.z);\n let l = (maxc + minc) / 2.0;\n let d = maxc - minc;\n if (d < 1e-6) { return vec3f(0.0, 0.0, l); }\n let s = d / (1.0 - abs(2.0 * l - 1.0));\n var h: f32;\n if (maxc == rgb.x) {\n let v = (rgb.y - rgb.z) / d;\n h = v - 6.0 * floor(v / 6.0);\n } else if (maxc == rgb.y) {\n h = (rgb.z - rgb.x) / d + 2.0;\n } else {\n h = (rgb.x - rgb.y) / d + 4.0;\n }\n h = h * 60.0;\n if (h < 0.0) { h = h + 360.0; }\n return vec3f(h, s, l);\n}\n\nfn _gpu_hsv_to_rgb(hsv: vec3f) -> vec3f {\n let h = hsv.x;\n let s = hsv.y;\n let v = hsv.z;\n let c = v * s;\n let h6 = h / 60.0;\n let x = c * (1.0 - abs((h6 - 2.0 * floor(h6 / 2.0)) - 1.0));\n var r: f32 = 0.0;\n var g: f32 = 0.0;\n var b: f32 = 0.0;\n if (h6 < 1.0) { r = c; g = x; b = 0.0; }\n else if (h6 < 2.0) { r = x; g = c; b = 0.0; }\n else if (h6 < 3.0) { r = 0.0; g = c; b = x; }\n else if (h6 < 4.0) { r = 0.0; g = x; b = c; }\n else if (h6 < 5.0) { r = x; g = 0.0; b = c; }\n else { r = c; g = 0.0; b = x; }\n let m = v - c;\n return vec3f(r + m, g + m, b + m);\n}\n\nfn _gpu_rgb_to_hsv(rgb: vec3f) -> vec3f {\n let maxc = max(max(rgb.x, rgb.y), rgb.z);\n let minc = min(min(rgb.x, rgb.y), rgb.z);\n let v = maxc;\n let d = maxc - minc;\n if (d < 1e-6) { return vec3f(0.0, 0.0, v); }\n var s: f32 = 0.0;\n if (maxc >= 1e-6) { s = d / maxc; }\n var h: f32;\n if (maxc == rgb.x) {\n let q = (rgb.y - rgb.z) / d;\n h = q - 6.0 * floor(q / 6.0);\n } else if (maxc == rgb.y) {\n h = (rgb.z - rgb.x) / d + 2.0;\n } else {\n h = (rgb.x - rgb.y) / d + 4.0;\n }\n h = h * 60.0;\n if (h < 0.0) { h = h + 360.0; }\n return vec3f(h, s, v);\n}\n\nfn _gpu_color_mix(lch1: vec3f, lch2: vec3f, t: f32) -> vec3f {\n let L = mix(lch1.x, lch2.x, t);\n let C = mix(lch1.y, lch2.y, t);\n let a1 = lch1.y < 1e-6;\n let a2 = lch2.y < 1e-6;\n var H: f32;\n if (a1 && a2) {\n H = lch1.z;\n } else if (a1) {\n H = lch2.z;\n } else if (a2) {\n H = lch1.z;\n } else {\n var dh = lch2.z - lch1.z;\n if (dh > 180.0) { dh = dh - 360.0; }\n if (dh < -180.0) { dh = dh + 360.0; }\n H = lch1.z + dh * t;\n if (H < 0.0) { H = H + 360.0; }\n if (H >= 360.0) { H = H - 360.0; }\n }\n return vec3f(L, C, H);\n}\n\nfn _gpu_apca(lch_bg: vec3f, lch_fg: vec3f) -> f32 {\n let bg = _gpu_oklch_to_srgb(lch_bg);\n let fg = _gpu_oklch_to_srgb(lch_fg);\n let bgR = _gpu_srgb_to_linear(bg.x);\n let bgG = _gpu_srgb_to_linear(bg.y);\n let bgB = _gpu_srgb_to_linear(bg.z);\n let fgR = _gpu_srgb_to_linear(fg.x);\n let fgG = _gpu_srgb_to_linear(fg.y);\n let fgB = _gpu_srgb_to_linear(fg.z);\n let bgY = 0.2126729 * bgR + 0.7151522 * bgG + 0.0721750 * bgB;\n let fgY = 0.2126729 * fgR + 0.7151522 * fgG + 0.0721750 * fgB;\n let bgC = pow(bgY, 0.56);\n let fgC = pow(fgY, 0.57);\n let contrast = (bgC - fgC) * 1.14;\n return contrast * 100.0;\n}\n";
189
146
  /**
190
147
  * Abstract base class for GPU shader compilation targets.
191
148
  *
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * JavaScript interval arithmetic compilation target
3
3
  *
4
4
  * Compiles mathematical expressions to JavaScript code using interval arithmetic
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import { chop, factorial, factorial2, gcd, lcm, limit } from '../numerics/numeric';
3
3
  import { gamma, gammaln, erf, erfc, erfInv, beta, digamma, trigamma, polygamma, zeta, lambertW, besselJ, besselY, besselI, besselK, airyAi, airyBi, fresnelS, fresnelC, sinc } from '../numerics/special-functions';
4
4
  import { choose } from '../boxed-expression/expand';
@@ -16,8 +16,19 @@ export declare class ComputeEngineFunction extends Function {
16
16
  contrastingColor(bg: string | number[], fg1?: string | number[], fg2?: string | number[]): number[];
17
17
  colorToColorspace(input: string | number[], space: string): number[];
18
18
  colormap(name: string, arg?: number): number[] | number[][];
19
- _interpolatePalette(colors: [number, number, number][], t: number): number[];
19
+ _interpolatePalette(colors: number[][], t: number): number[];
20
20
  colorFromColorspace(components: number[], space: string): number[];
21
+ rgb(r: number, g: number, b: number, alpha?: number): number[];
22
+ hsv(h: number, s: number, v: number, alpha?: number): number[];
23
+ hsl(h: number, s: number, l: number, alpha?: number): number[];
24
+ oklab(L: number, a: number, b: number, alpha?: number): number[];
25
+ oklch(L: number, C: number, H: number, alpha?: number): number[];
26
+ asRgb(input: string | number[]): number[];
27
+ asHsv(input: string | number[]): number[];
28
+ asHsl(input: string | number[]): number[];
29
+ asOklab(input: string | number[]): number[];
30
+ colorDelta(a: string | number[], b: string | number[]): number;
31
+ distance(a: number[], b: number[]): number;
21
32
  chop: typeof chop;
22
33
  factorial: typeof factorial;
23
34
  factorial2: typeof factorial2;
@@ -195,8 +206,19 @@ export declare class ComputeEngineFunctionLiteral extends Function {
195
206
  contrastingColor(bg: string | number[], fg1?: string | number[], fg2?: string | number[]): number[];
196
207
  colorToColorspace(input: string | number[], space: string): number[];
197
208
  colormap(name: string, arg?: number): number[] | number[][];
198
- _interpolatePalette(colors: [number, number, number][], t: number): number[];
209
+ _interpolatePalette(colors: number[][], t: number): number[];
199
210
  colorFromColorspace(components: number[], space: string): number[];
211
+ rgb(r: number, g: number, b: number, alpha?: number): number[];
212
+ hsv(h: number, s: number, v: number, alpha?: number): number[];
213
+ hsl(h: number, s: number, l: number, alpha?: number): number[];
214
+ oklab(L: number, a: number, b: number, alpha?: number): number[];
215
+ oklch(L: number, C: number, H: number, alpha?: number): number[];
216
+ asRgb(input: string | number[]): number[];
217
+ asHsv(input: string | number[]): number[];
218
+ asHsl(input: string | number[]): number[];
219
+ asOklab(input: string | number[]): number[];
220
+ colorDelta(a: string | number[], b: string | number[]): number;
221
+ distance(a: number[], b: number[]): number;
200
222
  chop: typeof chop;
201
223
  factorial: typeof factorial;
202
224
  factorial2: typeof factorial2;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { CompileTarget, CompiledOperators, CompiledFunctions, LanguageTarget, CompilationOptions, CompilationResult } from './types';
3
3
  /**
4
4
  * Python/NumPy language target implementation
@@ -1,15 +1,4 @@
1
- /* 0.55.5 */
2
- /**
3
- * A coordinate value with extended precision.
4
- *
5
- * - `number` — standard float64 (~16 decimal digits)
6
- * - `string` — arbitrary precision (parsed by BigDecimal)
7
- * - `{ hi, lo }` — double-double pair (~30 digits), true value = hi + lo
8
- */
9
- export type HighPrecisionCoord = number | string | {
10
- hi: number;
11
- lo: number;
12
- };
1
+ /* 0.56.0 */
13
2
  /**
14
3
  * Source code in the target language
15
4
  */
@@ -64,8 +53,6 @@ export interface CompileTarget<Expr = unknown> {
64
53
  block?: (statements: string[]) => string;
65
54
  /** Target language identifier (for debugging/logging) */
66
55
  language?: string;
67
- /** Compilation hints (viewport, etc.) passed through from options. */
68
- hints?: CompilationOptions['hints'];
69
56
  }
70
57
  /**
71
58
  * Base interface for language-specific compilation targets
@@ -160,30 +147,6 @@ export interface CompilationOptions<Expr = unknown> {
160
147
  * results (e.g., plotting).
161
148
  */
162
149
  realOnly?: boolean;
163
- /**
164
- * Compilation hints for precision-adaptive strategies.
165
- *
166
- * The compiler may use these hints to select different code generation
167
- * strategies (e.g., emulated double precision for deep-zoom fractals).
168
- * Non-fractal functions ignore hints.
169
- */
170
- hints?: {
171
- /** Current viewport for precision-adaptive compilation. */
172
- viewport?: {
173
- /**
174
- * Center of the viewport as [re, im].
175
- *
176
- * Each coordinate can be:
177
- * - `number` — standard float64 precision (~16 digits)
178
- * - `string` — arbitrary precision (parsed by BigDecimal)
179
- * - `{ hi, lo }` — double-double pair (~30 digits),
180
- * true value = hi + lo
181
- */
182
- center: [HighPrecisionCoord, HighPrecisionCoord];
183
- /** Viewport radius (half-width in complex plane units). */
184
- radius: number;
185
- };
186
- };
187
150
  }
188
151
  /**
189
152
  * Built-in targets that produce an executable `run` function.
@@ -284,35 +247,6 @@ export type CompilationResult<T extends string = string, R = number | ComplexRes
284
247
  calling?: 'expression' | 'lambda';
285
248
  /** Executable function (present for JS-executable targets only). */
286
249
  run?: CompiledRunner<R>;
287
- /**
288
- * Cheap staleness check for precision-adaptive compilation.
289
- *
290
- * The plot engine checks these thresholds on each viewport change
291
- * (a few number comparisons). When any condition is met, the expression
292
- * should be recompiled with updated hints.
293
- */
294
- staleWhen?: {
295
- /** Recompile when viewport radius drops below this value. */
296
- radiusBelow?: number;
297
- /** Recompile when viewport radius rises above this value. */
298
- radiusAbove?: number;
299
- /** Recompile when center moves more than this distance. */
300
- centerDistance?: number;
301
- };
302
- /** Scalar uniform values the shader needs. */
303
- uniforms?: Record<string, number>;
304
- /**
305
- * Texture data the shader needs (e.g., reference orbit).
306
- *
307
- * Separated from `uniforms` because the GPU upload path is fundamentally
308
- * different (createTexture + sampler vs uniform1f).
309
- */
310
- textures?: Record<string, {
311
- data: Float32Array;
312
- width: number;
313
- height: number;
314
- format: 'r32f' | 'rg32f' | 'rgba32f';
315
- }>;
316
250
  } & (T extends ExecutableTarget ? {
317
251
  calling: 'expression' | 'lambda';
318
252
  run: CompiledRunner<R>;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { CompiledFunctions } from './types';
3
3
  import { GPUShaderTarget } from './gpu-target';
4
4
  /**
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  /**
3
3
  * The default cost function, used to determine if a new expression is simpler
4
4
  * than the old one.
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { MathJsonSymbol } from '../math-json/types';
3
3
  export declare function ask(ce: IComputeEngine, pattern: Expression): BoxedSubstitution[];
4
4
  export declare function verify(ce: IComputeEngine, query: Expression): boolean | undefined;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  private _entries;
3
3
  getOrBuild<T>(cacheName: string, build: () => T, purge?: (t: T) => T | undefined): T;
4
4
  invalidate(cacheName: string): void;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  export type CommonSymbolTable = {
3
3
  [symbol: string]: null | Expression;
4
4
  };
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { LanguageTarget } from './compilation/types';
3
3
  /**
4
4
  * Internal registry for compilation targets.
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  type ResetHooks = {
3
3
  refreshNumericConstants: () => void;
4
4
  resetCommonSymbols: () => void;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import { BoxedType } from '../common/type/boxed-type';
3
3
  import type { MathJsonSymbol } from '../math-json/types';
4
4
  import type { ValueDefinition, OperatorDefinition, AssignValue, Expression, BoxedDefinition, SymbolDefinition, IComputeEngine, Scope } from './global-types';
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import { BigDecimal } from '../big-decimal';
3
3
  import type { MathJsonNumberObject, MathJsonSymbol } from '../math-json/types';
4
4
  import { NumericValue } from './numeric-value/types';
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { LanguageTarget, CompilationOptions } from './compilation/types';
3
3
  export declare function assertCompilationTargetName(name: unknown): string;
4
4
  export declare function assertLibraryName(name: unknown): string;
@@ -1,3 +1,3 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  export declare function resolveBootstrapLibraries(libraries?: readonly (string | LibraryDefinition)[]): LibraryDefinition[];
3
3
  export declare function loadLibraryDefinitions(engine: ComputeEngine, libraries: readonly LibraryDefinition[]): void;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { AngularUnit } from './types-definitions';
3
3
  export declare class EngineNumericConfiguration {
4
4
  private _precision;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  private _timeLimit;
3
3
  private _iterationLimit;
4
4
  private _recursionLimit;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  export declare function pushScope(ce: IComputeEngine, scope?: Scope, name?: string): void;
3
3
  export declare function popScope(ce: IComputeEngine): void;
4
4
  export declare function pushEvalContext(ce: IComputeEngine, scope: Scope, name?: string): void;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  export declare function declareSequence(ce: IComputeEngine, name: string, def: SequenceDefinition): IComputeEngine;
3
3
  export declare function getSequenceStatus(ce: IComputeEngine, name: string): SequenceStatus;
4
4
  export declare function getSequence(ce: IComputeEngine, name: string): SequenceInfo | undefined;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  /**
3
3
  * Internal holder for simplification rules and their cache-staleness marker.
4
4
  *
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { Expression, IComputeEngine as ComputeEngine, LibraryDefinition } from './global-types';
3
3
  export type CommonNumberBindings = {
4
4
  Zero: Expression;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  type ResolverScope = {
3
3
  parent: ResolverScope | null;
4
4
  types?: Record<string, TypeReference>;
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import { BoxedType } from '../common/type/boxed-type';
3
3
  import type { Expression, Metadata, ExpressionInput } from './global-types';
4
4
  type ValidationHost = {
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { Type, TypeString } from '../common/type/types';
3
3
  import type { LatexString, ParseLatexOptions } from './latex-syntax/types';
4
4
  import { compile as compileExpr } from './compilation/compile-expression';
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import type { BoxedDefinition, Expression, IComputeEngine as ComputeEngine, Scope } from './global-types';
3
3
  /***
4
4
  * ### THEORY OF OPERATIONS
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  export type * from './types-serialization';
3
3
  export type { ValueDefinition, SequenceDefinition, SequenceStatus, SequenceInfo, OEISSequenceInfo, OEISOptions, OperatorDefinition, BaseDefinition, SimplifyOptions, SymbolDefinition, SymbolDefinitions, LibraryDefinition, AngularUnit, Sign, BaseCollectionHandlers, IndexedCollectionHandlers, CollectionHandlers, TaggedValueDefinition, TaggedOperatorDefinition, BoxedDefinition, BoxedBaseDefinition, BoxedValueDefinition, OperatorDefinitionFlags, BoxedOperatorDefinition, } from './types-definitions';
4
4
  export type * from './types-evaluation';
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  import { BigDecimal } from '../big-decimal';
3
3
  import { Type, TypeResolver, TypeString } from '../common/type/types';
4
4
  import { BoxedType } from '../common/type/boxed-type';
@@ -6,7 +6,7 @@ import type { OneOf } from '../common/one-of';
6
6
  import type { ConfigurationChangeListener } from '../common/configuration-change';
7
7
  import type { MathJsonExpression, MathJsonSymbol, MathJsonNumberObject } from '../math-json/types';
8
8
  import type { ValueDefinition, OperatorDefinition, AngularUnit, AssignValue, AssumeResult, Expression, BoxedRule, BoxedRuleSet, BoxedSubstitution, CanonicalOptions, Metadata, Rule, Scope, EvalContext, ExpressionInput, IComputeEngine, ILatexSyntax, BoxedDefinition, SymbolDefinition, SequenceDefinition, SequenceStatus, SequenceInfo, OEISSequenceInfo, OEISOptions, LibraryDefinition } from './global-types';
9
- import type { LibraryCategory, ParseLatexOptions } from './latex-syntax/types';
9
+ import type { LibraryCategory, ParseLatexOptions, SerializeLatexOptions } from './latex-syntax/types';
10
10
  import type { BigNum, Rational } from './numerics/types';
11
11
  import { ExactNumericValueData, NumericValue, NumericValueData } from './numeric-value/types';
12
12
  import type { FormOption } from './types-serialization';
@@ -18,7 +18,7 @@ export type * from './global-types';
18
18
  export { parse, expr, simplify, evaluate, N, declare, assign, expand, expandAll, factor, solve, compile, getDefaultEngine, } from './free-functions';
19
19
  export { validatePattern };
20
20
  export { factorPerfectSquare, factorDifferenceOfSquares, factorQuadratic, factorPolynomial, };
21
- export type { CompileTarget, CompiledOperators, CompiledFunctions, CompilationOptions, CompilationResult, LanguageTarget, TargetSource, CompiledFunction, HighPrecisionCoord, } from './compilation/types';
21
+ export type { CompileTarget, CompiledOperators, CompiledFunctions, CompilationOptions, CompilationResult, LanguageTarget, TargetSource, CompiledFunction, } from './compilation/types';
22
22
  export { BigDecimal } from '../big-decimal';
23
23
  export { JavaScriptTarget } from './compilation/javascript-target';
24
24
  export { GLSLTarget } from './compilation/glsl-target';
@@ -174,6 +174,7 @@ export declare class ComputeEngine implements IComputeEngine {
174
174
  precision?: number | 'machine';
175
175
  tolerance?: number | 'auto';
176
176
  latexSyntax?: ILatexSyntax;
177
+ latexOptions?: Partial<ParseLatexOptions & SerializeLatexOptions>;
177
178
  });
178
179
  toJSON(): string;
179
180
  [Symbol.toStringTag]: string;
@@ -650,6 +651,25 @@ export declare class ComputeEngine implements IComputeEngine {
650
651
  /** @internal Returns the LatexSyntax instance, lazily creating one
651
652
  * if a factory is registered. Throws if no LatexSyntax is available. */
652
653
  _requireLatexSyntax(): ILatexSyntax;
654
+ /** @internal Engine-wide LaTeX parse/serialize options (e.g. decimalSeparator).
655
+ * Merged into every `parse()` and `toLatex()` call between the LatexSyntax
656
+ * instance defaults and any per-call overrides. */
657
+ private _latexOptions;
658
+ /** Engine-wide LaTeX parse/serialize options.
659
+ *
660
+ * These options are merged into every `parse()` and `toLatex()` call.
661
+ * Precedence (most-specific wins):
662
+ * 1. LatexSyntax instance defaults (set at its construction)
663
+ * 2. `ce.latexOptions` (this property)
664
+ * 3. Per-call options passed to `ce.parse()` / `expr.toLatex()`
665
+ *
666
+ * Assigning replaces the whole bag. Use spread to merge:
667
+ * ```ts
668
+ * ce.latexOptions = { ...ce.latexOptions, decimalSeparator: '{,}' };
669
+ * ```
670
+ */
671
+ get latexOptions(): Partial<ParseLatexOptions & SerializeLatexOptions>;
672
+ set latexOptions(options: Partial<ParseLatexOptions & SerializeLatexOptions>);
653
673
  /**
654
674
  * Parse a LaTeX string and return a boxed expression.
655
675
  *
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * Basic interval arithmetic operations
3
3
  *
4
4
  * @module interval/arithmetic
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * Comparison and conditional interval operations
3
3
  *
4
4
  * @module interval/comparison
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * Elementary interval functions (sqrt, pow, exp, ln, abs, floor, ceil, min, max, mod)
3
3
  *
4
4
  * @module interval/elementary
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * Interval arithmetic library for reliable function evaluation
3
3
  *
4
4
  * This module provides interval versions of mathematical operations
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * Trigonometric interval functions
3
3
  *
4
4
  * @module interval/trigonometric
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * Interval arithmetic types for reliable function evaluation
3
3
  *
4
4
  * @module interval/types
@@ -1,4 +1,4 @@
1
- /* 0.55.5 */
1
+ /* 0.56.0 */
2
2
  * Utility functions for interval arithmetic
3
3
  *
4
4
  * @module interval/util