test_lm_space.py 4.03 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# NIFTy
# Copyright (C) 2017  Theo Steininger
#
# Author: Theo Steininger
#
# 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/>.

Jait Dixit's avatar
Jait Dixit committed
19
20
21
import unittest
import numpy as np

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

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

Theo Steininger's avatar
Theo Steininger committed
53

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

63
64
    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
65

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

Theo Steininger's avatar
Theo Steininger committed
68

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


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

Theo Steininger's avatar
Theo Steininger committed
82

83
def get_hermitian_configs():
Martin Reinecke's avatar
Martin Reinecke committed
84
85
86
87
    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
88
    return [
Martin Reinecke's avatar
Martin Reinecke committed
89
        [h_0_x, h_0_res_real, h_0_res_imag]
90
91
    ]

Theo Steininger's avatar
Theo Steininger committed
92

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


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

113
114
    @expand(get_hermitian_configs())
    def test_hermitian_decomposition(self, x, real, imag):
115
116
117
118
119
120
121
        l = LMSpace(5)
        assert_almost_equal(
            l.hermitian_decomposition(distributed_data_object(x))[0],
            real)
        assert_almost_equal(
            l.hermitian_decomposition(distributed_data_object(x))[1],
            imag)
Jait Dixit's avatar
Jait Dixit committed
122

123
124
    @expand(get_weight_configs())
    def test_weight(self, x, power, axes, inplace, expected):
125
126
127
128
129
        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
130

131
132
    @expand(get_distance_array_configs())
    def test_distance_array(self, lmax, dtype, expected):
133
134
        l = LMSpace(lmax, dtype)
        assert_almost_equal(l.get_distance_array('not').data, expected)