egglog 9.0.0__pp310-pypy310_pp73-manylinux_2_17_ppc64.manylinux2014_ppc64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of egglog might be problematic. Click here for more details.

Files changed (44) hide show
  1. egglog/__init__.py +10 -0
  2. egglog/bindings.pyi +667 -0
  3. egglog/bindings.pypy310-pp73-powerpc64-linux-gnu.so +0 -0
  4. egglog/builtins.py +1045 -0
  5. egglog/config.py +8 -0
  6. egglog/conversion.py +262 -0
  7. egglog/declarations.py +818 -0
  8. egglog/egraph.py +1909 -0
  9. egglog/egraph_state.py +634 -0
  10. egglog/examples/README.rst +5 -0
  11. egglog/examples/__init__.py +3 -0
  12. egglog/examples/bignum.py +31 -0
  13. egglog/examples/bool.py +38 -0
  14. egglog/examples/eqsat_basic.py +45 -0
  15. egglog/examples/fib.py +28 -0
  16. egglog/examples/higher_order_functions.py +45 -0
  17. egglog/examples/lambda_.py +288 -0
  18. egglog/examples/matrix.py +175 -0
  19. egglog/examples/multiset.py +61 -0
  20. egglog/examples/ndarrays.py +144 -0
  21. egglog/examples/resolution.py +84 -0
  22. egglog/examples/schedule_demo.py +34 -0
  23. egglog/exp/__init__.py +3 -0
  24. egglog/exp/array_api.py +1943 -0
  25. egglog/exp/array_api_jit.py +44 -0
  26. egglog/exp/array_api_loopnest.py +74 -0
  27. egglog/exp/array_api_numba.py +69 -0
  28. egglog/exp/array_api_program_gen.py +510 -0
  29. egglog/exp/program_gen.py +424 -0
  30. egglog/exp/siu_examples.py +32 -0
  31. egglog/functionalize.py +91 -0
  32. egglog/ipython_magic.py +41 -0
  33. egglog/pretty.py +510 -0
  34. egglog/py.typed +0 -0
  35. egglog/runtime.py +633 -0
  36. egglog/thunk.py +95 -0
  37. egglog/type_constraint_solver.py +113 -0
  38. egglog/visualizer.css +1 -0
  39. egglog/visualizer.js +35777 -0
  40. egglog/visualizer_widget.py +39 -0
  41. egglog-9.0.0.dist-info/METADATA +74 -0
  42. egglog-9.0.0.dist-info/RECORD +44 -0
  43. egglog-9.0.0.dist-info/WHEEL +4 -0
  44. egglog-9.0.0.dist-info/licenses/LICENSE +21 -0
