quantumlib / Cirq

A Python framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits.
Apache License 2.0
4.27k stars 1.01k forks source link

The default dtype of np.complex64 for the DensityMatrixSimulator is not precise enough for relatively small circuits. #6551

Open bramathon opened 7 months ago

bramathon commented 7 months ago

Description of the issue

How to reproduce the issue

Use the example circuit: example-circuit.json

import cirq

with open("example-circuit.json", "r") as f:
    circuit = cirq.read_json(f)

simulator = cirq.DensityMatrixSimulator(dtype=np.complex64, noise=None, seed=None, split_untangled_states=True)
obs = cirq.PauliString(cirq.X(cirq.LineQubit(28)), cirq.X(cirq.LineQubit(29)))
simulator.simulate_expectation_values(program=circuit, observables=obs)

Now, if we change the dtype to np.complex128, the error goes away.

Suggested solution: set the default value of dtype to np.complex128 or np.complex256

1018 raise ValueError(f'Density matrix does not have trace 1. Instead, it has trace {trace}.') 1019 if not np.all(np.linalg.eigvalsh(density_matrix) > -atol): -> 1020 raise ValueError('The density matrix is not positive semidefinite.') ValueError: The density matrix is not positive semidefinite.

Cirq version 1.3.0

pavoljuhas commented 6 months ago

csynkque meeting - this works as intended, but the error message can be improved to suggest using a higher precision complex128 type. Another consideration is to expose a tolerance atol argument which would allow higher round-offs for complex64 data type.