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
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
Martin Reinecke committed
27
from nifty2go.dobj import to_ndarray as to_np, from_ndarray as from_np
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
Martin Reinecke committed
56
        'pindex': from_np(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
Martin Reinecke committed
65
        'pindex': from_np(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
Martin Reinecke committed
99
        assert_equal(np.bincount(to_np(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)