qiskit-ibm-runtime icon indicating copy to clipboard operation
qiskit-ibm-runtime copied to clipboard

Initializing with options dict using resilience level and resilience options fails

Open chriseclectic opened this issue 2 months ago • 0 comments

Describe the bug

When passing in a dict for Options when initializing an estimator, trying to modify options related to the resilience levels raises an exception.

Steps to reproduce

The following works to initialize a level 2 Estimator and set a custom ZNE extrapolator:

options = {"resilience_level": 2}
estimator = EstimatorV2(backend, options=options)
estimator.options.resilience.zne.extrapolator = "linear"

The following does not:

options = {
    "resilience_level": 2,
    "resilience": {"zne": {"extrapolator": "linear"}},
}
estimator = EstimatorV2(backend, options=options)
---------------------------------------------------------------------------
ValidationError                           Traceback (most recent call last)
Cell In[39], line 5
      1 options = {
      2     "resilience_level": 2,
      3     "resilience": {"zne": {"extrapolator": "linear"}},
      4 }
----> 5 estimator = EstimatorV2(backend, options=options)

File ~/mambaforge/envs/qiskit1/lib/python3.11/site-packages/qiskit_ibm_runtime/estimator.py:132, in EstimatorV2.__init__(self, backend, session, options)
    130 BaseEstimatorV2.__init__(self)
    131 Estimator.__init__(self)
--> 132 BasePrimitiveV2.__init__(self, backend=backend, session=session, options=options)

File ~/mambaforge/envs/qiskit1/lib/python3.11/site-packages/qiskit_ibm_runtime/base_primitive.py:89, in BasePrimitiveV2.__init__(self, backend, session, options)
     86 self._service: QiskitRuntimeService | QiskitRuntimeLocalService = None
     87 self._backend: Optional[BackendV1 | BackendV2] = None
---> 89 self._set_options(options)
     91 if isinstance(session, Session):
     92     self._session = session

File ~/mambaforge/envs/qiskit1/lib/python3.11/site-packages/qiskit_ibm_runtime/base_primitive.py:211, in BasePrimitiveV2._set_options(self, options)
    209 elif isinstance(options, dict):
    210     default_options = self._options_class()
--> 211     self._options = self._options_class(**merge_options(default_options, options))
    212 elif isinstance(options, self._options_class):
    213     self._options = replace(options)

File ~/mambaforge/envs/qiskit1/lib/python3.11/site-packages/pydantic/_internal/_dataclasses.py:135, in complete_dataclass.<locals>.__init__(__dataclass_self__, *args, **kwargs)
    133 __tracebackhide__ = True
    134 s = __dataclass_self__
--> 135 s.__pydantic_validator__.validate_python(ArgsKwargs(args, kwargs), self_instance=s)

ValidationError: 2 validation errors for EstimatorOptions
resilience.function-after[_validate_options(), ResilienceOptionsV2]
  Value error, 'zne' options are set, but 'zne_mitigation' is not set to True. [type=value_error, input_value={'measure_mitigation': Un...er_pair_depths': Unset}}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.6/v/value_error
resilience.is-instance[Dict]
  Input should be an instance of Dict [type=is_instance_of, input_value={'measure_mitigation': Un...er_pair_depths': Unset}}, input_type=dict]
    For further information visit https://errors.pydantic.dev/2.6/v/is_instance_of

Expected behavior

Passing in a dict of options should be equivalent to modifying them after initialization.

Suggested solutions

This looks like a Pydantic validation issue.

Additional Information

  • qiskit-ibm-runtime version: 0.23
  • Python version: 3.11
  • Operating system: MacOS

chriseclectic avatar May 05 '24 21:05 chriseclectic