test_jacobian.py 6.42 KB
Newer Older
Philipp Arras's avatar
Philipp Arras committed
1
2
3
4
5
6
7
8
9
10
11
12
13
# 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/>.
#
Philipp Arras's avatar
Philipp Arras committed
14
# Copyright(C) 2013-2020 Max-Planck-Society
Philipp Arras's avatar
Philipp Arras committed
15
16
17
18
19
#
# NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik.

import pytest

Martin Reinecke's avatar
5->6    
Martin Reinecke committed
20
import nifty6 as ift
Philipp Arras's avatar
Philipp Arras committed
21

22
from ..common import list2fixture, setup_function, teardown_function
Philipp Arras's avatar
Philipp Arras committed
23
24
25

pmp = pytest.mark.parametrize
space = list2fixture([
Philipp Arras's avatar
Philipp Arras committed
26
27
28
    ift.GLSpace(5),
    ift.RGSpace(3, distances=.789),
    ift.RGSpace([4, 4], distances=.789)
Philipp Arras's avatar
Philipp Arras committed
29
])
Philipp Arras's avatar
Philipp Arras committed
30
31
_h_RG_spaces = [
    ift.RGSpace(7, distances=0.2, harmonic=True),
Philipp Arras's avatar
Philipp Arras committed
32
    ift.RGSpace((3, 4), distances=(.2, .3), harmonic=True)
Philipp Arras's avatar
Philipp Arras committed
33
34
]
_h_spaces = _h_RG_spaces + [ift.LMSpace(17)]
Philipp Arras's avatar
Philipp Arras committed
35
space1 = space
Philipp Arras's avatar
Philipp Arras committed
36
37
seed = list2fixture([4, 78])
ntries = 10
Philipp Arras's avatar
Philipp Arras committed
38
39


Philipp Arras's avatar
Philipp Arras committed
40
def testBasics(space, seed):
Martin Reinecke's avatar
Martin Reinecke committed
41
    with ift.random.Context(seed):
Philipp Arras's avatar
Philipp Arras committed
42
        s = ift.from_random('normal', space)
Martin Reinecke's avatar
Martin Reinecke committed
43
44
        var = ift.Linearization.make_var(s)
        model = ift.ScalingOperator(var.target, 6.)
Philipp Arras's avatar
Philipp Arras committed
45
        ift.extra.check_jacobian_consistency(model, var.val, ntries=ntries)
Philipp Arras's avatar
Philipp Arras committed
46
47
48
49
50


@pmp('type1', ['Variable', 'Constant'])
@pmp('type2', ['Variable'])
def testBinary(type1, type2, space, seed):
Martin Reinecke's avatar
Martin Reinecke committed
51
52
53
54
55
56
57
    with ift.random.Context(seed):
        dom1 = ift.MultiDomain.make({'s1': space})
        dom2 = ift.MultiDomain.make({'s2': space})
        dom = ift.MultiDomain.union((dom1, dom2))
        select_s1 = ift.ducktape(None, dom1, "s1")
        select_s2 = ift.ducktape(None, dom2, "s2")
        model = select_s1*select_s2
Philipp Arras's avatar
Philipp Arras committed
58
        pos = ift.from_random("normal", dom)
Philipp Arras's avatar
Philipp Arras committed
59
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
60
61
        model = select_s1 + select_s2
        pos = ift.from_random("normal", dom)
Philipp Arras's avatar
Philipp Arras committed
62
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
63
64
        model = select_s1.scale(3.)
        pos = ift.from_random("normal", dom1)
Philipp Arras's avatar
Philipp Arras committed
65
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
66
67
        model = ift.ScalingOperator(space, 2.456)(select_s1*select_s2)
        pos = ift.from_random("normal", dom)
Philipp Arras's avatar
Philipp Arras committed
68
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
69
        model = (2.456*(select_s1*select_s2)).ptw("sigmoid")
Martin Reinecke's avatar
Martin Reinecke committed
70
        pos = ift.from_random("normal", dom)
Philipp Arras's avatar
Philipp Arras committed
71
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
72
73
        pos = ift.from_random("normal", dom)
        model = ift.OuterProduct(pos['s1'], ift.makeDomain(space))
