Skip to content

Commit 5199077

Browse files
Add test for translate_cirq_to_qtrajectory (#1040)
Adds a test for `translate_cirq_to_qtrajectory` in `qsim_circuit.py`, which was missing test coverage. The new test covers the general happy path (translating a circuit containing unitary gates, noisy mixture gates, and noisy channel gates) and also tests some edge cases: an empty circuit, a circuit with only unitaries, and unparseable operations handling. (Tests generated with the help of Jules.) --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
1 parent fcf8da4 commit 5199077

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

qsimcirq_tests/qsimcirq_test.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,61 @@ def _decompose_(self, qubits):
180180
assert result_hist[1] > 0
181181

182182

183+
def test_translate_cirq_to_qtrajectory():
184+
q0, q1 = cirq.LineQubit.range(2)
185+
186+
# General circuit with unitary, mixture, and channel.
187+
circuit = cirq.Circuit(
188+
cirq.H(q0),
189+
cirq.CNOT(q0, q1),
190+
cirq.bit_flip(0.1)(q0),
191+
cirq.depolarize(0.1)(q1),
192+
)
193+
qsim_circuit = qsimcirq.QSimCircuit(circuit)
194+
qsim_ncircuit, moment_indices = qsim_circuit.translate_cirq_to_qtrajectory()
195+
196+
assert isinstance(qsim_ncircuit, qsimcirq.qsim.NoisyCircuit)
197+
assert qsim_ncircuit.num_qubits == 2
198+
# The circuit has 3 moments, and 4 gates are translated in total.
199+
assert moment_indices == [1, 2, 4]
200+
201+
# Edge case: empty circuit.
202+
circuit_empty = cirq.Circuit()
203+
qsim_circuit_empty = qsimcirq.QSimCircuit(circuit_empty)
204+
qsim_ncircuit_empty, moment_indices_empty = (
205+
qsim_circuit_empty.translate_cirq_to_qtrajectory()
206+
)
207+
208+
assert isinstance(qsim_ncircuit_empty, qsimcirq.qsim.NoisyCircuit)
209+
assert qsim_ncircuit_empty.num_qubits == 0
210+
assert moment_indices_empty == []
211+
212+
# Edge case: circuit with only unitary gates.
213+
circuit_unitary = cirq.Circuit(cirq.X(q0), cirq.H(q1))
214+
qsim_circuit_unitary = qsimcirq.QSimCircuit(circuit_unitary)
215+
qsim_ncircuit_unitary, moment_indices_unitary = (
216+
qsim_circuit_unitary.translate_cirq_to_qtrajectory()
217+
)
218+
219+
assert isinstance(qsim_ncircuit_unitary, qsimcirq.qsim.NoisyCircuit)
220+
assert qsim_ncircuit_unitary.num_qubits == 2
221+
assert moment_indices_unitary == [2]
222+
223+
# Edge case: unparseable operation.
224+
class UnparseableOp(cirq.Operation):
225+
@property
226+
def qubits(self):
227+
return (q0,)
228+
229+
def with_qubits(self, *new_qubits):
230+
return self
231+
232+
circuit_unparseable = cirq.Circuit(UnparseableOp())
233+
qsim_circuit_unparseable = qsimcirq.QSimCircuit(circuit_unparseable)
234+
with pytest.raises(ValueError, match="Encountered unparseable op"):
235+
qsim_circuit_unparseable.translate_cirq_to_qtrajectory()
236+
237+
183238
@pytest.mark.parametrize("mode", ["noiseless", "noisy"])
184239
def test_cirq_qsim_simulate(mode: str):
185240
# Pick qubits.

0 commit comments

Comments
 (0)