summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Lecher <jlec@gentoo.org>2014-11-14 20:34:09 +0000
committerJustin Lecher <jlec@gentoo.org>2014-11-14 20:34:09 +0000
commitc77797810fa88260433c09530260c7d09e82f931 (patch)
treec2d92b4e3a6381c92cfdc685e2677aeb65b6ba2f /sci-libs/scipy
parentFix building shared libary on Solaris (diff)
downloadgentoo-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/ChangeLog8
-rw-r--r--sci-libs/scipy/files/scipy-0.14.0-lsqr-backport.patch107
-rw-r--r--sci-libs/scipy/metadata.xml16
-rw-r--r--sci-libs/scipy/scipy-0.14.0-r1.ebuild143
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"
+}