test_rg_space.py 3.79 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

Jait Dixit's avatar
Jait Dixit committed
19
from __future__ import division
20

Jait Dixit's avatar
Jait Dixit committed
21
22
23
import unittest
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

Martin Reinecke's avatar
Martin Reinecke committed
28
# [shape, distances, harmonic, expected]
29
CONSTRUCTOR_CONFIGS = [
Martin Reinecke's avatar
Martin Reinecke committed
30
        [(8,), None, False,
Jait Dixit's avatar
Jait Dixit committed
31
32
33
34
            {
                'shape': (8,),
                'distances': (0.125,),
                'harmonic': False,
Martin Reinecke's avatar
Martin Reinecke committed
35
                'size': 8,
Jait Dixit's avatar
Jait Dixit committed
36
            }],
Martin Reinecke's avatar
Martin Reinecke committed
37
        [(8,), None, True,
Jait Dixit's avatar
Jait Dixit committed
38
39
40
41
            {
                'shape': (8,),
                'distances': (1.0,),
                'harmonic': True,
Martin Reinecke's avatar
Martin Reinecke committed
42
                'size': 8,
Jait Dixit's avatar
Jait Dixit committed
43
            }],
Martin Reinecke's avatar
Martin Reinecke committed
44
        [(8,), (12,), True,
Jait Dixit's avatar
Jait Dixit committed
45
46
47
48
            {
                'shape': (8,),
                'distances': (12.0,),
                'harmonic': True,
Martin Reinecke's avatar
Martin Reinecke committed
49
                'size': 8,
Jait Dixit's avatar
Jait Dixit committed
50
            }],
Martin Reinecke's avatar
Martin Reinecke committed
51
        [(11, 11), None, False,
Jait Dixit's avatar
Jait Dixit committed
52
53
54
55
            {
                'shape': (11, 11),
                'distances': (1/11, 1/11),
                'harmonic': False,
Martin Reinecke's avatar
Martin Reinecke committed
56
                'size': 121,
Jait Dixit's avatar
Jait Dixit committed
57
            }],
Martin Reinecke's avatar
Martin Reinecke committed
58
        [(12, 12), (1.3, 1.3), True,
Jait Dixit's avatar
Jait Dixit committed
59
            {
Theo Steininger's avatar
Theo Steininger committed
60
                'shape': (12, 12),
Jait Dixit's avatar
Jait Dixit committed
61
62
                'distances': (1.3, 1.3),
                'harmonic': True,
Martin Reinecke's avatar
Martin Reinecke committed
63
                'size': 144,
Jait Dixit's avatar
Jait Dixit committed
64
65
66
67
68
            }]

    ]


69
def get_k_length_array_configs():
Martin Reinecke's avatar
Martin Reinecke committed
70
    # for RGSpace(shape=(4, 4), distances=(0.25,0.25))
Martin Reinecke's avatar
Martin Reinecke committed
71
72
73
74
75
76
77
    cords_0 = np.ogrid[0:4, 0:4]
    da_0 = ((cords_0[0] - 4 // 2) * 0.25)**2
    da_0 = np.fft.ifftshift(da_0)
    temp = ((cords_0[1] - 4 // 2) * 0.25)**2
    temp = np.fft.ifftshift(temp)
    da_0 = da_0 + temp
    da_0 = np.sqrt(da_0)
78
    return [
Martin Reinecke's avatar
Martin Reinecke committed
79
        [(4, 4), (0.25, 0.25), da_0],
80
81
82
        ]


83
def get_dvol_configs():
Martin Reinecke's avatar
Martin Reinecke committed
84
    np.random.seed(42)
85
    return [
86
87
88
89
90
91
92
93
        [(11, 11), None, False, 1],
        [(11, 11), None, False, 1],
        [(11, 11), (1.3, 1.3), False, 1],
        [(11, 11), (1.3, 1.3), False, 1],
        [(11, 11), None, True, 1],
        [(11, 11), None, True, 1],
        [(11, 11), (1.3, 1.3), True, 1],
        [(11, 11), (1.3, 1.3), True, 1]
94
95
96
        ]


Jait Dixit's avatar
Jait Dixit committed
97
class RGSpaceInterfaceTests(unittest.TestCase):
Martin Reinecke's avatar
Martin Reinecke committed
98
    @expand([['distances', tuple]])
99
    def test_property_ret_type(self, attribute, expected_type):
Martin Reinecke's avatar
Martin Reinecke committed
100
        x = ift.RGSpace(1)
Jait Dixit's avatar
Jait Dixit committed
101
102
103
104
        assert_(isinstance(getattr(x, attribute), expected_type))


class RGSpaceFunctionalityTests(unittest.TestCase):
105
    @expand(CONSTRUCTOR_CONFIGS)
Martin Reinecke's avatar
Martin Reinecke committed
106
    def test_constructor(self, shape, distances,
Martin Reinecke's avatar
Martin Reinecke committed
107
                         harmonic, expected):
Martin Reinecke's avatar
Martin Reinecke committed
108
        x = ift.RGSpace(shape, distances, harmonic)
Martin Reinecke's avatar
Martin Reinecke committed
109
        for key, value in expected.items():
Jait Dixit's avatar
Jait Dixit committed
110
111
            assert_equal(getattr(x, key), value)

112
113
    @expand(get_k_length_array_configs())
    def test_k_length_array(self, shape, distances, expected):
Martin Reinecke's avatar
Martin Reinecke committed
114
        r = ift.RGSpace(shape=shape, distances=distances, harmonic=True)
Martin Reinecke's avatar
Martin Reinecke committed
115
        assert_allclose(r.get_k_length_array().to_global_data(), expected)
Jait Dixit's avatar
Jait Dixit committed
116

117
118
    @expand(get_dvol_configs())
    def test_dvol(self, shape, distances, harmonic, power):
Martin Reinecke's avatar
Martin Reinecke committed
119
        r = ift.RGSpace(shape=shape, distances=distances, harmonic=harmonic)
Martin Reinecke's avatar
Martin Reinecke committed
120
        assert_allclose(r.dvol, np.prod(r.distances)**power)