Skip to content

Commit a53d7ee

Browse files
authored
Update Pauli example (#423)
The problem with the link to the Fold pass is that there's a problem with the nav generation, I think. The page of the fold pass is just empty: https://queracomputing.github.io/kirin/latest/reference/kirin/passes/fold/ Ref #419
1 parent a6a8f03 commit a53d7ee

File tree

4 files changed

+35
-24
lines changed

4 files changed

+35
-24
lines changed

docs/cookbook/paulilang/pauli.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -138,35 +138,35 @@ Since we want to rewrite statements of our dialect, the entry point we define in
138138
```python
139139
from dataclasses import dataclass
140140

141-
from kirin.rewrite import abc, result
141+
from kirin.rewrite import abc
142142
from kirin.dialects import py
143143

144144

145145
@dataclass
146146
class RewritePauliMult(abc.RewriteRule):
147-
def rewrite_Statement(self, node: ir.Statement) -> result.RewriteResult:
147+
def rewrite_Statement(self, node: ir.Statement) -> abc.RewriteResult:
148148
if not isinstance(node, py.binop.Mult): # (1)!
149-
return result.RewriteResult()
149+
return abc.RewriteResult()
150150

151151
if not isinstance(node.lhs.owner, PauliOperator) and not isinstance(node.rhs.owner, PauliOperator): # (2)!
152-
return result.RewriteResult()
152+
return abc.RewriteResult()
153153

154154
if isinstance(node.lhs.owner, py.Constant): # (3)!
155155
new_op = self.number_pauli_mult(node.lhs.owner, node.rhs.owner)
156156
node.replace_by(new_op)
157-
return result.RewriteResult(has_done_something=True)
157+
return abc.RewriteResult(has_done_something=True)
158158
elif isinstance(node.rhs.owner, py.Constant): # (4)!
159159
new_op = self.number_pauli_mult(node.rhs.owner, node.lhs.owner)
160160
node.replace_by(new_op)
161-
return result.RewriteResult(has_done_something=True)
161+
return abc.RewriteResult(has_done_something=True)
162162

163163

164164
if not isinstance(node.lhs.owner, PauliOperator) or not isinstance(node.rhs.owner, PauliOperator): # (5)!
165-
return result.RewriteResult()
165+
return abc.RewriteResult()
166166

167167
new_op = self.pauli_pauli_mult(node.lhs.owner, node.rhs.owner) #(6)!
168168
node.replace_by(new_op)
169-
return result.RewriteResult(has_done_something=True)
169+
return abc.RewriteResult(has_done_something=True)
170170

171171
...
172172
```
@@ -411,9 +411,9 @@ The basic principle is the same as before.
411411
```python
412412
@dataclass
413413
class RewriteDistributeMult(abc.RewriteRule):
414-
def rewrite_Statement(self, node: ir.Statement) -> result.RewriteResult:
414+
def rewrite_Statement(self, node: ir.Statement) -> abc.RewriteResult:
415415
if not isinstance(node, py.binop.Mult): # (1)!
416-
return result.RewriteResult()
416+
return abc.RewriteResult()
417417

418418
if isinstance(node.lhs.owner, py.binop.Add): # (2)!
419419
m1 = py.binop.Mult(node.lhs.owner.lhs, node.rhs) # (3)!
@@ -424,7 +424,7 @@ class RewriteDistributeMult(abc.RewriteRule):
424424

425425
a = py.binop.Add(m1.result, m2.result) # (5)!
426426
node.replace_by(a) # (6)!
427-
return result.RewriteResult(has_done_something=True)
427+
return abc.RewriteResult(has_done_something=True)
428428

429429
if isinstance(node.rhs.owner, py.binop.Add):
430430
m1 = py.binop.Mult(node.lhs, node.rhs.owner.lhs)
@@ -435,9 +435,9 @@ class RewriteDistributeMult(abc.RewriteRule):
435435

436436
a = py.binop.Add(m1.result, m2.result)
437437
node.replace_by(a)
438-
return result.RewriteResult(has_done_something=True)
438+
return abc.RewriteResult(has_done_something=True)
439439

440-
return result.RewriteResult()
440+
return abc.RewriteResult()
441441
```
442442

443443
1. Again, we want to make sure we're looking at a multiplication.
@@ -633,7 +633,7 @@ print(cool_example()) # (2)!
633633
1. Register an implementation for the statement `X()`.
634634
2. Notice that we are actually *calling* the function this time.
635635

636-
And, sure enough, when running the code, we now obtain a $2x2$ matrix:
636+
And, sure enough, when running the code, we now obtain a 2 x 2 matrix:
637637

638638
```python
639639
[[ 2.+2.j -2.+2.j]
@@ -675,7 +675,7 @@ Amazing.
675675

676676
But, wait:
677677
if constant folding can evaluate additions, couldn't it also evaluate multiplications?
678-
Wouldn't the make our multiplication rewrite pass obsolete?
678+
Wouldn't that make our multiplication rewrite pass obsolete?
679679
Sort of:
680680
this would mean that you still evaluate a whole bunch of matrix products, just at compile time rather than at runtime.
681681
Our rewriting pass, instead uses a symbolic approach to rewrite multiplications without the need to actually evaluate a matrix multiplication.

example/pauli/group.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from kirin.prelude import basic_no_opt
55

66

7-
@ir._dialectgroup(basic_no_opt.add(dialect=_dialect))
7+
@ir.dialect_group(basic_no_opt.add(dialect=_dialect))
88
def pauli(self):
99
def run_pass(mt):
1010
# TODO

example/pauli/rewrite.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,42 @@
11
from dataclasses import dataclass
22

33
from kirin import ir
4-
from kirin.rewrite import abc, result
4+
from kirin.rewrite import abc
55
from kirin.dialects import py
66

77
from .stmts import X, Y, Z, Id, PauliOperator
88

99

1010
@dataclass
1111
class RewritePauliMult(abc.RewriteRule):
12-
def rewrite_Statement(self, node: ir.Statement) -> result.RewriteResult:
12+
def rewrite_Statement(self, node: ir.Statement) -> abc.RewriteResult:
1313
if not isinstance(node, py.binop.Mult):
14-
return result.RewriteResult()
14+
return abc.RewriteResult()
1515

1616
if not isinstance(node.lhs.owner, PauliOperator) and not isinstance(
1717
node.rhs.owner, PauliOperator
1818
):
19-
return result.RewriteResult()
19+
return abc.RewriteResult()
2020

2121
if isinstance(node.lhs.owner, py.Constant):
2222
assert isinstance(node.rhs.owner, PauliOperator) # make the linter happy
2323
new_op = self.number_pauli_mult(node.lhs.owner, node.rhs.owner)
2424
node.replace_by(new_op)
25-
return result.RewriteResult(has_done_something=True)
25+
return abc.RewriteResult(has_done_something=True)
2626
elif isinstance(node.rhs.owner, py.Constant):
2727
assert isinstance(node.lhs.owner, PauliOperator) # make the linter happy
2828
new_op = self.number_pauli_mult(node.rhs.owner, node.lhs.owner)
2929
node.replace_by(new_op)
30-
return result.RewriteResult(has_done_something=True)
30+
return abc.RewriteResult(has_done_something=True)
3131

3232
if not isinstance(node.lhs.owner, PauliOperator) or not isinstance(
3333
node.rhs.owner, PauliOperator
3434
):
35-
return result.RewriteResult()
35+
return abc.RewriteResult()
3636

3737
new_op = self.pauli_pauli_mult(node.lhs.owner, node.rhs.owner)
3838
node.replace_by(new_op)
39-
return result.RewriteResult(has_done_something=True)
39+
return abc.RewriteResult(has_done_something=True)
4040

4141
@staticmethod
4242
def number_pauli_mult(lhs: py.Constant, rhs: PauliOperator) -> PauliOperator:

src/kirin/passes/fold.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@
1919

2020
@dataclass
2121
class Fold(Pass):
22+
"""
23+
Pass that runs a number of small optimization rewrites.
24+
25+
Specifically, the following rewrites are chained:
26+
27+
- `ConstantFold`
28+
- `InlineGetItem`
29+
- `Call2Invoke`
30+
- `DeadCodeElimination`
31+
"""
32+
2233
hint_const: HintConst = field(init=False)
2334

2435
def __post_init__(self):

0 commit comments

Comments
 (0)