Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
8853afb
Add lightweight v2 provider interface starter
mtreinish Sep 18, 2020
50e0938
Merge branch 'master' into v2-providers-lite
mtreinish Sep 18, 2020
febece1
Fix basicaer simulator init
mtreinish Sep 18, 2020
ee0ff8c
Fix lint
mtreinish Sep 21, 2020
90da14c
Merge branch 'master' into v2-providers-lite
mtreinish Sep 21, 2020
6d16f0a
Add provider property to basicaer for Aqua backwards compat
mtreinish Sep 21, 2020
032a70b
Add provider method back to backend class for backwards compat
mtreinish Sep 22, 2020
9ed219d
Merge branch 'master' into v2-providers-lite
mtreinish Sep 22, 2020
83b3288
Fix lint
mtreinish Sep 22, 2020
5bdf3ac
Merge branch 'v2-providers-lite' of github.com:mtreinish/qiskit-core …
mtreinish Sep 22, 2020
f4d83b1
Merge branch 'master' into v2-providers-lite
mtreinish Sep 24, 2020
a635536
Add release notes
mtreinish Sep 24, 2020
cb7caa9
Add v2 provider to docs
mtreinish Sep 24, 2020
826c4c2
Fix lint
mtreinish Sep 24, 2020
9ede763
Revert basicaer v2 provider migration
mtreinish Sep 24, 2020
2f89249
Merge branch 'master' into v2-providers-lite
mtreinish Sep 24, 2020
b758da1
Apply suggestions from code review
mtreinish Sep 25, 2020
0faaee1
Add missing version attributes
mtreinish Sep 25, 2020
6533f34
Make Options a simplenamespace subclass
mtreinish Sep 25, 2020
523fba9
Update Backend docstrings
mtreinish Sep 25, 2020
dad0cba
Merge branch 'master' into v2-providers-lite
mtreinish Sep 25, 2020
bfa57b1
Add v2 Backend support to the rest of terra
mtreinish Sep 25, 2020
a8ad1ab
Merge branch 'master' into v2-providers-lite
mtreinish Sep 25, 2020
c3a7bd2
Merge branch 'master' into v2-providers-lite
mtreinish Sep 25, 2020
dac39df
Fix lint
mtreinish Sep 25, 2020
3c8bdb8
Merge branch 'v2-providers-lite' of github.com:mtreinish/qiskit-core …
mtreinish Sep 25, 2020
ce9cfce
Merge branch 'master' into v2-providers-lite
mtreinish Sep 25, 2020
a0ff84a
Fix lint
mtreinish Sep 25, 2020
653cb72
Merge branch 'master' into v2-providers-lite
mtreinish Sep 25, 2020
f7e7ad6
Merge branch 'master' into v2-providers-lite
mtreinish Sep 27, 2020
5870072
Merge branch 'master' into v2-providers-lite
mtreinish Sep 28, 2020
0e40efb
Flatten providers subpackage
mtreinish Sep 29, 2020
1aa01bc
Merge branch 'master' into v2-providers-lite
mtreinish Sep 29, 2020
d682526
Merge branch 'master' into v2-providers-lite
mtreinish Oct 5, 2020
51aa1db
Apply suggestions from code review
mtreinish Oct 5, 2020
6f5c7c1
Merge branch 'master' into v2-providers-lite
mtreinish Oct 5, 2020
eff1c0b
Update release notes
mtreinish Oct 5, 2020
fb1cd8a
Merge branch 'master' into v2-providers-lite
mtreinish Oct 5, 2020
bc2a05f
Merge branch 'master' into v2-providers-lite
mtreinish Oct 5, 2020
2f62a5c
Merge branch 'master' into v2-providers-lite
mtreinish Oct 6, 2020
92d3dd2
Merge branch 'master' into v2-providers-lite
mergify[bot] Oct 6, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion qiskit/compiler/assemble.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from qiskit.qobj.utils import MeasLevel, MeasReturnType
from qiskit.validation.jsonschema import SchemaValidationError
from qiskit.providers import BaseBackend
from qiskit.providers.backend import Backend
from qiskit.pulse.channels import PulseChannel
from qiskit.pulse import Schedule

Expand All @@ -39,7 +40,7 @@ def _log_assembly_time(start_time, end_time):

