Skip to content

Commit 80c072f

Browse files
authored
Merge pull request #222 from BQSKit/fix-identity-rebase
Fix identity rebase
2 parents 73ddab3 + ea5ca2d commit 80c072f

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

bqskit/compiler/compile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,7 @@ def build_multi_qudit_retarget_workflow(
10141014
),
10151015
RestoreModelConnevtivityPass(),
10161016
],
1017-
AutoRebase2QuditGatePass(3, 5),
1017+
AutoRebase2QuditGatePass(3, 5, synthesis_epsilon),
10181018
),
10191019
ScanningGateRemovalPass(
10201020
success_threshold=synthesis_epsilon,

bqskit/passes/retarget/auto.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from bqskit.ir.opt.cost.functions import HilbertSchmidtResidualsGenerator
1010
from bqskit.ir.opt.cost.generator import CostFunctionGenerator
1111
from bqskit.passes.retarget.two import Rebase2QuditGatePass
12+
from bqskit.qis.unitary import UnitaryMatrix
1213
from bqskit.runtime import get_runtime
1314
from bqskit.utils.typing import is_integer
1415
from bqskit.utils.typing import is_real_number
@@ -112,6 +113,13 @@ async def run(self, circuit: Circuit, data: PassData) -> None:
112113

113114
target = self.get_target(circuit, data)
114115

116+
if isinstance(target, UnitaryMatrix):
117+
identity = UnitaryMatrix.identity(target.dim, target.radixes)
118+
if target.get_distance_from(identity) < self.success_threshold:
119+
_logger.debug('Target is identity, returning empty circuit.')
120+
circuit.clear()
121+
return
122+
115123
for g in old_gates:
116124
# Track retries to check for no progress
117125
num_retries = 0

bqskit/passes/retarget/two.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from bqskit.ir.opt.cost.functions import HilbertSchmidtResidualsGenerator
1414
from bqskit.ir.opt.cost.generator import CostFunctionGenerator
1515
from bqskit.ir.point import CircuitPoint as Point
16+
from bqskit.qis.unitary import UnitaryMatrix
1617
from bqskit.runtime import get_runtime
1718
from bqskit.utils.typing import is_integer
1819
from bqskit.utils.typing import is_real_number
@@ -164,6 +165,13 @@ async def run(self, circuit: Circuit, data: PassData) -> None:
164165

165166
target = self.get_target(circuit, data)
166167

168+
if isinstance(target, UnitaryMatrix):
169+
identity = UnitaryMatrix.identity(target.dim, target.radixes)
170+
if target.get_distance_from(identity) < self.success_threshold:
171+
_logger.debug('Target is identity, returning empty circuit.')
172+
circuit.clear()
173+
return
174+
167175
for g in self.gates:
168176
# Track retries to check for no progress
169177
num_retries = 0
@@ -188,6 +196,7 @@ async def run(self, circuit: Circuit, data: PassData) -> None:
188196
circuit.point(g),
189197
self.gates,
190198
)
199+
191200
circuits_with_new_gate = []
192201
for circ in self.circs:
193202
circuit_copy = circuit.copy()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from __future__ import annotations
2+
3+
from bqskit.compiler.compile import compile
4+
from bqskit.compiler.compiler import Compiler
5+
from bqskit.ir.lang.qasm2 import OPENQASM2Language
6+
7+
8+
def test_cry_identity_corner_case(compiler: Compiler) -> None:
9+
qasm = """
10+
OPENQASM 2.0;
11+
include "qelib1.inc";
12+
qreg q[5];
13+
creg meas[5];
14+
cry(0) q[0],q[2];
15+
cry(0) q[1],q[2];
16+
"""
17+
circuit = OPENQASM2Language().decode(qasm)
18+
_ = compile(circuit, optimization_level=1, seed=10)
19+
# Should finish

0 commit comments

Comments
 (0)