Skip to content

Commit 6de1e12

Browse files
authored
Allow computing cost from decomposition of cirq gates (#1510)
1 parent d811be0 commit 6de1e12

3 files changed

Lines changed: 22 additions & 5 deletions

File tree

qualtran/bloqs/basic_gates/rotation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def _z_pow() -> ZPowGate:
108108

109109
@frozen
110110
class CZPowGate(CirqGateAsBloqBase):
111-
exponent: float = 1.0
111+
exponent: SymbolicFloat = 1.0
112112
global_shift: float = 0.0
113113
eps: SymbolicFloat = 1e-11
114114

qualtran/cirq_interop/_cirq_to_bloq.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,11 @@ def cirq_gate(self) -> cirq.Gate:
150150
def my_static_costs(self, cost_key: 'CostKey'):
151151
if isinstance(cost_key, QECGatesCost):
152152
t_count = _from_directly_countable_cirq(self.cirq_gate)
153-
if t_count is None:
154-
raise ValueError(f"Cirq gate must be directly countable, not {self.cirq_gate}")
155-
return GateCounts(t=t_count.t, rotation=t_count.rotations, clifford=t_count.clifford)
153+
if t_count is not None:
154+
return GateCounts(
155+
t=t_count.t, rotation=t_count.rotations, clifford=t_count.clifford
156+
)
157+
return NotImplemented
156158

157159

158160
def _cirq_wire_symbol_to_qualtran_wire_symbol(symbol: str, side: Side) -> 'WireSymbol':

qualtran/cirq_interop/_cirq_to_bloq_test.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import cirq
1818
import numpy as np
1919
import pytest
20+
import sympy
2021
from attrs import frozen
2122

2223
import qualtran
@@ -34,11 +35,12 @@
3435
SoquetT,
3536
)
3637
from qualtran._infra.gate_with_registers import get_named_qubits
37-
from qualtran.bloqs.basic_gates import CNOT, GlobalPhase, OneState
38+
from qualtran.bloqs.basic_gates import CNOT, CZPowGate, GlobalPhase, OneState, YPowGate
3839
from qualtran.bloqs.bookkeeping import Allocate, Free, Join, Split
3940
from qualtran.bloqs.mcmt.and_bloq import And
4041
from qualtran.cirq_interop import cirq_optree_to_cbloq, CirqGateAsBloq, CirqQuregT
4142
from qualtran.cirq_interop.t_complexity_protocol import TComplexity
43+
from qualtran.resource_counting import GateCounts, get_cost_value, QECGatesCost
4244

4345

4446
@frozen
@@ -228,3 +230,16 @@ def test_cirq_gate_as_bloq_decompose_raises():
228230

229231
def test_cirq_gate_as_bloq_diagram_info():
230232
assert cirq.circuit_diagram_info(GlobalPhase(exponent=0.5)) is None
233+
234+
235+
def test_cirq_gate_cost_via_decomp():
236+
theta = sympy.Symbol("theta", real=True)
237+
cirq_swappow = cirq.SwapPowGate(exponent=theta)
238+
239+
swappow_bloq = CirqGateAsBloq(cirq_swappow)
240+
241+
_, sigma = swappow_bloq.call_graph()
242+
assert sigma == {CNOT(): 2, YPowGate(0.5): 1, YPowGate(-0.5): 1, CZPowGate(theta): 1}
243+
244+
gc_swappow = get_cost_value(swappow_bloq, QECGatesCost())
245+
assert gc_swappow == GateCounts(clifford=4, rotation=1)

0 commit comments

Comments
 (0)