diff options
author | Justin Lecher <jlec@gentoo.org> | 2014-11-14 20:34:09 +0000 |
---|---|---|
committer | Justin Lecher <jlec@gentoo.org> | 2014-11-14 20:34:09 +0000 |
commit | c77797810fa88260433c09530260c7d09e82f931 (patch) | |
tree | c2d92b4e3a6381c92cfdc685e2677aeb65b6ba2f /sci-libs/scipy | |
parent | Fix building shared libary on Solaris (diff) | |
download | gentoo-2-c77797810fa88260433c09530260c7d09e82f931.tar.gz gentoo-2-c77797810fa88260433c09530260c7d09e82f931.tar.bz2 gentoo-2-c77797810fa88260433c09530260c7d09e82f931.zip |
sci-libs/scipy: Backport fix for broken lsqr
(Portage version: 2.2.14/cvs/Linux x86_64, signed Manifest commit with key B9D4F231BD1558AB!)
Diffstat (limited to 'sci-libs/scipy')
-rw-r--r-- | sci-libs/scipy/ChangeLog | 8 | ||||
-rw-r--r-- | sci-libs/scipy/files/scipy-0.14.0-lsqr-backport.patch | 107 | ||||
-rw-r--r-- | sci-libs/scipy/metadata.xml | 16 | ||||
-rw-r--r-- | sci-libs/scipy/scipy-0.14.0-r1.ebuild | 143 |
4 files changed, 265 insertions, 9 deletions
diff --git a/sci-libs/scipy/ChangeLog b/sci-libs/scipy/ChangeLog index 0471f440b21f..7d3030841f7a 100644 --- a/sci-libs/scipy/ChangeLog +++ b/sci-libs/scipy/ChangeLog @@ -1,6 +1,12 @@ # ChangeLog for sci-libs/scipy # Copyright 1999-2014 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/sci-libs/scipy/ChangeLog,v 1.117 2014/07/22 17:47:47 zerochaos Exp $ +# $Header: /var/cvsroot/gentoo-x86/sci-libs/scipy/ChangeLog,v 1.118 2014/11/14 20:34:09 jlec Exp $ + +*scipy-0.14.0-r1 (14 Nov 2014) + + 14 Nov 2014; Justin Lecher <jlec@gentoo.org> +scipy-0.14.0-r1.ebuild, + +files/scipy-0.14.0-lsqr-backport.patch, metadata.xml: + Backport fix for broken lsqr 22 Jul 2014; Rick Farina <zerochaos@gentoo.org> scipy-0.12.1.ebuild, scipy-0.13.2.ebuild, scipy-0.13.3.ebuild, scipy-0.14.0.ebuild: diff --git a/sci-libs/scipy/files/scipy-0.14.0-lsqr-backport.patch b/sci-libs/scipy/files/scipy-0.14.0-lsqr-backport.patch new file mode 100644 index 000000000000..a754e36ab2cf --- /dev/null +++ b/sci-libs/scipy/files/scipy-0.14.0-lsqr-backport.patch @@ -0,0 +1,107 @@ +From 785e3961a685a351bd9d1e8eec0a62035cc4c6aa Mon Sep 17 00:00:00 2001 +From: Olivier Grisel <olivier.grisel@ensta.org> +Date: Thu, 13 Nov 2014 13:39:35 +0100 +Subject: [PATCH] BUG: ZeroDivisionError in scipy.sparse.linalg.lsqr + +--- + scipy/sparse/linalg/isolve/lsqr.py | 6 ++-- + scipy/sparse/linalg/isolve/tests/test_lsqr.py | 51 +++++++++++++++++++++------ + 2 files changed, 45 insertions(+), 12 deletions(-) + +diff --git a/scipy/sparse/linalg/isolve/lsqr.py b/scipy/sparse/linalg/isolve/lsqr.py +index c4a6c02..de5a6b9 100644 +--- a/scipy/sparse/linalg/isolve/lsqr.py ++++ b/scipy/sparse/linalg/isolve/lsqr.py +@@ -57,6 +57,8 @@ + from math import sqrt + from scipy.sparse.linalg.interface import aslinearoperator + ++eps = np.finfo(np.float64).eps ++ + + def _sym_ortho(a, b): + """ +@@ -432,8 +434,8 @@ def lsqr(A, b, damp=0.0, atol=1e-8, btol=1e-8, conlim=1e8, + # Now use these norms to estimate certain other quantities, + # some of which will be small near a solution. + test1 = rnorm / bnorm +- test2 = arnorm / (anorm * rnorm) +- test3 = 1 / acond ++ test2 = arnorm / (anorm * rnorm + eps) ++ test3 = 1 / (acond + eps) + t1 = test1 / (1 + anorm * xnorm / bnorm) + rtol = btol + atol * anorm * xnorm / bnorm + +diff --git a/scipy/sparse/linalg/isolve/tests/test_lsqr.py b/scipy/sparse/linalg/isolve/tests/test_lsqr.py +index f378cca..626288b 100644 +--- a/scipy/sparse/linalg/isolve/tests/test_lsqr.py ++++ b/scipy/sparse/linalg/isolve/tests/test_lsqr.py +@@ -1,7 +1,7 @@ + from __future__ import division, print_function, absolute_import + + import numpy as np +-from numpy.testing import assert_ ++from numpy.testing import assert_, assert_equal, assert_array_almost_equal + from scipy.lib.six import xrange + + import scipy.sparse +@@ -34,6 +34,46 @@ def test_basic(): + xo = X[0] + assert_(norm(svx - xo) < 1e-5) + ++ ++def test_gh_2466(): ++ row = np.array([0, 0]) ++ col = np.array([0, 1]) ++ val = np.array([1, -1]) ++ A = scipy.sparse.coo_matrix((val, (row, col)), shape=(1, 2)) ++ b = np.asarray([4]) ++ lsqr(A, b) ++ ++ ++def test_well_conditioned_problems(): ++ # Test that sparse the lsqr solver returns the right solution ++ # on various problems with different random seeds. ++ # This is a non-regression test for a potential ZeroDivisionError ++ # raised when computing the `test2` & `test3` convergence conditions. ++ n = 10 ++ A_sparse = scipy.sparse.eye(n, n) ++ A_dense = A_sparse.toarray() ++ ++ with np.errstate(invalid='raise'): ++ for seed in range(30): ++ rng = np.random.RandomState(seed + 10) ++ beta = rng.rand(n) ++ beta[beta == 0] = 0.00001 # ensure that all the betas are not null ++ b = A_sparse * beta[:, np.newaxis] ++ output = lsqr(A_sparse, b, show=show) ++ ++ # Check that the termination condition corresponds to an approximate ++ # solution to Ax = b ++ assert_equal(output[1], 1) ++ solution = output[0] ++ ++ # Check that we recover the ground truth solution ++ assert_array_almost_equal(solution, beta) ++ ++ # Sanity check: compare to the dense array solver ++ reference_solution = np.linalg.solve(A_dense, b).ravel() ++ assert_array_almost_equal(solution, reference_solution) ++ ++ + if __name__ == "__main__": + svx = np.linalg.solve(G, b) + +@@ -64,12 +104,3 @@ def test_basic(): + print("") + print(" || x_{direct} - x_{LSQR}|| %9.4e " % norm(svx-xo)) + print("") +- +- +-def test_gh_2466(): +- row = np.array([0, 0]) +- col = np.array([0, 1]) +- val = np.array([1, -1]) +- A = scipy.sparse.coo_matrix((val, (row, col)), shape=(1, 2)) +- b = np.asarray([4]) +- lsqr(A, b) diff --git a/sci-libs/scipy/metadata.xml b/sci-libs/scipy/metadata.xml index 4ee19593821e..350066e901ec 100644 --- a/sci-libs/scipy/metadata.xml +++ b/sci-libs/scipy/metadata.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd"> <pkgmetadata> -<herd>sci</herd> -<longdescription lang="en"> + <herd>sci</herd> + <longdescription lang="en"> SciPy is an open source library of scientific tools for Python. SciPy supplements the popular numpy module, gathering a variety of high level science and engineering modules together as a single package. @@ -10,10 +10,10 @@ integration, special functions, signal and image processing, genetic algorithms, ODE solvers, and others. </longdescription> -<use> - <flag name="sparse">Adds support for sparse solving with <pkg>sci-libs/umfpack</pkg></flag> -</use> -<upstream> - <remote-id type="pypi">scipy</remote-id> -</upstream> + <use> + <flag name="sparse">Adds support for sparse solving with <pkg>sci-libs/umfpack</pkg></flag> + </use> + <upstream> + <remote-id type="pypi">scipy</remote-id> + </upstream> </pkgmetadata> diff --git a/sci-libs/scipy/scipy-0.14.0-r1.ebuild b/sci-libs/scipy/scipy-0.14.0-r1.ebuild new file mode 100644 index 000000000000..7e11f66d4227 --- /dev/null +++ b/sci-libs/scipy/scipy-0.14.0-r1.ebuild @@ -0,0 +1,143 @@ +# Copyright 1999-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sci-libs/scipy/scipy-0.14.0-r1.ebuild,v 1.1 2014/11/14 20:34:09 jlec Exp $ + +EAPI=5 + +PYTHON_COMPAT=( python{2_7,3_2,3_3,3_4} ) + +DOC_PV=0.13.0 + +inherit eutils fortran-2 distutils-r1 flag-o-matic multilib toolchain-funcs + +DESCRIPTION="Scientific algorithms library for Python" +HOMEPAGE="http://www.scipy.org/" +SRC_URI=" + mirror://sourceforge/${PN}/${P}.tar.gz + doc? ( + http://docs.scipy.org/doc/${PN}-${DOC_PV}/${PN}-html.zip -> ${PN}-${DOC_PV}-html.zip + http://docs.scipy.org/doc/${PN}-${DOC_PV}/${PN}-ref.pdf -> ${PN}-${DOC_PV}-ref.pdf + )" + +LICENSE="BSD LGPL-2" +SLOT="0" +IUSE="doc sparse test" +KEYWORDS="~amd64 ~arm ~ppc ~ppc64 ~x86 ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos" + +CDEPEND=" + dev-python/numpy[lapack,${PYTHON_USEDEP}] + sci-libs/arpack:0= + virtual/cblas + virtual/lapack + sparse? ( sci-libs/umfpack:0= )" +DEPEND="${CDEPEND} + dev-lang/swig + >=dev-python/cython-0.19.1[${PYTHON_USEDEP}] + virtual/pkgconfig + doc? ( app-arch/unzip ) + test? ( dev-python/nose[${PYTHON_USEDEP}] ) + " + +RDEPEND="${CDEPEND} + virtual/python-imaging[${PYTHON_USEDEP}]" + +DOCS=( HACKING.rst.txt THANKS.txt ) + +DISTUTILS_IN_SOURCE_BUILD=1 + +src_unpack() { + unpack ${P}.tar.gz + if use doc; then + unzip -qo "${DISTDIR}"/${PN}-${DOC_PV}-html.zip -d html || die + fi +} + +pc_incdir() { + $(tc-getPKG_CONFIG) --cflags-only-I $@ | \ + sed -e 's/^-I//' -e 's/[ ]*-I/:/g' -e 's/[ ]*$//' -e 's|^:||' +} + +pc_libdir() { + $(tc-getPKG_CONFIG) --libs-only-L $@ | \ + sed -e 's/^-L//' -e 's/[ ]*-L/:/g' -e 's/[ ]*$//' -e 's|^:||' +} + +pc_libs() { + $(tc-getPKG_CONFIG) --libs-only-l $@ | \ + sed -e 's/[ ]-l*\(pthread\|m\)\([ ]\|$\)//g' \ + -e 's/^-l//' -e 's/[ ]*-l/,/g' -e 's/[ ]*$//' \ + | tr ',' '\n' | sort -u | tr '\n' ',' | sed -e 's|,$||' +} + +python_prepare_all() { + # scipy automatically detects libraries by default + export {FFTW,FFTW3,UMFPACK}=None + use sparse && unset UMFPACK + # the missing symbols are in -lpythonX.Y, but since the version can + # differ, we just introduce the same scaryness as on Linux/ELF + [[ ${CHOST} == *-darwin* ]] \ + && append-ldflags -bundle "-undefined dynamic_lookup" \ + || append-ldflags -shared + [[ -z ${FC} ]] && export FC="$(tc-getFC)" + # hack to force F77 to be FC until bug #278772 is fixed + [[ -z ${F77} ]] && export F77="$(tc-getFC)" + export F90="${FC}" + export SCIPY_FCONFIG="config_fc --noopt --noarch" + append-fflags -fPIC + + local libdir="${EPREFIX}"/usr/$(get_libdir) + cat >> site.cfg <<-EOF + [blas] + include_dirs = $(pc_incdir cblas) + library_dirs = $(pc_libdir cblas blas):${libdir} + blas_libs = $(pc_libs cblas blas) + [lapack] + library_dirs = $(pc_libdir lapack):${libdir} + lapack_libs = $(pc_libs lapack) + EOF + + # Drop hashes to force rebuild of cython based .c code + rm cythonize.dat || die + + local PATCHES=( + "${FILESDIR}"/${PN}-0.12.0-blitz.patch + "${FILESDIR}"/${PN}-0.12.0-restore-sys-argv.patch + "${FILESDIR}"/${PN}-0.12.0-cephes-missing-include.patch + "${FILESDIR}"/${P}-lsqr-backport.patch + ) + distutils-r1_python_prepare_all +} + +python_compile() { + ${EPYTHON} tools/cythonize.py || die + distutils-r1_python_compile ${SCIPY_FCONFIG} +} + +python_test() { + # fails with bdist_egg. should it be fixed in distutils-r1 eclass? + distutils_install_for_testing ${SCIPY_FCONFIG} + cd "${TEST_DIR}" || die "no ${TEST_DIR} available" + "${EPYTHON}" -c " +import scipy, sys +r = scipy.test('fast',verbose=2) +sys.exit(0 if r.wasSuccessful() else 1)" || die "Tests fail with ${EPYTHON}" +} + +python_install_all() { + if use doc; then + dodoc "${DISTDIR}"/${PN}*pdf + docinto html + dodoc -r "${WORKDIR}"/html/. + fi + distutils-r1_python_install_all +} + +python_install() { + distutils-r1_python_install ${SCIPY_FCONFIG} +} + +pkg_postinst() { + elog "You might want to set the variable SCIPY_PIL_IMAGE_VIEWER" + elog "to your prefered image viewer. Example:" + elog "\t echo \"export SCIPY_PIL_IMAGE_VIEWER=display\" >> ~/.bashrc" +} |