Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Optimise import qiskit with lazy imports #7525

Merged
merged 19 commits into from
Feb 2, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
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
16 changes: 4 additions & 12 deletions qiskit/algorithms/optimizers/bobyqa.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,9 @@
from typing import Any, Dict, Tuple, List, Callable, Optional

import numpy as np
from qiskit.exceptions import MissingOptionalLibraryError
from qiskit.utils import optionals as _optionals
from .optimizer import Optimizer, OptimizerSupportLevel, OptimizerResult, POINT

try:
import skquant.opt as skq

_HAS_SKQUANT = True
except ImportError:
_HAS_SKQUANT = False


class BOBYQA(Optimizer):
"""Bound Optimization BY Quadratic Approximation algorithm.
Expand All @@ -48,10 +41,7 @@ def __init__(
Raises:
MissingOptionalLibraryError: scikit-quant not installed
"""
if not _HAS_SKQUANT:
raise MissingOptionalLibraryError(
libname="scikit-quant", name="BOBYQA", pip_install="pip install scikit-quant"
)
_optionals.HAS_SKQUANT.require_now("BOBYQA")
super().__init__()
self._maxiter = maxiter

Expand All @@ -74,6 +64,8 @@ def minimize(
jac: Optional[Callable[[POINT], POINT]] = None,
bounds: Optional[List[Tuple[float, float]]] = None,
) -> OptimizerResult:
from skquant import opt as skq

