Skip to content

Commit de6e380

Browse files
committed
transpiler/1q_decomposition: fix circuit score for zero gate errors
1 parent 15b2715 commit de6e380

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def _error(circuit, target=None, qubit=None):
185185
if isinstance(circuit, list):
186186
return len(circuit)
187187
else:
188-
return len(circuit._multi_graph) - 2
188+
return circuit.size()
189189
else:
190190
if isinstance(circuit, list):
191191
gate_fidelities = [
@@ -198,11 +198,10 @@ def _error(circuit, target=None, qubit=None):
198198
]
199199
gate_error = 1 - np.product(gate_fidelities)
200200
if gate_error == 0.0:
201+
# prefer shorter circuits among those with zero error
201202
if isinstance(circuit, list):
202203
return -100 + len(circuit)
203204
else:
204-
return -100 + len(
205-
circuit._multi_graph
206-
) # prefer shorter circuits among those with zero error
205+
return -100 + circuit.size()
207206
else:
208207
return gate_error

test/python/transpiler/test_optimize_1q_decomposition.py

+35
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,41 @@ def test_euler_decomposition_zsx_2(self):
530530
result = passmanager.run(circuit)
531531
self.assertEqual(circuit, result, f"Circuit:\n{circuit}\nResult:\n{result}")
532532

533+
def test_optimize_run_of_u_to_single_u_on_target_no_error(self):
534+
"""U(pi/3, 0, 0) * U(pi/3, 0, 0) * U(pi/3, 0, 0) -> U(pi, 0, 0)."""
535+
qr = QuantumRegister(1, "qr")
536+
circuit = QuantumCircuit(qr)
537+
for _ in range(3):
538+
circuit.append(UGate(np.pi / 3, 0.0, 0.0), [qr[0]])
539+
540+
expected = QuantumCircuit(qr)
541+
expected.append(UGate(np.pi, 0.0, 0.0), [qr[0]])
542+
543+
passmanager = PassManager()
544+
passmanager.append(Optimize1qGatesDecomposition(target=target_rz_ry_u_noerror))
545+
result = passmanager.run(circuit)
546+
547+
msg = f"expected:\n{expected}\nresult:\n{result}"
548+
self.assertEqual(expected, result, msg=msg)
549+
550+
def test_optimize_run_of_u_to_single_u_no_target(self):
551+
"""U(pi/3, 0, 0) * U(pi/3, 0, 0) * U(pi/3, 0, 0) -> U(pi, 0, 0)."""
552+
qr = QuantumRegister(1, "qr")
553+
circuit = QuantumCircuit(qr)
554+
for _ in range(3):
555+
circuit.append(UGate(np.pi / 3, 0.0, 0.0), [qr[0]])
556+
557+
expected = QuantumCircuit(qr)
558+
expected.append(UGate(np.pi, 0.0, 0.0), [qr[0]])
559+
560+
basis = ["u"]
561+
passmanager = PassManager()
562+
passmanager.append(Optimize1qGatesDecomposition(basis))
563+
result = passmanager.run(circuit)
564+
565+
msg = f"expected:\n{expected}\nresult:\n{result}"
566+
self.assertEqual(expected, result, msg=msg)
567+
533568
def test_optimize_u_to_phase_gate(self):
534569
"""U(0, 0, pi/4) -> p(pi/4). Basis [p, sx]."""
535570
qr = QuantumRegister(2, "qr")

0 commit comments

Comments
 (0)