test_power_space.py 5.41 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
# 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/>.
Theo Steininger's avatar
Theo Steininger committed
13
#
Martin Reinecke's avatar
Martin Reinecke committed
14
# Copyright(C) 2013-2018 Max-Planck-Society
Theo Steininger's avatar
Theo Steininger committed
15
16
17
#
# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik
# and financially supported by the Studienstiftung des deutschen Volkes.
18

19
from __future__ import division
20

21
import unittest
22
from itertools import chain, product
23
from test.common import expand
24
25
26
27

import nifty5 as ift
import numpy as np
from numpy.testing import assert_, assert_allclose, assert_equal, assert_raises
28

Martin Reinecke's avatar
Martin Reinecke committed
29
30
31
32
33
34
35
HARMONIC_SPACES = [ift.RGSpace((8,), harmonic=True),
                   ift.RGSpace((7, 8), harmonic=True),
                   ift.RGSpace((6, 6), harmonic=True),
                   ift.RGSpace((5, 5), harmonic=True),
                   ift.RGSpace((4, 5, 7), harmonic=True),
                   ift.LMSpace(6),
                   ift.LMSpace(9)]
Martin Reinecke's avatar
Martin Reinecke committed
36
37


Martin Reinecke's avatar
stage1    
Martin Reinecke committed
38
# Try all sensible kinds of combinations of spaces and binning parameters
Martin Reinecke's avatar
Martin Reinecke committed
39
40
41
CONSISTENCY_CONFIGS_IMPLICIT = product(HARMONIC_SPACES,
                                       [None], [None, 3, 4], [True, False])
CONSISTENCY_CONFIGS_EXPLICIT = product(HARMONIC_SPACES,
Martin Reinecke's avatar
Martin Reinecke committed
42
                                       [[0., 1.3]], [None], [None])
Martin Reinecke's avatar
Martin Reinecke committed
43
44
CONSISTENCY_CONFIGS = chain(CONSISTENCY_CONFIGS_IMPLICIT,
                            CONSISTENCY_CONFIGS_EXPLICIT)
45

Martin Reinecke's avatar
stage1    
Martin Reinecke committed
46
# [harmonic_partner, logarithmic, nbin, binbounds, expected]
47
CONSTRUCTOR_CONFIGS = [
48
    [1, False, None, None, {'error': (ValueError, NotImplementedError)}],
Martin Reinecke's avatar
Martin Reinecke committed
49
50
    [ift.RGSpace((8,)), False, None, None, {'error': ValueError}],
    [ift.RGSpace((8,), harmonic=True), None, None, None, {
51
        'harmonic': False,
52
        'shape': (5,),
Martin Reinecke's avatar
Martin Reinecke committed
53
        'size': 5,
Martin Reinecke's avatar
Martin Reinecke committed
54
        'harmonic_partner': ift.RGSpace((8,), harmonic=True),
Martin Reinecke's avatar
Martin Reinecke committed
55
        'binbounds': None,
Martin Reinecke's avatar
Martin Reinecke committed
56
57
        'pindex': ift.dobj.from_global_data(
            np.array([0, 1, 2, 3, 4, 3, 2, 1])),
Martin Reinecke's avatar
Martin Reinecke committed
58
        'k_lengths': np.array([0., 1., 2., 3., 4.]),
59
        }],
Martin Reinecke's avatar
Martin Reinecke committed
60
    [ift.RGSpace((8,), harmonic=True), True, None, None, {
61
        'harmonic': False,
62
        'shape': (4,),
Martin Reinecke's avatar
Martin Reinecke committed
63
        'size': 4,
Martin Reinecke's avatar
Martin Reinecke committed
64
        'harmonic_partner': ift.RGSpace((8,), harmonic=True),
65
        'binbounds': (0.5, 1.3228756555322954, 3.5),
Martin Reinecke's avatar
Martin Reinecke committed
66
67
        'pindex': ift.dobj.from_global_data(
            np.array([0, 1, 2, 2, 3, 2, 2, 1])),
Martin Reinecke's avatar
Martin Reinecke committed
68
        'k_lengths': np.array([0., 1., 2.5, 4.]),
69
70
71
72
        }],
    ]


73
def k_lengths_configs():
Martin Reinecke's avatar
Martin Reinecke committed
74
    da_0 = np.array([0, 1.0, 1.41421356, 2., 2.23606798, 2.82842712])
75
    return [
Martin Reinecke's avatar
Martin Reinecke committed
76
        [ift.RGSpace((4, 4), harmonic=True),  da_0],
77
78
79
80
81
        ]


