Skip to content

Commit

Permalink
Add support for v2 provider interface (qiskit-community/qiskit-aqua#1270
Browse files Browse the repository at this point in the history
)

* Add support for v2 provider interface

In Qiskit#5086 the v2 provider interface is being added.
This starter interface is basically a drop in replacement for the v1
interface with 3 changes it's explicitly versioned at the object level,
Backend.run() can take in a circuit object, and Job objects can also be
async or sync. Eventually the interace will likely evolve towards a
model similar to what was initially done in Qiskit#4885.
This commit adds initial support for v2 provider backend objects, the
explicit type checking for BaseBackend objects is blocking the terra PR
from moving forward (because it switched BasicAer to use the v2
interface). This initial support just means accepting v2 Backend objects
in addition to v1 BaseBackend objects.

Depends on Qiskit#5086

* Fix import path

* fix style

Co-authored-by: Manoel Marques <manoel.marques@ibm.com>
  • Loading branch information
mtreinish and manoelmarques authored Oct 6, 2020
1 parent 3e0adaa commit 637a0d5
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 23 deletions.
5 changes: 3 additions & 2 deletions qiskit/aqua/algorithms/amplitude_amplifiers/grover.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

from qiskit import ClassicalRegister, QuantumCircuit
from qiskit.circuit.library import GroverOperator
from qiskit.providers import Backend
from qiskit.providers import BaseBackend
from qiskit.quantum_info import Statevector

Expand Down Expand Up @@ -121,7 +122,7 @@ class Grover(QuantumAlgorithm):
('post_processing', {float: 'lam'}),
('grover_operator', {list: 'rotation_counts'}),
('quantum_instance', {str: 'mct_mode'}),
('incremental', {(BaseBackend, QuantumInstance): 'quantum_instance'})
('incremental', {(Backend, BaseBackend, QuantumInstance): 'quantum_instance'})
], skip=1) # skip the argument 'self'
def __init__(self,
oracle: Union[Oracle, QuantumCircuit, Statevector],
Expand All @@ -131,7 +132,7 @@ def __init__(self,
sample_from_iterations: bool = False,
post_processing: Callable[[List[int]], List[int]] = None,
grover_operator: Optional[QuantumCircuit] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None,
quantum_instance: Optional[Union[QuantumInstance, Backend, BaseBackend]] = None,
init_state: Optional[InitialState] = None,
incremental: bool = False,
num_iterations: Optional[int] = None,
Expand Down
4 changes: 3 additions & 1 deletion qiskit/aqua/algorithms/factorizers/shor.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from qiskit.circuit import Gate, Instruction, ParameterVector
from qiskit.circuit.library import QFT
from qiskit.providers import BaseBackend
from qiskit.providers import Backend
from qiskit.aqua import QuantumInstance
from qiskit.aqua.algorithms import AlgorithmResult, QuantumAlgorithm
from qiskit.aqua.utils import get_subsystem_density_matrix, summarize_circuits
Expand Down Expand Up @@ -53,7 +54,8 @@ class Shor(QuantumAlgorithm):
def __init__(self,
N: int = 15,
a: int = 2,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
quantum_instance: Optional[
Union[QuantumInstance, BaseBackend, Backend]] = None) -> None:
"""
Args:
N: The integer to be factored, has a min. value of 3.
Expand Down
4 changes: 3 additions & 1 deletion qiskit/aqua/algorithms/minimum_eigen_solvers/qaoa/qaoa.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import numpy as np

from qiskit.providers import BaseBackend
from qiskit.providers import Backend
from qiskit.aqua import QuantumInstance
from qiskit.aqua.operators import OperatorBase, ExpectationBase, LegacyBaseOperator
from qiskit.aqua.components.initial_states import InitialState
Expand Down Expand Up @@ -74,7 +75,8 @@ def __init__(self,
aux_operators: Optional[List[Optional[Union[OperatorBase, LegacyBaseOperator]]]] =
None,
callback: Optional[Callable[[int, np.ndarray, float, float], None]] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
quantum_instance: Optional[
Union[QuantumInstance, BaseBackend, Backend]] = None) -> None:
"""
Args:
operator: Qubit operator
Expand Down
7 changes: 5 additions & 2 deletions qiskit/aqua/algorithms/minimum_eigen_solvers/vqe.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from qiskit.circuit import Parameter
from qiskit.circuit.library import RealAmplitudes
from qiskit.providers import BaseBackend
from qiskit.providers import Backend
from qiskit.aqua import QuantumInstance, AquaError
from qiskit.aqua.algorithms import QuantumAlgorithm
from qiskit.aqua.operators import (OperatorBase, ExpectationBase, ExpectationFactory, StateFn,
Expand Down Expand Up @@ -96,7 +97,8 @@ def __init__(self,
aux_operators: Optional[List[Optional[Union[OperatorBase,
LegacyBaseOperator]]]] = None,
callback: Optional[Callable[[int, np.ndarray, float, float], None]] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
quantum_instance: Optional[
Union[QuantumInstance, BaseBackend, Backend]] = None) -> None:
"""
Args:
Expand Down Expand Up @@ -200,7 +202,8 @@ def _set_expectation(self, exp: ExpectationBase) -> None:
self._expect_op = None

@QuantumAlgorithm.quantum_instance.setter
def quantum_instance(self, quantum_instance: Union[QuantumInstance, BaseBackend]) -> None:
def quantum_instance(self, quantum_instance: Union[QuantumInstance,
BaseBackend, Backend]) -> None:
""" set quantum_instance """
super(VQE, self.__class__).quantum_instance.__set__(self, quantum_instance)

Expand Down
20 changes: 12 additions & 8 deletions qiskit/aqua/algorithms/quantum_algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class in this module.
from abc import ABC, abstractmethod
from typing import Union, Dict, Optional
from qiskit.providers import BaseBackend
from qiskit.providers.backend import Backend
from qiskit.aqua import aqua_globals, QuantumInstance, AquaError


Expand All @@ -33,7 +34,8 @@ class QuantumAlgorithm(ABC):
"""
@abstractmethod
def __init__(self,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]]) -> None:
quantum_instance: Optional[
Union[QuantumInstance, Backend, BaseBackend, Backend]]) -> None:
self._quantum_instance = None
if quantum_instance:
self.quantum_instance = quantum_instance
Expand All @@ -44,7 +46,8 @@ def random(self):
return aqua_globals.random

