~ruther/guix-local

ff208b4b629a15ce0b72555db1cda9fcb7eec1c9 — Ludovic Courtès 3 years ago 5594f4c
gnu: arpack-ng: Update to 3.9.0.

* gnu/packages/maths.scm (arpack-ng): Update to 3.9.0.
[source]: Add 'patches'.
[build-system]: Switch to CMAKE-BUILD-SYSTEM.
[native-inputs]: Remove AUTOCONF, AUTOMAKE, and LIBTOOL.
(arpack-ng-openmpi)[inputs]: Use 'modify-inputs'.
[arguments]: Use gexps.
* gnu/packages/patches/arpack-ng-propagate-rng-state.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
3 files changed, 537 insertions(+), 12 deletions(-)

M gnu/local.mk
M gnu/packages/maths.scm
A gnu/packages/patches/arpack-ng-propagate-rng-state.patch
M gnu/local.mk => gnu/local.mk +1 -0
@@ 905,6 905,7 @@ dist_patch_DATA =						\
  %D%/packages/patches/aoflagger-use-system-provided-pybind11.patch \
  %D%/packages/patches/apr-skip-getservbyname-test.patch	\
  %D%/packages/patches/ark-skip-xar-test.patch			\
  %D%/packages/patches/arpack-ng-propagate-rng-state.patch	\
  %D%/packages/patches/aspell-CVE-2019-25051.patch		\
  %D%/packages/patches/aspell-default-dict-dir.patch		\
  %D%/packages/patches/ath9k-htc-firmware-binutils.patch	\

M gnu/packages/maths.scm => gnu/packages/maths.scm +13 -12
@@ 973,7 973,7 @@ halfspaces) or by their double description with both representations.")
(define-public arpack-ng
  (package
    (name "arpack-ng")
    (version "3.8.0")
    (version "3.9.0")
    (home-page "https://github.com/opencollab/arpack-ng")
    (source (origin
              (method git-fetch)


@@ 981,10 981,11 @@ halfspaces) or by their double description with both representations.")
              (file-name (git-file-name name version))
              (sha256
               (base32
                "0l7as5z6xvbxly8alam9s4kws70952qq35a6vkljzayi4b9gbklx"))))
    (build-system gnu-build-system)
                "09smxilyn8v9xs3kpx3nlj2s7ql3v8z40mpc09kccbb6smyd35iv"))
              (patches (search-patches "arpack-ng-propagate-rng-state.patch"))))
    (build-system cmake-build-system)
    (native-inputs
     (list autoconf automake libtool pkg-config))
     (list pkg-config))
    (inputs
     (list eigen lapack gfortran))
    (synopsis "Fortran subroutines for solving eigenvalue problems")


