test_lm_space.py 4.04 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

Martin Reinecke's avatar
Martin Reinecke committed
19
from __future__ import division
Jait Dixit's avatar
Jait Dixit committed
20
21
22
import unittest
import numpy as np

23
from numpy.testing import assert_, assert_equal, assert_raises,\
Theo Steininger's avatar
Theo Steininger committed
24
        assert_almost_equal, assert_array_almost_equal
25
from d2o import distributed_data_object
Jait Dixit's avatar
Jait Dixit committed
26
27
28
from nifty import LMSpace
from test.common import expand

Martin Reinecke's avatar
Martin Reinecke committed
29
# [lmax, expected]
30
CONSTRUCTOR_CONFIGS = [
Martin Reinecke's avatar
Martin Reinecke committed
31
        [5, {
Jait Dixit's avatar
Jait Dixit committed
32
33
34
35
36
37
38
            'lmax': 5,
            'mmax': 5,
            'shape': (36,),
            'harmonic': True,
            'dim': 36,
            'total_volume': 36.0,
            }],
Martin Reinecke's avatar
Martin Reinecke committed
39
        [7, {
Jait Dixit's avatar
Jait Dixit committed
40
41
42
43
44
45
46
            'lmax': 7,
            'mmax': 7,
            'shape': (64,),
            'harmonic': True,
            'dim': 64,
            'total_volume': 64.0,
            }],
Martin Reinecke's avatar
Martin Reinecke committed
47
        [-1, {
Jait Dixit's avatar
Jait Dixit committed
48
49
50
51
            'error': ValueError
            }]
    ]

Theo Steininger's avatar
Theo Steininger committed
52

Martin Reinecke's avatar
Martin Reinecke committed
53
54
55
56
57
def _distance_array_helper(index_arr, lmax):
    if index_arr <= lmax:
        index_half = index_arr
    else:
        if (index_arr - lmax) % 2 == 0:
Martin Reinecke's avatar
Martin Reinecke committed
58
            index_half = (index_arr + lmax)//2
Martin Reinecke's avatar
Martin Reinecke committed
59
        else:
Martin Reinecke's avatar
Martin Reinecke committed
60
            index_half = (index_arr + lmax + 1)//2
Martin Reinecke's avatar
Martin Reinecke committed
61

62
63
    m = np.ceil(((2*lmax + 1) - np.sqrt((2*lmax + 1)**2 -
                 8*(index_half - lmax)))/2).astype(int)
Martin Reinecke's avatar
Martin Reinecke committed
64

65
    return index_half - m*(2*lmax + 1 - m)//2
Martin Reinecke's avatar
Martin Reinecke committed
66

Theo Steininger's avatar
Theo Steininger committed
67

68
def get_distance_array_configs():
Martin Reinecke's avatar
Martin Reinecke committed
69
    da_0 = [_distance_array_helper(idx, 5) for idx in np.arange(36)]
Martin Reinecke's avatar
Martin Reinecke committed
70
    return [[5, da_0]]
71
72
73


def get_weight_configs():
Martin Reinecke's avatar
Martin Reinecke committed
74
75
    np.random.seed(42)
    w_0_x = np.random.rand(32, 16, 6)
76
    return [
Martin Reinecke's avatar
Martin Reinecke committed
77
78
        [w_0_x, 1, None, False, w_0_x],
        [w_0_x.copy(), 1, None,  True, w_0_x]
79
80
        ]

Theo Steininger's avatar
Theo Steininger committed
81

82
def get_hermitian_configs():
Martin Reinecke's avatar
Martin Reinecke committed
83
84
85
86
    np.random.seed(42)
    h_0_res_real = np.random.rand(32, 16, 6).astype(np.complex128)
    h_0_res_imag = np.random.rand(32, 16, 6).astype(np.complex128)
    h_0_x = h_0_res_real + h_0_res_imag * 1j
87
    return [
Martin Reinecke's avatar
Martin Reinecke committed
88
        [h_0_x, h_0_res_real, h_0_res_imag]
89
90
    ]

Theo Steininger's avatar
Theo Steininger committed
91

92
class LMSpaceInterfaceTests(unittest.TestCase):
Jait Dixit's avatar
Jait Dixit committed
93
94
95
    @expand([['lmax', int],
            ['mmax', int],
            ['dim', int]])
96
    def test_property_ret_type(self, attribute, expected_type):
97
        l = LMSpace(7)
98
        assert_(isinstance(getattr(l, attribute), expected_type))
Jait Dixit's avatar
Jait Dixit committed
99
100
101


class LMSpaceFunctionalityTests(unittest.TestCase):
102
    @expand(CONSTRUCTOR_CONFIGS)
Martin Reinecke's avatar
Martin Reinecke committed
103
    def test_constructor(self, lmax, expected):
104
105
        if 'error' in expected:
            with assert_raises(expected['error']):
Martin Reinecke's avatar
Martin Reinecke committed
106
                LMSpace(lmax)
Jait Dixit's avatar
Jait Dixit committed
107
        else:
Martin Reinecke's avatar
Martin Reinecke committed
108
            l = LMSpace(lmax)
Martin Reinecke's avatar
Martin Reinecke committed
109
            for key, value in expected.items():
110
                assert_equal(getattr(l, key), value)
Jait Dixit's avatar
Jait Dixit committed
111

Theo Steininger's avatar
Theo Steininger committed
112
    def test_hermitianize_inverter(self):
113
        l = LMSpace(5)
Theo Steininger's avatar
Theo Steininger committed
114
115
116
117
        v = distributed_data_object(global_shape=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.get_full_data(), v.get_full_data())
Jait Dixit's avatar
Jait Dixit committed
118

119
120
    @expand(get_weight_configs())
    def test_weight(self, x, power, axes, inplace, expected):
121
122
123
124
125
        l = LMSpace(5)
        res = l.weight(x, power, axes, inplace)
        assert_almost_equal(res, expected)
        if inplace:
            assert_(x is res)
Jait Dixit's avatar
Jait Dixit committed
126

127
    @expand(get_distance_array_configs())
Martin Reinecke's avatar
Martin Reinecke committed
128
129
    def test_distance_array(self, lmax, expected):
        l = LMSpace(lmax)
Martin Reinecke's avatar
more    
Martin Reinecke committed
130
        assert_almost_equal(l.get_distance_array().data, expected)