qiskit-aer
qiskit-aer copied to clipboard
Readout Error has absolutely no effect
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.
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)
It is possible to make it retain approximation=True and shots=None
while having a correct result? Since exact expectation value is needed.
Do you need "exact" expectation value with "readout errors"? Currently Aer supports readout errors with measurements, that will not produce "exact" expectation value.
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?
The readout error also has no effect for AerSampler when shots=None.