Philipp Arras's avatar
Philipp Arras committed
74
        ift.extra.check_jacobian_consistency(model, pos['s2'], ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
75
76
        model = select_s1**2
        pos = ift.from_random("normal", dom1)
Philipp Arras's avatar
Philipp Arras committed
77
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
78
79
        model = select_s1.clip(-1, 1)
        pos = ift.from_random("normal", dom1)
Philipp Arras's avatar
Philipp Arras committed
80
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
81
82
83
        f = ift.from_random("normal", space)
        model = select_s1.clip(f-0.1, f+1.)
        pos = ift.from_random("normal", dom1)
Philipp Arras's avatar
Philipp Arras committed
84
        ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
85
86
87
        if isinstance(space, ift.RGSpace):
            model = ift.FFTOperator(space)(select_s1*select_s2)
            pos = ift.from_random("normal", dom)
Philipp Arras's avatar
Philipp Arras committed
88
            ift.extra.check_jacobian_consistency(model, pos, ntries=ntries)
Philipp Arras's avatar
Philipp Arras committed
89
90


Rouven Lemmerz's avatar
Rouven Lemmerz committed
91
def testSpecialDistributionOps(space, seed):
Martin Reinecke's avatar
Martin Reinecke committed
92
    with ift.random.Context(seed):
Philipp Arras's avatar
Philipp Arras committed
93
        pos = ift.from_random('normal', space)
Martin Reinecke's avatar
Martin Reinecke committed
94
95
96
97
98
99
        alpha = 1.5
        q = 0.73
        model = ift.InverseGammaOperator(space, alpha, q)
        ift.extra.check_jacobian_consistency(model, pos, ntries=20)
        model = ift.UniformOperator(space, alpha, q)
        ift.extra.check_jacobian_consistency(model, pos, ntries=20)
Martin Reinecke's avatar
Martin Reinecke committed
100

101

Philipp Arras's avatar
Philipp Arras committed
102
103
@pmp('neg', [True, False])
def testAdder(space, seed, neg):
Martin Reinecke's avatar
Martin Reinecke committed
104
    with ift.random.Context(seed):
Philipp Arras's avatar
Philipp Arras committed
105
106
        f = ift.from_random('normal', space)
        f1 = ift.from_random('normal', space)
Martin Reinecke's avatar
Martin Reinecke committed
107
        op = ift.Adder(f1, neg)
Philipp Arras's avatar
Philipp Arras committed
108
        ift.extra.check_jacobian_consistency(op, f, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
109
        op = ift.Adder(f1.val.ravel()[0], neg=neg, domain=space)
Philipp Arras's avatar
Philipp Arras committed
110
        ift.extra.check_jacobian_consistency(op, f, ntries=ntries)
Philipp Arras's avatar
Philipp Arras committed
111
112
113


@pmp('target', [ift.RGSpace(64, distances=.789, harmonic=True),
Philipp Arras's avatar
Philipp Arras committed
114
                ift.RGSpace([10, 10], distances=.789, harmonic=True)])
Martin Reinecke's avatar
Martin Reinecke committed
115
116
@pmp('causal', [True, False])
@pmp('minimum_phase', [True, False])
Philipp Frank's avatar
Philipp Frank committed
117
def testDynamicModel(target, causal, minimum_phase, seed):
Martin Reinecke's avatar
Martin Reinecke committed
118
    with ift.random.Context(seed):
Philipp Arras's avatar
Philipp Arras committed
119
120
121
122
123
124
125
        dct = {'target': target,
               'harmonic_padding': None,
               'sm_s0': 3.,
               'sm_x0': 1.,
               'key': 'f',
               'causal': causal,
               'minimum_phase': minimum_phase}
Martin Reinecke's avatar
Martin Reinecke committed
126
        model, _ = ift.dynamic_operator(**dct)
Philipp Arras's avatar
Philipp Arras committed
127
        pos = ift.from_random('normal', model.domain)
Philipp Arras's avatar
Philipp Arras committed
128
        ift.extra.check_jacobian_consistency(model, pos, tol=1e-7, ntries=ntries)
Martin Reinecke's avatar
Martin Reinecke committed
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
        if len(target.shape) > 1:
            dct = {
                'target': target,
                'harmonic_padding': None,
                'sm_s0': 3.,
                'sm_x0': 1.,
                'key': 'f',
                'lightcone_key': 'c',
                'sigc': 1.,
                'quant': 5,
                'causal': causal,
                'minimum_phase': minimum_phase
            }
            dct['lightcone_key'] = 'c'
            dct['sigc'] = 1.
            dct['quant'] = 5
            model, _ = ift.dynamic_lightcone_operator(**dct)
Philipp Arras's avatar
Philipp Arras committed
146
            pos = ift.from_random('normal', model.domain)
Philipp Arras's avatar
Philipp Arras committed
147
            ift.extra.check_jacobian_consistency(model, pos, tol=1e-7, ntries=ntries)
Philipp Arras's avatar
Philipp Arras committed
148
149
150
151
152
153
154
155
156


@pmp('h_space', _h_spaces)
@pmp('specialbinbounds', [True, False])
@pmp('logarithmic', [True, False])
@pmp('nbin', [3, None])
def testNormalization(h_space, specialbinbounds, logarithmic, nbin):
    if not specialbinbounds and (not logarithmic or nbin is not None):
        return
Philipp Arras's avatar
Philipp Arras committed
157
    binbounds = None
Philipp Arras's avatar
Philipp Arras committed
158
159
160
161
162
    if specialbinbounds:
        binbounds = ift.PowerSpace.useful_binbounds(h_space, logarithmic, nbin)
    dom = ift.PowerSpace(h_space, binbounds)
    op = ift.library.correlated_fields._Normalization(dom)
    pos = 0.1*ift.from_random('normal', op.domain)
Philipp Arras's avatar
Philipp Arras committed
163
    ift.extra.check_jacobian_consistency(op, pos, ntries=10)