diff --git a/nifty/field.py b/nifty/field.py index 734ed344e26ec750394f11dd43589efa7ff0d0e3..4cd9d652168ee33a543299e987e717228e4ac4a2 100644 --- a/nifty/field.py +++ b/nifty/field.py @@ -82,9 +82,7 @@ class Field(object): def __init__(self, domain=None, val=None, dtype=None, copy=False): self.domain = self._parse_domain(domain=domain, val=val) self.domain_axes = self._get_axes_tuple(self.domain) - - self.dtype = self._infer_dtype(dtype=dtype, - val=val) + self.dtype = self._infer_dtype(dtype=dtype, val=val) if val is None: self._val = None @@ -134,9 +132,7 @@ class Field(object): else: dtype = np.dtype(dtype) - dtype = np.result_type(dtype, np.float) - - return dtype + return np.result_type(dtype, np.float) # ---Factory methods--- @@ -173,12 +169,6 @@ class Field(object): # create a initially empty field f = cls(domain=domain, dtype=dtype) - # now use the processed input in terms of f in order to parse the - # random arguments - random_arguments = cls._parse_random_arguments(random_type=random_type, - f=f, - **kwargs) - # extract the data from f and apply the appropriate # random number generator to it sample = f.get_val(copy=False) @@ -186,32 +176,9 @@ class Field(object): sample[:]=generator_function(dtype=f.dtype, shape=sample.shape, - **random_arguments) + **kwargs) return f - @staticmethod - def _parse_random_arguments(random_type, f, **kwargs): - if random_type == "pm1": - random_arguments = {} - - elif random_type == "normal": - mean = kwargs.get('mean', 0) - std = kwargs.get('std', 1) - random_arguments = {'mean': mean, - 'std': std} - - elif random_type == "uniform": - low = kwargs.get('low', 0) - high = kwargs.get('high', 1) - random_arguments = {'low': low, - 'high': high} - - else: - raise KeyError( - "unsupported random key '" + str(random_type) + "'.") - - return random_arguments - # ---Powerspectral methods--- def power_analyze(self, spaces=None, binbounds=None, @@ -507,22 +474,8 @@ class Field(object): def _hermitian_decomposition(domain, val, spaces, domain_axes, preserve_gaussian_variance=False): - flipped_val = val - for space in spaces: - flipped_val = domain[space].hermitianize_inverter( - x=flipped_val, - axes=domain_axes[space]) - # if no flips at all where performed `h` is a real field. - # if all spaces use the default implementation of doing nothing when - # no flips are applied, one can use `is` to infer this case. - - if flipped_val is val: - h = flipped_val.real.copy() - a = 1j * flipped_val.imag.copy() - else: - flipped_val = flipped_val.conjugate() - h = (val + flipped_val)/2. - a = val - h + h = val.real.copy() + a = 1j * val.imag.copy() # correct variance if preserve_gaussian_variance: @@ -531,42 +484,6 @@ class Field(object): h *= np.sqrt(2) a *= np.sqrt(2) -# The code below should not be needed in practice, since it would -# only ever be called when hermitianizing a purely real field. -# However it might be of educational use and keep us from forgetting -# how these things are done ... - -# if not issubclass(val.dtype.type, np.complexfloating): -# # in principle one must not correct the variance for the fixed -# # points of the hermitianization. However, for a complex field -# # the input field loses half of its power at its fixed points -# # in the `hermitian` part. Hence, here a factor of sqrt(2) is -# # also necessary! -# # => The hermitianization can be done on a space level since -# # either nothing must be done (LMSpace) or ALL points need a -# # factor of sqrt(2) -# # => use the preserve_gaussian_variance flag in the -# # hermitian_decomposition method above. -# -# # This code is for educational purposes: -# fixed_points = [domain[i].hermitian_fixed_points() -# for i in spaces] -# fixed_points = [[fp] if fp is None else fp -# for fp in fixed_points] -# -# for product_point in itertools.product(*fixed_points): -# slice_object = np.array((slice(None), )*len(val.shape), -# dtype=np.object) -# for i, sp in enumerate(spaces): -# point_component = product_point[i] -# if point_component is None: -# point_component = slice(None) -# slice_object[list(domain_axes[sp])] = point_component -# -# slice_object = tuple(slice_object) -# h[slice_object] /= np.sqrt(2) -# a[slice_object] /= np.sqrt(2) - return (h, a) def _spec_to_rescaler(self, spec, result_list, power_space_index): @@ -1159,262 +1076,78 @@ class Field(object): return working_field def __add__(self, other): - """ x.__add__(y) <==> x+y - - See Also - -------- - _binary_helper - - """ - return self._binary_helper(other, op='__add__') def __radd__(self, other): - """ x.__radd__(y) <==> y+x - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__radd__') def __iadd__(self, other): - """ x.__iadd__(y) <==> x+=y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__iadd__', inplace=True) def __sub__(self, other): - """ x.__sub__(y) <==> x-y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__sub__') def __rsub__(self, other): - """ x.__rsub__(y) <==> y-x - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__rsub__') def __isub__(self, other): - """ x.__isub__(y) <==> x-=y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__isub__', inplace=True) def __mul__(self, other): - """ x.__mul__(y) <==> x*y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__mul__') def __rmul__(self, other): - """ x.__rmul__(y) <==> y*x - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__rmul__') def __imul__(self, other): - """ x.__imul__(y) <==> x*=y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__imul__', inplace=True) def __div__(self, other): - """ x.__div__(y) <==> x/y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__div__') def __truediv__(self, other): - """ x.__truediv__(y) <==> x/y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__truediv__') def __rdiv__(self, other): - """ x.__rdiv__(y) <==> y/x - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__rdiv__') def __rtruediv__(self, other): - """ x.__rtruediv__(y) <==> y/x - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__rtruediv__') def __idiv__(self, other): - """ x.__idiv__(y) <==> x/=y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__idiv__', inplace=True) def __pow__(self, other): - """ x.__pow__(y) <==> x**y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__pow__') def __rpow__(self, other): - """ x.__rpow__(y) <==> y**x - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__rpow__') def __ipow__(self, other): - """ x.__ipow__(y) <==> x**=y - - See Also - -------- - _builtin_helper - - """ - return self._binary_helper(other, op='__ipow__', inplace=True) def __lt__(self, other): - """ x.__lt__(y) <==> x<y - - See Also - -------- - _binary_helper - - """ - return self._binary_helper(other, op='__lt__') def __le__(self, other): - """ x.__le__(y) <==> x<=y - - See Also - -------- - _binary_helper - - """ - return self._binary_helper(other, op='__le__') def __ne__(self, other): - """ x.__ne__(y) <==> x!=y - - See Also - -------- - _binary_helper - - """ - if other is None: return True else: return self._binary_helper(other, op='__ne__') def __eq__(self, other): - """ x.__eq__(y) <==> x=y - - See Also - -------- - _binary_helper - - """ - if other is None: return False else: return self._binary_helper(other, op='__eq__') def __ge__(self, other): - """ x.__ge__(y) <==> x>=y - - See Also - -------- - _binary_helper - - """ - return self._binary_helper(other, op='__ge__') def __gt__(self, other): - """ x.__gt__(y) <==> x>y - - See Also - -------- - _binary_helper - - """ - return self._binary_helper(other, op='__gt__') def __repr__(self): diff --git a/nifty/spaces/lm_space/lm_space.py b/nifty/spaces/lm_space/lm_space.py index fe9257b34446e751100f7ee3413f1dd5dfe6e3e8..78ce587febcc33e1b2a529d94083eecef1172fb7 100644 --- a/nifty/spaces/lm_space/lm_space.py +++ b/nifty/spaces/lm_space/lm_space.py @@ -87,8 +87,6 @@ class LMSpace(Space): super(LMSpace, self).__init__() self._lmax = self._parse_lmax(lmax) - # ---Mandatory properties and methods--- - def __repr__(self): return ("LMSpace(lmax=%r)" % self.lmax) @@ -143,22 +141,12 @@ class LMSpace(Space): def get_natural_binbounds(self): return np.arange(self.lmax, dtype=np.float64) + 0.5 - @staticmethod - def _distance_array_helper(index_array, lmax): - u = 2*lmax + 1 - index_half = (index_array+np.minimum(lmax, index_array)+1)//2 - m = (np.ceil((u - np.sqrt(u*u - 8*(index_half - lmax)))/2)).astype(int) - res = (index_half - m*(u - m)//2).astype(np.float64) - return res - def get_fft_smoothing_kernel_function(self, sigma): # cf. "All-sky convolution for polarimetry experiments" # by Challinor et al. # http://arxiv.org/abs/astro-ph/0008228 return lambda x: np.exp(-0.5 * x * (x + 1) * sigma*sigma) - # ---Added properties and methods--- - @property def lmax(self): """ Returns the maximal :math:`l` value of any spherical harmonics diff --git a/nifty/spaces/rg_space/rg_space.py b/nifty/spaces/rg_space/rg_space.py index 38df832935485e6cdf86e8934a315ae6e36a0a34..33196d05623dfae961845a57331381064544a3f7 100644 --- a/nifty/spaces/rg_space/rg_space.py +++ b/nifty/spaces/rg_space/rg_space.py @@ -90,32 +90,6 @@ class RGSpace(Space): self._shape = self._parse_shape(shape) self._distances = self._parse_distances(distances) -# This code is unused but may be useful to keep around if it is ever needed -# again in the future ... - -# def hermitian_fixed_points(self): -# dimensions = len(self.shape) -# mid_index = np.array(self.shape)//2 -# ndlist = [1]*dimensions -# for k in range(dimensions): -# if self.shape[k] % 2 == 0: -# ndlist[k] = 2 -# ndlist = tuple(ndlist) -# fixed_points = [] -# for index in np.ndindex(ndlist): -# for k in range(dimensions): -# if self.shape[k] % 2 != 0 and self.zerocenter[k]: -# index = list(index) -# index[k] = 1 -# index = tuple(index) -# fixed_points += [tuple(index * mid_index)] -# return fixed_points - - def hermitianize_inverter(self, x, axes): - return x - - # ---Mandatory properties and methods--- - def __repr__(self): return ("RGSpace(shape=%r, distances=%r, harmonic=%r)" % (self.shape, self.distances, self.harmonic)) diff --git a/nifty/spaces/space/space.py b/nifty/spaces/space/space.py index 83de351f0af3236cb1f72bd410762eb081f2e423..ac67d7005b51fc1180265f814367c1432f963208 100644 --- a/nifty/spaces/space/space.py +++ b/nifty/spaces/space/space.py @@ -148,23 +148,3 @@ class Space(DomainObject): raise NotImplementedError( "There is no generic co-smoothing kernel for Space base class.") - - def hermitianize_inverter(self, x, axes): - """ Inverts/flips x in the context of Hermitian decomposition. - - This method is only implemented for harmonic spaces. - This method is mainly used for power-synthesizing and -analyzing - Fields. - - Parameters - ---------- - axes : tuple of ints - Specifies the axes of x which correspond to this space. - - Returns - ------- - numpy.ndarray - The Hermitian-flipped of x. - """ - - return x diff --git a/test/test_spaces/test_lm_space.py b/test/test_spaces/test_lm_space.py index 74786fe79de5580934e5de97167856e8013800da..5ec075037b8352e190be3850acc44532a454657e 100644 --- a/test/test_spaces/test_lm_space.py +++ b/test/test_spaces/test_lm_space.py @@ -108,13 +108,6 @@ class LMSpaceFunctionalityTests(unittest.TestCase): for key, value in expected.items(): assert_equal(getattr(l, key), value) - def test_hermitianize_inverter(self): - l = LMSpace(5) - v = np.empty(l.shape, dtype=np.complex128) - v[:] = np.random.random(l.shape) + 1j*np.random.random(l.shape) - inverted = l.hermitianize_inverter(v, axes=(0,)) - assert_array_almost_equal(inverted, v) - @expand(get_weight_configs()) def test_weight(self, x, power, axes, inplace, expected): l = LMSpace(5) diff --git a/test/test_spaces/test_rg_space.py b/test/test_spaces/test_rg_space.py index 1ffd4958ed19d76f5f5b9a7284c6a7d6e2ffb81d..3ed984483b01a33efcd05bd4df2cdbbe49129043 100644 --- a/test/test_spaces/test_rg_space.py +++ b/test/test_spaces/test_rg_space.py @@ -127,20 +127,6 @@ class RGSpaceFunctionalityTests(unittest.TestCase): for key, value in expected.items(): assert_equal(getattr(x, key), value) - @expand(product([(10,), (11,), (1, 1), (4, 4), (5, 7), (8, 12), (7, 16), - (4, 6, 8), (17, 5, 3)])) - def test_hermitianize_inverter(self, shape): - try: - r = RGSpace(shape, harmonic=True) - except ValueError: - raise SkipTest - v = np.empty(shape, dtype=np.complex128) - v[:] = np.random.random(shape) + 1j*np.random.random(shape) - - inverted = r.hermitianize_inverter(v, axes=range(len(shape))) - - assert_array_equal(v, inverted) - @expand(get_distance_array_configs()) def test_distance_array(self, shape, distances, expected): r = RGSpace(shape=shape, distances=distances, harmonic=True)