Skip to content
This repository has been archived by the owner on Jun 12, 2023. It is now read-only.

Commit

Permalink
Make scikit-learn an optional dependency (#524)
Browse files Browse the repository at this point in the history
* Make scikit-learn an optional dependency

We previously had scikit-learn as a requirement that always needed to be
installed. However it was only ever used by the measurement
discriminators and not needed for ignis in general. Since this is a
fairly large package it is a bit heavy to require for every install
especially if the discriminators aren't being used. This commit removes
scikit-learn from the requirements list and adds it as an optional
dependency.

Co-authored-by: Christopher J. Wood <[email protected]>
  • Loading branch information
mtreinish and chriseclectic authored Mar 30, 2021
1 parent 864663d commit d6f1ad7
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 8 deletions.
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,11 @@ for running tomogography you'll need to install cvxpy. You can do this with
error mitigation using the CTMP method performance can be improved using
just-in-time compiling if Numbda is installed. You can do this with
`pip install numba` or when you install ignis with
`pip install qiskit-ignis[jit]`. If you want to install all extra requirements
when you install ignis you can run `pip install qiskit-ignis[visualization,cvx,jit]`.
`pip install qiskit-ignis[jit]`. For using the discriminator classes in
`qiskit.ignis.measurement` scikit-learn needs to be installed. You can do this with
`pip install scikit-learn` or when you install ignis with
`pip install qiskit-ignis[iq]`. If you want to install all extra requirements
when you install ignis you can run `pip install qiskit-ignis[visualization,cvx,jit,iq]`.

## Creating your first quantum experiment with Qiskit Ignis
Now that you have Qiskit Ignis installed, you can start creating experiments, to reveal information about the device quality. Here is a basic example:
Expand Down
23 changes: 19 additions & 4 deletions qiskit/ignis/measurement/discriminator/iq_discriminators.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
from typing import Union, List

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis

from qiskit.exceptions import QiskitError
from qiskit.ignis.measurement.discriminator.discriminators import \
Expand All @@ -36,6 +34,13 @@
except ImportError:
HAS_MATPLOTLIB = False

try:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
HAS_SKLEARN = True
except ImportError:
HAS_SKLEARN = False


class IQDiscriminationFitter(BaseDiscriminationFitter):
"""
Expand Down Expand Up @@ -65,7 +70,6 @@ def __init__(self, cal_results: Union[Result, List[Result]],
instead of the schedules. If schedules is None, then all the
schedules in cal_results are used.
"""

BaseDiscriminationFitter.__init__(self, cal_results, qubit_mask,
expected_states, standardize,
schedules)
Expand Down Expand Up @@ -423,6 +427,8 @@ def __init__(self, cal_results: Union[Result, List[Result]],
instead of the schedules. If schedules is None, then all the
schedules in cal_results are used.
discriminator_parameters (dict): parameters for Sklearn's LDA.
Raises:
ImportError: If scikit-learn is not installed
"""
if not discriminator_parameters:
discriminator_parameters = {}
Expand All @@ -431,7 +437,10 @@ def __init__(self, cal_results: Union[Result, List[Result]],
shrink = discriminator_parameters.get('shrinkage', None)
store_cov = discriminator_parameters.get('store_covariance', False)
tol = discriminator_parameters.get('tol', 1.0e-4)

if not HAS_SKLEARN:
raise ImportError("To use the LinearIQDiscriminator class "
"scikit-learn needs to be installed. This can "
"be done with 'pip install scikit-learn'")
self._lda = LinearDiscriminantAnalysis(solver=solver, shrinkage=shrink,
store_covariance=store_cov,
tol=tol)
Expand Down Expand Up @@ -492,12 +501,18 @@ def __init__(self, cal_results: Union[Result, List[Result]],
instead of the schedules. If schedules is None, then all the
schedules in cal_results are used.
discriminator_parameters (dict): parameters for Sklearn's LDA.
Raises:
ImportError: If scikit-learn is not installed
"""
if not discriminator_parameters:
discriminator_parameters = {}

store_cov = discriminator_parameters.get('store_covariance', False)
tol = discriminator_parameters.get('tol', 1.0e-4)
if not HAS_SKLEARN:
raise ImportError("To use the QuadraticIQDiscriminator class "
"scikit-learn needs to be installed. This can "
"be done with 'pip install scikit-learn'")

self._qda = QuadraticDiscriminantAnalysis(store_covariance=store_cov,
tol=tol)
Expand Down
12 changes: 12 additions & 0 deletions releasenotes/notes/scikit-learn-is-optional-0540027be0003aad.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
upgrade:
- |
The ``scikit-learn`` dependency is no longer required and is now an optional
requirement. If you're using the IQ measurement discriminators
(:class:`~qiskit.ignis.measurement.IQDiscriminationFitter`,
:class:`~qiskit.ignis.measurement.LinearIQDiscriminationFitter`,
:class:`~qiskit.ignis.measurement.QuadraticIQDiscriminationFitter`,
or :class:`~qiskit.ignis.measurement.SklearnIQDiscriminator`) you will
now need to manually install scikit-learn, either by running
``pip install scikit-learn`` or when you're also installing
qiskit-ignis with ``pip install qiskit-ignis[iq]``.
1 change: 1 addition & 0 deletions requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ jupyter-sphinx;python_version<'3.9'
reno
matplotlib
pyfakefs
scikit-learn>=0.17
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
"retworkx>=0.8.0",
"scipy>=0.19,!=0.19.1",
"setuptools>=40.1.0",
"scikit-learn>=0.17",
]


Expand Down Expand Up @@ -81,6 +80,7 @@
extras_require={
'visualization': ['matplotlib>=2.1'],
'cvx': ['cvxpy>=1.0.15'],
'iq': ["scikit-learn>=0.17"],
'jit': ['numba'],
},
install_requires=requirements,
Expand Down
7 changes: 7 additions & 0 deletions test/measurement/discriminator/test_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,19 @@
import unittest
from operator import getitem

try:
import sklearn # pylint: disable=unused-import
HAS_SKLEARN = True
except ImportError:
HAS_SKLEARN = False

from qiskit.ignis.measurement.discriminator.filters import DiscriminationFilter
from qiskit.result import Result
from qiskit.ignis.measurement.discriminator.iq_discriminators import \
LinearIQDiscriminator


@unittest.skipUnless(HAS_SKLEARN, 'scikit-learn is required for these tests')
class TestDiscriminationFilter(unittest.TestCase):
"""
Test methods of discrimination filters.
Expand Down
7 changes: 6 additions & 1 deletion test/measurement/discriminator/test_iq_discriminator.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@

import test.utils as utils

from sklearn.svm import SVC
try:
from sklearn.svm import SVC
HAS_SKLEARN = True
except ImportError:
HAS_SKLEARN = False

import qiskit
from qiskit import Aer
Expand All @@ -34,6 +38,7 @@
from qiskit.result.models import ExperimentResultData


@unittest.skipUnless(HAS_SKLEARN, 'scikit-learn is required to run these tests')
class BaseTestIQDiscriminator(unittest.TestCase):
"""
Base class for IQ discriminator test cases.
Expand Down

0 comments on commit d6f1ad7

Please sign in to comment.