From 2d3f070cc840334a03dda884121d9bdc54bb225b Mon Sep 17 00:00:00 2001 From: Reimar Leike <reimar@mpa-garching.mpg.de> Date: Tue, 25 Sep 2018 12:13:59 +0200 Subject: [PATCH] changed LogRGSpace.get_k_length_array to something sensible. Slope operator and AMplitude model are now getting the structure of the space from the space --- nifty5/domains/log_rg_space.py | 40 +++++++++++++++--------------- nifty5/library/amplitude_model.py | 7 +----- nifty5/operators/slope_operator.py | 8 +----- 3 files changed, 22 insertions(+), 33 deletions(-) diff --git a/nifty5/domains/log_rg_space.py b/nifty5/domains/log_rg_space.py index 2d7f5d2db..bdcda4141 100644 --- a/nifty5/domains/log_rg_space.py +++ b/nifty5/domains/log_rg_space.py @@ -78,23 +78,23 @@ class LogRGSpace(StructuredDomain): self._t_0, True) def get_k_length_array(self): - # FIXME This is simply wrong! Definitely not the final version. - ib = dobj.ibegin_from_shape(self._shape) - res = np.arange(self.local_shape[0], dtype=np.float64) + ib[0] - res = np.minimum(res, self.shape[0]-res)*self.bindistances[0] - if len(self.shape) == 1: - return Field.from_local_data(self, res) - res *= res - for i in range(1, len(self.shape)): - tmp = np.arange(self.local_shape[i], dtype=np.float64) + ib[i] - tmp = np.minimum(tmp, self.shape[i]-tmp)*self.bindistances[i] - tmp *= tmp - res = np.add.outer(res, tmp) - return Field.from_local_data(self, np.sqrt(res)) - - def get_expk_length_array(self): - # FIXME This is a hack! Only for plotting. Seems not to be the final version. - out = exp(self.get_k_length_array()).to_global_data_rw() - out[1:] = out[:-1] - out[0] = 0 - return Field.from_global_data(self, out) + if not self.harmonic: + raise NotImplementedError + ks = self.get_k_array() + return Field.from_global_data(self, np.linalg.norm(ks, axis=0)) + + def get_k_array(self): + ndim = len(self.shape) + k_array = np.zeros((ndim,) + self.shape) + dist = self.bindistances + for i in range(ndim): + ks = np.zeros(self.shape[i]) + ks[1:] = np.minimum(self.shape[i] - 1 - np.arange(self.shape[i]-1), np.arange(self.shape[i]-1)) * dist[i] + if self.harmonic: + ks[0] = np.nan + else: + ks[0] = -np.inf + ks[1:] += self.t_0[i] + k_array[i] += ks.reshape((1,)*i + (self.shape[i],) + (1,)*(ndim-i-1)) + return k_array + diff --git a/nifty5/library/amplitude_model.py b/nifty5/library/amplitude_model.py index 8d964b090..73eea3987 100644 --- a/nifty5/library/amplitude_model.py +++ b/nifty5/library/amplitude_model.py @@ -48,12 +48,7 @@ def create_cepstrum_amplitude_field(domain, cepstrum): dist = domain.bindistances shape = domain.shape - # Prepare q_array - q_array = np.zeros((dim,) + shape) - for i in range(dim): - ks = np.zeros(shape[i]) - ks[1:] = np.minimum(shape[i] - 1 - np.arange(shape[i]-1), np.arange(shape[i]-1)) * dist[i] - q_array[i] += ks.reshape((1,)*i + (shape[i],) + (1,)*(dim-i-1)) + q_array = domain.get_k_array() # Fill cepstrum field (all non-zero modes) no_zero_modes = (slice(1, None),) * dim diff --git a/nifty5/operators/slope_operator.py b/nifty5/operators/slope_operator.py index 570b932fe..d5cf6fabd 100644 --- a/nifty5/operators/slope_operator.py +++ b/nifty5/operators/slope_operator.py @@ -60,13 +60,7 @@ class SlopeOperator(LinearOperator): raise ValueError("Slope Operator only works for ndim == 1") # Prepare pos - self.pos = np.zeros((self.ndim,) + self.target[0].shape) - shape = self.target.shape - dist = self.target[0].bindistances - for i in range(self.ndim): - ks = np.zeros(shape[i]) - ks[1:] = np.minimum(shape[i] - 1 - np.arange(shape[i]-1), np.arange(shape[i]-1)) * dist[i] - self.pos[i] += ks.reshape((1,)*i + (shape[i],) + (1,)*(self.ndim-i-1)) + self.pos = self.target[0].get_k_array()-self.target[0].t_0[0] -- GitLab