From 85a520fd9f15e359db2f76c8f52328aa61247606 Mon Sep 17 00:00:00 2001
From: Martin Reinecke <martin@mpa-garching.mpg.de>
Date: Fri, 26 Apr 2019 15:25:32 +0200
Subject: [PATCH] remove NFFT

---
 Dockerfile                          |  2 +-
 demos/bench_gridder.py              | 15 ------
 nifty5/__init__.py                  |  1 -
 nifty5/library/nfft.py              | 73 -----------------------------
 test/test_operators/test_adjoint.py |  7 ---
 5 files changed, 1 insertion(+), 97 deletions(-)
 delete mode 100644 nifty5/library/nfft.py

diff --git a/Dockerfile b/Dockerfile
index a713bdfa5..b1521076f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -10,7 +10,7 @@ RUN apt-get update && apt-get install -y \
     # Testing dependencies
     python3-pytest-cov jupyter \
     # Optional NIFTy dependencies
-    libfftw3-dev python3-mpi4py python3-matplotlib python3-pynfft \
+    libfftw3-dev python3-mpi4py python3-matplotlib \
   # more optional NIFTy dependencies
   && pip3 install pyfftw \
   && pip3 install git+https://gitlab.mpcdf.mpg.de/ift/pyHealpix.git \
diff --git a/demos/bench_gridder.py b/demos/bench_gridder.py
index 1d5fb0b55..bcdd5436d 100644
--- a/demos/bench_gridder.py
+++ b/demos/bench_gridder.py
@@ -45,18 +45,6 @@ for ii in range(10, 23):
     b0s.append(t2 - t1)
     c0s.append(t3 - t2)
 
-    t0 = time()
-    op = ift.NFFT(uvspace, uv)
-    t1 = time()
-    op(img).to_global_data()
-    t2 = time()
-    op.adjoint(vis).to_global_data()
-    t3 = time()
-    N1s.append(N)
-    a1s.append(t1 - t0)
-    b1s.append(t2 - t1)
-    c1s.append(t3 - t2)
-
 print('Measure rest operator')
 sc = ift.StatCalculator()
 op = GM.getRest().adjoint
@@ -68,7 +56,6 @@ t_fft = sc.mean
 print('FFT shape', res.shape)
 
 plt.scatter(N0s, a0s, label='Gridder mr')
-plt.scatter(N1s, a1s, marker='^', label='NFFT')
 plt.legend()
 # no idea why this is necessary, but if it is omitted, the range is wrong
 plt.ylim(min(a0s+a1s), max(a0s+a1s))
@@ -79,9 +66,7 @@ plt.savefig('bench0.png')
 plt.close()
 
 plt.scatter(N0s, b0s, color='k', marker='^', label='Gridder mr times')
-plt.scatter(N1s, b1s, color='r', marker='^', label='NFFT times')
 plt.scatter(N0s, c0s, color='k', label='Gridder mr adjoint times')
-plt.scatter(N1s, c1s, color='r', label='NFFT adjoint times')
 plt.axhline(sc.mean, label='FFT')
 plt.axhline(sc.mean + np.sqrt(sc.var))
 plt.axhline(sc.mean - np.sqrt(sc.var))
diff --git a/nifty5/__init__.py b/nifty5/__init__.py
index dd1ccb298..eee17e5bb 100644
--- a/nifty5/__init__.py
+++ b/nifty5/__init__.py
@@ -86,7 +86,6 @@ from .library.wiener_filter_curvature import WienerFilterCurvature
 from .library.correlated_fields import CorrelatedField, MfCorrelatedField
 from .library.adjust_variances import (make_adjust_variances_hamiltonian,
                                        do_adjust_variances)
-from .library.nfft import NFFT
 from .library.gridder import GridderMaker
 
 from . import extra
diff --git a/nifty5/library/nfft.py b/nifty5/library/nfft.py
deleted file mode 100644
index c96866d6e..000000000
--- a/nifty5/library/nfft.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-# Copyright(C) 2018-2019 Max-Planck-Society
-#
-# Resolve is being developed at the Max-Planck-Institut fuer Astrophysik.
-
-import numpy as np
-
-import nifty5 as ift
-
-
-class NFFT(ift.LinearOperator):
-    """Performs a non-equidistant Fourier transform, i.e. a Fourier transform
-    followed by a degridding operation.
-
-    Parameters
-    ----------
-    domain : RGSpace
-        Domain of the operator. It has to be two-dimensional and have shape
-        `(2N, 2N)`. The coordinates of the lower left pixel of the dirty image
-        are `(-N,-N)`, and of the upper right pixel `(N-1,N-1)`.
-    uv : numpy.ndarray
-        2D numpy array of type float64 and shape (M,2), where M is the number
-        of measurements. uv[i,0] and uv[i,1] contain the u and v coordinates
-        of measurement #i, respectively. All coordinates must lie in the range
-        `[-0.5; 0,5[`.
-    """
-    def __init__(self, domain, uv):
-        from pynfft.nfft import NFFT
-        npix = domain.shape[0]
-        assert npix == domain.shape[1]
-        assert len(domain.shape) == 2
-        assert type(npix) == int, "npix must be integer"
-        assert npix > 0 and (
-            npix % 2) == 0, "npix must be an even, positive integer"
-        assert isinstance(uv, np.ndarray), "uv must be a Numpy array"
-        assert uv.dtype == np.float64, "uv must be an array of float64"
-        assert uv.ndim == 2, "uv must be a 2D array"
-        assert uv.shape[0] > 0, "at least one point needed"
-        assert uv.shape[1] == 2, "the second dimension of uv must be 2"
-        assert np.all(uv >= -0.5) and np.all(uv <= 0.5),\
-            "all coordinates must lie between -0.5 and 0.5"
-
-        self._domain = ift.DomainTuple.make(domain)
-        self._target = ift.DomainTuple.make(
-            ift.UnstructuredDomain(uv.shape[0]))
-        self._capability = self.TIMES | self.ADJOINT_TIMES
-
-        self.npt = uv.shape[0]
-        self.plan = NFFT(self.domain.shape, self.npt, m=6)
-        self.plan.x = uv
-        self.plan.precompute()
-
-    def apply(self, x, mode):
-        self._check_input(x, mode)
-        if mode == self.TIMES:
-            self.plan.f_hat = x.to_global_data()
-            res = self.plan.trafo().copy()
-        else:
-            self.plan.f = x.to_global_data()
-            res = self.plan.adjoint().copy()
-        return ift.Field.from_global_data(self._tgt(mode), res)
diff --git a/test/test_operators/test_adjoint.py b/test/test_operators/test_adjoint.py
index 97e020763..56d2534ae 100644
--- a/test/test_operators/test_adjoint.py
+++ b/test/test_operators/test_adjoint.py
@@ -293,10 +293,3 @@ def testValueInserter(sp, seed):
             ind.append(np.random.randint(0, ss-1))
     op = ift.ValueInserter(sp, ind)
     ift.extra.consistency_check(op)
-
-
-def testNFFT():
-    dom = ift.RGSpace(2*(16,))
-    uv = np.array([[.2, .4], [-.22, .452]])
-    op = ift.NFFT(dom, uv)
-    ift.extra.consistency_check(op)
-- 
GitLab