def run(self,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None,
quantum_instance: Optional[
Union[QuantumInstance, Backend, BaseBackend]] = None,
**kwargs) -> Dict:
"""Execute the algorithm with selected backend.
Expand All @@ -59,7 +62,7 @@ def run(self,
if quantum_instance is None and self.quantum_instance is None:
raise AquaError("Quantum device or backend "
"is needed since you are running quantum algorithm.")
if isinstance(quantum_instance, BaseBackend):
if isinstance(quantum_instance, (BaseBackend, Backend)):
self.set_backend(quantum_instance, **kwargs)
else:
if quantum_instance is not None:
Expand All @@ -77,23 +80,24 @@ def quantum_instance(self) -> Optional[QuantumInstance]:
return self._quantum_instance

@quantum_instance.setter
def quantum_instance(self, quantum_instance: Union[QuantumInstance, BaseBackend]) -> None:
def quantum_instance(self, quantum_instance: Union[QuantumInstance,
BaseBackend, Backend]) -> None:
""" Sets quantum instance. """
if isinstance(quantum_instance, BaseBackend):
if isinstance(quantum_instance, (BaseBackend, Backend)):
quantum_instance = QuantumInstance(quantum_instance)
self._quantum_instance = quantum_instance

def set_backend(self, backend: BaseBackend, **kwargs) -> None:
def set_backend(self, backend: Union[Backend, BaseBackend], **kwargs) -> None:
""" Sets backend with configuration. """
self.quantum_instance = QuantumInstance(backend)
self.quantum_instance.set_config(**kwargs)

@property
def backend(self) -> BaseBackend:
def backend(self) -> Union[Backend, BaseBackend]:
""" Returns backend. """
return self.quantum_instance.backend

@backend.setter
def backend(self, backend: BaseBackend):
def backend(self, backend: Union[Backend, BaseBackend]):
""" Sets backend without additional configuration. """
self.set_backend(backend)
4 changes: 3 additions & 1 deletion qiskit/aqua/algorithms/vq_algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

from qiskit.circuit import QuantumCircuit, ParameterVector
from qiskit.providers import BaseBackend
from qiskit.providers import Backend
from qiskit.aqua import QuantumInstance
from qiskit.aqua.algorithms import AlgorithmResult, QuantumAlgorithm
from qiskit.aqua.components.optimizers import Optimizer, SLSQP
Expand All @@ -47,7 +48,8 @@ def __init__(self,
optimizer: Optimizer,
cost_fn: Optional[Callable] = None,
initial_point: Optional[np.ndarray] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
quantum_instance: Optional[
Union[QuantumInstance, BaseBackend, Backend]] = None) -> None:
"""
Args:
var_form: An optional parameterized variational form (ansatz).
Expand Down
14 changes: 8 additions & 6 deletions qiskit/aqua/operators/converters/circuit_sampler.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from time import time

