-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathindex.html
More file actions
815 lines (812 loc) · 301 KB
/
Copy pathindex.html
File metadata and controls
815 lines (812 loc) · 301 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-compute-engine/guide-compile" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.10.2">
<title data-rh="true">Compiling Expressions · MathLive</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://mathlive.io/img/social-card.jpg"><meta data-rh="true" name="twitter:image" content="https://mathlive.io/img/social-card.jpg"><meta data-rh="true" property="og:url" content="https://mathlive.io/compute-engine/guides/compiling/"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Compiling Expressions · MathLive"><meta data-rh="true" name="description" content="The Compute Engine can compile LaTeX expressions to JavaScript functions!"><meta data-rh="true" property="og:description" content="The Compute Engine can compile LaTeX expressions to JavaScript functions!"><link data-rh="true" rel="icon" href="/img/logo.webp"><link data-rh="true" rel="canonical" href="https://mathlive.io/compute-engine/guides/compiling/"><link data-rh="true" rel="alternate" href="https://mathlive.io/compute-engine/guides/compiling/" hreflang="en"><link data-rh="true" rel="alternate" href="https://mathlive.io/compute-engine/guides/compiling/" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://Q23Y5RN3UQ-dsn.algolia.net" crossorigin="anonymous"><link data-rh="true" rel="alternate" type="text/markdown" href="/compute-engine/guides/compiling.md"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Compiling Expressions","item":"https://mathlive.io/compute-engine/guides/compiling/"}]}</script><link rel="search" type="application/opensearchdescription+xml" title="MathLive" href="/opensearch.xml">
<link rel="stylesheet" src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.11/codemirror.min.css">
<script>!function(){var e,t;window.moduleMap||(window.moduleMap={}),window.moduleMap={...window.moduleMap,mathlive:"https://esm.run/mathlive","compute-engine":"https://esm.run/@cortex-js/compute-engine","@cortex-js/compute-engine":"https://esm.run/@cortex-js/compute-engine"},(e=["https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js","https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/javascript/javascript.min.js","https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/xml/xml.min.js","https://unpkg.com/@cortex-js/compute-engine","https://cdn.jsdelivr.net/npm/mathlive","https://cdn.jsdelivr.net/npm/@ui-js/code-playground@1.13.2/dist/code-playground.min.js@module"]).forEach((o,n)=>{const m=o.endsWith("@module"),c="script"+function(e,t=0){let o=3735928559^t,n=1103547991^t;for(let t=0;t<e.length;t++){const m=e.charCodeAt(t);o=Math.imul(o^m,2654435761),n=Math.imul(n^m,1597334677)}return o=Math.imul(o^o>>>16,2246822507),o^=Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507),n^=Math.imul(o^o>>>13,3266489909),4294967296*(2097151&n)+(o>>>0)}(o=o.replace("@module","")).toString(36);if(document.getElementById(c))return;const d=document.createElement("script");m&&(d.type="module"),d.id=c,d.src=o,d.async=!1,t&&n===e.length-1&&(d.onload=t),document.head.appendChild(d)})}()</script>
<link rel="preconnect" href="https://rsms.me/">
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" media="print" onload="this.media='all'">
<link rel="preload" as="font" type="font/woff2" href="/fonts/berkeley-mono/BerkeleyMono-Regular.woff2" crossorigin="anonymous">
<link rel="preload" as="font" type="font/woff2" href="/fonts/berkeley-mono/BerkeleyMono-Bold.woff2" crossorigin="anonymous">
<link rel="preload" as="font" type="font/woff2" href="https://cdn.jsdelivr.net/npm/mathlive/fonts/KaTeX_Main-Regular.woff2" crossorigin="anonymous">
<link rel="preload" as="font" type="font/woff2" href="https://cdn.jsdelivr.net/npm/mathlive/fonts/KaTeX_Math-Italic.woff2" crossorigin="anonymous">
<link rel="preload" as="font" type="font/woff2" href="https://cdn.jsdelivr.net/npm/mathlive/fonts/KaTeX_AMS-Regular.woff2" crossorigin="anonymous">
<link rel="preload" as="font" type="font/woff2" href="https://cdn.jsdelivr.net/npm/mathlive/fonts/KaTeX_Size1-Regular.woff2" crossorigin="anonymous">
<link rel="preload" as="image" href="/img/hand-slugs.jpg" fetchpriority="high">
<link rel="preload" as="image" href="/img/hand-gears.jpg" fetchpriority="high">
<link rel="preload" as="image" href="/img/hand-cube2.jpg" fetchpriority="high"><link rel="stylesheet" href="/assets/css/styles.f0919c7c.css">
<script src="/assets/js/runtime~main.9753dc55.js" defer="defer"></script>
<script src="/assets/js/main.088f98ed.js" defer="defer"></script>
</head>
<body>
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>document.documentElement.setAttribute("data-theme",window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),document.documentElement.setAttribute("data-theme-choice","system"),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/img/logo.webp"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="shared-header"><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.webp" alt="MathLive Logo" class="themedComponent_mlkZ themedComponent--light_NVdE" height="42" width="42"><img src="/img/logo.webp" alt="MathLive Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU" height="42" width="42"></div><b class="navbar__title text--truncate">MathLive</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/mathfield/">Mathfield</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/compute-engine/">Compute Engine</a><a href="https://epsil.dev" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Epsil<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/cortex-js" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link" icon="github">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Meta+k)" aria-keyshortcuts="Meta+k"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="8" stroke="currentColor" fill="none" stroke-width="1.4"></circle><path d="m21 21-4.3-4.3" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav></div><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/mathfield/"><span class="categoryLinkLabel_W154">Mathfield</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/compute-engine/"><span class="categoryLinkLabel_W154">Compute Engine</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item compass-icon"><a class="menu__link" tabindex="0" href="/compute-engine/"><span class="linkLabel_WmDU">Introduction</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item flask-icon"><a class="menu__link" tabindex="0" href="/compute-engine/demo/"><span class="linkLabel_WmDU">Demo</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2"><hr></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item changelog-icon"><a class="menu__link" tabindex="0" href="/compute-engine/changelog/"><span class="linkLabel_WmDU">Changelog</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2"><hr></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/expressions/"><span class="linkLabel_WmDU">Expressions</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/evaluate/"><span class="linkLabel_WmDU">Evaluation of Expressions</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/symbolic-computing/"><span class="linkLabel_WmDU">Symbolic Computing</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/numeric-evaluation/"><span class="linkLabel_WmDU">Numeric Evaluation</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/canonical-form/"><span class="linkLabel_WmDU">Canonical Form</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/symbols/"><span class="linkLabel_WmDU">Symbols</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/augmenting/"><span class="linkLabel_WmDU">Custom Functions and Symbols</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/latex-syntax/"><span class="linkLabel_WmDU">LaTeX Syntax</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/types/"><span class="linkLabel_WmDU">Types</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/units/"><span class="linkLabel_WmDU">Units and Quantities</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/simplify/"><span class="linkLabel_WmDU">Simplify</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/compute-engine/guides/compiling/"><span class="linkLabel_WmDU">Compiling Expressions</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/python-target/"><span class="linkLabel_WmDU">Python/NumPy Target</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/assumptions/"><span class="linkLabel_WmDU">Assumptions</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/patterns-and-rules/"><span class="linkLabel_WmDU">Patterns and Rules</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/identities/"><span class="linkLabel_WmDU">Extended Rules — The Identities Library</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/logic/"><span class="linkLabel_WmDU">Logic and First-Order Logic</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item guide-icon"><a class="menu__link" tabindex="0" href="/compute-engine/guides/linear-algebra/"><span class="linkLabel_WmDU">Linear Algebra</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2"><hr></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item sdk-icon"><a class="menu__link" tabindex="0" href="/math-json/"><span class="linkLabel_WmDU">MathJSON Format</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item sdk-icon"><a class="menu__link" tabindex="0" href="/compute-engine/api/"><span class="linkLabel_WmDU">API Reference</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2"><hr></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item compass-icon"><a class="menu__link" tabindex="0" href="/compute-engine/standard-library/"><span class="linkLabel_WmDU">MathJSON Standard Library</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/arithmetic/"><span class="linkLabel_WmDU">Arithmetic</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/calculus/"><span class="linkLabel_WmDU">Calculus</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/collections/"><span class="linkLabel_WmDU">Collections</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/colors/"><span class="linkLabel_WmDU">Colors</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/complex/"><span class="linkLabel_WmDU">Complex</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/control-structures/"><span class="linkLabel_WmDU">Control Structures</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/core/"><span class="linkLabel_WmDU">Core</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/functions/"><span class="linkLabel_WmDU">Functions</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/linear-algebra/"><span class="linkLabel_WmDU">Linear Algebra</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/logic/"><span class="linkLabel_WmDU">Logic</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/sets/"><span class="linkLabel_WmDU">Sets</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/special-functions/"><span class="linkLabel_WmDU">Special Functions</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/statistics/"><span class="linkLabel_WmDU">Statistics</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/combinatorics/"><span class="linkLabel_WmDU">Combinatorics</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/number-theory/"><span class="linkLabel_WmDU">Number Theory</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/strings/"><span class="linkLabel_WmDU">Strings and Text</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/trigonometry/"><span class="linkLabel_WmDU">Trigonometry</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item reference-icon"><a class="menu__link" tabindex="0" href="/compute-engine/reference/units/"><span class="linkLabel_WmDU">Units and Quantities</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link"><span class="categoryLinkLabel_W154">Tutorials</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item tutorial-icon"><a class="menu__link" tabindex="0" href="/tutorials/simple-quiz/"><span class="linkLabel_WmDU">Simple Quiz</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/about/"><span class="categoryLinkLabel_W154">Additional Resources</span></a></div></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Compute Engine</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Compiling Expressions</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Compiling Expressions</h1></header><div class="intro_b9yo"><p>The Compute Engine can compile <strong>LaTeX expressions</strong> to <strong>JavaScript functions</strong>!</p></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no"></a></h2>
<p>Some expressions can take a long time to evaluate numerically, for example if
they contain a large number of terms or involve a loop $(\sum$ or
$\prod$).</p>
<p>In this case, it is useful to compile the expression into a JavaScript function
that can be evaluated much faster.</p>
<p>For example this approximation: <code class="language-math math-inline">\pi \approx \textstyle\sqrt{6\sum^{10^6}_{n=1}\frac{1}{n^2}}</code></p>
<code-playground><div slot="javascript">// import { parse, compile } from '@cortex-js/compute-engine';
<!-- -->const expr = parse("\\sqrt{6\\sum^{10^5}_{n=1}\\frac{1}{n^2}}");
<!-- -->
<!-- -->// Numerical evaluation using the Compute Engine
<!-- -->console.time('evaluate');
<!-- -->const evaluated = expr.evaluate();
<!-- -->console.timeEnd('evaluate');
<!-- -->console.log(evaluated.toString());
<!-- -->
<!-- -->// Compilation to a JavaScript function and execution
<!-- -->console.time('compile');
<!-- -->const result = compile(expr);
<!-- -->console.timeEnd('compile');
<!-- -->console.log(result.run?.());
</div></code-playground>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compiling">Compiling<a href="#compiling" class="hash-link" aria-label="Direct link to Compiling" title="Direct link to Compiling" translate="no"></a></h2>
<p><strong>To get a compiled version of an expression</strong> use the <code>compile()</code> function:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> f </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"2\\prod_{n=1}^{\\infty} \\frac{4n^2}{4n^2-1}"</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><br></div></code></pre></div></div>
<p><strong>To evaluate the compiled expression</strong> call the <code>run</code> method on the
<code>CompilationResult</code> returned by <code>compile()</code>:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ 3.141592653589793</span><br></div></code></pre></div></div>
<p>If the expression cannot be compiled, the <code>result.success</code> property will be
<code>false</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation-and-fallback-behavior">Validation and Fallback Behavior<a href="#validation-and-fallback-behavior" class="hash-link" aria-label="Direct link to Validation and Fallback Behavior" title="Direct link to Validation and Fallback Behavior" translate="no"></a></h3>
<p>Compilation APIs enforce runtime contracts to catch malformed extension payloads
early:</p>
<ul>
<li class=""><code>ce.registerCompilationTarget(name, target)</code> validates target names and
required <code>LanguageTarget</code> methods (<code>getOperators()</code>, <code>getFunctions()</code>,
<code>createTarget()</code>, <code>compile()</code>).</li>
<li class=""><code>compile(expr, options)</code> validates option payload shape for <code>to</code>, <code>target</code>,
<code>operators</code>, <code>functions</code>, <code>vars</code>, <code>imports</code>, <code>preamble</code>, <code>fallback</code>, and
<code>constantFold</code>.</li>
</ul>
<p>By default, <code>compile()</code> falls back to interpretation (<code>success: false</code> with a
<code>run</code> function). To disable fallback and fail fast, set <code>fallback: false</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="constant-folding">Constant Folding<a href="#constant-folding" class="hash-link" aria-label="Direct link to Constant Folding" title="Direct link to Constant Folding" translate="no"></a></h3>
<p>A <strong>pure</strong> subexpression with no free variables is evaluated at compile time
and emitted as a literal instead of being lowered structurally — on every
target:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">parse</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"\\mathrm{Sum}(\\mathrm{Take}(\\mathrm{Map}(\\_ \\mapsto \\_^2, 1..20), 10))"</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ "385"</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">parse</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"x + \\mathrm{Sum}(\\mathrm{Map}(\\_ \\mapsto \\_^2, 1..5))"</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ "_.x + 55"</span><br></div></code></pre></div></div>
<p>Numbers, booleans, and <strong>constant collections</strong> fold. A constant collection
becomes a literal list, which matters most when the collection is constant but
its consumer is not:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">box</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'At'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'Map'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'Function'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'Square'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'y'</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'y'</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'Range'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">6</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'k'</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ "_SYS.at([1, 4, 9, 16, 25, 36], _.k)"</span><br></div></code></pre></div></div>
<p>The index <code>k</code> is a run-time input, so the expression as a whole cannot fold —
but its base is baked once at compile time instead of being rebuilt and
mapped over on every call. Collection folding is bounded: it applies to a
<strong>finite, indexed</strong> collection (a <code>Set</code> has no defined element order, so it
never folds) of at most 50 <strong>numeric</strong> elements. A longer collection, or one
holding strings, tuples or nested collections, compiles structurally.</p>
<p>Folding declines — and the subtree compiles exactly as before — whenever any
of the following holds:</p>
<ul>
<li class="">the subtree is <strong>impure</strong> (<code>Random(…)</code> and friends keep drawing at run
time);</li>
<li class="">it mentions an <strong>unknown</strong>, a <strong><code>vars</code>-mapped input</strong> (even one with an
engine value — <code>vars</code> pins it live), or a name bound by an enclosing lambda
or loop;</li>
<li class="">it mentions an operator whose emission you overrode with the <code>functions</code> or
<code>operators</code> options (folding would evaluate the engine's definition, not
yours);</li>
<li class="">it contains a <code>Sum</code> or <code>Product</code> over a <strong>non-finite bound</strong> (<code>Σ i, i=1..∞</code>): for a divergent series the interpreter's numeric evaluation
silently returns an iteration-limit-truncated partial sum, and folding
would bake that wrong number as a constant — such expressions keep their
fail-closed structural behavior (a <em>bounded</em> infinite pipeline like
<code>Sum(Take(Map(_ ↦ _^2, 1..∞), 10))</code> still folds);</li>
<li class="">it is estimated to cost too much to evaluate at compile time, or exceeds
the engine's collection-size cap. The estimate is <strong>deterministic</strong> — it
reads the expression and nothing else, so the same input always compiles
to the same output, and folded code is safe to pin in a test. Constructs
that multiply work are priced by their counts: a <code>Sum</code> or <code>Product</code> by its
number of iterations, a <code>Map</code> or <code>Filter</code> by the size of its source. An
expression whose count cannot be determined statically is not folded —
though a bound supplied by a <em>consumer</em> still counts, which is why
<code>Sum(Take(Map(f, 1..∞), 10))</code> folds while <code>Sum(Map(f, 1..∞))</code> does not;</li>
<li class="">the compilation records a capture set (the <code>symbolDeps</code> option, used by the
engine's implicit-compilation cache): folding evaluates through engine
state transitively and would under-report the dependencies the cache is
keyed on, so such a compilation never folds.</li>
</ul>
<p>The folded value is the <strong>interpreter's</strong> (<code>.N()</code>), so a folded constant can
differ in the last ulp from what the structural code would have computed in a
different operation order — compiled output tracks <code>evaluate()</code> by design
(<code>sin(π/6)</code> compiles to <code>0.5</code>, not <code>Math.sin(Math.PI / 6)</code>, which is
<code>0.49999999999999994</code>).</p>
<p><strong>To disable folding</strong> — for example to inspect the structural lowering of a
constant expression — pass <code>constantFold: false</code>:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">expr</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">constantFold</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token boolean" style="color:var(--base-09)">false</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><br></div></code></pre></div></div>
<p>The interval-arithmetic target (<code>interval-js</code>) never constant-folds: a folded
point value would discard the outward-rounded enclosure that target exists to
compute.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-a-compilation-declined">Why a compilation declined<a href="#why-a-compilation-declined" class="hash-link" aria-label="Direct link to Why a compilation declined" title="Direct link to Why a compilation declined" translate="no"></a></h3>
<p>When <code>success</code> is <code>false</code>, <code>CompilationResult.error</code> carries the reason (the
same text the <code>fallback: false</code> path throws). The message identifies which of
three things happened:</p>
<table><thead><tr><th style="text-align:left">Message shape</th><th style="text-align:left">Meaning</th></tr></thead><tbody><tr><td style="text-align:left"><code>X: cannot compile — …</code> naming an operand or a component</td><td style="text-align:left">The head lowers, but not for these operand shapes (e.g. a collection-valued point component)</td></tr><tr><td style="text-align:left"><code>X: cannot compile — the operator is known … no lowering</code></td><td style="text-align:left">A target gap: the engine knows <code>X</code>, this target has no codegen for it</td></tr><tr><td style="text-align:left"><code>Unknown operator `X` </code></td><td style="text-align:left">No operator definition for <code>X</code> at all — a typo, or a symbol never declared as a function</td></tr></tbody></table>
<p><code>CompilationResult.unsupported</code> lists the same heads declaratively, so a caller
can branch on the condition without parsing the message.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="values-that-may-be-lists">Values That May Be Lists<a href="#values-that-may-be-lists" class="hash-link" aria-label="Direct link to Values That May Be Lists" title="Direct link to Values That May Be Lists" translate="no"></a></h3>
<p>An operand typed
<a class="" href="/compute-engine/guides/types/"><code>broadcastable<T></code></a> — a value that may be a
scalar or a list, such as the result of a call whose return type is
<code>unknown</code> — compiles differently per target:</p>
<ul>
<li class=""><strong>JavaScript</strong>: arithmetic and element-wise math functions compile through a
runtime broadcast helper. The same compiled artifact returns a scalar for a
scalar binding and the element-wise list for a list binding, matching the
interpreter.</li>
<li class="">Shapes that cannot be lowered soundly <strong>fail closed</strong> (a compilation error;
with the default fallback, the interpreter is used): a product of two or
more possibly-list operands (a run-time matrix would require the matrix
product, not an element-wise one), <code>Equal</code>/<code>NotEqual</code> over a possibly-list
operand, and complex-element broadcasts.</li>
<li class=""><strong>Python</strong>: arithmetic over a possibly-list operand always fails closed —
Python's <code>*</code> and <code>+</code> repeat or concatenate a plain <code>list</code> rather than
broadcasting, so scalar code would silently compute the wrong value.
Function heads that lower to NumPy calls (<code>np.sin</code>, …) are unaffected —
NumPy broadcasts natively.</li>
<li class=""><strong>GLSL/WGSL</strong>: such operands compile as scalar slots, unchanged — shader
targets have no dynamic lists.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="out-of-domain-operands-to-string-operators">Out-of-Domain Operands to String Operators<a href="#out-of-domain-operands-to-string-operators" class="hash-link" aria-label="Direct link to Out-of-Domain Operands to String Operators" title="Direct link to Out-of-Domain Operands to String Operators" translate="no"></a></h3>
<p>Several string operators take an operand whose domain the interpreter enforces
by returning an <strong>error value</strong>: <code>RangeOf</code>'s <code>from</code> (an integer of 1 or more)
and its needle (a non-empty sequence), <code>StringReplace</code>'s <code>target</code> (a non-empty
string) and <code>count</code> (a positive integer), <code>StringRepeat</code>'s <code>n</code> (a non-negative
integer), and <code>PadStart</code>/<code>PadEnd</code>'s <code>n</code> (a non-negative integer) and <code>pad</code> (a
non-empty string). Compiled code has no representation for an error value, so
each of those operands takes one of three routes.</p>
<p><strong>A valid literal compiles bare.</strong> The check happens once, at compile time, and
nothing is emitted for it:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">box</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'PadStart'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'s'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">5</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">str</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'0'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ '_SYS.spad(_.s, 5, "0", true)'</span><br></div></code></pre></div></div>
<p><strong>An invalid literal declines to compile</strong>, and so does a computed operand the
engine can already <em>prove</em> out of domain (<code>Negate(k)</code> for a <code>k</code> known positive,
a symbol assigned <code>""</code>). The result is <code>success: false</code> with a message naming
the operator and the rule; with the default fallback the interpreter runs the
expression instead, and returns its error value:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> r </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">box</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'PadStart'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'s'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">-</span><span class="token number" style="color:var(--base-09)">1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">str</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'0'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">r</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">success</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ false</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">r</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">error</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ "PadStart: cannot compile — `n` must be a non-negative integer of at most</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// 1000000, and this operand is the literal `-1`, which the interpreter</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// answers with an error value. Fail closed (D6)."</span><br></div></code></pre></div></div>
<p>This is the first row of the <a href="#why-a-compilation-declined" class="">decline table</a> — the
head lowers, just not for this operand — so it is reported in <code>error</code> only;
<code>CompilationResult.unsupported</code> stays empty, because <code>PadStart</code> itself is not a
target gap.</p>
<p><strong>A computed operand compiles and is guarded at run time.</strong> The emitted code
carries a domain check that <strong>throws a <code>RangeError</code></strong> naming the operator and
the rule when the value turns out to be out of domain:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">declare</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">'s'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'string'</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">declare</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">'w'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'integer'</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> p </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">box</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'PadStart'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'s'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'w'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">str</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'0'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">p</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ '_SYS.spad(_.s, _SYS.domi(_.w, 0, 1000000, "PadStart: `n` must be a</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// non-negative integer of at most 1000000"), "0", true)'</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">p</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">s</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'7'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">w</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">5</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ "00007"</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">p</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">s</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'7'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">w</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">-</span><span class="token number" style="color:var(--base-09)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ throws RangeError: PadStart: `n` must be a non-negative integer of at</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// most 1000000</span><br></div></code></pre></div></div>
<p>Throwing is the deliberate divergence. The interpreter answers an out-of-domain
operand with an error value; a compiled artifact returns a plain JavaScript
value and cannot carry one, so it fails loudly rather than returning a wrong
answer. <code>Slice</code> in the same target already sets that precedent — a non-literal
span argument compiles and the emitted code throws
<code>RangeError: Slice: the span argument is not an ascending index range at run time</code>.</p>
<p>The upper bound in those messages is not arbitrary. The interpreter reads these
counts with <code>asSmallInteger</code>, which answers <code>null</code> — hence an error value —
above <strong>1 000 000</strong>, so the compiled guard uses the same ceiling; without it
<code>StringRepeat(s, 2000001)</code> would build a multi-megabyte string where the
interpreter errors. <code>RangeOf</code>'s <code>from</code> is the exception: it is read with
<code>toInteger</code>, which has no ceiling, so a large <code>from</code> is not an error at all —
just a search that starts past the end and answers <code>Nothing</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="implicit-compilation-and-the-jit-setting">Implicit Compilation and the <code>jit</code> Setting<a href="#implicit-compilation-and-the-jit-setting" class="hash-link" aria-label="Direct link to implicit-compilation-and-the-jit-setting" title="Direct link to implicit-compilation-and-the-jit-setting" translate="no"></a></h2>
<p>Beyond explicit <code>compile()</code> calls, the engine <strong>compiles automatically</strong> in a
number of implicit spots — for example when draining a large numeric <code>Map</code>,
or when an exact integer computation over a large collection is provably safe
to run in floating point. This is transparent: results are identical to the
interpreter's, and any compilation failure silently falls back to
interpretation.</p>
<p>The <code>jit</code> property of a <code>ComputeEngine</code> instance controls this behavior:</p>
<ul>
<li class=""><strong><code>"auto"</code></strong> (the default): implicit compilation is attempted where
beneficial. If the environment forbids code generation altogether (a
strict Content-Security-Policy page without <code>'unsafe-eval'</code>, an MV3
browser extension), the engine detects this on the first attempt and
latches to <code>"off"</code> engine-wide, so at most one CSP violation is reported.</li>
<li class=""><strong><code>"off"</code></strong>: no implicit code generation is ever attempted; every implicit
path uses the interpreter. Set it up front on hardened runtimes, or use it
as a diagnostic kill switch to compare interpreter and compiled behavior.</li>
</ul>
<p>Explicit <code>compile()</code> calls are not affected by this setting — a direct
request keeps failing loudly with the environment's own error.</p>
<p>Toggling <code>jit</code> is an engine-configuration change: caches whose entries were
produced on the other route are invalidated, so <code>jit = "off"</code> genuinely
re-runs the interpreter rather than serving previously compiled results.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-can-be-compiled">What Can Be Compiled<a href="#what-can-be-compiled" class="hash-link" aria-label="Direct link to What Can Be Compiled" title="Direct link to What Can Be Compiled" translate="no"></a></h2>
<p>Three kinds of expressions can be compiled, and each produces a <code>run</code> function
with a different calling convention.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="plain-expressions">Plain Expressions<a href="#plain-expressions" class="hash-link" aria-label="Direct link to Plain Expressions" title="Direct link to Plain Expressions" translate="no"></a></h3>
<p>A plain expression like <code>x^2 + 1</code> has free variables (unknowns). The compiled
<code>run</code> function takes a <strong>vars object</strong> mapping variable names to values:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->const f = compile("n^2");
<!-- -->
<!-- -->for (let i = 1; i < 10; i++) console.log(f.run({ n: i }));
</div></code-playground>
<p>An expression with no unknowns can be called with no arguments:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->console.log(compile("\\sqrt{6\\sum^{100}_{n=1}\\frac{1}{n^2}}").run());
<!-- -->// ➔ 3.1320...
</div></code-playground>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="lambda-expressions">Lambda Expressions<a href="#lambda-expressions" class="hash-link" aria-label="Direct link to Lambda Expressions" title="Direct link to Lambda Expressions" translate="no"></a></h3>
<p>A lambda expression uses <code class="language-math math-inline">\mapsto</code> (<code>\mapsto</code>) to explicitly declare
parameters. The compiled <code>run</code> function takes <strong>positional arguments</strong>:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->// Single parameter
<!-- -->const f = compile("x \\mapsto x^2 + 1");
<!-- -->console.log(f.run(3));
<!-- -->// ➔ 10
<!-- -->
<!-- -->// Multiple parameters
<!-- -->const g = compile("(x, y) \\mapsto x^2 + y^2");
<!-- -->console.log(g.run(3, 4));
<!-- -->// ➔ 25
</div></code-playground>
<p>Lambdas are useful when the variable name is user-specified rather than assumed
by convention. A lambda like <code>\theta \mapsto 1 + \cos(\theta)</code> makes the
parameter explicit, avoiding ambiguity.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tuple-expressions">Tuple Expressions<a href="#tuple-expressions" class="hash-link" aria-label="Direct link to Tuple Expressions" title="Direct link to Tuple Expressions" translate="no"></a></h3>
<p>A tuple expression like <code>(\cos(t), \sin(t))</code> compiles to a function that returns
a JavaScript array:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->const f = compile("(\\cos(t), \\sin(t))");
<!-- -->
<!-- -->const [x, y] = f.run({ t: Math.PI / 5 });
<!-- -->console.log(x, y);
</div></code-playground>
<p>This is particularly useful for parametric curves. Both <code>Tuple</code> and <code>List</code>
expressions compile to arrays.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-structures">Control Structures<a href="#control-structures" class="hash-link" aria-label="Direct link to Control Structures" title="Direct link to Control Structures" translate="no"></a></h3>
<p>Control structures such as conditionals, loops, and blocks can be compiled to
JavaScript.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="if-and-which-conditionals"><code>If</code> and <code>Which</code> (Conditionals)<a href="#if-and-which-conditionals" class="hash-link" aria-label="Direct link to if-and-which-conditionals" title="Direct link to if-and-which-conditionals" translate="no"></a></h4>
<p><code>If</code> expressions compile to ternary operators and <code>Which</code> expressions (used by
<code>\begin{cases}</code>) compile to chained ternaries:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->// If expression
<!-- -->const f = compile("\\keyword{if} x > 0 \\keyword{then} x \\keyword{else} -x");
<!-- -->console.log(f.run({ x: -5 }));
<!-- -->// ➔ 5
<!-- -->
<!-- -->// Which / cases expression
<!-- -->const g = compile("\\begin{cases} x^2 & x > 0 \\\\ -x & x < 0 \\\\ 0 \\end{cases}");
<!-- -->console.log(g.run({ x: 3 }));
<!-- -->// ➔ 9
</div></code-playground>
<p>When no condition matches, compiled <code>Which</code> returns <code>NaN</code>. The interpreter
answers <code>Missing</code> for the same input — the absence marker has no value in the
target's floating-point model, so it projects to <code>NaN</code>. See
<a href="#non-finite-results" class="">Non-Finite Results</a>.</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->// No clause covers x = 0, and there is no fallback clause
<!-- -->const h = compile("\\begin{cases} x^2 & x > 0 \\\\ -x & x < 0 \\end{cases}");
<!-- -->console.log(h.run({ x: 0 }));
<!-- -->// ➔ NaN
</div></code-playground>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sum-and-product"><code>Sum</code> and <code>Product</code><a href="#sum-and-product" class="hash-link" aria-label="Direct link to sum-and-product" title="Direct link to sum-and-product" translate="no"></a></h4>
<p><code>Sum</code> and <code>Product</code> with numeric bounds compile to <code>for</code> loops with accumulator
variables:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->// Fourier approximation
<!-- -->const f = compile("\\sum_{k=0}^{5} \\frac{\\sin((2k+1)x)}{2k+1}");
<!-- -->console.log(f.run({ x: 1.0 }));
</div></code-playground>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="loop-break-continue-return"><code>Loop</code>, <code>Break</code>, <code>Continue</code>, <code>Return</code><a href="#loop-break-continue-return" class="hash-link" aria-label="Direct link to loop-break-continue-return" title="Direct link to loop-break-continue-return" translate="no"></a></h4>
<p><code>Loop</code> is imperative control flow, compiled for effect: bare <code>Loop(body)</code>
compiles to a JavaScript <code>while (true) { ... }</code> loop, and <code>Loop(body, Element(...), ...)</code> compiles to plain <code>for</code>/<code>for-of</code> loops with no result
collection — the compiled expression's value is <code>undefined</code>. <code>Break</code>,
<code>Continue</code>, and <code>Return</code> compile to their JavaScript equivalents:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->const f = compile("\\keyword{for} i \\keyword{from} 1 \\keyword{to} 10 \\keyword{do} i^2");
<!-- -->console.log(f.run());
<!-- -->// ➔ undefined (Loop is evaluated for effect)
</div></code-playground>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="comprehension"><code>Comprehension</code><a href="#comprehension" class="hash-link" aria-label="Direct link to comprehension" title="Direct link to comprehension" translate="no"></a></h4>
<p><code>Comprehension</code> compiles to nested <code>for (const x of ...)</code> loops that push
each computed value into a result array, which is returned:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->const f = compile("x^2 \\keyword{for} x = [1...5]");
<!-- -->console.log(f.run());
<!-- -->// ➔ [1, 4, 9, 16, 25]
</div></code-playground>
<p><code>Comprehension</code> is not compilable to GLSL or WGSL (shaders have no dynamic
arrays). Imperative <code>Loop</code> is still compilable to GLSL/WGSL.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-statement-constructs-on-the-shader-targets">Multi-statement constructs on the shader targets<a href="#multi-statement-constructs-on-the-shader-targets" class="hash-link" aria-label="Direct link to Multi-statement constructs on the shader targets" title="Direct link to Multi-statement constructs on the shader targets" translate="no"></a></h4>
<p>A shader has no expression-level loop or IIFE, so on GLSL and WGSL a <code>Sum</code> or
<code>Product</code> with a symbolic bound is emitted as <strong>statements</strong> (with constant
bounds it unrolls into an ordinary expression instead). Such a loop is hoisted
ahead of the value that consumes it, so it can appear anywhere in an
expression — <code>0.03\sum_{k=0}^{n}kx</code> compiles, and a nested sum is hoisted into
its enclosing loop body rather than out of it.</p>
<p>A loop inside a <strong>conditionally-evaluated branch</strong> — an <code>If</code>, <code>When</code>, <code>Which</code> or
<code>Match</code> arm — fails closed (<code>success: false</code>) instead. A shader conditional is
an expression, not a statement, so there is no place to put the loop inside the
branch; hoisting it out would run it whichever branch is selected, which changes
the result whenever the branch draws from the random stream.</p>
<p><code>Loop</code> and <code>Block</code> are not hoisted either — they remain valid only as a whole
function body, and fail closed when used as a sub-expression.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="block-and-where"><code>Block</code> and <code>where</code><a href="#block-and-where" class="hash-link" aria-label="Direct link to block-and-where" title="Direct link to block-and-where" translate="no"></a></h4>
<p><code>Block</code> expressions create scoped variable bindings. The <code>where</code> syntax provides
a convenient way to define local variables:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->const f = compile("r^2 \\text{ where } r \\coloneq x^2 + y^2");
<!-- -->console.log(f.run({ x: 3, y: 4 }));
<!-- -->// ➔ 625
</div></code-playground>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="variable-names">Variable Names<a href="#variable-names" class="hash-link" aria-label="Direct link to Variable Names" title="Direct link to Variable Names" translate="no"></a></h2>
<p>The compiled function expects variable names as they appear in the parsed
MathJSON expression. Greek letters become their English names:</p>
<table><thead><tr><th>LaTeX</th><th>Variable Name</th></tr></thead><tbody><tr><td><code>x</code>, <code>y</code></td><td><code>"x"</code>, <code>"y"</code></td></tr><tr><td><code>t</code></td><td><code>"t"</code></td></tr><tr><td><code>\theta</code></td><td><code>"theta"</code></td></tr><tr><td><code>\alpha</code></td><td><code>"alpha"</code></td></tr><tr><td><code>u</code>, <code>v</code></td><td><code>"u"</code>, <code>"v"</code></td></tr></tbody></table>
<p>Use the wrong name and you'll get <code>NaN</code> silently:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> f </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"1 + \\cos(\\theta)"</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">f</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">theta</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0.5</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// ✓ correct → 1.8776</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">f</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">x</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0.5</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// ✗ wrong key — returns NaN</span><br></div></code></pre></div></div>
<p><strong>To discover the variable names</strong> in an expression, use <code>expr.unknowns</code> (or
its alias <code>expr.freeVariables</code>). These properties return only the free
variables — symbols that are not constants, operators, or bound by scoping
constructs like <code>Sum</code> or <code>Product</code>:</p>
<code-playground><div slot="javascript">console.log(parse("n^2").unknowns);
<!-- -->
<!-- -->console.log(parse("a^2+b^3").unknowns);
<!-- -->
<!-- -->console.log(parse("\\sin(\\theta)").unknowns);
</div></code-playground>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="complex-numbers">Complex Numbers<a href="#complex-numbers" class="hash-link" aria-label="Direct link to Complex Numbers" title="Direct link to Complex Numbers" translate="no"></a></h2>
<p>The JavaScript target has full complex arithmetic support. When the compiler
detects that a subexpression involves complex values, it automatically emits
complex-aware code for all operations touching that subexpression.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-complex-arithmetic-is-used">When Complex Arithmetic Is Used<a href="#when-complex-arithmetic-is-used" class="hash-link" aria-label="Direct link to When Complex Arithmetic Is Used" title="Direct link to When Complex Arithmetic Is Used" translate="no"></a></h3>
<p>The compiler decides at compile time whether each subexpression is
complex-valued. This happens when:</p>
<ul>
<li class="">The expression contains <code>i</code> (<code>ImaginaryUnit</code>)</li>
<li class="">A symbol has been declared with a complex type</li>
<li class="">An operation is applied to a complex-valued operand</li>
</ul>
<p>The detection is <strong>static</strong> — based on the expression's structure, not on
runtime values. So <code>\sqrt{x}</code> compiles to real <code>Math.sqrt</code> because <code>x</code> has no
declared complex type, even though <code>Math.sqrt(-1)</code> returns <code>NaN</code> at runtime.</p>
<p>To get complex results from <code>\sqrt{x}</code>, you'd need to make the expression
explicitly complex, e.g., <code>\sqrt{x + 0i}</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="result-format">Result Format<a href="#result-format" class="hash-link" aria-label="Direct link to Result Format" title="Direct link to Result Format" translate="no"></a></h3>
<p>When an expression <em>is</em> complex-valued, the compiled <code>run</code> function returns a
<code>{ re: number, im: number }</code> object instead of a plain number:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->// Explicit complex expression — compiler knows it's complex
<!-- -->const f = compile("(1 + 2i)^2");
<!-- -->console.log(f.run());
<!-- -->// ➔ { re: -3, im: 4 }
</div></code-playground>
<p>Complex-aware operations include all the standard arithmetic (<code>+</code>, <code>-</code>, <code>*</code>,
<code>/</code>), trigonometric functions (<code>sin</code>, <code>cos</code>, <code>tan</code>, and their inverses and
hyperbolic variants), <code>exp</code>, <code>ln</code>, <code>sqrt</code>, <code>pow</code>, <code>abs</code>, <code>arg</code>, <code>conjugate</code>,
<code>Re</code>, and <code>Im</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="extracting-real-and-imaginary-parts">Extracting Real and Imaginary Parts<a href="#extracting-real-and-imaginary-parts" class="hash-link" aria-label="Direct link to Extracting Real and Imaginary Parts" title="Direct link to Extracting Real and Imaginary Parts" translate="no"></a></h3>
<p>Use <code>Re</code> and <code>Im</code> to extract components from a complex expression:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->const f = compile("\\Re((1 + 2i)^2)");
<!-- -->console.log(f.run());
<!-- -->// ➔ -3 (a plain number, not an object)
</div></code-playground>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mixing-real-and-complex-operands">Mixing Real and Complex Operands<a href="#mixing-real-and-complex-operands" class="hash-link" aria-label="Direct link to Mixing Real and Complex Operands" title="Direct link to Mixing Real and Complex Operands" translate="no"></a></h3>
<p>When a complex operand is combined with a real operand, the result is complex:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->const f = compile("x + 2i");
<!-- -->console.log(f.run({ x: 3 }));
<!-- -->// ➔ { re: 3, im: 2 }
</div></code-playground>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="glsl-target">GLSL Target<a href="#glsl-target" class="hash-link" aria-label="Direct link to GLSL Target" title="Direct link to GLSL Target" translate="no"></a></h3>
<p>The GLSL target also supports complex arithmetic, but represents complex numbers
as <code>vec2</code> values — the <code>.x</code> component is the real part, <code>.y</code> is the imaginary
part:</p>
<div class="language-glsl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-glsl codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token plain">// Complex literal: 3 + 4i</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">vec2(3.0, 4.0)</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">// Imaginary unit</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">vec2(0.0, 1.0)</span><br></div></code></pre></div></div>
<p>Simple operations like addition, subtraction, negation, and scalar multiplication
use native <code>vec2</code> operations. More involved operations — complex multiplication,
division, exponentiation, and transcendentals — use helper functions emitted in
a <strong>preamble</strong> block:</p>
<table><thead><tr><th>Operation</th><th>GLSL Helper</th></tr></thead><tbody><tr><td><code>z * w</code></td><td><code>_gpu_cmul(z, w)</code></td></tr><tr><td><code>z / w</code></td><td><code>_gpu_cdiv(z, w)</code></td></tr><tr><td><code>z ^ w</code></td><td><code>_gpu_cpow(z, w)</code></td></tr><tr><td><code>sqrt(z)</code></td><td><code>_gpu_csqrt(z)</code></td></tr><tr><td><code>exp(z)</code></td><td><code>_gpu_cexp(z)</code></td></tr><tr><td><code>ln(z)</code></td><td><code>_gpu_cln(z)</code></td></tr></tbody></table>
<p>The preamble is <strong>dependency-aware</strong>: each helper declares its prerequisites
(e.g., <code>_gpu_cpow</code> depends on <code>_gpu_cexp</code>, <code>_gpu_cmul</code>, and <code>_gpu_cln</code>), and
only the needed functions are emitted in topological order. If the expression is
purely real, no preamble is generated.</p>
<p>Component extraction maps to native swizzle operations:</p>
<div class="language-glsl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-glsl codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token plain">Re(z) → (z).x</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">Im(z) → (z).y</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">Abs(z) → length(z) // built-in</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">Arg(z) → atan(z.y, z.x)</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">Conjugate(z) → vec2(z.x, -z.y)</span><br></div></code></pre></div></div>
<p>The same complex value analysis used by the JavaScript target determines
whether each subexpression needs complex or real code paths in GLSL.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="result-convention">Result Convention<a href="#result-convention" class="hash-link" aria-label="Direct link to Result Convention" title="Direct link to Result Convention" translate="no"></a></h3>
<p>A compiled JavaScript unit returns a real value as a plain <code>number</code> and a
non-real value as <code>{ re, im }</code> — and both directions are guaranteed at the
<code>run()</code> boundary: a value whose imaginary part is <strong>exactly</strong> zero comes back
as a <code>number</code>, and a returned <code>{ re, im }</code> always has <code>im !== 0</code>. So a
consumer's per-sample test is the single <code>typeof v === 'number'</code>, and a
<code>{ re, im }</code> with a non-zero imaginary part tells "outside the real domain"
from a genuine <code>NaN</code>. Booleans are never coerced.</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->console.log(compile("(1 + 0i) * 5").run()); // 5 (a plain number)
<!-- -->console.log(compile("\\sqrt{x}").run({ x: 4 })); // 2
<!-- -->console.log(compile("\\sqrt{x}").run({ x: -1 })); // { re: 0, im: 1 }
</div></code-playground>
<p>The transcendental complex kernels chop their own roundoff dust at the
machine scale (as the interpreter does), which is what lets the boundary test
be exact: <code>arcsin(0.5)</code> compiled through the complex kernel is the number
<code>0.5235…</code>, while <code>1 + 10^{-12} i</code> stays <code>{ re: 1, im: 1e-12 }</code> — nothing is
chopped in ring arithmetic.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="non-finite-results">Non-Finite Results<a href="#non-finite-results" class="hash-link" aria-label="Direct link to Non-Finite Results" title="Direct link to Non-Finite Results" translate="no"></a></h3>
<p>The engine distinguishes three kinds of non-finite number — the signed
infinities <code class="language-math math-inline">+\infty</code> and <code class="language-math math-inline">-\infty</code>, complex infinity <code class="language-math math-inline">\tilde\infty</code>, and <code>NaN</code>.
A floating-point target has only two: IEEE <code>Infinity</code>/<code>-Infinity</code> and <code>NaN</code>.
Compiled code therefore reports a <strong>projection</strong> of the interpreted answer, and
the two agree everywhere except at the direction-less infinity.</p>
<p>The signed infinities and <code>NaN</code> round-trip. <code>\ln(0)</code> is <code class="language-math math-inline">-\infty</code> interpreted
and <code>-Infinity</code> compiled; a <code>NaN</code> argument stays <code>NaN</code> through a compiled
numeric head, exactly as it does through <code>evaluate()</code>:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->console.log(compile("\\ln(x)").run({ x: 0 }));
<!-- -->// ➔ -Infinity
<!-- -->
<!-- -->console.log(compile("\\mathrm{Heaviside}(x)").run({ x: NaN }));
<!-- -->// ➔ NaN
</div></code-playground>
<p>Complex infinity has no distinct floating-point value, so a pole projects onto
the positive infinity. Interpreting <code class="language-math math-inline">1/0</code> gives <code class="language-math math-inline">\tilde\infty</code>, which carries no
direction; the compiled unit answers <code>Infinity</code>, and <code>-Infinity</code> for the
negative-zero approach that IEEE arithmetic does distinguish:</p>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->const f = compile("\\frac{1}{x}");
<!-- -->console.log(f.run({ x: 0 })); // ➔ Infinity
<!-- -->console.log(f.run({ x: -0 })); // ➔ -Infinity
</div></code-playground>
<p>Absence markers project the same way. <code>Missing</code> — what an unmatched <code>Which</code>
returns — is not a number, so the chained ternary ends in a literal <code>NaN</code> (see
<a href="#if-and-which-conditionals" class=""><code>If</code> and <code>Which</code></a>). The same value reaches <code>run()</code>
when the expression was never compiled at all: an else-less <code>If</code> declines and
falls back to interpretation, and its <code>Missing</code> crosses the boundary as <code>NaN</code>
too.</p>
<p><strong>Type guards follow the finite-by-default lattice.</strong> Every bare numeric type
name denotes a <strong>finite</strong> value, so the guard a compiled parameter test emits
rejects <code>Infinity</code> and <code>NaN</code> exactly as the interpreter's signature check does:
<code>real</code> lowers to <code>Number.isFinite</code>, <code>integer</code> to <code>Number.isInteger</code>, and
<code>complex</code> to a test that a plain number is finite or that both parts of a
<code>{ re, im }</code> pair are. <code>+oo | -oo</code> — the signed pair — is the guard for
the infinities.</p>
<p>The <code>infinity</code> and <code>nan</code> tiers have no faithful test in the target's value
model, because the projection above is lossy in exactly the place those tiers
distinguish. A definition whose parameters use either one therefore <strong>declines
as a whole</strong> and runs interpreted, rather than dispatching on a test that would
disagree with <code>evaluate()</code>. This is the usual fail-closed posture for a
construct the target cannot represent.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="modes-auto-strict-complex">Modes: <code>auto</code>, <code>strict</code>, <code>complex</code><a href="#modes-auto-strict-complex" class="hash-link" aria-label="Direct link to modes-auto-strict-complex" title="Direct link to modes-auto-strict-complex" translate="no"></a></h3>
<p>JavaScript has no complex number: a compiled value is a <code>number</code> or a
<code>{ re, im }</code> object, and the compiler decides which <strong>statically, per node</strong>.
What a compile <strong>mode</strong> fixes is what a numeric binding whose static type is
<strong>wide</strong> (<code>unknown</code>, <code>number</code>, an unannotated parameter, a <code>Block</code> local not
declared real) is shaped as — and what happens when a complex-shaped value
reaches one:</p>
<ul>
<li class=""><strong><code>strict</code></strong> — the shader targets' model, on every target: shape follows the
static type. A <code>complex</code>-typed value, a <code>Complex(…)</code> literal, <code>i</code>, and a
radical of a <strong>provably</strong> negative operand are complex-shaped; a wide
binding is real; nothing promotes (<code>√x</code> at <code>x = −1</code> is <code>NaN</code>, as
<code>Math.sqrt</code> gives); and a complex-shaped value meeting a wide binding —
<code>b(z)</code> for <code>b(x) := 2x</code> and <code>z: complex</code> — <strong>fails closed</strong> with a
<code>LaneMismatch</code> decline naming the binding to declare complex. This is
today's real-kernel codegen byte for byte, plus that decline class.</li>
<li class=""><strong><code>complex</code></strong> — a wide binding is complex, lifted at its use; unknown-sign
radicals promote; user functions are emitted once. Always sound, only
slower (~2.3× on affected chains).</li>
<li class=""><strong><code>auto</code></strong> (the default on <code>javascript</code> and <code>python</code>) — <code>strict</code> shapes plus
<strong>promotion</strong>: an unknown-sign <code>Sqrt</code>/<code>Ln</code>/<code>Log</code>, and <code>x^{0.3}</code>-style
powers (a non-integer number exponent of an unknown-sign base), lower
through the complex kernels so the compiled value matches <code>evaluate()</code>; and
if — and only if — a promoted or typed complex value reaches a wide binding,
the compilation is redone <strong>once</strong> in <code>complex</code> mode. Nothing else
escalates. Radicals whose operand is non-negative under the compiler's own
"wide is real" premise — <code>√(x² + y²)</code>, <code>√((x−a)² + (y−b)²)</code>, <code>√|x|</code>,
<code>ln(x²)</code> — keep the real kernel and cost nothing.</li>
</ul>
<code-playground><div slot="javascript">// import { ComputeEngine, compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->const ce = new ComputeEngine();
<!-- -->ce.parse("z(t) \\coloneq \\sqrt{t-1}").evaluate();
<!-- -->
<!-- -->// Interpreted — promotes to complex, then |·| brings it back to a real
<!-- -->ce.assign("t", 0.3);
<!-- -->console.log(ce.parse("|z(t)/2 - 1|").N().toString()); // 1.08397416943394
<!-- -->
<!-- -->// Compiled, by default (`auto`) — the same value; the radical was PROMOTED
<!-- -->const r = compile(ce.parse("|z(t)/2 - 1|"));
<!-- -->console.log(r.run({ t: 0.3 }), r.mode, r.promoted); // 1.08397416943394 "strict" true
<!-- -->
<!-- -->// `strict` — today's real kernel, NaN
<!-- -->console.log(compile(ce.parse("|z(t)/2 - 1|"), { mode: "strict" }).run({ t: 0.3 })); // NaN
</div></code-playground>
<p>Every result reports what was used, so a consumer can tell "this row would
not be real on the shader lane" without guessing:</p>
<ul>
<li class=""><code>result.mode</code> — <code>'strict'</code> or <code>'complex'</code>, the discipline the code was
compiled under (<code>auto</code> reports the attempt that produced the code);</li>
<li class=""><code>result.promoted</code> — whether a promotable head was lowered through a complex
kernel; a compile-time fact decided from the source, so the same source
always reports the same flag;</li>
<li class=""><code>result.escalation</code> — under <code>auto</code>, the <code>LaneMismatch</code> diagnostic of the
strict attempt when the compilation was redone in complex mode
(<code>boundary</code>, a user-legible <code>binding</code> such as "the parameter <code>x</code> of <code>b</code>",
and the offending <code>value</code>);</li>
<li class=""><code>result.diagnostic</code> — on any decline, the structured form of <code>error</code>
(<code>code</code>, <code>kind: 'capability' | 'correctness'</code>, <code>message</code>, and the
lane-mismatch payload above).</li>
</ul>
<p>Ordering comparisons and the real-only heads (<code>Floor</code>, <code>Mod</code>, <code>Max</code>, <code>Erf</code>,
…) over a value that <strong>may</strong> be complex — a <code>complex</code>-typed symbol, a promoted
radical — compile under <code>auto</code> and <code>complex</code> with a <strong>runtime rule</strong>: the
operand is bound once, and the comparison is <code>false</code> / the head <code>NaN</code> when the
value's imaginary part is not exactly zero (<code>z < 2</code> is <code>true</code> at <code>z = 1</code>,
<code>false</code> at <code>z = i</code>; <code>y > √x</code> compiles and is <code>false</code> where <code>x < 0</code>). A
<strong>statically</strong> non-real operand (<code>i < 2</code>, <code>Floor(2i)</code>) has no compiled value
and is a compile-time decline in every mode; <code>strict</code> declines every complex
operand of such a head, as before.</p>
<p>The single most effective lever is not a mode: <strong>declare the narrowest type
you can.</strong> A symbol declared <code>real</code> is never a wide binding — <code>2a + 1</code>,
<code>b(a)</code>, <code>a < 3</code> stay on the real kernel in every setting (its unknown-sign
radical still promotes under <code>auto</code>, because promotion is about sign, not
wideness); a symbol declared <code>complex</code> is complex-shaped in every setting and
never a mismatch. <code>mode</code> is per compilation, on <code>CompileTarget</code> (the target
default) or on <code>compile()</code>'s options; a mode a target does not offer
(<code>complex</code> on <code>glsl</code>) is a <code>capability</code> decline, never a silent coercion. The
shader targets and <code>interval-js</code> offer <code>strict</code> only.</p>
<blockquote>
<p><strong>Deprecated:</strong> <code>complexPromotion: true</code> maps to <code>mode: 'complex'</code> (a
console warning, once), and is ignored on a target without complex mode.
Since <code>auto</code> already promotes, most callers can simply drop it.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-operators">Custom Operators<a href="#custom-operators" class="hash-link" aria-label="Direct link to Custom Operators" title="Direct link to Custom Operators" translate="no"></a></h2>
<p>By default, operators like <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code> compile to their JavaScript equivalents. However, you can override operators to use custom function calls instead. This is particularly useful for:</p>
<ul>
<li class=""><strong>Vector and matrix operations</strong> - where <code>[1,2,3] + [4,5,6]</code> should call a custom <code>add()</code> function</li>
<li class=""><strong>Custom domain-specific languages</strong> - where operations have specialized semantics</li>
<li class=""><strong>Type-specific operations</strong> - where the same operator behaves differently for different types</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="basic-usage">Basic Usage<a href="#basic-usage" class="hash-link" aria-label="Direct link to Basic Usage" title="Direct link to Basic Usage" translate="no"></a></h3>
<p>Override operators by passing an <code>operators</code> option to <code>compile()</code>:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> result </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"v + w"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">operators</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Add</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'add'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">11</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// Convert + to add() function</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Multiply</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'mul'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">12</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// Convert * to mul() function</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">functions</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">add</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">a</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> b</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> a</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">map</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">v</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> v </span><span class="token operator" style="color:var(--base-06)">+</span><span class="token plain"> b</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">mul</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">a</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> b</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> a</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">map</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">v</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> v </span><span class="token operator" style="color:var(--base-06)">*</span><span class="token plain"> b</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> value </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">v</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token number" style="color:var(--base-09)">1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">2</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">3</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">w</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token number" style="color:var(--base-09)">4</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">5</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">6</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">value</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ [5, 7, 9]</span><br></div></code></pre></div></div>
<p>The operator override format is <code>[functionName, precedence]</code>:</p>
<ul>
<li class=""><strong>functionName</strong>: The name of the function to call (alphanumeric identifier)</li>
<li class=""><strong>precedence</strong>: Numeric precedence level (higher = tighter binding)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="function-based-overrides">Function-Based Overrides<a href="#function-based-overrides" class="hash-link" aria-label="Direct link to Function-Based Overrides" title="Direct link to Function-Based Overrides" translate="no"></a></h3>
<p>You can also use a function to conditionally override operators:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> result </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"v + w"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">operators</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">op</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// Only override Add, let other operators use defaults</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">op </span><span class="token operator" style="color:var(--base-06)">===</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'Add'</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'vectorAdd'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">11</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">undefined</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">functions</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">vectorAdd</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">a</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> b</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> a</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">map</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">v</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> v </span><span class="token operator" style="color:var(--base-06)">+</span><span class="token plain"> b</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="complex-expressions">Complex Expressions<a href="#complex-expressions" class="hash-link" aria-label="Direct link to Complex Expressions" title="Direct link to Complex Expressions" translate="no"></a></h3>
<p>Operator overrides work with complex nested expressions:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> result </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"(a + b) * c"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">operators</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Add</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'add'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">11</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Multiply</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'mul'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">12</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">functions</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">add</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">a</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> b</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> a</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">map</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">v</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> v </span><span class="token operator" style="color:var(--base-06)">+</span><span class="token plain"> b</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">mul</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">a</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> b</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> a</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">map</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">v</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> i</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> v </span><span class="token operator" style="color:var(--base-06)">*</span><span class="token plain"> b</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">i</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> value </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">a</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token number" style="color:var(--base-09)">1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">2</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">3</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">b</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token number" style="color:var(--base-09)">4</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">5</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">6</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">c</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token number" style="color:var(--base-09)">2</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">2</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">2</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">value</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// ➔ [10, 14, 18] // (a + b) * c = ([1,2,3] + [4,5,6]) * [2,2,2]</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="important-notes">Important Notes<a href="#important-notes" class="hash-link" aria-label="Direct link to Important Notes" title="Direct link to Important Notes" translate="no"></a></h3>
<p><strong>Canonical Form</strong>: Expressions are canonicalized before compilation, which may affect operator usage:</p>
<ul>
<li class="">Subtraction <code>a - b</code> is canonicalized to <code>Add(a, Negate(b))</code></li>
<li class="">To handle subtraction with custom operations, override both <code>Add</code> and <code>Negate</code></li>
</ul>
<p><strong>Symbol vs Function Names</strong>:</p>
<ul>
<li class=""><strong>Function names</strong> (alphanumeric like <code>add</code>, <code>mul</code>) compile to function calls: <code>add(a, b)</code></li>
<li class=""><strong>Symbol operators</strong> (like <code>+</code>, <code>-</code>, <code>⊕</code>) compile to infix operators: <code>a + b</code></li>
</ul>
<p><strong>Partial Overrides</strong>: You can override only some operators; others will use their default JavaScript implementations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-complete-vector-math">Example: Complete Vector Math<a href="#example-complete-vector-math" class="hash-link" aria-label="Direct link to Example: Complete Vector Math" title="Direct link to Example: Complete Vector Math" translate="no"></a></h3>
<code-playground><div slot="javascript">// import { compile } from '@cortex-js/compute-engine';
<!-- -->
<!-- -->// Define vector operations
<!-- -->function add(a, b) { return a.map((v, i) => v + b[i]); }
<!-- -->function mul(a, b) { return a.map((v, i) => v * b[i]); }
<!-- -->function neg(a) { return a.map(v => -v); }
<!-- -->
<!-- -->const f = compile("u * v + w - z", {
<!-- --> <!-- -->operators: {
<!-- --> <!-- -->Add: ['add', 11],
<!-- --> <!-- -->Multiply: ['mul', 12],
<!-- --> <!-- -->Negate: ['neg', 14]
<!-- --> <!-- -->},
<!-- --> <!-- -->functions: { add, mul, neg }
<!-- -->});
<!-- -->
<!-- -->console.log(f.run({
<!-- --> <!-- -->u: [2, 3, 4],
<!-- --> <!-- -->v: [1, 1, 1],
<!-- --> <!-- -->w: [5, 6, 7],
<!-- --> <!-- -->z: [1, 2, 3]
<!-- -->}));
<!-- -->// ➔ [6, 7, 8] // u*v + w - z = [2,3,4] + [5,6,7] - [1,2,3]
</div></code-playground>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-custom-compilation-targets">Advanced: Custom Compilation Targets<a href="#advanced-custom-compilation-targets" class="hash-link" aria-label="Direct link to Advanced: Custom Compilation Targets" title="Direct link to Advanced: Custom Compilation Targets" translate="no"></a></h2>
<p>For advanced use cases, you can create completely custom compilation targets by using the exported <code>CompileTarget</code> interface and <code>BaseCompiler</code> class.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="exported-interfaces">Exported Interfaces<a href="#exported-interfaces" class="hash-link" aria-label="Direct link to Exported Interfaces" title="Direct link to Exported Interfaces" translate="no"></a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> ComputeEngine</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> BaseCompiler</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> JavaScriptTarget</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> type CompileTarget</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-a-custom-target">Creating a Custom Target<a href="#creating-a-custom-target" class="hash-link" aria-label="Direct link to Creating a Custom Target" title="Direct link to Creating a Custom Target" translate="no"></a></h3>
<p>Define a custom target object that implements the <code>CompileTarget</code> interface:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> BaseCompiler </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> myTarget </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">language</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'my-dsl'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">operators</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">op</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> ops </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Add</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'ADD'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">11</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Multiply</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'MUL'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">12</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Divide</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'DIV'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">13</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> ops</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">op</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">functions</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> id</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">toUpperCase</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">var</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token template-string string" style="color:var(--base-0b)">VAR("</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">${</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">}</span><span class="token template-string string" style="color:var(--base-0b)">")</span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">string</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">s</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token template-string string" style="color:var(--base-0b)">"</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">${</span><span class="token template-string interpolation">s</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">}</span><span class="token template-string string" style="color:var(--base-0b)">"</span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">number</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">n</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> n</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">toString</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">ws</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">' '</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">preamble</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">''</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">indent</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> code </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> BaseCompiler</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"x + y * 2"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> myTarget</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">code</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → ADD(VAR("x"), MUL(VAR("y"), 2))</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-sql-like-target">Example: SQL-like Target<a href="#example-sql-like-target" class="hash-link" aria-label="Direct link to Example: SQL-like Target" title="Direct link to Example: SQL-like Target" translate="no"></a></h3>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> BaseCompiler </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> sqlTarget </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">language</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'sql'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">operators</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">op</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Equal</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'='</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">8</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">NotEqual</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'<>'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">8</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">And</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'AND'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">4</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Or</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'OR'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">3</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">op</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">functions</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Abs</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'ABS'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Sqrt</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'SQRT'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">id</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">var</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token template-string string" style="color:var(--base-0b)">"</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">${</span><span class="token template-string interpolation">id</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">}</span><span class="token template-string string" style="color:var(--base-0b)">"</span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// Quote column names</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">string</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">s</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token template-string string" style="color:var(--base-0b)">'</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">${</span><span class="token template-string interpolation">s</span><span class="token template-string interpolation punctuation" style="color:var(--base-06)">.</span><span class="token template-string interpolation function" style="color:var(--base-0a)">replace</span><span class="token template-string interpolation punctuation" style="color:var(--base-06)">(</span><span class="token template-string interpolation regex regex-delimiter" style="color:var(--base-0b)">/</span><span class="token template-string interpolation regex regex-source language-regex" style="color:var(--base-0b)">'</span><span class="token template-string interpolation regex regex-delimiter" style="color:var(--base-0b)">/</span><span class="token template-string interpolation regex regex-flags" style="color:var(--base-0b)">g</span><span class="token template-string interpolation punctuation" style="color:var(--base-06)">,</span><span class="token template-string interpolation"> </span><span class="token template-string interpolation string" style="color:var(--base-0b)">"''"</span><span class="token template-string interpolation punctuation" style="color:var(--base-06)">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">}</span><span class="token template-string string" style="color:var(--base-0b)">'</span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">number</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">n</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> n</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">toString</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">ws</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">' '</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">preamble</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">''</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">indent</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> sql </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> BaseCompiler</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"x > 10 \\land y \\leq 20"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> sqlTarget</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token template-string string" style="color:var(--base-0b)">SELECT * FROM table WHERE </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">${</span><span class="token template-string interpolation">sql</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">}</span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → SELECT * FROM table WHERE AND("x" > 10, "y" <= 20)</span><br></div></code></pre></div></div>
<p>For more examples of custom targets, see <a class="" href="/compute-engine/guides/examples/compile-custom-target.js/"><code>examples/compile-custom-target.js</code></a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="plugin-architecture-registering-custom-targets">Plugin Architecture: Registering Custom Targets<a href="#plugin-architecture-registering-custom-targets" class="hash-link" aria-label="Direct link to Plugin Architecture: Registering Custom Targets" title="Direct link to Plugin Architecture: Registering Custom Targets" translate="no"></a></h2>
<p>The Compute Engine includes a plugin architecture that allows you to register custom compilation targets and switch between them easily.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-in-targets">Built-in Targets<a href="#built-in-targets" class="hash-link" aria-label="Direct link to Built-in Targets" title="Direct link to Built-in Targets" translate="no"></a></h3>
<p>The Compute Engine comes with these compilation targets:</p>
<ul>
<li class=""><strong><code>javascript</code></strong> (default) - Compiles to executable JavaScript functions</li>
<li class=""><strong><code>glsl</code></strong> - Compiles to GLSL (OpenGL Shading Language) for WebGL shaders</li>
<li class=""><strong><code>python</code></strong> - Compiles to Python/NumPy code for scientific computing (requires registration)</li>
<li class=""><strong><code>interval-js</code></strong> - Compiles to JavaScript using interval arithmetic for reliable function plotting</li>
<li class=""><strong><code>interval-glsl</code></strong> - <em>(Deprecated)</em> Compiles to GLSL using interval arithmetic for GPU-based plotting</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="compiling-to-different-targets">Compiling to Different Targets<a href="#compiling-to-different-targets" class="hash-link" aria-label="Direct link to Compiling to Different Targets" title="Direct link to Compiling to Different Targets" translate="no"></a></h3>
<p>Use the <code>to</code> option to specify the target language:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> parse</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> expr </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">parse</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"x^2 + y^2"</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Compile to JavaScript (default)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> jsResult </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">expr</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">jsResult</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">x</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">3</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">y</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">4</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// → 25</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Compile to GLSL</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> glslResult </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">expr</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'glsl'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">glslResult</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// → pow(x, 2.0) + pow(y, 2.0)</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pythonnumpy-target">Python/NumPy Target<a href="#pythonnumpy-target" class="hash-link" aria-label="Direct link to Python/NumPy Target" title="Direct link to Python/NumPy Target" translate="no"></a></h3>
<p>The Compute Engine includes a complete Python/NumPy compilation target for scientific computing:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> ComputeEngine</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> PythonTarget</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> ce </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">new</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">ComputeEngine</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Register the Python target with NumPy support</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">registerCompilationTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'python'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">new</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">PythonTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">includeImports</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token boolean" style="color:var(--base-09)">true</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Compile expressions to Python/NumPy code</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> f </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"\\sin(x) + \\cos(y)"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'python'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">f</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → import numpy as np</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">//</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// np.sin(x) + np.cos(y)</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="generating-python-functions">Generating Python Functions<a href="#generating-python-functions" class="hash-link" aria-label="Direct link to Generating Python Functions" title="Direct link to Generating Python Functions" translate="no"></a></h4>
<p>The <code>PythonTarget</code> can generate complete Python functions:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> PythonTarget </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> python </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">new</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">PythonTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">includeImports</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token boolean" style="color:var(--base-09)">true</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> func </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> python</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">compileFunction</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">"\\sqrt{x^2 + y^2}"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'euclidean_distance'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'x'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'y'</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'Calculate Euclidean distance between two points'</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">func</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><br></div></code></pre></div></div>
<p>Generates:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:var(--base-0e)">as</span><span class="token plain"> np</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">def</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">euclidean_distance</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">x</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> y</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:var(--base-0b)">"""Calculate Euclidean distance between two points"""</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> np</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">sqrt</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">x </span><span class="token operator" style="color:var(--base-06)">**</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">2</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">+</span><span class="token plain"> y </span><span class="token operator" style="color:var(--base-06)">**</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">2</span><span class="token punctuation" style="color:var(--base-06)">)</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-cases">Use Cases<a href="#use-cases" class="hash-link" aria-label="Direct link to Use Cases" title="Direct link to Use Cases" translate="no"></a></h4>
<p>The Python target is ideal for:</p>
<ul>
<li class=""><strong>Scientific Computing</strong>: Generate NumPy code for numerical analysis</li>
<li class=""><strong>Machine Learning</strong>: Create feature engineering functions</li>
<li class=""><strong>Data Analysis</strong>: Convert formulas to Pandas/NumPy operations</li>
<li class=""><strong>Education</strong>: Show Python equivalents of mathematical notation</li>
<li class=""><strong>Code Generation</strong>: Automated function creation from LaTeX</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="lambda-functions">Lambda Functions<a href="#lambda-functions" class="hash-link" aria-label="Direct link to Lambda Functions" title="Direct link to Lambda Functions" translate="no"></a></h4>
<p>Generate Python lambda expressions:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> lambda </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> python</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">compileLambda</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"x^2 + 2x + 1"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'x'</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">lambda</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → lambda x: x ** 2 + 2 * x + 1</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="supported-functions">Supported Functions<a href="#supported-functions" class="hash-link" aria-label="Direct link to Supported Functions" title="Direct link to Supported Functions" translate="no"></a></h4>
<p>The Python target maps to NumPy functions:</p>
<ul>
<li class=""><strong>Trigonometric</strong>: <code>sin</code> → <code>np.sin</code>, <code>cos</code> → <code>np.cos</code>, etc.</li>
<li class=""><strong>Exponential</strong>: <code>exp</code> → <code>np.exp</code>, <code>ln</code> → <code>np.log</code></li>
<li class=""><strong>Power</strong>: <code>x^n</code> → <code>x ** n</code>, <code>sqrt</code> → <code>np.sqrt</code></li>
<li class=""><strong>Statistics</strong>: <code>sum</code> → <code>np.sum</code>, <code>mean</code> → <code>np.mean</code></li>
<li class=""><strong>Linear Algebra</strong>: <code>dot</code> → <code>np.dot</code>, <code>cross</code> → <code>np.cross</code></li>
</ul>
<p>For complete documentation, see the <a href="https://cortexjs.io/compute-engine/guides/python-target/" target="_blank" rel="noopener noreferrer" class="">Python Target Guide</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="interval-arithmetic-targets">Interval Arithmetic Targets<a href="#interval-arithmetic-targets" class="hash-link" aria-label="Direct link to Interval Arithmetic Targets" title="Direct link to Interval Arithmetic Targets" translate="no"></a></h3>
<p>The Compute Engine includes interval arithmetic compilation targets designed for
reliable function plotting. These targets operate on intervals <code>[lo, hi]</code> rather
than point values, providing guaranteed enclosures of the true result and
detecting singularities.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-interval-arithmetic">Why Interval Arithmetic?<a href="#why-interval-arithmetic" class="hash-link" aria-label="Direct link to Why Interval Arithmetic?" title="Direct link to Why Interval Arithmetic?" translate="no"></a></h4>
<p>Standard plotting approaches sample functions at regular intervals, which can:</p>
<ul>
<li class="">Miss features (spikes between sample points)</li>
<li class="">Create aliasing (high-frequency oscillations appear as lower frequencies)</li>
<li class="">Produce wild line segments at singularities (like <code>tan(π/2)</code>)</li>
<li class="">Render discontinuities as vertical lines</li>
</ul>
<p>Interval arithmetic addresses these by:</p>
<ul>
<li class="">Returning wide intervals when uncertainty is high (triggers refinement)</li>
<li class="">Explicitly detecting division by zero and other singularities</li>
<li class="">Indicating when function domains are restricted</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="javascript-interval-target-interval-js">JavaScript Interval Target (<code>interval-js</code>)<a href="#javascript-interval-target-interval-js" class="hash-link" aria-label="Direct link to javascript-interval-target-interval-js" title="Direct link to javascript-interval-target-interval-js" translate="no"></a></h4>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> f </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"\\sin(x) / x"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'interval-js'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Call with interval inputs</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> value </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> f</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">x</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">lo</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">-</span><span class="token number" style="color:var(--base-09)">0.1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">hi</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0.1</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">value</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → { kind: 'singular' } // Division by interval containing zero</span><br></div></code></pre></div></div>
<p>The function accepts an object where keys are variable names and values are
<code>Interval</code> objects with <code>lo</code> and <code>hi</code> properties.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="result-types">Result Types<a href="#result-types" class="hash-link" aria-label="Direct link to Result Types" title="Direct link to Result Types" translate="no"></a></h4>
<p>The compiled function returns an <code>IntervalResult</code> discriminated union:</p>
<table><thead><tr><th>Kind</th><th>Meaning</th><th>Example</th></tr></thead><tbody><tr><td><code>interval</code></td><td>Normal result with bounds</td><td><code>sin([0, π])</code> → <code>{ kind: 'interval', value: { lo: 0, hi: 1 } }</code></td></tr><tr><td><code>empty</code></td><td>No valid output values</td><td><code>sqrt([-2, -1])</code> → <code>{ kind: 'empty' }</code></td></tr><tr><td><code>entire</code></td><td>Result spans all reals</td><td>Division with mixed signs near zero</td></tr><tr><td><code>singular</code></td><td>Contains a pole/asymptote</td><td><code>1 / [-1, 1]</code> → <code>{ kind: 'singular' }</code></td></tr><tr><td><code>partial</code></td><td>Partially valid domain</td><td><code>sqrt([-1, 4])</code> → <code>{ kind: 'partial', value: { lo: 0, hi: 2 }, domainClipped: 'lo' }</code></td></tr></tbody></table>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="examples">Examples<a href="#examples" class="hash-link" aria-label="Direct link to Examples" title="Direct link to Examples" translate="no"></a></h4>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Simple function - normal result</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> sinResult </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">'\\sin(x)'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'interval-js'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">sinResult</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">x</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">lo</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">hi</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> Math</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token constant" style="color:var(--base-09)">PI</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → { kind: 'interval', value: { lo: 0, hi: 1 } }</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Singularity detection</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> recipResult </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">'1/x'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'interval-js'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">recipResult</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">x</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">lo</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">-</span><span class="token number" style="color:var(--base-09)">1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">hi</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">1</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → { kind: 'singular' }</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Partial domain</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> sqrtResult </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">'\\sqrt{x}'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'interval-js'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">sqrtResult</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">x</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">lo</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">-</span><span class="token number" style="color:var(--base-09)">1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">hi</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">4</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → { kind: 'partial', value: { lo: 0, hi: 2 }, domainClipped: 'lo' }</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Multi-variable expressions</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> fnResult </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">'x^2 + y'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'interval-js'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">fnResult</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">run</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">x</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">lo</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">1</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">hi</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">2</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">y</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">lo</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">hi</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0.5</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// → { kind: 'interval', value: { lo: 1, hi: 4.5 } }</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="glsl-interval-target-interval-glsl">GLSL Interval Target (<code>interval-glsl</code>)<a href="#glsl-interval-target-interval-glsl" class="hash-link" aria-label="Direct link to glsl-interval-target-interval-glsl" title="Direct link to glsl-interval-target-interval-glsl" translate="no"></a></h4>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Deprecated</div><div class="admonitionContent_BuS1"><p>The <code>interval-glsl</code> target (and the never-rebuilt <code>interval-wgsl</code> sibling) is
deprecated and will be removed in a future release. GPU interval evaluation only
pays off when the entire pipeline stays on the GPU; a compile → GPU framebuffer →
<code>readPixels</code> → CPU round-trip is net-negative versus CPU <code>interval-js</code>, and the
target cannot compile any relational operator (so it cannot host
restriction/masking conditions). Use <strong><code>interval-js</code></strong> (CPU interval arithmetic)
or the scalar <strong><code>glsl</code></strong>/<strong><code>wgsl</code></strong> targets instead.</p></div></div>
<p>For GPU-based plotting, compile to GLSL interval arithmetic:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> IntervalGLSLTarget </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> target </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">new</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">IntervalGLSLTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Generate complete shader code</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> shader </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> target</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">compileShaderFunction</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"\\sin(x) + y^2"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">functionName</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'evaluateInterval'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">parameters</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'x'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'y'</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">version</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'300 es'</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">shader</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Outputs complete GLSL shader with interval arithmetic library</span><br></div></code></pre></div></div>
<p>In GLSL, intervals are represented as <code>vec2</code> where <code>.x</code> is the lower bound and
<code>.y</code> is the upper bound. The generated shader includes status flags for
singularity detection.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="plotting-integration">Plotting Integration<a href="#plotting-integration" class="hash-link" aria-label="Direct link to Plotting Integration" title="Direct link to Plotting Integration" translate="no"></a></h4>
<p>The interval results enable adaptive plotting algorithms:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">function</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">shouldSubdivide</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">result</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> tolerance</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">kind</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">case</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'singular'</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">case</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'entire'</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token boolean" style="color:var(--base-09)">true</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// Always refine near singularities</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">case</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'interval'</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">case</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'partial'</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">hi </span><span class="token operator" style="color:var(--base-06)">-</span><span class="token plain"> result</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">lo</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">></span><span class="token plain"> tolerance</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">case</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'empty'</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token boolean" style="color:var(--base-09)">false</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// Nothing to plot</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="registering-custom-targets">Registering Custom Targets<a href="#registering-custom-targets" class="hash-link" aria-label="Direct link to Registering Custom Targets" title="Direct link to Registering Custom Targets" translate="no"></a></h3>
<p>You can also create your own compilation targets using <code>ce.registerCompilationTarget()</code>:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> ComputeEngine</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> BaseCompiler</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> ce </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">new</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">ComputeEngine</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Define a custom target (e.g., for R, MATLAB, etc.)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">class</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">CustomTarget</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">getOperators</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Add</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'+'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">11</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Multiply</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'*'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">12</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// ... other operators</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">getFunctions</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Sin</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'sin'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">Cos</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'cos'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// ... other functions</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">createTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">language</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'custom'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">operators</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">op</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">this</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">getOperators</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">op</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">functions</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">this</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">getFunctions</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token plain">id</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">var</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> id</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">string</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">str</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token constant" style="color:var(--base-09)">JSON</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">stringify</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">str</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">number</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">n</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> n</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">toString</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">indent</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">ws</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">' '</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">preamble</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">''</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">expr</span><span class="token parameter punctuation" style="color:var(--base-06)">,</span><span class="token parameter"> options </span><span class="token parameter operator" style="color:var(--base-06)">=</span><span class="token parameter"> </span><span class="token parameter punctuation" style="color:var(--base-06)">{</span><span class="token parameter punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> target </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">this</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">createTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> code </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> BaseCompiler</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">expr</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> target</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">target</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'custom'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">success</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token boolean" style="color:var(--base-09)">true</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> code</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)">// Register and use</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">ce</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">registerCompilationTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">'custom'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">new</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">CustomTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> result </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"x + y * 2"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">to</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'custom'</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="direct-target-override">Direct Target Override<a href="#direct-target-override" class="hash-link" aria-label="Direct link to Direct Target Override" title="Direct link to Direct Target Override" translate="no"></a></h3>
<p>For one-time use, you can provide a <code>CompileTarget</code> directly without registration:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">import</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> compile </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">from</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'@cortex-js/compute-engine'</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> customTarget </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">language</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">'custom'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">operators</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">[</span><span class="token string" style="color:var(--base-0b)">'+'</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">10</span><span class="token punctuation" style="color:var(--base-06)">]</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">functions</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token keyword" style="color:var(--base-0e)">undefined</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">var</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">id</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> id</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">toUpperCase</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">string</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">str</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token template-string string" style="color:var(--base-0b)">"</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">${</span><span class="token template-string interpolation">str</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:var(--base-06)">}</span><span class="token template-string string" style="color:var(--base-0b)">"</span><span class="token template-string template-punctuation string" style="color:var(--base-0b)">`</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">number</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token parameter">n</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> n</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">toString</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">indent</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token number" style="color:var(--base-09)">0</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function-variable function" style="color:var(--base-0a)">ws</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token plain"> </span><span class="token operator" style="color:var(--base-06)">=></span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">' '</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">preamble</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> </span><span class="token string" style="color:var(--base-0b)">''</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token keyword" style="color:var(--base-0e)">const</span><span class="token plain"> result </span><span class="token operator" style="color:var(--base-06)">=</span><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token string" style="color:var(--base-0b)">"a + b"</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:var(--base-0c)">target</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> customTarget </span><span class="token punctuation" style="color:var(--base-06)">}</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">console</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token function" style="color:var(--base-0a)">log</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">result</span><span class="token punctuation" style="color:var(--base-06)">.</span><span class="token plain">code</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">// → A + B</span><br></div></code></pre></div></div>
<p>The <code>target</code> option takes precedence over the <code>to</code> option if both are provided.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="creating-custom-language-targets">Creating Custom Language Targets<a href="#creating-custom-language-targets" class="hash-link" aria-label="Direct link to Creating Custom Language Targets" title="Direct link to Creating Custom Language Targets" translate="no"></a></h3>
<p>To create a custom language target, implement the <code>LanguageTarget</code> interface:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token keyword" style="color:var(--base-0e)">interface</span><span class="token plain"> </span><span class="token class-name" style="color:var(--base-0a)">LanguageTarget</span><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">/**</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * Returns operator mappings for this language.</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * Maps operator names to [operator_string, precedence] tuples.</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">getOperators</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> CompiledOperators</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">/**</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * Returns function mappings for this language.</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * Maps function names to language-specific function names or implementations.</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">getFunctions</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> CompiledFunctions</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">/**</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * Creates a CompileTarget with the specified options.</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">createTarget</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain">options</span><span class="token operator" style="color:var(--base-06)">?</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> Partial</span><span class="token operator" style="color:var(--base-06)"><</span><span class="token plain">CompileTarget</span><span class="token operator" style="color:var(--base-06)">></span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> CompileTarget</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token comment" style="color:var(--base-05)">/**</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * Compiles an expression to a CompilationResult.</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * For non-JavaScript targets, this typically returns a result</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> * with the source code in the `code` property.</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"> */</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token function" style="color:var(--base-0a)">compile</span><span class="token punctuation" style="color:var(--base-06)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> expr</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> Expression</span><span class="token punctuation" style="color:var(--base-06)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> options</span><span class="token operator" style="color:var(--base-06)">?</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> CompilationOptions</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"> </span><span class="token punctuation" style="color:var(--base-06)">)</span><span class="token operator" style="color:var(--base-06)">:</span><span class="token plain"> CompilationResult</span><span class="token punctuation" style="color:var(--base-06)">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token punctuation" style="color:var(--base-06)">}</span><br></div></code></pre></div></div>
<p>For complete examples of custom targets including RPN (Reverse Polish Notation), Python, and more, see <a class="" href="/compute-engine/guides/examples/compile-plugin-architecture.js/"><code>examples/compile-plugin-architecture.js</code></a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-benchmarks">Performance Benchmarks<a href="#performance-benchmarks" class="hash-link" aria-label="Direct link to Performance Benchmarks" title="Direct link to Performance Benchmarks" translate="no"></a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="javascript-vs-pythonnumpy">JavaScript vs Python/NumPy<a href="#javascript-vs-pythonnumpy" class="hash-link" aria-label="Direct link to JavaScript vs Python/NumPy" title="Direct link to JavaScript vs Python/NumPy" translate="no"></a></h3>
<p>To compare performance across compilation targets, the project includes benchmark scripts:</p>
<p><strong>JavaScript Benchmarks</strong> (Node.js):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token function" style="color:var(--base-0a)">npm</span><span class="token plain"> run </span><span class="token builtin class-name" style="color:var(--base-0a)">test</span><span class="token plain"> compute-engine/compile-performance</span><br></div></code></pre></div></div>
<p><strong>Python Benchmarks</strong> (generated):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:var(--console-color);--prism-background-color:var(--console-background)"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_qGQc thin-scrollbar" style="color:var(--console-color);background-color:var(--console-background)"><code class="codeBlockLines_p187"><div class="token-line" style="color:var(--console-color)"><span class="token comment" style="color:var(--base-05)"># Generate the Python benchmark script</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token function" style="color:var(--base-0a)">npm</span><span class="token plain"> run </span><span class="token builtin class-name" style="color:var(--base-0a)">test</span><span class="token plain"> compute-engine/compile-python-generate</span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain"></span><span class="token comment" style="color:var(--base-05)"># Run Python benchmarks (requires NumPy)</span><span class="token plain"></span><br></div><div class="token-line" style="color:var(--console-color)"><span class="token plain">python benchmarks/python-performance.py</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="expected-results">Expected Results<a href="#expected-results" class="hash-link" aria-label="Direct link to Expected Results" title="Direct link to Expected Results" translate="no"></a></h3>
<p>The benchmarks test the same mathematical expressions across different targets:</p>
<table><thead><tr><th>Target</th><th>Performance</th><th>Use Case</th></tr></thead><tbody><tr><td><strong>JavaScript Compiled</strong></td><td>40-2900x faster than eval</td><td>CPU computation, real-time calculations</td></tr><tr><td><strong>Python/NumPy</strong></td><td>Fast for arrays, some overhead for scalars</td><td>Scientific computing, data analysis</td></tr><tr><td><strong>GLSL</strong></td><td>Massively parallel on GPU</td><td>Graphics, WebGL shaders</td></tr></tbody></table>
<p><strong>Key Insights</strong>:</p>
<ul>
<li class="">JavaScript compilation is excellent for single-threaded CPU performance</li>
<li class="">Python/NumPy excels at vectorized array operations</li>
<li class="">GLSL enables GPU parallelism for millions of simultaneous operations</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="limitations">Limitations<a href="#limitations" class="hash-link" aria-label="Direct link to Limitations" title="Direct link to Limitations" translate="no"></a></h2>
<p><strong>Precision:</strong> Compiled functions use machine-precision (64-bit) floating-point
arithmetic only. Arbitrary-precision and symbolic calculations are not available.</p>
<p><strong>Complex numbers:</strong> The JavaScript target supports complex arithmetic when the
expression involves complex-valued operands (e.g., <code>i</code>, complex-typed symbols).
Complex results are returned as <code>{ re, im }</code> objects. See
<a href="#complex-numbers" class="">Complex Numbers</a> for details and
<a href="#result-convention" class="">Result Convention</a>: a real value is a plain <code>number</code>, so <code>typeof v === 'number' ? v : NaN</code> projects to the reals.</p>
<p><strong>Unsupported functions:</strong> Most standard mathematical functions are supported,
but some cannot be compiled. When compilation fails, <code>compile()</code> returns a
<code>CompilationResult</code> with <code>success</code> set to <code>false</code>.</p>
<p>By default, a fallback <code>run</code> function based on the CE's numerical evaluator is
provided so the expression still produces a result (at lower performance). Set
<code>{ fallback: false }</code> to throw instead.</p>
<code-playground><div slot="javascript">// import { compile, parse } from '@cortex-js/compute-engine';
<!-- -->function compileOrEvaluate(latex) {
<!-- --> <!-- -->const result = compile(latex);
<!-- --> <!-- -->if (result.success) {
<!-- --> <!-- -->return result.run() + " (compiled)";
<!-- --> <!-- -->} else {
<!-- --> <!-- -->const evaluated = parse(latex).N();
<!-- --> <!-- -->return evaluated.numericValue + " (evaluated)";
<!-- --> <!-- -->}
<!-- -->}
<!-- -->
<!-- -->// `compile()` can handle this expression
<!-- -->console.log(compileOrEvaluate("\\frac{\\sqrt{5}+1}{2}"));
<!-- -->
<!-- -->// `compile()` cannot handle `Expand`, so it falls back
<!-- -->// and we use numerical evaluation with expr.N()
<!-- -->console.log(compileOrEvaluate("\\operatorname{Expand}((x+1)^2)"));
</div></code-playground>
<p><strong>Target coverage varies.</strong> Not every function that compiles to JavaScript also
compiles to GLSL or interval-js. The JavaScript target has the broadest coverage
(~120 functions including special functions, statistics, Bessel, and color
operations). The GLSL target supports ~80 functions (basic math, trig,
hyperbolic, gamma, erf, and color — but not statistics, Bessel, Zeta, LambertW,
or iterative constructs like Sum/Product). The interval-js target covers ~60
functions (basic math, trig, hyperbolic, gamma).</p>
<p>When a target fails, callers should fall back to a more capable target (e.g.,
GLSL → JavaScript, interval-js → JavaScript).</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"></div><div class="col lastUpdated_VsjB"></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/compute-engine/guides/simplify/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Simplify</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/compute-engine/guides/python-target/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Python/NumPy Target</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#introduction" class="table-of-contents__link toc-highlight">Introduction</a></li><li><a href="#compiling" class="table-of-contents__link toc-highlight">Compiling</a><ul><li><a href="#validation-and-fallback-behavior" class="table-of-contents__link toc-highlight">Validation and Fallback Behavior</a></li><li><a href="#constant-folding" class="table-of-contents__link toc-highlight">Constant Folding</a></li><li><a href="#why-a-compilation-declined" class="table-of-contents__link toc-highlight">Why a compilation declined</a></li><li><a href="#values-that-may-be-lists" class="table-of-contents__link toc-highlight">Values That May Be Lists</a></li><li><a href="#out-of-domain-operands-to-string-operators" class="table-of-contents__link toc-highlight">Out-of-Domain Operands to String Operators</a></li></ul></li><li><a href="#implicit-compilation-and-the-jit-setting" class="table-of-contents__link toc-highlight">Implicit Compilation and the <code>jit</code> Setting</a></li><li><a href="#what-can-be-compiled" class="table-of-contents__link toc-highlight">What Can Be Compiled</a><ul><li><a href="#plain-expressions" class="table-of-contents__link toc-highlight">Plain Expressions</a></li><li><a href="#lambda-expressions" class="table-of-contents__link toc-highlight">Lambda Expressions</a></li><li><a href="#tuple-expressions" class="table-of-contents__link toc-highlight">Tuple Expressions</a></li><li><a href="#control-structures" class="table-of-contents__link toc-highlight">Control Structures</a></li></ul></li><li><a href="#variable-names" class="table-of-contents__link toc-highlight">Variable Names</a></li><li><a href="#complex-numbers" class="table-of-contents__link toc-highlight">Complex Numbers</a><ul><li><a href="#when-complex-arithmetic-is-used" class="table-of-contents__link toc-highlight">When Complex Arithmetic Is Used</a></li><li><a href="#result-format" class="table-of-contents__link toc-highlight">Result Format</a></li><li><a href="#extracting-real-and-imaginary-parts" class="table-of-contents__link toc-highlight">Extracting Real and Imaginary Parts</a></li><li><a href="#mixing-real-and-complex-operands" class="table-of-contents__link toc-highlight">Mixing Real and Complex Operands</a></li><li><a href="#glsl-target" class="table-of-contents__link toc-highlight">GLSL Target</a></li><li><a href="#result-convention" class="table-of-contents__link toc-highlight">Result Convention</a></li><li><a href="#non-finite-results" class="table-of-contents__link toc-highlight">Non-Finite Results</a></li><li><a href="#modes-auto-strict-complex" class="table-of-contents__link toc-highlight">Modes: <code>auto</code>, <code>strict</code>, <code>complex</code></a></li></ul></li><li><a href="#custom-operators" class="table-of-contents__link toc-highlight">Custom Operators</a><ul><li><a href="#basic-usage" class="table-of-contents__link toc-highlight">Basic Usage</a></li><li><a href="#function-based-overrides" class="table-of-contents__link toc-highlight">Function-Based Overrides</a></li><li><a href="#complex-expressions" class="table-of-contents__link toc-highlight">Complex Expressions</a></li><li><a href="#important-notes" class="table-of-contents__link toc-highlight">Important Notes</a></li><li><a href="#example-complete-vector-math" class="table-of-contents__link toc-highlight">Example: Complete Vector Math</a></li></ul></li><li><a href="#advanced-custom-compilation-targets" class="table-of-contents__link toc-highlight">Advanced: Custom Compilation Targets</a><ul><li><a href="#exported-interfaces" class="table-of-contents__link toc-highlight">Exported Interfaces</a></li><li><a href="#creating-a-custom-target" class="table-of-contents__link toc-highlight">Creating a Custom Target</a></li><li><a href="#example-sql-like-target" class="table-of-contents__link toc-highlight">Example: SQL-like Target</a></li></ul></li><li><a href="#plugin-architecture-registering-custom-targets" class="table-of-contents__link toc-highlight">Plugin Architecture: Registering Custom Targets</a><ul><li><a href="#built-in-targets" class="table-of-contents__link toc-highlight">Built-in Targets</a></li><li><a href="#compiling-to-different-targets" class="table-of-contents__link toc-highlight">Compiling to Different Targets</a></li><li><a href="#pythonnumpy-target" class="table-of-contents__link toc-highlight">Python/NumPy Target</a></li><li><a href="#interval-arithmetic-targets" class="table-of-contents__link toc-highlight">Interval Arithmetic Targets</a></li><li><a href="#registering-custom-targets" class="table-of-contents__link toc-highlight">Registering Custom Targets</a></li><li><a href="#direct-target-override" class="table-of-contents__link toc-highlight">Direct Target Override</a></li><li><a href="#creating-custom-language-targets" class="table-of-contents__link toc-highlight">Creating Custom Language Targets</a></li></ul></li><li><a href="#performance-benchmarks" class="table-of-contents__link toc-highlight">Performance Benchmarks</a><ul><li><a href="#javascript-vs-pythonnumpy" class="table-of-contents__link toc-highlight">JavaScript vs Python/NumPy</a></li><li><a href="#expected-results" class="table-of-contents__link toc-highlight">Expected Results</a></li></ul></li><li><a href="#limitations" class="table-of-contents__link toc-highlight">Limitations</a></li></ul></div></div></div></div></main></div></div></div><div class="shared-footer"><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">SDKs</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/mathfield/">Mathfield</a></li><li class="footer__item"><a class="footer__link-item" href="/compute-engine/">Compute Engine</a></li><li class="footer__item"><a class="footer__link-item" href="/math-json/">MathJSON</a></li><li class="footer__item"><a href="https://epsil.dev" target="_blank" rel="noopener noreferrer" class="footer__link-item">Epsil<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/cortex-js" target="_blank" rel="noopener noreferrer" class="footer__link-item">
<svg class="icon-one-rem"><use role="none" xlink:href="/icons.svg#github"></use></svg>
GitHub
<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg>
</a></li><li class="footer__item"><a href="https://discord.gg/yhmvVeJ4Hd" target="_blank" rel="noopener noreferrer" class="footer__link-item">
<svg class="icon-one-rem"><use role="none" xlink:href="/icons.svg#discord"></use></svg>
Discord
<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg>
</a></li><li class="footer__item"><a href="https://chatgpt.com/g/g-8YgEfR7ig-mathlive-gpt" target="_blank" rel="noopener noreferrer" class="footer__link-item">
<svg class="icon-one-rem"><use role="none" xlink:href="/icons.svg#openai"></use></svg>
MathLive GPT
<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg>
</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/about/">About Us</a></li></ul></div></div></div></footer></div></div>
</body>
</html>