Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
"""Fixture module to skip the unsupervised_learning.rst doctest for
versions of SciPy earlier than 0.12.0.
"""Fixture module to skip the unsupervised_learning.rst doctest for
versions of SciPy earlier than 0.12.0.
"""
from sklearn.utils.testing import SkipTest
from sklearn.utils.fixes import sp_version
from sklearn.utils import parse_version

def setup_module(module):
if sp_version < (0, 12):
if sp_version < parse_version('0.12'):
raise SkipTest("Skipping because SciPy version earlier than 0.12.0 and "
"thus does not include the scipy.misc.face() image.")
5 changes: 2 additions & 3 deletions sklearn/cross_decomposition/pls_.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@

# Author: Edouard Duchesnay <edouard.duchesnay@cea.fr>
# License: BSD 3 clause
from distutils.version import LooseVersion
from sklearn.utils.extmath import svd_flip

from ..base import BaseEstimator, RegressorMixin, TransformerMixin
from ..utils import check_array, check_consistent_length
from ..utils import check_array, check_consistent_length, parse_version
from ..externals import six

import warnings
Expand All @@ -22,7 +21,7 @@

import scipy
pinv2_args = {}
if LooseVersion(scipy.__version__) >= LooseVersion('0.12'):
if parse_version(scipy.__version__) >= parse_version('0.12'):
# check_finite=False is an optimization available only in scipy >=0.12
pinv2_args = {'check_finite': False}

Expand Down
3 changes: 2 additions & 1 deletion sklearn/feature_extraction/tests/test_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
from sklearn.utils.graph import connected_components
from sklearn.utils.testing import SkipTest, assert_equal, assert_true
from sklearn.utils.fixes import sp_version
from sklearn.utils.version import parse_version

if sp_version < (0, 12):
if sp_version < parse_version('0.12'):
raise SkipTest("Skipping because SciPy version earlier than 0.12.0 and "
"thus does not include the scipy.misc.face() image.")

Expand Down
5 changes: 3 additions & 2 deletions sklearn/linear_model/least_angle.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
from math import log
import sys
import warnings
from distutils.version import LooseVersion

import numpy as np
from scipy import linalg, interpolate
Expand All @@ -28,9 +27,11 @@
from ..externals.six.moves import xrange
from ..externals.six import string_types

from ..utils import parse_version

import scipy
solve_triangular_args = {}
if LooseVersion(scipy.__version__) >= LooseVersion('0.12'):
if parse_version(scipy.__version__) >= parse_version('0.12'):
solve_triangular_args = {'check_finite': False}


Expand Down
5 changes: 3 additions & 2 deletions sklearn/linear_model/omp.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
# License: BSD 3 clause

import warnings
from distutils.version import LooseVersion

import numpy as np
from scipy import linalg
Expand All @@ -18,9 +17,11 @@
from ..model_selection import check_cv
from ..externals.joblib import Parallel, delayed

from ..utils import parse_version

import scipy
solve_triangular_args = {}
if LooseVersion(scipy.__version__) >= LooseVersion('0.12'):
if parse_version(scipy.__version__) >= parse_version('0.12'):
# check_finite=False is an optimization available only in scipy >=0.12
solve_triangular_args = {'check_finite': False}

Expand Down
5 changes: 3 additions & 2 deletions sklearn/linear_model/tests/test_logistic.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from sklearn.exceptions import ConvergenceWarning
from sklearn.utils import compute_class_weight
from sklearn.utils.fixes import sp_version
from sklearn.utils.version import parse_version

from sklearn.linear_model.logistic import (
LogisticRegression,
Expand Down Expand Up @@ -899,7 +900,7 @@ def test_max_iter():

solvers = ['newton-cg', 'liblinear', 'sag']
# old scipy doesn't have maxiter
if sp_version >= (0, 12):
if sp_version >= parse_version('0.12'):
solvers.append('lbfgs')

for max_iter in range(1, 5):
Expand Down Expand Up @@ -969,7 +970,7 @@ def test_warm_start():

solvers = ['newton-cg', 'sag']
# old scipy doesn't have maxiter
if sp_version >= (0, 12):
if sp_version >= parse_version('0.12'):
solvers.append('lbfgs')

for warm_start in [True, False]:
Expand Down
3 changes: 2 additions & 1 deletion sklearn/metrics/tests/test_classification.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from sklearn.utils.testing import assert_not_equal
from sklearn.utils.testing import ignore_warnings
from sklearn.utils.mocking import MockDataFrame
from sklearn.utils.version import parse_version

from sklearn.metrics import accuracy_score
from sklearn.metrics import average_precision_score
Expand Down Expand Up @@ -691,7 +692,7 @@ def test_classification_report_multiclass_with_unicode_label():

avg / total 0.51 0.53 0.47 75
"""
if np_version[:3] < (1, 7, 0):
if np_version < parse_version('1.7.0'):
expected_message = ("NumPy < 1.7.0 does not implement"
" searchsorted on unicode data correctly.")
assert_raise_message(RuntimeError, expected_message,
Expand Down
4 changes: 2 additions & 2 deletions sklearn/model_selection/_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from ..exceptions import NotFittedError
from ..externals.joblib import Parallel, delayed
from ..externals import six
from ..utils import check_random_state
from ..utils import check_random_state, parse_version
from ..utils.fixes import sp_version
from ..utils.fixes import rankdata
from ..utils.fixes import MaskedArray
Expand Down Expand Up @@ -251,7 +251,7 @@ def __iter__(self):
params = dict()
for k, v in items:
if hasattr(v, "rvs"):
if sp_version < (0, 16):
if sp_version < parse_version('0.16'):
params[k] = v.rvs()
else:
params[k] = v.rvs(random_state=rnd)
Expand Down
3 changes: 2 additions & 1 deletion sklearn/model_selection/tests/test_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from sklearn.utils.testing import assert_almost_equal
from sklearn.utils.testing import ignore_warnings
from sklearn.utils.mocking import CheckingClassifier, MockDataFrame
from sklearn.utils.version import parse_version

from scipy.stats import bernoulli, expon, uniform

Expand Down Expand Up @@ -688,7 +689,7 @@ def test_param_sampler():
n_iter=3, random_state=0)
assert_equal([x for x in sampler], [x for x in sampler])