from qiskit.providers import BaseBackend
from qiskit.providers import Backend
from qiskit.circuit import QuantumCircuit, Parameter, ParameterExpression
from qiskit import QiskitError
from qiskit.aqua import QuantumInstance
Expand Down Expand Up @@ -48,7 +49,7 @@ class CircuitSampler(ConverterBase):
"""

def __init__(self,
backend: Union[BaseBackend, QuantumInstance] = None,
backend: Union[Backend, BaseBackend, QuantumInstance] = None,
statevector: Optional[bool] = None,
param_qobj: bool = False,
attach_results: bool = False) -> None:
Expand Down Expand Up @@ -101,7 +102,7 @@ def _check_quantum_instance_and_modes_consistent(self) -> None:
'backend, not {}.'.format(self.quantum_instance.backend))

@property
def backend(self) -> BaseBackend:
def backend(self) -> Union[Backend, BaseBackend]:
""" Returns the backend.
Returns:
Expand All @@ -110,11 +111,11 @@ def backend(self) -> BaseBackend:
return self.quantum_instance.backend

@backend.setter
def backend(self, backend: BaseBackend):
def backend(self, backend: Union[Backend, BaseBackend]):
""" Sets backend without additional configuration. """
self.set_backend(backend)

def set_backend(self, backend: BaseBackend, **kwargs) -> None:
def set_backend(self, backend: Union[Backend, BaseBackend], **kwargs) -> None:
""" Sets backend with configuration.
Raises:
Expand All @@ -133,13 +134,14 @@ def quantum_instance(self) -> QuantumInstance:
return self._quantum_instance

@quantum_instance.setter
def quantum_instance(self, quantum_instance: Union[QuantumInstance, BaseBackend]) -> None:
def quantum_instance(self, quantum_instance: Union[QuantumInstance,
Backend, BaseBackend]) -> None:
""" Sets the QuantumInstance.
Raises:
ValueError: statevector or param_qobj are True when not supported by backend.
"""
if isinstance(quantum_instance, BaseBackend):
if isinstance(quantum_instance, (Backend, BaseBackend)):
quantum_instance = QuantumInstance(quantum_instance)
self._quantum_instance = quantum_instance
self._check_quantum_instance_and_modes_consistent()
Expand Down
3 changes: 2 additions & 1 deletion qiskit/aqua/operators/expectations/expectation_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

from qiskit import BasicAer
from qiskit.providers import BaseBackend
from qiskit.providers import Backend
from qiskit.aqua.utils.backend_utils import (is_statevector_backend,
is_aer_qasm,
has_aer)
Expand All @@ -38,7 +39,7 @@ class ExpectationFactory:

@staticmethod
def build(operator: OperatorBase,
backend: Optional[Union[BaseBackend, QuantumInstance]] = None,
backend: Optional[Union[Backend, BaseBackend, QuantumInstance]] = None,
include_custom: bool = True) -> ExpectationBase:
"""
A factory method for convenient automatic selection of an Expectation based on the
Expand Down
3 changes: 2 additions & 1 deletion qiskit/aqua/utils/run_circuits.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import numpy as np
from qiskit.providers import BaseBackend, JobStatus, JobError
from qiskit.providers import Backend
from qiskit.providers.jobstatus import JOB_FINAL_STATES
from qiskit.providers.basicaer import BasicAerJob
from qiskit.qobj import QasmQobj
Expand Down Expand Up @@ -218,7 +219,7 @@ def run_qobj(qobj, backend, qjob_config=None, backend_options=None,
backend_options = backend_options or {}
noise_config = noise_config or {}

if backend is None or not isinstance(backend, BaseBackend):
if backend is None or not isinstance(backend, (Backend, BaseBackend)):
raise ValueError('Backend is missing or not an instance of BaseBackend')

with_autorecover = not is_simulator_backend(backend)
Expand Down

0 comments on commit 637a0d5

Please sign in to comment.