Skip to content

Commit 9028641

Browse files
committed
Add CSWAP support to ClassicalStateSimulator closes #7841
1 parent 9f96ca5 commit 9028641

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

cirq-core/cirq/sim/classical_simulator.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ def _act_on_fallback_(self, action, qubits: Sequence[cirq.Qid], allow_decompose:
154154
elif gate == ops.SWAP:
155155
a, b = mapped_qubits
156156
self._state.basis[a], self._state.basis[b] = self._state.basis[b], self._state.basis[a]
157+
elif gate == ops.CSWAP:
158+
c, a, b = mapped_qubits
159+
if self._state.basis[c]:
160+
self._state.basis[a], self._state.basis[b] = self._state.basis[b], self._state.basis[a]
157161
elif gate == ops.TOFFOLI:
158162
c1, c2, q = mapped_qubits
159163
self._state.basis[q] ^= self._state.basis[c1] & self._state.basis[c2]

cirq-core/cirq/sim/classical_simulator_test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,23 @@ def test_CSWAP(initial_state) -> None:
146146
np.testing.assert_equal(results, final_state)
147147

148148

149+
def test_named_CSWAP() -> None:
150+
# Specifically test named CSWAP gate, not just controlled(SWAP)
151+
q0, q1, q2 = cirq.LineQubit.range(3)
152+
circuit = cirq.Circuit()
153+
# Control q0=1, so swap q1, q2
154+
circuit.append(cirq.X(q0))
155+
circuit.append(cirq.X(q1))
156+
circuit.append(cirq.CSWAP(q0, q1, q2)) # q0=1 -> swap q1=1, q2=0 -> q1=0, q2=1
157+
circuit.append(cirq.measure((q0, q1, q2), key='key'))
158+
159+
sim = cirq.ClassicalStateSimulator()
160+
result = sim.run(circuit, repetitions=1)
161+
# Expected: 1, 0, 1
162+
expected = np.array([[[1, 0, 1]]], dtype=np.uint8)
163+
np.testing.assert_equal(result.records['key'], expected)
164+
165+
149166
def test_measurement_gate() -> None:
150167
q0, q1 = cirq.LineQubit.range(2)
151168
circuit = cirq.Circuit()

0 commit comments

Comments
 (0)