if sp_version >= (0, 16):
if sp_version >= parse_version('0.16'):
param_distributions = {"C": uniform(0, 1)}
sampler = ParameterSampler(param_distributions=param_distributions,
n_iter=10, random_state=0)
Expand Down
19 changes: 5 additions & 14 deletions sklearn/neighbors/tests/test_dist_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,13 @@
from sklearn.neighbors.dist_metrics import DistanceMetric
from sklearn.neighbors import BallTree
from sklearn.utils.testing import SkipTest, assert_raises_regex
from sklearn.utils.version import parse_version


def dist_func(x1, x2, p):
return np.sum((x1 - x2) ** p) ** (1. / p)


def cmp_version(version1, version2):
version1 = tuple(map(int, version1.split('.')[:2]))
version2 = tuple(map(int, version2.split('.')[:2]))

if version1 < version2:
return -1
elif version1 > version2:
return 1
else:
return 0


class TestMetrics:
def __init__(self, n1=20, n2=25, d=4, zero_frac=0.5,
rseed=0, dtype=np.float64):
Expand Down Expand Up @@ -70,7 +59,8 @@ def test_cdist(self):
yield self.check_cdist_bool, metric, D_true

def check_cdist(self, metric, kwargs, D_true):
if metric == 'canberra' and cmp_version(scipy.__version__, '0.9') <= 0:
if metric == 'canberra' and \
parse_version(scipy.__version__) <= parse_version('0.9'):
raise SkipTest("Canberra distance incorrect in scipy < 0.9")
dm = DistanceMetric.get_metric(metric, **kwargs)
D12 = dm.pairwise(self.X1, self.X2)
Expand All @@ -94,7 +84,8 @@ def test_pdist(self):
yield self.check_pdist_bool, metric, D_true

def check_pdist(self, metric, kwargs, D_true):
if metric == 'canberra' and cmp_version(scipy.__version__, '0.9') <= 0:
if metric == 'canberra' and \
parse_version(scipy.__version__) <= parse_version('0.9'):
raise SkipTest("Canberra distance incorrect in scipy < 0.9")
dm = DistanceMetric.get_metric(metric, **kwargs)
D12 = dm.pairwise(self.X1)
Expand Down
4 changes: 2 additions & 2 deletions sklearn/preprocessing/label.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from ..utils.fixes import sparse_min_max
from ..utils.fixes import astype
from ..utils.fixes import in1d
from ..utils import column_or_1d
from ..utils import column_or_1d, parse_version
from ..utils.validation import check_array
from ..utils.validation import check_is_fitted
from ..utils.validation import _num_samples
Expand Down Expand Up @@ -47,7 +47,7 @@ def _check_numpy_unicode_bug(labels):
https://github.com/numpy/numpy/pull/243

