diff --git a/Dockerfile b/Dockerfile index afe594fb517bb4681951cd84086b999949f16dfc..f1b81e6113aea911af14e4f4b4fa3e6d8f217a09 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ RUN apt-get update && apt-get install -y \ python3-mpi4py python3-matplotlib \ # more optional NIFTy dependencies && pip3 install git+https://gitlab.mpcdf.mpg.de/ift/pyHealpix.git \ - && pip3 install git+https://gitlab.mpcdf.mpg.de/ift/nifty_gridder.git \ + && pip3 install git+https://gitlab.mpcdf.mpg.de/ift/nifty_gridder.git@better_params \ && pip3 install git+https://gitlab.mpcdf.mpg.de/mtr/pypocketfft.git \ && pip3 install jupyter \ && rm -rf /var/lib/apt/lists/* diff --git a/demos/bench_gridder.py b/demos/bench_gridder.py index 5dd68c1cd157605a28445edec33500db46dfaeba..48ae4f3b1b8a3ff9390581695fcdf31e53c25d81 100644 --- a/demos/bench_gridder.py +++ b/demos/bench_gridder.py @@ -9,7 +9,7 @@ np.random.seed(40) N0s, a0s, b0s, c0s = [], [], [], [] -for ii in range(10, 23): +for ii in range(10, 26): nu = 1024 nv = 1024 N = int(2**ii) @@ -27,17 +27,15 @@ for ii in range(10, 23): img = ift.from_global_data(uvspace, img) t0 = time() - GM = ift.GridderMaker(uvspace, eps=1e-7) - idx = GM.getReordering(uv) - uv = uv[idx] - vis = vis[idx] + GM = ift.GridderMaker(uvspace, eps=1e-7, uv=uv) vis = ift.from_global_data(visspace, vis) - op = GM.getFull(uv).adjoint + op = GM.getFull().adjoint t1 = time() op(img).to_global_data() t2 = time() op.adjoint(vis).to_global_data() t3 = time() + print(t2-t1, t3-t2) N0s.append(N) a0s.append(t1 - t0) b0s.append(t2 - t1) diff --git a/demos/getting_started_3.py b/demos/getting_started_3.py index a4f6458ff3e6713d3bc228198b3e43ca7fedc5c5..00875a34c4227304927c2b1b9a9e5b34e0a0c595 100644 --- a/demos/getting_started_3.py +++ b/demos/getting_started_3.py @@ -109,7 +109,8 @@ if __name__ == '__main__': minimizer = ift.NewtonCG(ic_newton) # Set up likelihood and information Hamiltonian - likelihood = ift.GaussianEnergy(mean=data, covariance=N)(signal_response) + likelihood = ift.GaussianEnergy(mean=data, + inverse_covariance=N.inverse)(signal_response) H = ift.StandardHamiltonian(likelihood, ic_sampling) initial_mean = ift.MultiField.full(H.domain, 0.) diff --git a/nifty5/domains/log_rg_space.py b/nifty5/domains/log_rg_space.py index 65cfb46a50aa3a9e16b26a32b6d6d5990ae798d1..4cd66c03009bd46784ff8bab3220341b6591e573 100644 --- a/nifty5/domains/log_rg_space.py +++ b/nifty5/domains/log_rg_space.py @@ -80,8 +80,8 @@ class LogRGSpace(StructuredDomain): return np.array(self._t_0) def __repr__(self): - return ("LogRGSpace(shape={}, harmonic={})".format( - self.shape, self.harmonic)) + return ("LogRGSpace(shape={}, bindistances={}, t_0={}, harmonic={})".format( + self.shape, self.bindistances, self.t_0, self.harmonic)) def get_default_codomain(self): """Returns a :class:`LogRGSpace` object representing the (position or diff --git a/nifty5/library/gridder.py b/nifty5/library/gridder.py index a1f1dcda9ab1f350990805fb9d1ecccb47aa9011..c9d33ed9283bf18bd7b573b819e91a3594f387e3 100644 --- a/nifty5/library/gridder.py +++ b/nifty5/library/gridder.py @@ -15,108 +15,96 @@ # # NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik. -import numpy as np - from ..domain_tuple import DomainTuple from ..domains.rg_space import RGSpace from ..domains.unstructured_domain import UnstructuredDomain -from ..fft import hartley from ..operators.linear_operator import LinearOperator from ..sugar import from_global_data, makeDomain +import numpy as np class GridderMaker(object): - def __init__(self, domain, eps=2e-13): - from nifty_gridder import get_w - domain = makeDomain(domain) - if (len(domain) != 1 or not isinstance(domain[0], RGSpace) or - not len(domain.shape) == 2): - raise ValueError("need domain with exactly one 2D RGSpace") - nu, nv = domain.shape - if nu % 2 != 0 or nv % 2 != 0: - raise ValueError("dimensions must be even") - nu2, nv2 = 2*nu, 2*nv - w = get_w(eps) - nsafe = (w+1)//2 - nu2 = max([nu2, 2*nsafe]) - nv2 = max([nv2, 2*nsafe]) - - oversampled_domain = RGSpace( - [nu2, nv2], distances=[1, 1], harmonic=False) - - self._eps = eps - self._rest = _RestOperator(domain, oversampled_domain, eps) - - def getReordering(self, uv): - from nifty_gridder import peanoindex - nu2, nv2 = self._rest._domain.shape - return peanoindex(uv, nu2, nv2) - - def getGridder(self, uv): - return RadioGridder(self._rest.domain, self._eps, uv) + def __init__(self, dirty_domain, uv, eps=2e-13): + import nifty_gridder + dirty_domain = makeDomain(dirty_domain) + if (len(dirty_domain) != 1 or not isinstance(dirty_domain[0], RGSpace) + or not len(dirty_domain.shape) == 2): + raise ValueError("need dirty_domain with exactly one 2D RGSpace") + if uv.ndim != 2: + raise ValueError("uv must be a 2D array") + if uv.shape[1] != 2: + raise ValueError("second dimension of uv must have length 2") + dstx, dsty = dirty_domain[0].distances + # wasteful hack to adjust to shape required by nifty_gridder + uvw = np.empty((uv.shape[0], 3), dtype=np.float64) + uvw[:, 0:2] = uv + uvw[:, 2] = 0. + # Scale uv such that 0