13
13
"""Primitive options."""
14
14
15
15
from typing import Union , Literal
16
- import copy
17
16
18
- from qiskit .transpiler import CouplingMap
19
17
from pydantic .dataclasses import dataclass as pydantic_dataclass
20
18
from pydantic import Field , ConfigDict , field_validator
21
19
22
20
from .utils import (
23
21
Dict ,
24
22
Unset ,
25
23
UnsetType ,
26
- _remove_dict_unset_values ,
27
- merge_options ,
28
24
skip_unset_validation ,
29
25
)
30
26
from .execution_options import ExecutionOptionsV2
@@ -74,6 +70,8 @@ class EstimatorOptions(OptionsV2):
74
70
Allowed values are ``"XX"``, ``"XpXm"``, ``"XY4"``.
75
71
Default: None
76
72
73
+ seed_estimator: Seed used to control sampling.
74
+
77
75
transpilation: Transpilation options. See :class:`TranspilationOptions` for all
78
76
available options.
79
77
@@ -90,14 +88,14 @@ class EstimatorOptions(OptionsV2):
90
88
91
89
"""
92
90
93
- _VERSION : int = Field (2 , frozen = True ) # pylint: disable=invalid-name
94
91
_MAX_OPTIMIZATION_LEVEL : int = Field (3 , frozen = True ) # pylint: disable=invalid-name
95
92
_MAX_RESILIENCE_LEVEL : int = Field (3 , frozen = True ) # pylint: disable=invalid-name
96
93
97
94
# Sadly we cannot use pydantic's built in validation because it won't work on Unset.
98
95
optimization_level : Union [UnsetType , int ] = Unset
99
96
resilience_level : Union [UnsetType , int ] = Unset
100
97
dynamical_decoupling : Union [UnsetType , DDSequenceType ] = Unset
98
+ seed_estimator : Union [UnsetType , int ] = Unset
101
99
transpilation : Union [TranspilationOptions , Dict ] = Field (default_factory = TranspilationOptions )
102
100
resilience : Union [ResilienceOptionsV2 , Dict ] = Field (default_factory = ResilienceOptionsV2 )
103
101
execution : Union [ExecutionOptionsV2 , Dict ] = Field (default_factory = ExecutionOptionsV2 )
@@ -127,113 +125,3 @@ def _validate_resilience_level(cls, resilience_level: int) -> int:
127
125
f"0-{ EstimatorOptions ._MAX_RESILIENCE_LEVEL } "
128
126
)
129
127
return resilience_level
130
-
131
- @staticmethod
132
- def _get_program_inputs (options : dict ) -> dict :
133
- """Convert the input options to program compatible inputs.
134
-
135
- Returns:
136
- Inputs acceptable by primitives.
137
- """
138
-
139
- sim_options = options .get ("simulator" , {})
140
- inputs = {}
141
- inputs ["transpilation" ] = copy .copy (options .get ("transpilation" , {}))
142
- inputs ["skip_transpilation" ] = inputs ["transpilation" ].pop ("skip_transpilation" )
143
- coupling_map = sim_options .get ("coupling_map" , None )
144
- # TODO: We can just move this to json encoder
145
- if isinstance (coupling_map , CouplingMap ):
146
- coupling_map = list (map (list , coupling_map .get_edges ()))
147
- inputs ["transpilation" ].update (
148
- {
149
- "optimization_level" : options .get ("optimization_level" ),
150
- "coupling_map" : coupling_map ,
151
- "basis_gates" : sim_options .get ("basis_gates" , None ),
152
- }
153
- )
154
-
155
- inputs ["resilience_level" ] = options .get ("resilience_level" )
156
- inputs ["resilience" ] = options .get ("resilience" , {})
157
-
158
- inputs ["twirling" ] = options .get ("twirling" , {})
159
-
160
- inputs ["execution" ] = options .get ("execution" , {})
161
- inputs ["execution" ].update (
162
- {
163
- "noise_model" : sim_options .get ("noise_model" , Unset ),
164
- "seed_simulator" : sim_options .get ("seed_simulator" , Unset ),
165
- }
166
- )
167
-
168
- # Add arbitrary experimental options
169
- if isinstance (options .get ("experimental" , None ), dict ):
170
- inputs = merge_options (inputs , options .get ("experimental" ))
171
-
172
- # Remove image
173
- inputs .pop ("image" , None )
174
-
175
- inputs ["_experimental" ] = True
176
- inputs ["version" ] = EstimatorOptions ._VERSION
177
- _remove_dict_unset_values (inputs )
178
-
179
- return inputs
180
-
181
-
182
- # @dataclass(frozen=True)
183
- # class _ResilienceLevel0Options:
184
- # resilience_level: int = 0
185
- # resilience: ResilienceOptions = field(
186
- # default_factory=lambda: ResilienceOptions(
187
- # measure_noise_mitigation=False, zne_mitigation=False, pec_mitigation=False
188
- # )
189
- # )
190
- # twirling: TwirlingOptions = field(
191
- # default_factory=lambda: TwirlingOptions(gates=False, measure=False)
192
- # )
193
-
194
-
195
- # @dataclass(frozen=True)
196
- # class _ResilienceLevel1Options:
197
- # resilience_level: int = 1
198
- # resilience: ResilienceOptions = field(
199
- # default_factory=lambda: ResilienceOptions(
200
- # measure_noise_mitigation=True, zne_mitigation=False, pec_mitigation=False
201
- # )
202
- # )
203
- # twirling: TwirlingOptions = field(
204
- # default_factory=lambda: TwirlingOptions(gates=False, measure=True, strategy="active-accum")
205
- # )
206
-
207
-
208
- # @dataclass(frozen=True)
209
- # class _ResilienceLevel2Options:
210
- # resilience_level: int = 2
211
- # resilience: ResilienceOptions = field(
212
- # default_factory=lambda: ResilienceOptions(
213
- # measure_noise_mitigation=True, pec_mitigation=False, **asdict(_ZneOptions())
214
- # )
215
- # )
216
- # twirling: TwirlingOptions = field(
217
- # default_factory=lambda: TwirlingOptions(gates=True, measure=True, strategy="active-accum")
218
- # )
219
-
220
-
221
- # @dataclass(frozen=True)
222
- # class _ResilienceLevel3Options:
223
- # resilience_level: int = 3
224
- # resilience: ResilienceOptions = field(
225
- # default_factory=lambda: ResilienceOptions(
226
- # measure_noise_mitigation=True, zne_mitigation=False, **asdict(_PecOptions())
227
- # )
228
- # )
229
- # twirling: TwirlingOptions = field(
230
- # default_factory=lambda: TwirlingOptions(gates=True, measure=True, strategy="active")
231
- # )
232
-
233
-
234
- # _DEFAULT_RESILIENCE_LEVEL_OPTIONS = {
235
- # 0: _ResilienceLevel0Options(),
236
- # 1: _ResilienceLevel1Options(),
237
- # 2: _ResilienceLevel2Options(),
238
- # 3: _ResilienceLevel3Options(),
239
- # }
0 commit comments