# TODO: parallelize over the experiments (serialize each separately, then add global header/config)
def assemble(experiments: Union[QuantumCircuit, List[QuantumCircuit], Schedule, List[Schedule]],
backend: Optional[BaseBackend] = None,
backend: Optional[Union[Backend, BaseBackend]] = None,
qobj_id: Optional[str] = None,
qobj_header: Optional[Union[QobjHeader, Dict]] = None,
shots: Optional[int] = None, memory: Optional[bool] = False,
Expand Down
3 changes: 2 additions & 1 deletion qiskit/compiler/schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from qiskit.exceptions import QiskitError
from qiskit.pulse import InstructionScheduleMap, Schedule
from qiskit.providers import BaseBackend
from qiskit.providers.backend import Backend
from qiskit.scheduler import ScheduleConfig
from qiskit.scheduler.schedule_circuit import schedule_circuit

Expand All @@ -35,7 +36,7 @@ def _log_schedule_time(start_time, end_time):


def schedule(circuits: Union[QuantumCircuit, List[QuantumCircuit]],
backend: Optional[BaseBackend] = None,
backend: Optional[Union[Backend, BaseBackend]] = None,
inst_map: Optional[InstructionScheduleMap] = None,
meas_map: Optional[List[List[int]]] = None,
dt: Optional[float] = None,
Expand Down
3 changes: 2 additions & 1 deletion qiskit/compiler/sequence.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@
from qiskit.circuit.quantumcircuit import QuantumCircuit
from qiskit.exceptions import QiskitError
from qiskit.providers import BaseBackend
from qiskit.providers.backend import Backend
from qiskit.pulse import InstructionScheduleMap, Schedule
from qiskit.scheduler import ScheduleConfig
from qiskit.scheduler.sequence import sequence as _sequence


def sequence(scheduled_circuits: Union[QuantumCircuit, List[QuantumCircuit]],
backend: Optional[BaseBackend] = None,
backend: Optional[Union[Backend, BaseBackend]] = None,
inst_map: Optional[InstructionScheduleMap] = None,
meas_map: Optional[List[List[int]]] = None,
dt: Optional[float] = None) -> Union[Schedule, List[Schedule]]:
Expand Down
3 changes: 2 additions & 1 deletion qiskit/compiler/transpile.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from qiskit.converters import isinstanceint, isinstancelist, dag_to_circuit, circuit_to_dag
from qiskit.dagcircuit import DAGCircuit
from qiskit.providers import BaseBackend
from qiskit.providers.backend import Backend
from qiskit.providers.models import BackendProperties
from qiskit.providers.models.backendproperties import Gate
from qiskit.pulse import Schedule
Expand All @@ -41,7 +42,7 @@


def transpile(circuits: Union[QuantumCircuit, List[QuantumCircuit]],
backend: Optional[BaseBackend] = None,
backend: Optional[Union[Backend, BaseBackend]] = None,
basis_gates: Optional[List[str]] = None,
coupling_map: Optional[Union[CouplingMap, List[List[int]]]] = None,
backend_properties: Optional[BackendProperties] = None,
Expand Down
81 changes: 53 additions & 28 deletions qiskit/execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
from time import time
from qiskit.circuit import QuantumCircuit
from qiskit.compiler import transpile, assemble, schedule
from qiskit.providers import BaseBackend
from qiskit.providers.backend import Backend
from qiskit.qobj.utils import MeasLevel, MeasReturnType
from qiskit.pulse import Schedule
from qiskit.exceptions import QiskitError
Expand Down Expand Up @@ -58,7 +60,7 @@ def execute(experiments, backend,
experiments (QuantumCircuit or list[QuantumCircuit] or Schedule or list[Schedule]):
Circuit(s) or pulse schedule(s) to execute

backend (BaseBackend):
backend (BaseBackend or Backend):
Backend to execute circuits on.
Transpiler options are automatically grabbed from
backend.configuration() and backend.properties().
Expand Down Expand Up @@ -272,33 +274,56 @@ def execute(experiments, backend,
meas_map=meas_map,
method=scheduling_method)

# assembling the circuits into a qobj to be run on the backend
qobj = assemble(experiments,
qobj_id=qobj_id,
qobj_header=qobj_header,
shots=shots,
memory=memory,
max_credits=max_credits,
seed_simulator=seed_simulator,
default_qubit_los=default_qubit_los,
default_meas_los=default_meas_los,
schedule_los=schedule_los,
meas_level=meas_level,
meas_return=meas_return,
memory_slots=memory_slots,
memory_slot_size=memory_slot_size,
rep_time=rep_time,
rep_delay=rep_delay,
parameter_binds=parameter_binds,
backend=backend,
init_qubits=init_qubits,
**run_config)

# executing the circuits on the backend and returning the job
start_time = time()
job = backend.run(qobj, **run_config)
end_time = time()
_log_submission_time(start_time, end_time)
if isinstance(backend, BaseBackend):
# assembling the circuits into a qobj to be run on the backend
qobj = assemble(experiments,
qobj_id=qobj_id,
qobj_header=qobj_header,
shots=shots,
memory=memory,
max_credits=max_credits,
seed_simulator=seed_simulator,
default_qubit_los=default_qubit_los,
default_meas_los=default_meas_los,
schedule_los=schedule_los,
meas_level=meas_level,
meas_return=meas_return,
memory_slots=memory_slots,
memory_slot_size=memory_slot_size,
rep_time=rep_time,
rep_delay=rep_delay,
parameter_binds=parameter_binds,
backend=backend,
init_qubits=init_qubits,
**run_config)

# executing the circuits on the backend and returning the job
start_time = time()
job = backend.run(qobj, **run_config)
end_time = time()
_log_submission_time(start_time, end_time)
elif isinstance(backend, Backend):
start_time = time()
job = backend.run(experiments,
shots=shots,
memory=memory,
seed_simulator=seed_simulator,
default_qubit_los=default_qubit_los,
default_meas_los=default_meas_los,
schedule_los=schedule_los,
meas_level=meas_level,
meas_return=meas_return,
memory_slots=memory_slots,
memory_slot_size=memory_slot_size,
rep_time=rep_time,
rep_delay=rep_delay,
parameter_binds=parameter_binds,
init_qubits=init_qubits,
**run_config)
end_time = time()
_log_submission_time(start_time, end_time)
else:
raise QiskitError("Invalid backend type %s" % type(backend))
return job


Expand Down
127 changes: 118 additions & 9 deletions qiskit/providers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,109 @@
# that they have been altered from the originals.

"""
======================================
Base Objects (:mod:`qiskit.providers`)
======================================
================================================
Providers Interface (:mod:`qiskit.providers`)
================================================

.. currentmodule:: qiskit.providers

This module contains the classes used to build external providers for Terra. A
provider is anything that provides an external service to Terra. The typical
example of this is a Backend provider which provides
:class:`~qiskit.providers.Backend` objects which can be used for executing
:class:`~qiskit.circuits.QuantumCircuit` and/or :class:`~qiskit.pulse.Schedule`
objects. This module contains the abstract classes which are used to define the
interface between a provider and terra.

Version Support
===============

Each providers interface abstract class is individually versioned. When we
need to make a change to an interface a new abstract class will be created to
define the new interface. These interface changes are not guaranteed to be
backwards compatible between versions.

Version Changes
----------------

Each minor version release of qiskit-terra **may** increment the version of any
providers interface a single version number. It will be an aggreagate of all
the interface changes for that release on that interface.

Version Support Policy
----------------------

To enable providers to have time to adjust to changes in this interface
Terra will support support multiple versions of each class at once. Given the
nature of one version per release the version deprecation policy is a bit
more conservative than the standard deprecation policy. Terra will support a
provider interface version for a minimum of 3 minor releases or the first
release after 6 months from the release that introduced a version, whichever is
longer, prior to a potential deprecation. After that the standard deprecation
policy will apply to that interface version. This will give providers and users
sufficient time to adapt to potential breaking changes in the interface. So for
example lets say in 0.19.0 ``BackendV2`` is introduced and in the 3 months after
the release of 0.19.0 we release 0.20.0, 0.21.0, and 0.22.0, then 7 months after
0.19.0 we release 0.23.0. In 0.23.0 we can deprecate BackendV2, and it needs to
still be supported and can't be removed until the deprecation policy completes.

It's worth pointing out that Terra's version support policy doesn't mean
providers themselves will have the same support story, they can (and arguably
should) update to newer versions as soon as they can, the support window is
just for Terra's supported versions. Part of this lengthy window prior to
deprecation is to give providers enough time to do their own deprecation of a
potential end user impacting change in a user facing part of the interface
prior to bumping their version. For example, lets say we changed the signature
to `Backend.run()` in ``BackendV34`` in a backwards incompatible way, before
Aer could update its ``AerBackend`` class to use version 34 they'd need to
deprecate the old signature prior to switching over. The changeover for Aer is
not guaranteed to be lockstep with Terra so we need to ensure there is a
sufficient amount of time for Aer to complete it's deprecation cycle prior to
removing version 33 (ie making version 34 mandatory/the minimum version).


Abstract Classes
================

Provider
--------

.. autosummary::
:toctree: ../stubs/

Provider
ProviderV1

Backend
-------

.. autosummary::
:toctree: ../stubs/

Backend
BackendV1

Options
-------

.. autosummary::
:toctree: ../stubs/

Options

Job
---

.. autosummary::
:toctree: ../stubs/

Job
JobV1


================================================================
Legacy Provider Interface Base Objects (:mod:`qiskit.providers`)
================================================================

.. currentmodule:: qiskit.providers

Expand Down Expand Up @@ -49,12 +149,21 @@

import pkgutil

from .basebackend import BaseBackend
from .baseprovider import BaseProvider
from .basejob import BaseJob
from .exceptions import (JobError, JobTimeoutError, QiskitBackendNotFoundError,
BackendPropertyError, BackendConfigurationError)
from .jobstatus import JobStatus
# Providers interface
from qiskit.providers.provider import Provider
from qiskit.providers.provider import ProviderV1
from qiskit.providers.backend import Backend
from qiskit.providers.backend import BackendV1
from qiskit.providers.options import Options
from qiskit.providers.job import Job
from qiskit.providers.job import JobV1
# Legacy providers interface
from qiskit.providers.basebackend import BaseBackend
from qiskit.providers.baseprovider import BaseProvider
from qiskit.providers.basejob import BaseJob
from qiskit.providers.exceptions import (JobError, JobTimeoutError, QiskitBackendNotFoundError,
BackendPropertyError, BackendConfigurationError)
from qiskit.providers.jobstatus import JobStatus


# Allow extending this namespace.
Expand Down
Loading