quantumlib/qsim

Exception when simulating circuit with empty moments

Closed this issue · 1 comments

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)|11In [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

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.