qiskit-ibm-runtime
                                
                                 qiskit-ibm-runtime copied to clipboard
                                
                                    qiskit-ibm-runtime copied to clipboard
                            
                            
                            
                        No benefit from using advanced resilience_levels in Estimator
The IBM Runtime has resilience_levels that controls how much error mitigation goes into a result.  In general, it is supposed that the higher the resilience_level the more accurate the resulting expectation values are.  However, this does not appear to be the case.
Consider the circuit:
N = 6
qc2 = QuantumCircuit(N)
qc2.x(range(N))
qc2.h(range(N))
for kk in range(N // 2, 0, -1):
    qc2.ch(kk, kk - 1)
for kk in range(N // 2, N - 1):
    qc2.ch(kk, kk + 1)
and operator:
oper = SparsePauliOp.from_list([('Z'*6, 1)])
Running through all the possible resilience_levels on ibm_geneva using:
with Session(backend=backend):
    estimator = Estimator()
    job0 = estimator.run(qc2, oper, shots=1e4, resilience_level=0)
    job1 = estimator.run(qc2, oper, shots=1e4, resilience_level=1)
    job2 = estimator.run(qc2, oper, shots=1e4, resilience_level=2)
    job3 = estimator.run(qc2, oper, shots=1e4, resilience_level=3)
gives expectation values [0.203, 0.4525, 0.2165, 0.1497], respectively, where the ideal value is 0.4374.  Thus level 1 (TREX) overshoots the answer (over-corrects), level 2 (ZNE) does very little (within shot variance I think), and level 3 (PEC) makes things worse.
The drop from resilience level 1 to 2 is consistent with the fact that you have a short depth circuit dominated by measurement error. We really need level 2 to do both TREX and ZNE.
The failure of PEC in this case at level 3 deserves some standalone debug. How long did job3 take, @nonhermitian?
Ok yeah. I assumed that TREX was being done at level 2 since it is a straightforward addition.
The PEC job took about 43min.
For the PEC issues I will add that mitigating simple circuits like 4Q GHZ states is markedly off.  In this case the actual should be 1.0 but PEC returns a much larger number.  Also note that standard_error seems to be erroring somewhere:
EstimatorResult(values=array([1.72611795]), metadata=[{'standard_error': nan, 'confidence_interval': [1.6989553989420931, 1.753280495527756], 'confidence_level': 0.95, 'shots': 1498496, 'samples': 11707, 'sampling_overhead': 1.1707446507600376, 'total_mitigated_layers': 2}])
Job time was 30 min
@nonhermitian Have you experienced similar results when using EstimatorV2?
Was not able to replicate this with EstimatorV2, closing for now. Feel free to reopen if you are still experiencing this issue.