class PowerSpaceInterfaceTest(unittest.TestCase):
    @expand([
Martin Reinecke's avatar
Martin Reinecke committed
82
        ['harmonic_partner', ift.StructuredDomain],
Martin Reinecke's avatar
Martin Reinecke committed
83
        ['binbounds', type(None)],
Martin Reinecke's avatar
Martin Reinecke committed
84
        ['pindex', ift.dobj.data_object],
Martin Reinecke's avatar
Martin Reinecke committed
85
        ['k_lengths', np.ndarray],
86
87
        ])
    def test_property_ret_type(self, attribute, expected_type):
Martin Reinecke's avatar
Martin Reinecke committed
88
89
        r = ift.RGSpace((4, 4), harmonic=True)
        p = ift.PowerSpace(r)
90
91
        assert_(isinstance(getattr(p, attribute), expected_type))

Martin Reinecke's avatar
Martin Reinecke committed
92

93
class PowerSpaceConsistencyCheck(unittest.TestCase):
94
    @expand(CONSISTENCY_CONFIGS)
Martin Reinecke's avatar
stage1    
Martin Reinecke committed
95
    def test_rhopindexConsistency(self, harmonic_partner,
Martin Reinecke's avatar
Martin Reinecke committed
96
                                  binbounds, nbin, logarithmic):
Martin Reinecke's avatar
Martin Reinecke committed
97
98
99
        bb = ift.PowerSpace.useful_binbounds(harmonic_partner, logarithmic,
                                             nbin)
        p = ift.PowerSpace(harmonic_partner=harmonic_partner, binbounds=bb)
Martin Reinecke's avatar
Martin Reinecke committed
100

Martin Reinecke's avatar
Martin Reinecke committed
101
        assert_equal(np.bincount(ift.dobj.to_global_data(p.pindex).ravel()),
Martin Reinecke's avatar
Martin Reinecke committed
102
                     p.dvol, err_msg='rho is not equal to pindex degeneracy')
Martin Reinecke's avatar
PEP8    
Martin Reinecke committed
103

Martin Reinecke's avatar
Martin Reinecke committed
104

105
class PowerSpaceFunctionalityTest(unittest.TestCase):
Martin Reinecke's avatar
Martin Reinecke committed
106
    @expand(CONSTRUCTOR_CONFIGS)
Martin Reinecke's avatar
stage1    
Martin Reinecke committed
107
    def test_constructor(self, harmonic_partner,
Theo Steininger's avatar
Theo Steininger committed
108
                         logarithmic, nbin, binbounds, expected):
109
110
        if 'error' in expected:
            with assert_raises(expected['error']):
Martin Reinecke's avatar
Martin Reinecke committed
111
112
113
                bb = ift.PowerSpace.useful_binbounds(harmonic_partner,
                                                     logarithmic, nbin)
                ift.PowerSpace(harmonic_partner=harmonic_partner, binbounds=bb)
114
        else:
Martin Reinecke's avatar
Martin Reinecke committed
115
116
117
            bb = ift.PowerSpace.useful_binbounds(harmonic_partner,
                                                 logarithmic, nbin)
            p = ift.PowerSpace(harmonic_partner=harmonic_partner, binbounds=bb)
Martin Reinecke's avatar
Martin Reinecke committed
118
            for key, value in expected.items():
119
                if isinstance(value, np.ndarray):
Martin Reinecke's avatar
Martin Reinecke committed
120
                    assert_allclose(getattr(p, key), value)
121
122
123
                else:
                    assert_equal(getattr(p, key), value)

124
125
    @expand(k_lengths_configs())
    def test_k_lengths(self, harmonic_partner, expected):
Martin Reinecke's avatar
Martin Reinecke committed
126
127
        p = ift.PowerSpace(harmonic_partner=harmonic_partner)
        assert_allclose(p.k_lengths, expected)
128

129
    def test_dvol(self):
Martin Reinecke's avatar
Martin Reinecke committed
130
131
        hp = ift.RGSpace(10, harmonic=True)
        p = ift.PowerSpace(harmonic_partner=hp)
Martin Reinecke's avatar
Martin Reinecke committed
132
        v1 = hp.dvol
Martin Reinecke's avatar
Martin Reinecke committed
133
        v1 = hp.size*v1 if np.isscalar(v1) else np.sum(v1)
Martin Reinecke's avatar
Martin Reinecke committed
134
        v2 = p.dvol
Martin Reinecke's avatar
Martin Reinecke committed
135
        v2 = p.size*v2 if np.isscalar(v2) else np.sum(v2)
Martin Reinecke's avatar
Martin Reinecke committed
136
        assert_allclose(v1, v2)