egglog/__init__.py ADDED
@@ -0,0 +1,10 @@
1
+ """
2
+ Package for creating e-graphs in Python.
3
+ """
4
+
5
+ from . import config, ipython_magic # noqa: F401
6
+ from .builtins import * # noqa: UP029
7
+ from .conversion import ConvertError, convert, converter, get_type_args # noqa: F401
8
+ from .egraph import *
9
+
10
+ del ipython_magic
egglog/bindings.pyi ADDED
@@ -0,0 +1,667 @@
1
+ from datetime import timedelta
2
+ from pathlib import Path
3
+ from typing import TypeAlias
4
+
5
+ from typing_extensions import final
6
+
7
+ __all__ = [
8
+ "ActionCommand",
9
+ "AddRuleset",
10
+ "Best",
11
+ "BiRewriteCommand",
12
+ "Bool",
13
+ "Call",
14
+ "Change",
15
+ "Check",
16
+ "Constructor",
17
+ "Datatype",
18
+ "Datatypes",
19
+ "Delete",
20
+ "EGraph",
21
+ "EggSmolError",
22
+ "EgglogSpan",
23
+ "Eq",
24
+ "Expr_",
25
+ "Extract",
26
+ "Fact",
27
+ "Fail",
28
+ "Float",
29
+ "Function",
30
+ "IdentSort",
31
+ "Include",
32
+ "Input",
33
+ "Int",
34
+ "Let",
35
+ "Lit",
36
+ "NewSort",
37
+ "Output",
38
+ "Panic",
39
+ "PanicSpan",
40
+ "Pop",
41
+ "PrintFunction",
42
+ "PrintOverallStatistics",
43
+ "PrintSize",
44
+ "Push",
45
+ "PyObjectSort",
46
+ "QueryExtract",
47
+ "Relation",
48
+ "Repeat",
49
+ "Rewrite",
50
+ "RewriteCommand",
51
+ "Rule",
52
+ "RuleCommand",
53
+ "Run",
54
+ "RunConfig",
55
+ "RunReport",
56
+ "RunSchedule",
57
+ "RustSpan",
58
+ "Saturate",
59
+ "Schema",
60
+ "Sequence",
61
+ "SerializedEGraph",
62
+ "Set",
63
+ "SetOption",
64
+ "Simplify",
65
+ "Sort",
66
+ "SrcFile",
67
+ "String",
68
+ "SubVariants",
69
+ "Subsume",
70
+ "TermApp",
71
+ "TermDag",
72
+ "TermLit",
73
+ "TermVar",
74
+ "Union",
75
+ "Unit",
76
+ "UnstableCombinedRuleset",
77
+ "Var",
78
+ "Variant",
79
+ "Variants",
80
+ ]
81
+
82
+ @final
83
+ class SerializedEGraph:
84
+ def inline_leaves(self) -> None: ...
85
+ def saturate_inline_leaves(self) -> None: ...
86
+ def to_dot(self) -> str: ...
87
+ def to_json(self) -> str: ...
88
+ def map_ops(self, map: dict[str, str]) -> None: ...
89
+ def split_classes(self, egraph: EGraph, ops: set[str]) -> None: ...
90
+
91
+ @final
92
+ class PyObjectSort:
93
+ def __init__(self) -> None: ...
94
+ def store(self, __o: object, /) -> _Expr: ...
95
+ def load(self, __e: _Expr, /) -> object: ...
96
+
97
+ @final
98
+ class EGraph:
99
+ def __init__(
100
+ self,
101
+ py_object_sort: PyObjectSort | None = None,
102
+ /,
103
+ *,
104
+ fact_directory: str | Path | None = None,
105
+ seminaive: bool = True,
106
+ record: bool = False,
107
+ ) -> None: ...
108
+ def parse_program(self, __input: str, /, filename: str | None = None) -> list[_Command]: ...
109
+ def commands(self) -> str | None: ...
110
+ def run_program(self, *commands: _Command) -> list[str]: ...
111
+ def extract_report(self) -> _ExtractReport | None: ...
112
+ def run_report(self) -> RunReport | None: ...
113
+ def serialize(
114
+ self,
115
+ root_eclasses: list[_Expr],
116
+ *,
117
+ max_functions: int | None = None,
118
+ max_calls_per_function: int | None = None,
119
+ include_temporary_functions: bool = False,
120
+ ) -> SerializedEGraph: ...
121
+
122
+ @final
123
+ class EggSmolError(Exception):
124
+ context: str
125
+
126
+ ##
127
+ # Spans
128
+ ##
129
+
130
+ @final
131
+ class PanicSpan:
132
+ def __init__(self) -> None: ...
133
+
134
+ @final
135
+ class SrcFile:
136
+ name: str | None
137
+ contents: str
138
+ def __init__(self, name: str | None, contents: str) -> None: ...
139
+
140
+ @final
141
+ class EgglogSpan:
142
+ file: SrcFile
143
+ i: int
144
+ j: int
145
+ def __init__(self, file: SrcFile, i: int, j: int) -> None: ...
146
+
147
+ @final
148
+ class RustSpan:
149
+ file: str
150
+ line: int
151
+ column: int
152
+ def __init__(self, file: str, line: int, column: int) -> None: ...
153
+
154
+ _Span: TypeAlias = PanicSpan | EgglogSpan | RustSpan
155
+
156
+ ##
157
+ # Literals
158
+ ##
159
+
160
+ @final
161
+ class Int:
162
+ def __init__(self, value: int) -> None: ...
163
+ value: int
164
+
165
+ @final
166
+ class Float:
167
+ value: float
168
+ def __init__(self, value: float) -> None: ...
169
+
170
+ @final
171
+ class String:
172
+ def __init__(self, value: str) -> None: ...
173
+ value: str
174
+
175
+ @final
176
+ class Unit:
177
+ def __init__(self) -> None: ...
178
+
179
+ @final
180
+ class Bool:
181
+ def __init__(self, b: bool) -> None: ...
182
+ value: bool
183
+
184
+ _Literal: TypeAlias = Int | Float | String | Bool | Unit
185
+
186
+ ##
187
+ # Expressions
188
+ ##
189
+
190
+ @final
191
+ class Lit:
192
+ def __init__(self, span: _Span, value: _Literal) -> None: ...
193
+ span: _Span
194
+ value: _Literal
195
+
196
+ @final
197
+ class Var:
198
+ def __init__(self, span: _Span, name: str) -> None: ...
199
+ span: _Span
200
+ name: str
201
+
202
+ @final
203
+ class Call:
204
+ def __init__(self, span: _Span, name: str, args: list[_Expr]) -> None: ...
205
+ span: _Span
206
+ name: str
207
+ args: list[_Expr]
208
+
209
+ # Unions must be private becuase it is not actually exposed by the runtime library.
210
+ _Expr: TypeAlias = Lit | Var | Call
211
+
212
+ ##
213
+ # Terms
214
+ ##
215
+
216
+ @final
217
+ class TermLit:
218
+ def __init__(self, value: _Literal) -> None: ...
219
+ value: _Literal
220
+
221
+ @final
222
+ class TermVar:
223
+ def __init__(self, name: str) -> None: ...
224
+ name: str
225
+
226
+ @final
227
+ class TermApp:
228
+ def __init__(self, name: str, args: list[int]) -> None: ...
229
+ name: str
230
+ args: list[int]
231
+
232
+ _Term: TypeAlias = TermLit | TermVar | TermApp
233
+
234
+ ##
235
+ # Facts
236
+ ##
237
+
238
+ @final
239
+ class Eq:
240
+ def __init__(self, span: _Span, left: _Expr, right: _Expr) -> None: ...
241
+ span: _Span
242
+ left: _Expr
243
+ right: _Expr
244
+
245
+ @final
246
+ class Fact:
247
+ def __init__(self, expr: _Expr) -> None: ...
248
+ expr: _Expr
249
+
250
+ _Fact: TypeAlias = Fact | Eq
251
+
252
+ ##
253
+ # Change
254
+ ##
255
+
256
+ @final
257
+ class Delete:
258
+ def __init__(self) -> None: ...
259
+
260
+ @final
261
+ class Subsume:
262
+ def __init__(self) -> None: ...
263
+
264
+ _Change: TypeAlias = Delete | Subsume
265
+
266
+ ##
267
+ # Actions
268
+ ##
269
+
270
+ @final
271
+ class Let:
272
+ def __init__(self, span: _Span, lhs: str, rhs: _Expr) -> None: ...
273
+ span: _Span
274
+ lhs: str
275
+ rhs: _Expr
276
+
277
+ @final
278
+ class Set:
279
+ def __init__(self, span: _Span, lhs: str, args: list[_Expr], rhs: _Expr) -> None: ...
280
+ span: _Span
281
+ lhs: str
282
+ args: list[_Expr]
283
+ rhs: _Expr
284
+
285
+ @final
286
+ class Change:
287
+ span: _Span
288
+ change: _Change
289
+ sym: str
290
+ args: list[_Expr]
291
+ def __init__(self, span: _Span, change: _Change, sym: str, args: list[_Expr]) -> None: ...
292
+
293
+ @final
294
+ class Union:
295
+ def __init__(self, span: _Span, lhs: _Expr, rhs: _Expr) -> None: ...
296
+ span: _Span
297
+ lhs: _Expr
298
+ rhs: _Expr
299
+
300
+ @final
301
+ class Panic:
302
+ def __init__(self, span: _Span, msg: str) -> None: ...
303
+ span: _Span
304
+ msg: str
305
+
306
+ @final
307
+ class Expr_: # noqa: N801
308
+ def __init__(self, span: _Span, expr: _Expr) -> None: ...
309
+ span: _Span
310
+ expr: _Expr
311
+
312
+ @final
313
+ class Extract:
314
+ def __init__(self, span: _Span, expr: _Expr, variants: _Expr) -> None: ...
315
+ span: _Span
316
+ expr: _Expr
317
+ variants: _Expr
318
+
319
+ _Action: TypeAlias = Let | Set | Change | Union | Panic | Expr_ | Extract
320
+
321
+ ##
322
+ # Other Structs
323
+ ##
324
+
325
+ @final
326
+ class Variant:
327
+ def __init__(self, span: _Span, name: str, types: list[str], cost: int | None = None) -> None: ...
328
+ span: _Span
329
+ name: str
330
+ types: list[str]
331
+ cost: int | None
332
+
333
+ @final
334
+ class Schema:
335
+ input: list[str]
336
+ output: str
337
+ def __init__(self, input: list[str], output: str) -> None: ...
338
+
339
+ @final
340
+ class Rule:
341
+ span: _Span
342
+ head: list[_Action]
343
+ body: list[_Fact]
344
+ def __init__(self, span: _Span, head: list[_Action], body: list[_Fact]) -> None: ...
345
+
346
+ @final
347
+ class Rewrite:
348
+ span: _Span
349
+ lhs: _Expr
350
+ rhs: _Expr
351
+ conditions: list[_Fact]
352
+
353
+ def __init__(self, span: _Span, lhs: _Expr, rhs: _Expr, conditions: list[_Fact] = []) -> None: ...
354
+
355
+ @final
356
+ class RunConfig:
357
+ ruleset: str
358
+ until: list[_Fact] | None
359
+ def __init__(self, ruleset: str, until: list[_Fact] | None = None) -> None: ...
360
+
361
+ @final
362
+ class IdentSort:
363
+ ident: str
364
+ sort: str
365
+ def __init__(self, ident: str, sort: str) -> None: ...
366
+
367
+ @final
368
+ class RunReport:
369
+ updated: bool
370
+ search_time_per_rule: dict[str, timedelta]
371
+ apply_time_per_rule: dict[str, timedelta]
372
+ search_time_per_ruleset: dict[str, timedelta]
373
+ apply_time_per_ruleset: dict[str, timedelta]
374
+ rebuild_time_per_ruleset: dict[str, timedelta]
375
+ num_matches_per_rule: dict[str, int]
376
+
377
+ def __init__(
378
+ self,
379
+ updated: bool,
380
+ search_time_per_rule: dict[str, timedelta],
381
+ apply_time_per_rule: dict[str, timedelta],
382
+ search_time_per_ruleset: dict[str, timedelta],
383
+ apply_time_per_ruleset: dict[str, timedelta],
384
+ rebuild_time_per_ruleset: dict[str, timedelta],
385
+ num_matches_per_rule: dict[str, int],
386
+ ) -> None: ...
387
+
388
+ @final
389
+ class Variants:
390
+ termdag: TermDag
391
+ terms: list[_Term]
392
+ def __init__(self, termdag: TermDag, terms: list[_Term]) -> None: ...
393
+
394
+ @final
395
+ class Best:
396
+ termdag: TermDag
397
+ cost: int
398
+ term: _Term
399
+ def __init__(self, termdag: TermDag, cost: int, term: _Term) -> None: ...
400
+
401
+ _ExtractReport: TypeAlias = Variants | Best
402
+
403
+ ##
404
+ # Schedules
405
+ ##
406
+
407
+ @final
408
+ class Saturate:
409
+ span: _Span
410
+ schedule: _Schedule
411
+ def __init__(self, span: _Span, schedule: _Schedule) -> None: ...
412
+
413
+ @final
414
+ class Repeat:
415
+ span: _Span
416
+ length: int
417
+ schedule: _Schedule
418
+ def __init__(self, span: _Span, length: int, schedule: _Schedule) -> None: ...
419
+
420
+ @final
421
+ class Run:
422
+ span: _Span
423
+ config: RunConfig
424
+ def __init__(self, span: _Span, config: RunConfig) -> None: ...
425
+
426
+ @final
427
+ class Sequence:
428
+ span: _Span
429
+ schedules: list[_Schedule]
430
+ def __init__(self, span: _Span, schedules: list[_Schedule]) -> None: ...
431
+
432
+ _Schedule: TypeAlias = Saturate | Repeat | Run | Sequence
433
+
434
+ ##
435
+ # Subdatatypes
436
+ ##
437
+
438
+ @final
439
+ class SubVariants:
440
+ def __init__(self, variants: list[Variant]) -> None: ...
441
+ variants: list[Variant]
442
+
443
+ @final
444
+ class NewSort:
445
+ def __init__(self, name: str, args: list[_Expr]) -> None: ...
446
+ name: str
447
+ args: list[_Expr]
448
+
449
+ _Subdatatypes: TypeAlias = SubVariants | NewSort
450
+
451
+ ##
452
+ # Commands
453
+ ##
454
+
455
+ @final
456
+ class SetOption:
457
+ name: str
458
+ value: _Expr
459
+ def __init__(self, name: str, value: _Expr) -> None: ...
460
+
461
+ @final
462
+ class Datatype:
463
+ span: _Span
464
+ name: str
465
+ variants: list[Variant]
466
+ def __init__(self, span: _Span, name: str, variants: list[Variant]) -> None: ...
467
+
468
+ @final
469
+ class Datatypes:
470
+ span: _Span
471
+ datatypes: list[tuple[_Span, str, _Subdatatypes]]
472
+ def __init__(self, span: _Span, datatypes: list[tuple[_Span, str, _Subdatatypes]]) -> None: ...
473
+
474
+ @final
475
+ class Sort:
476
+ span: _Span
477
+ name: str
478
+ presort_and_args: tuple[str, list[_Expr]] | None
479
+ def __init__(self, span: _Span, name: str, presort_and_args: tuple[str, list[_Expr]] | None = None) -> None: ...
480
+
481
+ @final
482
+ class Function:
483
+ span: _Span
484
+ name: str
485
+ schema: Schema
486
+ merge: _Expr | None
487
+ def __init__(self, span: _Span, name: str, schema: Schema, merge: _Expr | None) -> None: ...
488
+
489
+ @final
490
+ class AddRuleset:
491
+ name: str
492
+ def __init__(self, name: str) -> None: ...
493
+
494
+ @final
495
+ class RuleCommand:
496
+ name: str
497
+ ruleset: str
498
+ rule: Rule
499
+ def __init__(self, name: str, ruleset: str, rule: Rule) -> None: ...
500
+
501
+ @final
502
+ class RewriteCommand:
503
+ # TODO: Rename to ruleset
504
+ name: str
505
+ rewrite: Rewrite
506
+ subsume: bool
507
+ def __init__(self, name: str, rewrite: Rewrite, subsume: bool) -> None: ...
508
+
509
+ @final
510
+ class BiRewriteCommand:
511
+ # TODO: Rename to ruleset
512
+ name: str
513
+ rewrite: Rewrite
514
+ def __init__(self, name: str, rewrite: Rewrite) -> None: ...
515
+
516
+ @final
517
+ class ActionCommand:
518
+ action: _Action
519
+ def __init__(self, action: _Action) -> None: ...
520
+
521
+ @final
522
+ class RunSchedule:
523
+ schedule: _Schedule
524
+ def __init__(self, schedule: _Schedule) -> None: ...
525
+
526
+ @final
527
+ class Simplify:
528
+ span: _Span
529
+ expr: _Expr
530
+ schedule: _Schedule
531
+ def __init__(self, span: _Span, expr: _Expr, schedule: _Schedule) -> None: ...
532
+
533
+ @final
534
+ class QueryExtract:
535
+ span: _Span
536
+ variants: int
537
+ expr: _Expr
538
+ def __init__(self, span: _Span, variants: int, expr: _Expr) -> None: ...
539
+
540
+ @final
541
+ class Check:
542
+ span: _Span
543
+ facts: list[_Fact]
544
+ def __init__(self, span: _Span, facts: list[_Fact]) -> None: ...
545
+
546
+ @final
547
+ class PrintFunction:
548
+ span: _Span
549
+ name: str
550
+ length: int
551
+ def __init__(self, span: _Span, name: str, length: int) -> None: ...
552
+
553
+ @final
554
+ class PrintSize:
555
+ span: _Span
556
+ name: str | None
557
+ def __init__(self, span: _Span, name: str | None) -> None: ...
558
+
559
+ @final
560
+ class Output:
561
+ span: _Span
562
+ file: str
563
+ exprs: list[_Expr]
564
+ def __init__(self, span: _Span, file: str, exprs: list[_Expr]) -> None: ...
565
+
566
+ @final
567
+ class Input:
568
+ span: _Span
569
+ name: str
570
+ file: str
571
+ def __init__(self, span: _Span, name: str, file: str) -> None: ...
572
+
573
+ @final
574
+ class Push:
575
+ length: int
576
+ def __init__(self, length: int) -> None: ...
577
+
578
+ @final
579
+ class Pop:
580
+ span: _Span
581
+ length: int
582
+ def __init__(self, span: _Span, length: int) -> None: ...
583
+
584
+ @final
585
+ class Fail:
586
+ span: _Span
587
+ command: _Command
588
+ def __init__(self, span: _Span, command: _Command) -> None: ...
589
+
590
+ @final
591
+ class Include:
592
+ span: _Span
593
+ path: str
594
+ def __init__(self, span: _Span, path: str) -> None: ...
595
+
596
+ @final
597
+ class Relation:
598
+ span: _Span
599
+ name: str
600
+ inputs: list[str]
601
+
602
+ def __init__(self, span: _Span, name: str, inputs: list[str]) -> None: ...
603
+
604
+ @final
605
+ class Constructor:
606
+ span: _Span
607
+ name: str
608
+ schema: Schema
609
+ cost: int | None
610
+ unextractable: bool
611
+ def __init__(self, span: _Span, name: str, schema: Schema, cost: int | None, unextractable: bool) -> None: ...
612
+
613
+ @final
614
+ class PrintOverallStatistics:
615
+ def __init__(self) -> None: ...
616
+
617
+ @final
618
+ class UnstableCombinedRuleset:
619
+ name: str
620
+ rulesets: list[str]
621
+ def __init__(self, name: str, rulesets: list[str]) -> None: ...
622
+
623
+ _Command: TypeAlias = (
624
+ SetOption
625
+ | Datatype
626
+ | Datatypes
627
+ | Sort
628
+ | Function
629
+ | AddRuleset
630
+ | RuleCommand
631
+ | RewriteCommand
632
+ | BiRewriteCommand
633
+ | ActionCommand
634
+ | RunSchedule
635
+ | Simplify
636
+ | QueryExtract
637
+ | Check
638
+ | PrintFunction
639
+ | PrintSize
640
+ | Output
641
+ | Input
642
+ | Push
643
+ | Pop
644
+ | Fail
645
+ | Include
646
+ | Relation
647
+ | PrintOverallStatistics
648
+ | UnstableCombinedRuleset
649
+ | Constructor
650
+ )
651
+
652
+ ##
653
+ # TermDag
654
+ ##
655
+
656
+ @final
657
+ class TermDag:
658
+ def __init__(self) -> None: ...
659
+ def size(self) -> int: ...
660
+ def lookup(self, node: _Term) -> int: ...
661
+ def get(self, id: int) -> _Term: ...
662
+ def app(self, sym: str, children: list[int]) -> _Term: ...
663
+ def lit(self, lit: _Literal) -> _Term: ...
664
+ def var(self, sym: str) -> _Term: ...
665
+ def expr_to_term(self, expr: _Expr) -> _Term: ...
666
+ def term_to_expr(self, term: _Term, span: _Span) -> _Expr: ...
667
+ def to_string(self, term: _Term) -> str: ...