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

import numpy as np
import pytest

Martin Reinecke's avatar
5->6    
Martin Reinecke committed
21
import nifty6 as ift
Philipp Arras's avatar
Philipp Arras committed
22
23
24
25
26
27
from itertools import product

# Currently it is not possible to parametrize fixtures. But this will
# hopefully be fixed in the future.
# https://docs.pytest.org/en/latest/proposals/parametrize_with_fixtures.html

Philipp Arras's avatar
Philipp Arras committed
28
29
30
SPACES = [ift.GLSpace(15),
          ift.RGSpace(64, distances=.789),
          ift.RGSpace([32, 32], distances=.789)]
Philipp Arras's avatar
Philipp Arras committed
31
32
SEEDS = [4, 78, 23]
PARAMS = product(SEEDS, SPACES)
33
pmp = pytest.mark.parametrize
Philipp Arras's avatar
Philipp Arras committed
34
# FIXME Test also with multifields in domain
Philipp Arras's avatar
Philipp Arras committed
35
36
37
38
39


@pytest.fixture(params=PARAMS)
def field(request):
    np.random.seed(request.param[0])
40
    S = ift.ScalingOperator(request.param[1], 1.)
Philipp Arras's avatar
Philipp Arras committed
41
42
43
    s = S.draw_sample()
    return ift.MultiField.from_dict({'s1': s})['s1']

Philipp Arras's avatar
Philipp Arras committed
44

45
def test_variablecovariancegaussian(field):
Philipp Arras's avatar
Philipp Arras committed
46
    dc = {'a': field, 'b': field.exp()}
47
    mf = ift.MultiField.from_dict(dc)
Philipp Arras's avatar
Philipp Arras committed
48
    energy = ift.VariableCovarianceGaussianEnergy(field.domain, 'a', 'b')
49
    ift.extra.check_jacobian_consistency(energy, mf, tol=1e-6)
Philipp Arras's avatar
Fixup    
Philipp Arras committed
50
    energy(ift.Linearization.make_var(mf, want_metric=True)).metric.draw_sample()
Philipp Arras's avatar
Philipp Arras committed
51

Philipp Arras's avatar
Philipp Arras committed
52

Philipp Arras's avatar
Philipp Arras committed
53
54
def test_gaussian(field):
    energy = ift.GaussianEnergy(domain=field.domain)
Martin Reinecke's avatar
Martin Reinecke committed
55
    ift.extra.check_jacobian_consistency(energy, field)
Philipp Arras's avatar
Philipp Arras committed
56

Philipp Arras's avatar
Philipp Arras committed
57

58
@pmp('icov', [lambda dom:ift.ScalingOperator(dom, 1.),
Philipp Arras's avatar
Philipp Arras committed
59
              lambda dom:ift.SandwichOperator.make(ift.GeometryRemover(dom))])
60
61
62
def test_ScaledEnergy(field, icov):
    icov = icov(field.domain)
    energy = ift.GaussianEnergy(inverse_covariance=icov)
63
64
    ift.extra.check_jacobian_consistency(energy.scale(0.3), field)

Philipp Arras's avatar
Philipp Arras committed
65
    lin = ift.Linearization.make_var(field, want_metric=True)
Vincent Eberle's avatar
Vincent Eberle committed
66
    met1 = energy(lin).metric
Vincent Eberle's avatar
Vincent Eberle committed
67
    met2 = energy.scale(0.3)(lin).metric
Philipp Arras's avatar
Philipp Arras committed
68
    np.testing.assert_allclose(met1(field).val, met2(field).val/0.3, rtol=1e-12)
69
    met2.draw_sample()
Martin Reinecke's avatar
Martin Reinecke committed
70

Philipp Arras's avatar
Philipp Arras committed
71

72
73
74
def test_studentt(field):
    energy = ift.StudentTEnergy(domain=field.domain, theta=.5)
    ift.extra.check_jacobian_consistency(energy, field, tol=1e-6)
Philipp Arras's avatar
Philipp Arras committed
75

Martin Reinecke's avatar
Martin Reinecke committed
76

Philipp Arras's avatar
Philipp Arras committed
77
78
79
80
def test_inverse_gamma(field):
    field = field.exp()
    space = field.domain
    d = np.random.normal(10, size=space.shape)**2
Martin Reinecke's avatar
stage2    
Martin Reinecke committed
81
    d = ift.Field(space, d)
Philipp Arras's avatar
Philipp Arras committed
82
    energy = ift.InverseGammaLikelihood(d)
83
    ift.extra.check_jacobian_consistency(energy, field, tol=1e-5)
Philipp Arras's avatar
Philipp Arras committed
84
85
86
87
88
89


def testPoissonian(field):
    field = field.exp()
    space = field.domain
    d = np.random.poisson(120, size=space.shape)
Martin Reinecke's avatar
stage2    
Martin Reinecke committed
90
    d = ift.Field(space, d)
Philipp Arras's avatar
Philipp Arras committed
91
    energy = ift.PoissonianEnergy(d)
Martin Reinecke's avatar
Martin Reinecke committed
92
    ift.extra.check_jacobian_consistency(energy, field, tol=1e-7)
Philipp Arras's avatar
Philipp Arras committed
93
94
95
96
97
98


def test_hamiltonian_and_KL(field):
    field = field.exp()
    space = field.domain
    lh = ift.GaussianEnergy(domain=space)
99
    hamiltonian = ift.StandardHamiltonian(lh)
Martin Reinecke's avatar
Martin Reinecke committed
100
    ift.extra.check_jacobian_consistency(hamiltonian, field)
101
    S = ift.ScalingOperator(space, 1.)
Philipp Arras's avatar
Philipp Arras committed
102
    samps = [S.draw_sample() for i in range(3)]
Martin Reinecke's avatar
Martin Reinecke committed
103
    kl = ift.AveragedEnergy(hamiltonian, samps)
Martin Reinecke's avatar
Martin Reinecke committed
104
    ift.extra.check_jacobian_consistency(kl, field)
Philipp Arras's avatar
Philipp Arras committed
105
106
107


def test_bernoulli(field):
Philipp Arras's avatar
Fixups    
Philipp Arras committed
108
    field = field.sigmoid()
Philipp Arras's avatar
Philipp Arras committed
109
110
    space = field.domain
    d = np.random.binomial(1, 0.1, size=space.shape)
Martin Reinecke's avatar
stage2    
Martin Reinecke committed
111
    d = ift.Field(space, d)
Philipp Arras's avatar
Philipp Arras committed
112
    energy = ift.BernoulliEnergy(d)
113
    ift.extra.check_jacobian_consistency(energy, field, tol=1e-5)