Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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