@@ 998,16 999,16 @@ large scale eigenvalue problems.")
  (package (inherit arpack-ng)
    (name "arpack-ng-openmpi")
    (inputs
     `(("mpi" ,openmpi)
       ,@(package-inputs arpack-ng)))
     (modify-inputs (package-inputs arpack-ng)
       (prepend openmpi)))
    (arguments
     (substitute-keyword-arguments (package-arguments arpack-ng)
       ((#:configure-flags _ '())
        ''("--enable-mpi"))
       ((#:phases phases '%standard-phases)
        `(modify-phases ,phases
           (add-before 'check 'mpi-setup
             ,%openmpi-setup)))))
       ((#:configure-flags _ #~())
        #~'("-DMPI=ON"))
       ((#:phases phases #~%standard-phases)
        #~(modify-phases #$phases
            (add-before 'check 'mpi-setup
              #$%openmpi-setup)))))
    (synopsis "Fortran subroutines for solving eigenvalue problems with MPI")))

(define-public lapack

A gnu/packages/patches/arpack-ng-propagate-rng-state.patch => gnu/packages/patches/arpack-ng-propagate-rng-state.patch +523 -0
@@ 0,0 1,523 @@
Fix a bug that manifests while running the test suite of 'python-igraph':

  https://github.com/opencollab/arpack-ng/issues/401
  https://github.com/opencollab/arpack-ng/pull/414

From d885b7be4ecdc9c1496f2d6f256f6c0d34962459 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Szabolcs=20Horva=CC=81t?= <szhorvat@gmail.com>
Date: Sun, 9 Apr 2023 16:36:35 +0200
Subject: [PATCH] fix: ensure that LAPACK RNG state is propagated

 - fixes #401, #410, #411
 - restores 'inits' variable removed in ce2e69a849da1d10dad5d6d3ec4db6120b3ecf50, ensuring that the RNG state is propagated
 - reverts e0d67054f573da351f12a226f7c7cc65a690ef3d to ensure that seed is different on each parallel thread
 - updates seed initialization of parallel pdgetv0/psgetv0 so that they match that of pzgetv0/pcgetv0
---
 PARPACK/SRC/MPI/pcgetv0.f | 48 +++++++++++++++++++++++----------------
 PARPACK/SRC/MPI/pdgetv0.f | 40 ++++++++++++++++++++++++++------
 PARPACK/SRC/MPI/psgetv0.f | 43 ++++++++++++++++++++++++++---------
 PARPACK/SRC/MPI/pzgetv0.f | 48 +++++++++++++++++++++++----------------
 SRC/cgetv0.f              | 21 ++++++++++++-----
 SRC/dgetv0.f              | 21 ++++++++++++-----
 SRC/sgetv0.f              | 21 ++++++++++++-----
 SRC/zgetv0.f              | 21 ++++++++++++-----
 8 files changed, 183 insertions(+), 80 deletions(-)

diff --git a/PARPACK/SRC/MPI/pcgetv0.f b/PARPACK/SRC/MPI/pcgetv0.f
index 59e3d1658..24fe8a0f1 100644
--- a/PARPACK/SRC/MPI/pcgetv0.f
+++ b/PARPACK/SRC/MPI/pcgetv0.f
@@ -176,13 +176,13 @@ subroutine pcgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
+      logical    first, inits, orth
       integer    idist, iseed(4), iter, msglvl, jj, myid, igen
       Real
      &           rnorm0
       Complex
      &           cnorm, cnorm2
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
       Complex
      &           cnorm_buf, buf2(1)
@@ -203,6 +203,12 @@ subroutine pcgetv0
      &           ccdotc
       external   ccdotc, pscnorm2, slapy2
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
@@ -213,26 +219,30 @@ subroutine pcgetv0
 c     | random number generator           |
 c     %-----------------------------------%
 c
+      if (inits) then
 c
-c     %-----------------------------------%
-c     | Generate a seed on each processor |
-c     | using process id (myid).          |
-c     | Note: the seed must be between 1  |
-c     | and 4095.  iseed(4) must be odd.  |
-c     %-----------------------------------%
+c        %-----------------------------------%
+c        | Generate a seed on each processor |
+c        | using process id (myid).          |
+c        | Note: the seed must be between 1  |
+c        | and 4095.  iseed(4) must be odd.  |
+c        %-----------------------------------%
 c
-      call MPI_COMM_RANK(comm, myid, ierr)
-      igen = 1000 + 2*myid + 1
-      if (igen .gt. 4095) then
-         write(0,*) 'Error in p_getv0: seed exceeds 4095!'
-      end if
+         call MPI_COMM_RANK(comm, myid, ierr)
+         igen = 1000 + 2*myid + 1
+         if (igen .gt. 4095) then
+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
+         end if
+c
+         iseed(1) = igen/1000
+         igen     = mod(igen,1000)
+         iseed(2) = igen/100
+         igen     = mod(igen,100)
+         iseed(3) = igen/10
+         iseed(4) = mod(igen,10)
 c
-      iseed(1) = igen/1000
-      igen     = mod(igen,1000)
-      iseed(2) = igen/100
-      igen     = mod(igen,100)
-      iseed(3) = igen/10
-      iseed(4) = 7
+         inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c
diff --git a/PARPACK/SRC/MPI/pdgetv0.f b/PARPACK/SRC/MPI/pdgetv0.f
index 0f348b820..5a1956997 100644
--- a/PARPACK/SRC/MPI/pdgetv0.f
+++ b/PARPACK/SRC/MPI/pdgetv0.f
@@ -177,11 +177,11 @@ subroutine pdgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
-      integer    idist, iseed(4), iter, msglvl, jj
+      logical    first, inits, orth
+      integer    idist, iseed(4), iter, msglvl, jj, myid, igen
       Double precision
      &           rnorm0, buf2(1)
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
       Double precision
      &           rnorm_buf
@@ -206,6 +206,12 @@ subroutine pdgetv0
 c
       intrinsic    abs, sqrt
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
@@ -216,10 +222,30 @@ subroutine pdgetv0
 c     | random number generator           |
 c     %-----------------------------------%
 c
-      iseed(1) = 1
-      iseed(2) = 3
-      iseed(3) = 5
-      iseed(4) = 7
+      if (inits) then
+c
+c        %-----------------------------------%
+c        | Generate a seed on each processor |
+c        | using process id (myid).          |
+c        | Note: the seed must be between 1  |
+c        | and 4095.  iseed(4) must be odd.  |
+c        %-----------------------------------%
+c
+         call MPI_COMM_RANK(comm, myid, ierr)
+         igen = 1000 + 2*myid + 1
+         if (igen .gt. 4095) then
+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
+         end if
+c
+         iseed(1) = igen/1000
+         igen     = mod(igen,1000)
+         iseed(2) = igen/100
+         igen     = mod(igen,100)
+         iseed(3) = igen/10
+         iseed(4) = mod(igen,10)
+c
+         inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c
diff --git a/PARPACK/SRC/MPI/psgetv0.f b/PARPACK/SRC/MPI/psgetv0.f
index d79a513b2..078e4fa8c 100644
--- a/PARPACK/SRC/MPI/psgetv0.f
+++ b/PARPACK/SRC/MPI/psgetv0.f
@@ -177,11 +177,11 @@ subroutine psgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
-      integer    idist, iseed(4), iter, msglvl, jj
+      logical    first, inits, orth
+      integer    idist, iseed(4), iter, msglvl, jj, myid, igen
       Real
      &           rnorm0
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
       Real
      &           rnorm_buf
@@ -206,20 +206,41 @@ subroutine psgetv0
 c
       intrinsic    abs, sqrt
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
 c
 c
-c     %-----------------------------------%
-c     | Initialize the seed of the LAPACK |
-c     | random number generator           |
-c     %-----------------------------------%
+      if (inits) then
 c
-      iseed(1) = 1
-      iseed(2) = 3
-      iseed(3) = 5
-      iseed(4) = 7
+c        %-----------------------------------%
+c        | Generate a seed on each processor |
+c        | using process id (myid).          |
+c        | Note: the seed must be between 1  |
+c        | and 4095.  iseed(4) must be odd.  |
+c        %-----------------------------------%
+c
+         call MPI_COMM_RANK(comm, myid, ierr)
+         igen = 1000 + 2*myid + 1
+         if (igen .gt. 4095) then
+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
+         end if
+c
+         iseed(1) = igen/1000
+         igen     = mod(igen,1000)
+         iseed(2) = igen/100
+         igen     = mod(igen,100)
+         iseed(3) = igen/10
+         iseed(4) = mod(igen,10)
+c
+         inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c
diff --git a/PARPACK/SRC/MPI/pzgetv0.f b/PARPACK/SRC/MPI/pzgetv0.f
index 731fb319f..94fb705f3 100644
--- a/PARPACK/SRC/MPI/pzgetv0.f
+++ b/PARPACK/SRC/MPI/pzgetv0.f
@@ -176,13 +176,13 @@ subroutine pzgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
+      logical    first, inits, orth
       integer    idist, iseed(4), iter, msglvl, jj, myid, igen
       Double precision
      &           rnorm0
       Complex*16
      &           cnorm, cnorm2
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
       Complex*16
      &           cnorm_buf, buf2(1)
@@ -203,6 +203,12 @@ subroutine pzgetv0
      &           zzdotc
       external   zzdotc , pdznorm2 , dlapy2
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
@@ -213,26 +219,30 @@ subroutine pzgetv0
 c     | random number generator           |
 c     %-----------------------------------%
 c
+      if (inits) then
 c
-c     %-----------------------------------%
-c     | Generate a seed on each processor |
-c     | using process id (myid).          |
-c     | Note: the seed must be between 1  |
-c     | and 4095.  iseed(4) must be odd.  |
-c     %-----------------------------------%
+c        %-----------------------------------%
+c        | Generate a seed on each processor |
+c        | using process id (myid).          |
+c        | Note: the seed must be between 1  |
+c        | and 4095.  iseed(4) must be odd.  |
+c        %-----------------------------------%
 c
-      call MPI_COMM_RANK(comm, myid, ierr)
-      igen = 1000 + 2*myid + 1
-      if (igen .gt. 4095) then
-         write(0,*) 'Error in p_getv0: seed exceeds 4095!'
-      end if
+         call MPI_COMM_RANK(comm, myid, ierr)
+         igen = 1000 + 2*myid + 1
+         if (igen .gt. 4095) then
+            write(0,*) 'Error in p_getv0: seed exceeds 4095!'
+         end if
+c
+         iseed(1) = igen/1000
+         igen     = mod(igen,1000)
+         iseed(2) = igen/100
+         igen     = mod(igen,100)
+         iseed(3) = igen/10
+         iseed(4) = mod(igen,10)
 c
-      iseed(1) = igen/1000
-      igen     = mod(igen,1000)
-      iseed(2) = igen/100
-      igen     = mod(igen,100)
-      iseed(3) = igen/10
-      iseed(4) = 7
+         inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c
diff --git a/SRC/cgetv0.f b/SRC/cgetv0.f
index b49e66708..c231eadcb 100644
--- a/SRC/cgetv0.f
+++ b/SRC/cgetv0.f
@@ -156,13 +156,13 @@ subroutine cgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
+      logical    first, inits, orth
       integer    idist, iseed(4), iter, msglvl, jj
       Real
      &           rnorm0
       Complex
      &           cnorm
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
 c     %----------------------%
 c     | External Subroutines |
@@ -180,6 +180,12 @@ subroutine cgetv0
      &           ccdotc
       external   ccdotc, scnrm2, slapy2
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
@@ -190,10 +196,13 @@ subroutine cgetv0
 c     | random number generator           |
 c     %-----------------------------------%
 c
-      iseed(1) = 1
-      iseed(2) = 3
-      iseed(3) = 5
-      iseed(4) = 7
+      if (inits) then
+          iseed(1) = 1
+          iseed(2) = 3
+          iseed(3) = 5
+          iseed(4) = 7
+          inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c
diff --git a/SRC/dgetv0.f b/SRC/dgetv0.f
index 8be4fa26d..1d6dc01bd 100644
--- a/SRC/dgetv0.f
+++ b/SRC/dgetv0.f
@@ -157,11 +157,11 @@ subroutine dgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
+      logical    first, inits, orth
       integer    idist, iseed(4), iter, msglvl, jj
       Double precision
      &           rnorm0
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
 c     %----------------------%
 c     | External Subroutines |
@@ -183,6 +183,12 @@ subroutine dgetv0
 c
       intrinsic    abs, sqrt
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
@@ -193,10 +199,13 @@ subroutine dgetv0
 c     | random number generator           |
 c     %-----------------------------------%
 c
-      iseed(1) = 1
-      iseed(2) = 3
-      iseed(3) = 5
-      iseed(4) = 7
+      if (inits) then
+          iseed(1) = 1
+          iseed(2) = 3
+          iseed(3) = 5
+          iseed(4) = 7
+          inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c
diff --git a/SRC/sgetv0.f b/SRC/sgetv0.f
index 26130a014..d861b2d6d 100644
--- a/SRC/sgetv0.f
+++ b/SRC/sgetv0.f
@@ -157,11 +157,11 @@ subroutine sgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
+      logical    first, inits, orth
       integer    idist, iseed(4), iter, msglvl, jj
       Real
      &           rnorm0
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
 c     %----------------------%
 c     | External Subroutines |
@@ -183,6 +183,12 @@ subroutine sgetv0
 c
       intrinsic    abs, sqrt
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
@@ -193,10 +199,13 @@ subroutine sgetv0
 c     | random number generator           |
 c     %-----------------------------------%
 c
-      iseed(1) = 1
-      iseed(2) = 3
-      iseed(3) = 5
-      iseed(4) = 7
+      if (inits) then
+          iseed(1) = 1
+          iseed(2) = 3
+          iseed(3) = 5
+          iseed(4) = 7
+          inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c
diff --git a/SRC/zgetv0.f b/SRC/zgetv0.f
index cc13c3cfb..1fbd50851 100644
--- a/SRC/zgetv0.f
+++ b/SRC/zgetv0.f
@@ -156,13 +156,13 @@ subroutine zgetv0
 c     | Local Scalars & Arrays |
 c     %------------------------%
 c
-      logical    first, orth
+      logical    first, inits, orth
       integer    idist, iseed(4), iter, msglvl, jj
       Double precision
      &           rnorm0
       Complex*16
      &           cnorm
-      save       first, iseed, iter, msglvl, orth, rnorm0
+      save       first, iseed, inits, iter, msglvl, orth, rnorm0
 c
 c     %----------------------%
 c     | External Subroutines |
@@ -180,6 +180,12 @@ subroutine zgetv0
      &           zzdotc
       external   zzdotc, dznrm2, dlapy2
 c
+c     %-----------------%
+c     | Data Statements |
+c     %-----------------%
+c
+      data       inits /.true./
+c
 c     %-----------------------%
 c     | Executable Statements |
 c     %-----------------------%
@@ -190,10 +196,13 @@ subroutine zgetv0
 c     | random number generator           |
 c     %-----------------------------------%
 c
-      iseed(1) = 1
-      iseed(2) = 3
-      iseed(3) = 5
-      iseed(4) = 7
+      if (inits) then
+          iseed(1) = 1
+          iseed(2) = 3
+          iseed(3) = 5
+          iseed(4) = 7
+          inits = .false.
+      end if
 c
       if (ido .eq.  0) then
 c