def _parse_rep_delay(rep_delay: float, default_rep_delay: float, rep_delay_range: List[float]) -> float: """Parse and set ``rep_delay`` parameter in runtime config. Args: rep_delay: Initial rep delay. default_rep_delay: Backend default rep delay. rep_delay_range: Backend list defining allowable range of rep delays. Raises: SchemaValidationError: If rep_delay is not in the backend rep_delay_range. Returns: float: Modified rep delay after parsing. """ if rep_delay is None: rep_delay = default_rep_delay if rep_delay is not None: # check that rep_delay is in rep_delay_range if rep_delay_range is not None and isinstance(rep_delay_range, list): # pylint: disable=E1136 if len(rep_delay_range) != 2: raise SchemaValidationError( "Backend rep_delay_range {} must be a list with two entries." .format(rep_delay_range)) if not rep_delay_range[0] <= rep_delay <= rep_delay_range[1]: raise SchemaValidationError( "Supplied rep delay {} not in the supported " "backend range {}".format(rep_delay, rep_delay_range)) rep_delay = rep_delay * 1e6 # convert sec to μs return rep_delay
def _parse_pulse_args( backend, meas_level, meas_return, meas_map, memory_slot_size, rep_time, parametric_pulses, **run_config, ): """Build a pulse RunConfig replacing unset arguments with defaults derived from the `backend`. See `assemble` for more information on the required arguments. Returns: RunConfig: a run config, which is a standardized object that configures the qobj and determines the runtime environment. Raises: SchemaValidationError: If the given meas_level is not allowed for the given `backend`. """ # grab relevant info from backend if it exists backend_config = None if backend: backend_config = backend.configuration() if meas_level not in getattr(backend_config, "meas_levels", [MeasLevel.CLASSIFIED]): raise SchemaValidationError(( "meas_level = {} not supported for backend {}, only {} is supported" ).format(meas_level, backend_config.backend_name, backend_config.meas_levels)) meas_map = meas_map or getattr(backend_config, "meas_map", None) dynamic_reprate_enabled = getattr(backend_config, "dynamic_reprate_enabled", False) rep_time = rep_time or getattr(backend_config, "rep_times", None) if rep_time: if dynamic_reprate_enabled: warnings.warn( "Dynamic rep rates are supported on this backend. 'rep_delay' will be " "used instead of 'rep_time'.", RuntimeWarning, ) if isinstance(rep_time, list): rep_time = rep_time[0] rep_time = int(rep_time * 1e6) # convert sec to μs parametric_pulses = parametric_pulses or getattr(backend_config, "parametric_pulses", []) # create run configuration and populate run_config_dict = dict( meas_level=meas_level, meas_return=meas_return, meas_map=meas_map, memory_slot_size=memory_slot_size, rep_time=rep_time, parametric_pulses=parametric_pulses, **run_config, ) run_config = RunConfig( **{k: v for k, v in run_config_dict.items() if v is not None}) return run_config
def _parse_pulse_args(backend, qubit_lo_freq, meas_lo_freq, qubit_lo_range, meas_lo_range, schedule_los, meas_level, meas_return, meas_map, memory_slot_size, rep_time, parametric_pulses, **run_config): """Build a pulse RunConfig replacing unset arguments with defaults derived from the `backend`. See `assemble` for more information on the required arguments. Returns: RunConfig: a run config, which is a standardized object that configures the qobj and determines the runtime environment. Raises: SchemaValidationError: If the given meas_level is not allowed for the given `backend`. """ # grab relevant info from backend if it exists backend_config = None backend_default = None if backend: backend_default = backend.defaults() backend_config = backend.configuration() if meas_level not in getattr(backend_config, 'meas_levels', [MeasLevel.CLASSIFIED]): raise SchemaValidationError(( 'meas_level = {} not supported for backend {}, only {} is supported' ).format(meas_level, backend_config.backend_name, backend_config.meas_levels)) meas_map = meas_map or getattr(backend_config, 'meas_map', None) schedule_los = schedule_los or [] if isinstance(schedule_los, (LoConfig, dict)): schedule_los = [schedule_los] # Convert to LoConfig if LO configuration supplied as dictionary schedule_los = [ lo_config if isinstance(lo_config, LoConfig) else LoConfig(lo_config) for lo_config in schedule_los ] if not qubit_lo_freq and hasattr(backend_default, 'qubit_freq_est'): qubit_lo_freq = backend_default.qubit_freq_est if not meas_lo_freq and hasattr(backend_default, 'meas_freq_est'): meas_lo_freq = backend_default.meas_freq_est qubit_lo_range = qubit_lo_range or getattr(backend_config, 'qubit_lo_range', None) meas_lo_range = meas_lo_range or getattr(backend_config, 'meas_lo_range', None) dynamic_reprate_enabled = getattr(backend_config, 'dynamic_reprate_enabled', False) rep_time = rep_time or getattr(backend_config, 'rep_times', None) if rep_time: if dynamic_reprate_enabled: warnings.warn( "Dynamic rep rates are supported on this backend. 'rep_delay' will be " "used instead of 'rep_time'.", RuntimeWarning) if isinstance(rep_time, list): rep_time = rep_time[0] rep_time = int(rep_time * 1e6) # convert sec to μs parametric_pulses = parametric_pulses or getattr(backend_config, 'parametric_pulses', []) # create run configuration and populate run_config_dict = dict(qubit_lo_freq=qubit_lo_freq, meas_lo_freq=meas_lo_freq, qubit_lo_range=qubit_lo_range, meas_lo_range=meas_lo_range, schedule_los=schedule_los, meas_level=meas_level, meas_return=meas_return, meas_map=meas_map, memory_slot_size=memory_slot_size, rep_time=rep_time, parametric_pulses=parametric_pulses, **run_config) run_config = RunConfig( **{k: v for k, v in run_config_dict.items() if v is not None}) return run_config
def _parse_pulse_args(backend, qubit_lo_freq, meas_lo_freq, qubit_lo_range, meas_lo_range, schedule_los, meas_level, meas_return, meas_map, memory_slot_size, rep_time, **run_config): """Build a pulse RunConfig replacing unset arguments with defaults derived from the `backend`. See `assemble` for more information on the required arguments. Returns: RunConfig: a run config, which is a standardized object that configures the qobj and determines the runtime environment. Raises: SchemaValidationError: if the given meas_level is not allowed for the given `backend`. """ # grab relevant info from backend if it exists backend_config = None backend_default = None if backend: backend_config = backend.configuration() # TODO : Remove usage of config.defaults when backend.defaults() is updated. try: backend_default = backend.defaults() except (ModelValidationError, AttributeError): from collections import namedtuple backend_config_defaults = getattr(backend_config, 'defaults', {}) BackendDefault = namedtuple('BackendDefault', ('qubit_freq_est', 'meas_freq_est')) backend_default = BackendDefault( qubit_freq_est=backend_config_defaults.get('qubit_freq_est'), meas_freq_est=backend_config_defaults.get('meas_freq_est')) if meas_level not in getattr(backend_config, 'meas_levels', [MeasLevel.CLASSIFIED]): raise SchemaValidationError(( 'meas_level = {} not supported for backend {}, only {} is supported' ).format(meas_level, backend_config.backend_name, backend_config.meas_levels)) meas_map = meas_map or getattr(backend_config, 'meas_map', None) schedule_los = schedule_los or [] if isinstance(schedule_los, (LoConfig, dict)): schedule_los = [schedule_los] # Convert to LoConfig if LO configuration supplied as dictionary schedule_los = [ lo_config if isinstance(lo_config, LoConfig) else LoConfig(lo_config) for lo_config in schedule_los ] if not qubit_lo_freq and hasattr(backend_default, 'qubit_freq_est'): qubit_lo_freq = backend_default.qubit_freq_est if not meas_lo_freq and hasattr(backend_default, 'meas_freq_est'): meas_lo_freq = backend_default.meas_freq_est qubit_lo_range = qubit_lo_range or getattr(backend_config, 'qubit_lo_range', None) meas_lo_range = meas_lo_range or getattr(backend_config, 'meas_lo_range', None) rep_time = rep_time or getattr(backend_config, 'rep_times', None) if isinstance(rep_time, list): rep_time = rep_time[0] # create run configuration and populate run_config_dict = dict(qubit_lo_freq=qubit_lo_freq, meas_lo_freq=meas_lo_freq, qubit_lo_range=qubit_lo_range, meas_lo_range=meas_lo_range, schedule_los=schedule_los, meas_level=meas_level, meas_return=meas_return, meas_map=meas_map, memory_slot_size=memory_slot_size, rep_time=rep_time, **run_config) run_config = RunConfig( **{k: v for k, v in run_config_dict.items() if v is not None}) return run_config