qiskit-aer icon indicating copy to clipboard operation
qiskit-aer copied to clipboard

Readout Error has absolutely no effect

Open eul94458 opened this issue 1 year ago • 5 comments

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

  • Python version: 3.8
  • Operating system: ALL

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.

eul94458 avatar Jul 06 '23 05:07 eul94458

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)

hhorii avatar Jul 06 '23 09:07 hhorii

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

eul94458 avatar Jul 06 '23 11:07 eul94458

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

hhorii avatar Jul 10 '23 02:07 hhorii

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?

eul94458 avatar Jul 10 '23 05:07 eul94458

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

xyzdxf avatar Aug 19 '23 09:08 xyzdxf