getting_started_3.py 3.53 KB
Newer Older
Jakob Knollmueller's avatar
Jakob Knollmueller committed
1 2 3 4 5
import nifty5 as ift
import numpy as np


def get_random_LOS(n_los):
6 7
    starts = list(np.random.uniform(0, 1, (n_los, 2)).T)
    ends = list(np.random.uniform(0, 1, (n_los, 2)).T)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
8 9 10

    return starts, ends

11

Jakob Knollmueller's avatar
Jakob Knollmueller committed
12
if __name__ == '__main__':
13
    # ## ABOUT THIS TUTORIAL
14
    np.random.seed(42)
15
    position_space = ift.RGSpace([128, 128])
Jakob Knollmueller's avatar
Jakob Knollmueller committed
16

Jakob Knollmueller's avatar
Jakob Knollmueller committed
17
    # Setting up an amplitude model
Martin Reinecke's avatar
fixes  
Martin Reinecke committed
18
    A, amplitude_internals = ift.make_amplitude_model(
19
        position_space, 16, 1, 10, -4., 1, 0., 1.)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33

    # Building the model for a correlated signal
    harmonic_space = position_space.get_default_codomain()
    ht = ift.HarmonicTransformOperator(harmonic_space, position_space)
    power_space = A.value.domain[0]
    power_distributor = ift.PowerDistributor(harmonic_space, power_space)
    position = {}
    position['xi'] = ift.Field.from_random('normal', harmonic_space)
    position = ift.MultiField(position)

    xi = ift.Variable(position)['xi']
    Amp = power_distributor(A)
    correlated_field_h = Amp * xi
    correlated_field = ht(correlated_field_h)
34
    # alternatively to the block above one can do:
Martin Reinecke's avatar
fixes  
Martin Reinecke committed
35
    # correlated_field,_ = ift.make_correlated_field(position_space, A)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
36 37 38 39

    # apply some nonlinearity
    signal = ift.PointwisePositiveTanh(correlated_field)
    # Building the Line of Sight response
40
    LOS_starts, LOS_ends = get_random_LOS(100)
Martin Reinecke's avatar
fixes  
Martin Reinecke committed
41 42
    R = ift.LOSResponse(position_space, starts=LOS_starts,
                        ends=LOS_ends)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
43
    # build signal response model and model likelihood
Jakob Knollmueller's avatar
Jakob Knollmueller committed
44
    signal_response = R(signal)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
45 46
    # specify noise
    data_space = R.target
Jakob Knollmueller's avatar
Jakob Knollmueller committed
47
    noise = .001
48
    N = ift.ScalingOperator(noise, data_space)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
49 50 51

    # generate mock data
    MOCK_POSITION = ift.from_random('normal', signal.position.domain)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
52
    data = signal_response.at(MOCK_POSITION).value + N.draw_sample()
Jakob Knollmueller's avatar
Jakob Knollmueller committed
53 54 55 56 57

    # set up model likelihood
    likelihood = ift.GaussianEnergy(signal_response, mean=data, covariance=N)

    # set up minimization and inversion schemes
Jakob Knollmueller's avatar
Jakob Knollmueller committed
58 59
    ic_cg = ift.GradientNormController(iteration_limit=10)
    ic_sampling = ift.GradientNormController(iteration_limit=100)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
60 61
    ic_newton = ift.GradientNormController(name='Newton', iteration_limit=100)
    minimizer = ift.RelaxedNewton(ic_newton)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
62

Jakob Knollmueller's avatar
Jakob Knollmueller committed
63
    # build model Hamiltonian
Martin Reinecke's avatar
Martin Reinecke committed
64
    H = ift.Hamiltonian(likelihood, ic_sampling)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
65

66
    INITIAL_POSITION = ift.from_random('normal', H.position.domain)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
67
    position = INITIAL_POSITION
Jakob Knollmueller's avatar
Jakob Knollmueller committed
68

69 70 71
    ift.plot(signal.at(MOCK_POSITION).value, name='truth.pdf')
    ift.plot(R.adjoint_times(data), name='data.pdf')
    ift.plot([A.at(MOCK_POSITION).value], name='power.pdf')
Jakob Knollmueller's avatar
Jakob Knollmueller committed
72

Jakob Knollmueller's avatar
Jakob Knollmueller committed
73
    # number of samples used to estimate the KL
74
    N_samples = 20
Jakob Knollmueller's avatar
Jakob Knollmueller committed
75 76
    for i in range(5):
        H = H.at(position)
77 78
        samples = [H.curvature.draw_sample(from_inverse=True)
                   for _ in range(N_samples)]
Jakob Knollmueller's avatar
Jakob Knollmueller committed
79

Martin Reinecke's avatar
Martin Reinecke committed
80 81
        KL = ift.SampledKullbachLeiblerDivergence(H, samples)
        KL = KL.makeInvertible(ic_cg)
Jakob Knollmueller's avatar
Jakob Knollmueller committed
82 83 84
        KL, convergence = minimizer(KL)
        position = KL.position

85
        ift.plot(signal.at(position).value, name='reconstruction.pdf')
Jakob Knollmueller's avatar
Jakob Knollmueller committed
86

87 88
        ift.plot([A.at(position).value, A.at(MOCK_POSITION).value],
                 name='power.pdf')
Jakob Knollmueller's avatar
Jakob Knollmueller committed
89

Jakob Knollmueller's avatar
Jakob Knollmueller committed
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    avrg = 0.
    va = 0.
    powers = []
    for sample in samples:
        sam = signal.at(sample + position).value
        powers.append(A.at(sample+position).value)
        avrg += sam
        va += sam**2

    avrg /= len(samples)
    va /= len(samples)
    va -= avrg**2
    std = ift.sqrt(va)
    ift.plot(avrg, name='avrg.pdf')
    ift.plot(std, name='std.pdf')
105 106
    ift.plot([A.at(position).value, A.at(MOCK_POSITION).value]+powers,
             name='power.pdf')