Qiskit / qiskit-aer

Aer is a high performance simulator for quantum circuits that includes noise models
https://qiskit.github.io/qiskit-aer/
Apache License 2.0
488 stars 360 forks source link

Readout Error has absolutely no effect #1861

Open eul94458 opened 1 year ago

eul94458 commented 1 year ago

Informations

qiskit 0.43.1 pypi_0 pypi qiskit-aer 0.12.1 pypi_0 pypi qiskit-ibm-provider 0.5.2 pypi_0 pypi qiskit-ibm-runtime 0.9.4 pypi_0 pypi qiskit-ibmq-provider 0.20.2 pypi_0 pypi qiskit-terra 0.24.1 pypi_0 pypi

What is the current behavior?

Readout Error has absolutely no effect

Steps to reproduce the problem

from qiskit_aer import AerSimulator
from qiskit_aer.primitives import Estimator as AerEstimator
from qiskit_aer.noise import NoiseModel, ReadoutError
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp, Statevector

noisemodel = NoiseModel()
readout_err = ReadoutError(
    [[0, 1],
     [1, 0]])
noisemodel.add_all_qubit_readout_error(readout_err)

A = SparsePauliOp("I", 1)
state = QuantumCircuit(1)

for with_noise in [0, 1]:
    my_noisemodel = noisemodel if with_noise else None
    aer_estimator = AerEstimator(
            run_options={"shots": None, "seed": 42},
            backend_options={"noise_model": my_noisemodel},
            approximation=True,
            )
    print(aer_estimator.run(state, A).result().values.real)

Result:

[1.]
[1.]

What is the expected behavior?

Has effect.

Suggested solutions

Make it effective.

hhorii commented 1 year ago

Please use approximation =False with other pauli operators.

from qiskit_aer import AerSimulator
from qiskit_aer.primitives import Estimator as AerEstimator
from qiskit_aer.noise import NoiseModel, ReadoutError
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp, Statevector

noisemodel = NoiseModel()
readout_err = ReadoutError(
    [[0, 1],
     [1, 0]])
noisemodel.add_all_qubit_readout_error(readout_err)

A = SparsePauliOp("Z", 1)
state = QuantumCircuit(1)

for with_noise in [0, 1]:
    my_noisemodel = noisemodel if with_noise else None
    aer_estimator = AerEstimator(
            run_options={"shots": 1024, "seed": 42},
            backend_options={"noise_model": my_noisemodel},
            approximation=False
            )
    print(aer_estimator.run(state, A).result().values.real)
eul94458 commented 1 year ago

It is possible to make it retain approximation=True and shots=None while having a correct result? Since exact expectation value is needed.

hhorii commented 1 year ago

Do you need "exact" expectation value with "readout errors"? Currently Aer supports readout errors with measurements, that will not produce "exact" expectation value.

eul94458 commented 1 year ago

My understanding is that "exact expectation value" is the limit when shots approach to infinte, which is the ideal value. You claimed that with shots=None and approximate=True can product such ideal value but instead it do not. As shown in the following code, we can see that the NOISY expectation value approaching 0.4 with decreasing sampling error, however, equals to 1 when approximation set to True, which is absurd.

from qiskit_aer import AerSimulator
from qiskit_aer.primitives import Estimator as AerEstimator
from qiskit_aer.noise import NoiseModel, ReadoutError
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp, Statevector

noisemodel = NoiseModel()
readout_err = ReadoutError(
    [[0.7, 0.3],
     [0.3, 0.7]])
noisemodel.add_all_qubit_readout_error(readout_err)

A = SparsePauliOp("Z", 1)
for my_shots in [1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8]:
    aer_estimator = AerEstimator(
            run_options={"shots": my_shots, "seed": 42},           
            backend_options={"noise_model": noisemodel},
            approximation=False
            )
    print(aer_estimator.run(state, A).result().values.real)

AerEstimator(
    run_options={"shots": my_shots, "seed": 42},           
    backend_options={"noise_model": noisemodel},
    approximation=True
    ).run(state, A).result().values.real

output:

[0.4]
[0.46]
[0.382]
[0.4026]
[0.39862]
[0.39999]
[0.3998694]
[0.39992492]
array([1.])

Noises such as bitflip, phaseflip, depolar are working when shots=None and approximate=True but all of a sudden readout error is ignored completely. What is this inconsistancy?

xyzdxf commented 1 year ago

The readout error also has no effect for AerSampler when shots=None.