Exception when simulating circuit with empty moments
Closed this issue · 1 comments
maffoo commented
Some multi-qubit circuits with empty moments cause an error when simulating:
In [1]: import qsimcirq
In [2]: s = qsimcirq.QSimSimulator()
In [3]: qs = cirq.LineQubit.range(2)
In [4]: s.simulate(cirq.Circuit(cirq.X(qs[0])**0.5, cirq.Moment(), cirq.X(qs[1])**0.5))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-686c0f4a8a07> in <module>
----> 1 s.simulate(cirq.Circuit(cirq.X(qs[0])**0.5, cirq.Moment(), cirq.X(qs[1])**0.5))
~/.virtualenvs/pyle/lib/python3.8/site-packages/cirq/sim/simulator.py in simulate(self, program, param_resolver, qubit_order, initial_state)
339 SimulationTrialResults for the simulation. Includes the final state.
340 """
--> 341 return self.simulate_sweep(
342 program, study.ParamResolver(param_resolver), qubit_order, initial_state
343 )[0]
~/.virtualenvs/pyle/lib/python3.8/site-packages/qsimcirq/qsim_simulator.py in simulate_sweep(self, program, params, qubit_order, initial_state)
363 solved_circuit = protocols.resolve_parameters(program, prs)
364 translator_fn = getattr(solved_circuit, translator_fn_name)
--> 365 options['c'] = translator_fn(cirq_order)
366 options['s'] = self.get_seed()
367 qubit_map = {
~/.virtualenvs/pyle/lib/python3.8/site-packages/qsimcirq/qsim_circuit.py in translate_cirq_to_qsim(self, qubit_order)
313 for op in moment
314 ]
--> 315 moment_length = max(len(gate_ops) for gate_ops in ops_by_gate)
316
317 # Gates must be added in time order.
ValueError: max() arg is an empty sequence
Changing the circuit to have gates on both qubits either before or after the empty moment currently works:
In [5]: s.simulate(cirq.Circuit(cirq.X.on_each(qs), cirq.Moment(), cirq.X(qs[1])**0.5))
Out[5]:
measurements: (no measurements)
output vector: (0.5-0.5j)|10⟩ + (0.5+0.5j)|11⟩
In [6]: s.simulate(cirq.Circuit(cirq.X(qs[0])**0.5, cirq.Moment(), cirq.X.on_each(qs)))
Out[6]:
measurements: (no measurements)
output vector: (0.5-0.5j)|01⟩ + (0.5+0.5j)|11⟩
95-martin-orion commented
Not quite sure why gates on both qubits fixes the issue, but the root cause is a bad max
expression in the circuit translator. Shouldn't be too hard to fix.