"""
if np_version[:3] < (1, 7, 0) and labels.dtype.kind == 'U':
if np_version < parse_version('1.7.0') and labels.dtype.kind == 'U':
raise RuntimeError("NumPy < 1.7.0 does not implement searchsorted"
" on unicode data correctly. Please upgrade"
" NumPy to use LabelEncoder with unicode inputs.")
Expand Down
4 changes: 2 additions & 2 deletions sklearn/preprocessing/tests/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import numpy as np
import numpy.linalg as la
from scipy import sparse
from distutils.version import LooseVersion

from sklearn.utils import gen_batches

Expand All @@ -29,6 +28,7 @@
from sklearn.utils.testing import assert_no_warnings
from sklearn.utils.testing import assert_allclose
from sklearn.utils.testing import skip_if_32bit
from sklearn.utils.version import parse_version

from sklearn.utils.sparsefuncs import mean_variance_axis
from sklearn.preprocessing.data import _transform_selected
Expand Down Expand Up @@ -206,7 +206,7 @@ def test_standard_scaler_numerical_stability():
# was empirically found to cause numerical problems with np.mean & np.std.

x = np.zeros(8, dtype=np.float64) + np.log(1e-5, dtype=np.float64)
if LooseVersion(np.__version__) >= LooseVersion('1.9'):
if parse_version(np.__version__) >= parse_version('1.9'):
# This does not raise a warning as the number of samples is too low
# to trigger the problem in recent numpy
x_scaled = assert_no_warnings(scale, x)
Expand Down
3 changes: 2 additions & 1 deletion sklearn/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
check_random_state, column_or_1d, check_array,
check_consistent_length, check_X_y, indexable,
check_symmetric)
from .version import parse_version
from .class_weight import compute_class_weight, compute_sample_weight
from ..externals.joblib import cpu_count
from ..exceptions import DataConversionWarning
Expand All @@ -25,7 +26,7 @@
"compute_class_weight", "compute_sample_weight",
"column_or_1d", "safe_indexing",
"check_consistent_length", "check_X_y", 'indexable',
"check_symmetric", "indices_to_mask", "deprecated"]
"check_symmetric", "indices_to_mask", "deprecated", "parse_version"]


def safe_mask(X, mask):
Expand Down
8 changes: 4 additions & 4 deletions sklearn/utils/arpack.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
import scipy
import functools
import operator
from distutils.version import LooseVersion
from .version import parse_version

__docformat__ = "restructuredtext en"

Expand Down Expand Up @@ -276,9 +276,9 @@


# CHECK IF BACKPORT IS ACTUALLY NEEDED
if scipy.version.version >= LooseVersion('0.12'):
if parse_version(scipy.version.version) >= parse_version('0.12'):
BACKPORT_TO = None
elif scipy.version.version >= LooseVersion('0.11'):
elif parse_version(scipy.version.version) >= parse_version('0.11'):
BACKPORT_TO = '0.10'
else:
BACKPORT_TO = '0.09'
Expand Down Expand Up @@ -1853,7 +1853,7 @@ def matvec_XH_X(x):


# Redefine the backported function
if scipy.version.version >= LooseVersion('0.12'):
if parse_version(scipy.version.version) >= parse_version('0.12'):
from scipy.sparse.linalg import eigs, eigsh, svds
else:
eigs, eigsh, svds = _eigs, _eigsh, _svds
7 changes: 4 additions & 3 deletions sklearn/utils/extmath.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from .sparsefuncs_fast import csr_row_norms
from .validation import check_array
from ..exceptions import NonBLASDotWarning
from .version import parse_version


def norm(x):
Expand All @@ -40,7 +41,7 @@ def norm(x):


# Newer NumPy has a ravel that needs less copying.
if np_version < (1, 7, 1):
if np_version < parse_version('1.7.1'):
_ravel = np.ravel
else:
_ravel = partial(np.ravel, order='K')
Expand Down Expand Up @@ -131,7 +132,7 @@ def _have_blas_gemm():


# Only use fast_dot for older NumPy; newer ones have tackled the speed issue.
if np_version < (1, 7, 2) and _have_blas_gemm():
if np_version < parse_version('1.7.2') and _have_blas_gemm():
def fast_dot(A, B):
"""Compute fast dot products directly calling BLAS.

Expand Down Expand Up @@ -860,7 +861,7 @@ def stable_cumsum(arr, axis=None, rtol=1e-05, atol=1e-08):
Absolute tolerance, see ``np.allclose``
"""
# sum is as unstable as cumsum for numpy < 1.9
if np_version < (1, 9):
if np_version < parse_version('1.9'):
return np.cumsum(arr, axis=axis, dtype=np.float64)

out = np.cumsum(arr, axis=axis, dtype=np.float64)
Expand Down
Loading