Skip to content

Commit 9991bc5

Browse files
Merge pull request #485 from quantumlib/qsim-invert-masks
Optimize invert mask application
2 parents a0dd1e4 + 664f484 commit 9991bc5

File tree

1 file changed

+18
-13
lines changed

1 file changed

+18
-13
lines changed

qsimcirq/qsim_simulator.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -376,27 +376,32 @@ def _sample_measure_results(
376376
seed=self._prng,
377377
)
378378

379-
for i in range(repetitions):
380-
for key, op in meas_ops.items():
381-
meas_indices = [qubit_map[qubit] for qubit in op.qubits]
382-
invert_mask = op.gate.full_invert_mask()
383-
for j, q in enumerate(meas_indices):
384-
results[key][i][j] = full_results[i][q] ^ invert_mask[j]
379+
for key, op in meas_ops.items():
380+
meas_indices = [qubit_map[qubit] for qubit in op.qubits]
381+
invert_mask = op.gate.full_invert_mask()
382+
# Apply invert mask to re-ordered results
383+
results[key] = full_results[:, meas_indices] ^ invert_mask
384+
385385
else:
386386
options["c"] = self._translate_circuit(
387387
program,
388388
translator_fn_name,
389389
cirq.QubitOrder.DEFAULT,
390390
)
391+
measurements = np.empty(
392+
shape=(
393+
repetitions,
394+
sum(cirq.num_qubits(op) for op in meas_ops.values()),
395+
),
396+
dtype=int,
397+
)
391398
for i in range(repetitions):
392399
options["s"] = self.get_seed()
393-
measurements = sampler_fn(options)
394-
for key, bound in bounds.items():
395-
invert_mask = meas_ops[key].gate.full_invert_mask()
396-
for j in range(bound[1] - bound[0]):
397-
results[key][i][j] = int(
398-
measurements[bound[0] + j] ^ invert_mask[j]
399-
)
400+
measurements[i] = sampler_fn(options)
401+
402+
for key, (start, end) in bounds.items():
403+
invert_mask = meas_ops[key].gate.full_invert_mask()
404+
results[key] = measurements[:, start:end] ^ invert_mask
400405

401406
return results
402407

0 commit comments

Comments
 (0)