res, history = skq.minimize(
func=fun,
x0=np.asarray(x0),
Expand Down
16 changes: 4 additions & 12 deletions qiskit/algorithms/optimizers/imfil.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,9 @@

from typing import Any, Dict, Callable, Optional, List, Tuple

from qiskit.exceptions import MissingOptionalLibraryError
from qiskit.utils import optionals as _optionals
from .optimizer import Optimizer, OptimizerSupportLevel, OptimizerResult, POINT

try:
import skquant.opt as skq

_HAS_SKQUANT = True
except ImportError:
_HAS_SKQUANT = False


class IMFIL(Optimizer):
"""IMplicit FILtering algorithm.
Expand All @@ -49,10 +42,7 @@ def __init__(
Raises:
MissingOptionalLibraryError: scikit-quant not installed
"""
if not _HAS_SKQUANT:
raise MissingOptionalLibraryError(
libname="scikit-quant", name="IMFIL", pip_install="pip install scikit-quant"
)
_optionals.HAS_SKQUANT.require_now("IMFIL")
super().__init__()
self._maxiter = maxiter

Expand All @@ -77,6 +67,8 @@ def minimize(
jac: Optional[Callable[[POINT], POINT]] = None,
bounds: Optional[List[Tuple[float, float]]] = None,
) -> OptimizerResult:
from skquant import opt as skq

res, history = skq.minimize(
func=fun,
x0=x0,
Expand Down
31 changes: 8 additions & 23 deletions qiskit/algorithms/optimizers/nlopts/nloptimizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,12 @@
from abc import abstractmethod
import logging
import numpy as np
from qiskit.exceptions import MissingOptionalLibraryError

from qiskit.utils import optionals as _optionals
from ..optimizer import Optimizer, OptimizerSupportLevel, OptimizerResult, POINT

logger = logging.getLogger(__name__)

try:
import nlopt

logger.info(
"NLopt version: %s.%s.%s",
nlopt.version_major(),
nlopt.version_minor(),
nlopt.version_bugfix(),
)
_HAS_NLOPT = True
except ImportError:
_HAS_NLOPT = False


class NLoptOptimizerType(Enum):
"""NLopt Valid Optimizer"""
Expand All @@ -51,6 +39,8 @@ class NLoptOptimizer(Optimizer):
NLopt global optimizer base class
"""

# pylint: disable=import-error

_OPTIONS = ["max_evals"]

def __init__(self, max_evals: int = 1000) -> None: # pylint: disable=unused-argument
Expand All @@ -61,15 +51,8 @@ def __init__(self, max_evals: int = 1000) -> None: # pylint: disable=unused-arg
Raises:
MissingOptionalLibraryError: NLopt library not installed.
"""
if not _HAS_NLOPT:
raise MissingOptionalLibraryError(
libname="nlopt",
name="NLoptOptimizer",
msg=(
"See https://qiskit.org/documentation/apidoc/"
"qiskit.algorithms.optimizers.nlopts.html for installation information"
),
)
_optionals.HAS_NLOPT.require_now("NLoptOptimizer")
import nlopt

super().__init__()
for k, v in list(locals().items()):
Expand Down Expand Up @@ -124,6 +107,8 @@ def minimize(
jac: Optional[Callable[[POINT], POINT]] = None,
bounds: Optional[List[Tuple[float, float]]] = None,
) -> OptimizerResult:
import nlopt

x0 = np.asarray(x0)

if bounds is None:
Expand Down
30 changes: 6 additions & 24 deletions qiskit/algorithms/optimizers/snobfit.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,10 @@
from typing import Any, Dict, Optional, Callable, Tuple, List

import numpy as np
from qiskit.exceptions import MissingOptionalLibraryError
from qiskit.utils import optionals as _optionals
from .optimizer import Optimizer, OptimizerSupportLevel, OptimizerResult, POINT


try:
import skquant.opt as skq

_HAS_SKQUANT = True
except ImportError:
_HAS_SKQUANT = False

try:
from SQSnobFit import optset

_HAS_SKSNOBFIT = True
except ImportError:
_HAS_SKSNOBFIT = False


class SNOBFIT(Optimizer):
"""Stable Noisy Optimization by Branch and FIT algorithm.

Expand Down Expand Up @@ -64,14 +49,8 @@ def __init__(
Raises:
MissingOptionalLibraryError: scikit-quant or SQSnobFit not installed
"""
if not _HAS_SKQUANT:
raise MissingOptionalLibraryError(
libname="scikit-quant", name="SNOBFIT", pip_install="pip install scikit-quant"
)
if not _HAS_SKSNOBFIT:
raise MissingOptionalLibraryError(
libname="SQSnobFit", name="SNOBFIT", pip_install="pip install SQSnobFit"
)
_optionals.HAS_SKQUANT.require_now("SNOBFIT")
_optionals.HAS_SQSNOBFIT.require_now("SNOBFIT")
super().__init__()
self._maxiter = maxiter
self._maxfail = maxfail
Expand Down Expand Up @@ -102,6 +81,9 @@ def minimize(
jac: Optional[Callable[[POINT], POINT]] = None,
bounds: Optional[List[Tuple[float, float]]] = None,
) -> OptimizerResult:
import skquant.opt as skq
from SQSnobFit import optset

snobfit_settings = {
"maxmp": self._maxmp,
"maxfail": self._maxfail,
Expand Down
2 changes: 1 addition & 1 deletion qiskit/circuit/gate.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
from warnings import warn
from typing import List, Optional, Union, Tuple
import numpy as np
from scipy.linalg import schur

from qiskit.circuit.parameterexpression import ParameterExpression
from qiskit.circuit.exceptions import CircuitError
Expand Down Expand Up @@ -72,6 +71,7 @@ def power(self, exponent: float):
"""
from qiskit.quantum_info.operators import Operator # pylint: disable=cyclic-import
from qiskit.extensions.unitary import UnitaryGate # pylint: disable=cyclic-import
from scipy.linalg import schur

# Should be diagonalized because it's a unitary.
decomposition, unitary = schur(Operator(self).data, output="complex")
Expand Down
16 changes: 7 additions & 9 deletions qiskit/circuit/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,9 @@

from uuid import uuid4

from qiskit.utils import optionals as _optionals
from .parameterexpression import ParameterExpression

try:
import symengine

HAS_SYMENGINE = True
except ImportError:
HAS_SYMENGINE = False


class Parameter(ParameterExpression):
"""Parameter Class for variable parameters.
Expand Down Expand Up @@ -81,11 +75,13 @@ def __init__(self, name: str):
be any unicode string, e.g. "ϕ".
"""
self._name = name
if not HAS_SYMENGINE:
if not _optionals.HAS_SYMENGINE:
from sympy import Symbol

symbol = Symbol(name)
else:
import symengine

symbol = symengine.Symbol(name)
super().__init__(symbol_map={self: symbol}, expr=symbol)

Expand Down Expand Up @@ -126,10 +122,12 @@ def __getstate__(self):

def __setstate__(self, state):
self._name = state["name"]
if not HAS_SYMENGINE:
if not _optionals.HAS_SYMENGINE:
from sympy import Symbol

symbol = Symbol(self._name)
else:
import symengine

symbol = symengine.Symbol(self._name)
super().__init__(symbol_map={self: symbol}, expr=symbol)
Loading