Skip to content

Commit 08e21cd

Browse files
fix: implemented change recommended in review + added custom bloq for testing
1 parent 3726791 commit 08e21cd

2 files changed

Lines changed: 32 additions & 40 deletions

File tree

qualtran/quirk_interop/bloq_to_quirk.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def __init__(self, cbloq: CompositeBloq, max_n_lines: int = 100):
3131
self._join_to_split_id = self._build_join_to_split_map()
3232
self._split_to_join_id = self._build_split_to_join_map()
3333

34-
def _find_dual_on_line(self, line: int, start: int, dual_cls):
34+
def _find_dual_on_line(self, line: int, start: int, dual_cls: Bloq):
3535
dual_candidates = [
3636
(rpos.seq_x, soq.binst.i) # type: ignore[union-attr]
3737
for soq, rpos in self.soq_assign.items()
@@ -102,19 +102,11 @@ def composite_bloq_to_quirk(
102102
circuit = [col for col in sparse_circuit if col != empty_col]
103103
if circuit == []:
104104
raise ValueError(f"{cbloq} is an empty circuit")
105-
nb_deleted_lines = 0
106-
for i in range(
107-
msd.max_y + 1
108-
): # deleting lines of the circuit which are not used (happens with partition)
109-
ind = i - nb_deleted_lines
110-
for col in circuit:
111-
line_is_useless = col[ind] == '1'
112-
if not line_is_useless:
113-
break
114-
if line_is_useless:
115-
for col in circuit:
116-
col.pop(ind)
117-
nb_deleted_lines += 1
105+
# deleting lines of the circuit which are not used (happens with partition)
106+
if circuit:
107+
num_lines = len(circuit[0])
108+
lines_to_keep = [i for i in range(num_lines) if any(col[i] != '1' for col in circuit)]
109+
circuit = [[col[i] for i in lines_to_keep] for col in circuit]
118110

119111
quirk_url = "https://algassert.com/quirk"
120112
start = '#circuit={"cols":['

qualtran/quirk_interop/bloq_to_quirk_test.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import pytest
22

3-
from qualtran import BloqBuilder, QAny, QUInt
3+
from qualtran import BloqBuilder, QAny
4+
from qualtran.bloqs.basic_gates import Toffoli, XGate
45
from qualtran.bloqs.bookkeeping import Allocate, Join, Split
5-
from qualtran.bloqs.basic_gates import Toffoli
6-
from qualtran.bloqs.mcmt import MultiTargetCNOT
7-
from qualtran.bloqs.arithmetic import Add, Negate
86
from qualtran.quirk_interop.bloq_to_quirk import (
97
SparseLineManager,
108
bloq_to_quirk,
@@ -14,12 +12,21 @@
1412

1513
def _build_split_join_split_cbloq(n):
1614
bb = BloqBuilder()
17-
q = bb.add(Allocate(QAny(n)))
18-
qs = bb.add(Split(QAny(n)), reg=q)
19-
q_joined = bb.add(Join(QAny(n)), reg=qs)
20-
qs_again = bb.add(Split(QAny(n)), reg=q_joined)
21-
out = bb.add(Join(QAny(n)), reg=qs_again)
22-
return bb.finalize(out=out)
15+
q1 = bb.add(Allocate(QAny(n)))
16+
q2 = bb.add(Allocate(QAny(n)))
17+
qs1 = bb.add(Split(QAny(n)), reg=q1)
18+
qs2 = bb.add(Split(QAny(n)), reg=q2)
19+
for i in range(n):
20+
qs1[i] = bb.add(XGate(), q=qs1[i])
21+
q1 = bb.add(Join(QAny(n)), reg=qs1)
22+
q2 = bb.add(Join(QAny(n)), reg=qs2)
23+
qs1 = bb.add(Split(QAny(n)), reg=q1)
24+
qs2 = bb.add(Split(QAny(n)), reg=q2)
25+
for i in range(n):
26+
qs2[i] = bb.add(XGate(), q=qs2[i])
27+
q2 = bb.add(Join(QAny(n)), reg=qs2)
28+
q1 = bb.add(Join(QAny(n)), reg=qs1)
29+
return bb.finalize(q1=q1, q2=q2)
2330

2431

2532
@pytest.mark.parametrize("n", range(3, 6))
@@ -33,29 +40,22 @@ def test_sparse_line_manager_builds_dual_maps(n):
3340

3441
@pytest.mark.parametrize("n", range(3, 6))
3542
def test_composite_bloq_to_quirk_url_shape(n):
36-
cbloq = MultiTargetCNOT(n).decompose_bloq().flatten()
43+
cbloq = _build_split_join_split_cbloq(n)
3744
url = composite_bloq_to_quirk(cbloq)
3845

3946
assert url.startswith('https://algassert.com/quirk#circuit={"cols":[')
4047
assert url.endswith(']}')
4148

4249

43-
def test_bloq_to_quirk():
44-
url_add = bloq_to_quirk(Add(QUInt(5)))
45-
assert url_add.startswith('https://algassert.com/quirk#circuit={"cols":[')
46-
assert url_add.endswith(']}')
47-
url_mtcnot = bloq_to_quirk(MultiTargetCNOT(3))
48-
assert (
49-
url_mtcnot
50-
== 'https://algassert.com/quirk#circuit={"cols":[[1,"•",1,"X"],[1,"•","X",1],["•","X",1,1],[1,"•","X",1],[1,"•",1,"X"]]}'
51-
)
52-
53-
54-
def test_negate_to_quirk():
55-
url = bloq_to_quirk(Negate(QUInt(2)))
50+
def test_composite_bloq_to_quirk():
51+
cbloq1 = _build_split_join_split_cbloq(1)
52+
url1 = composite_bloq_to_quirk(cbloq1)
53+
assert url1 == 'https://algassert.com/quirk#circuit={"cols":[["X",1],[1,"X"]]}'
54+
cbloq2 = _build_split_join_split_cbloq(2)
55+
url2 = composite_bloq_to_quirk(cbloq2)
5656
assert (
57-
url
58-
== 'https://algassert.com/quirk#circuit={"cols":[["X",1,1,1,1],[1,"X",1,1,1],[1,1,1,"X",1],[1,"•",1,"•","X"],["X",1,1,1,"•"],[1,"•",1,"•","X"],["X",1,"•",1,1],[1,"X",1,"•",1],[1,1,1,"X",1]]}'
57+
url2
58+
== 'https://algassert.com/quirk#circuit={"cols":[["X",1,1,1],[1,"X",1,1],[1,1,"X",1],[1,1,1,"X"]]}'
5959
)
6060

6161

0 commit comments

Comments
 (0)