test_power_space.py 5.4 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
14
15
16
17
#
# Copyright(C) 2013-2017 Max-Planck-Society
#
# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik
# and financially supported by the Studienstiftung des deutschen Volkes.
18

19
20
21
from __future__ import division
import unittest
import numpy as np
Martin Reinecke's avatar
Martin Reinecke committed
22
from numpy.testing import assert_, assert_equal, assert_allclose,\
23
        assert_raises
Martin Reinecke's avatar
Martin Reinecke committed
24
import nifty2go as ift
25
from test.common import expand
Reimar H Leike's avatar
Reimar H Leike committed
26
from itertools import product, chain
Martin Reinecke's avatar
fixes    
Martin Reinecke committed
27
from nifty2go import dobj
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
53
        'shape': (5,),
        'dim': 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
fixes    
Martin Reinecke committed
56
        'pindex': dobj.from_global_data(np.array([0, 1, 2, 3, 4, 3, 2, 1])),
Martin Reinecke's avatar
Martin Reinecke committed
57
        'k_lengths': np.array([0., 1., 2., 3., 4.]),
58
        }],
Martin Reinecke's avatar
Martin Reinecke committed
59
    [ift.RGSpace((8,), harmonic=True), True, None, None, {
60
        'harmonic': False,
61
62
        'shape': (4,),
        'dim': 4,
Martin Reinecke's avatar
Martin Reinecke committed
63
        'harmonic_partner': ift.RGSpace((8,), harmonic=True),
64
        'binbounds': (0.5, 1.3228756555322954, 3.5),
Martin Reinecke's avatar
fixes    
Martin Reinecke committed
65
        'pindex': dobj.from_global_data(np.array([0, 1, 2, 2, 3, 2, 2, 1])),
Martin Reinecke's avatar
Martin Reinecke committed
66
        'k_lengths': np.array([0., 1., 2.5, 4.]),
67
68
69
70
        }],
    ]


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


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

Martin Reinecke's avatar
Martin Reinecke committed
90

91
class PowerSpaceConsistencyCheck(unittest.TestCase):
92
    @expand(CONSISTENCY_CONFIGS)
Martin Reinecke's avatar
stage1    
Martin Reinecke committed
93
    def test_rhopindexConsistency(self, harmonic_partner,
Martin Reinecke's avatar
Martin Reinecke committed
94
                                  binbounds, nbin, logarithmic):
Martin Reinecke's avatar
Martin Reinecke committed
95
96
97
        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
98

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

Martin Reinecke's avatar
Martin Reinecke committed
102

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

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

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