Exemple #1
0
    def test_method_access_default_call(self):
        oscN = 3
        nH = 1
        params = self.generate_params(oscN, nH)
        t = np.linspace(0, 1, 200)
        model = ModelWrapper(KurSL(params))

        kursl = KurSL()
        s_kursl = np.array(kursl(t, params))
        s_model = np.array(model(t, params))
        self.assertTrue(np.all(s_kursl == s_model),
                        "Both calls should return the same")
Exemple #2
0
 def test_lnlikelihood(self):
     t = np.arange(0, 1, 0.01)
     S = np.random.random(t.size)
     theta = self.random_theta(3, 2)
     kursl = KurSL(theta)
     model = ModelWrapper(kursl)
     lnlikelihood = KurslMCMC.lnlikelihood(theta, t, S[:-1], model)
     self.assertTrue(lnlikelihood < 0, "Any negative value is good")
Exemple #3
0
 def test_lnprob(self):
     t = np.arange(0, 1, 0.01)
     S = np.random.random(t.size)
     theta = self.random_theta(4, 3)
     kursl = KurSL(theta)
     model = ModelWrapper(kursl)
     self.assertTrue(
         KurslMCMC.lnprob(theta, t, S[:-1], model) < 0,
         "Any good theta should return negative value")
Exemple #4
0
    def test_initiation_with_model(self):
        oscN = 3
        nH = 1
        params = self.generate_params(oscN, nH)
        kursl = KurSL(params)
        model = ModelWrapper(kursl)

        self.assertEqual(model.model, kursl)
        self.assertEqual(model.oscN, oscN)
        self.assertEqual(model.nH, nH)
Exemple #5
0
    def test_lnprob_theta_outside_range(self):
        t = np.arange(0, 1, 0.01)
        S = np.random.random(t.size)
        theta = self.random_theta(4, 3)
        kursl = KurSL(theta)
        model = ModelWrapper(kursl)

        theta[0, 0] = model.MIN_W - 1
        self.assertEqual(KurslMCMC.lnprob(theta, t, S[:-1], model), -np.inf,
                         "Inherit behaviour of lnprob and lnlikelihood")
Exemple #6
0
    def test_lnprior(self):
        t = np.arange(0, 1, 0.01)
        theta = self.random_theta(3, 2)
        kursl = KurSL(theta)
        model = ModelWrapper(kursl)
        lnprob = KurslMCMC.lnprior(theta, model)

        # Given default uniform probablities it's either 0 or -np.inf
        self.assertEqual(np.round(lnprob, 10), 0,
                         "Theta within max ranges results in 0")
Exemple #7
0
    def test_set_model_after_initiation(self):
        model = ModelWrapper()

        oscN = 3
        nH = 1
        params = np.random.random(oscN * (3 + (oscN - 1) * nH)) + 1
        params = params.reshape((oscN, -1))
        kursl = KurSL(params)
        model.set_model(kursl)

        self.assertEqual(model.model, kursl)
        self.assertEqual(model.oscN, oscN)
        self.assertEqual(model.nH, nH)
Exemple #8
0
 def test_lnlikelihood_zero(self):
     t = np.arange(0, 1, 0.01)
     S = 2 * np.cos(10 * t + 0) + 6 * np.cos(20 * t + 4)
     theta = np.array([
         [10, 0, 2, 0],
         [20, 4, 6, 0],
     ])
     kursl = KurSL(theta)
     model = ModelWrapper(kursl)
     lnlikelihood = KurslMCMC.lnlikelihood(theta, t, S[:-1], model)
     self.assertEqual(np.round(lnlikelihood, 10), 0,
                      "Exact reconstruction should return 0")
     self.assertTrue(model.THRESHOLD_OBTAINED, "0 is below any threshold")
Exemple #9
0
    def test_correct_parameter_initiation(self):
        oscN = 3
        nH = 2

        #    W     Ph    A|    K1   |   K2
        P = [
            [11, 0, 1, 1, -1, 0.1, 2.3],
            [20, 0.2, 2, 1, 2, 0.5, 3.1],
            [29, 1.5, 2.5, 0.1, -1.7, -10, 0],
        ]
        P = np.array(P)
        kursl = KurSL(P)

        self.assertEqual(kursl.oscN, oscN, "Number of oscillators")
        self.assertEqual(kursl.nH, nH, "Order of model")
Exemple #10
0
    def test_lnprior_theta_outside_ranges(self):
        t = np.arange(0, 1, 0.01)
        S = np.random.random(t.size)
        theta = self.random_theta(3, 2)
        kursl = KurSL(theta)
        model = ModelWrapper(kursl)

        new_theta = theta.copy()
        new_theta[0, 2] = model.MIN_R - 1
        self.assertEqual(KurslMCMC.lnprior(new_theta, model), -np.inf)
        new_theta[0, 2] = model.MAX_R + 1
        self.assertEqual(KurslMCMC.lnprior(new_theta, model), -np.inf)

        new_theta = theta.copy()
        new_theta[1, 0] = model.MIN_W - 1
        self.assertEqual(KurslMCMC.lnprior(new_theta, model), -np.inf)
        new_theta[1, 0] = model.MAX_W + 1
        self.assertEqual(KurslMCMC.lnprior(new_theta, model), -np.inf)

        # Check for W_i < sum_j (|k_ij|)
        new_theta = theta.copy()
        new_theta[2, 0] = np.sum(new_theta[2, 3:]) * 0.6
        self.assertEqual(KurslMCMC.lnprior(new_theta, model), -np.inf)
Exemple #11
0
#oscN = 3
#nH = 2
F = [3., 5, 10]
W = np.array([f * 2 * np.pi for f in F])
R = np.array([1, 2, 1])
Y = np.array([0, 0.5, np.pi])
K = np.array([
    [2.1, 3.2, -2.5, 1.2],
    [-1.2, 0.3, -6.1, -5.2],
    [7.9, 3.4, 0.1, 4.2],
])

params = np.column_stack((W, Y, R, K))

kursl = KurSL(params)
phase, amp, signals = kursl.generate(t)

# Precalculate Fourier transform parameters
freq = np.fft.fftfreq(len(t) - 1, dt)
idx = np.r_[freq >= 0] & np.r_[freq < 20]

f, axes = plt.subplots(3, 2, figsize=(8, 8))
for osc in range(len(W)):
    ax = axes[osc, 0]
    ax.plot(t[:-1], signals[osc], 'b')
    ax.plot(t[:-1], amp[osc], 'r')
    ax.plot(t[:-1], -amp[osc], 'r')

    if osc == 0:
        ax.set_title("Time series")
Exemple #12
0
    R_MIN, R_MAX = 0, 5
    K_MIN, K_MAX = -5, 5

    # Making sure that there's W_MIN_DIFF between all W
    while True:
        W = np.random.random(oscN) * W_MAX + W_MIN
        if np.all(np.diff(W) > W_MIN_DIFF): break

    R = np.random.random(oscN) * R_MAX + R_MIN
    Y0 = np.random.random(oscN) * Y_MAX + Y_MIN
    K = np.random.random((oscN, nH * (oscN - 1))) * K_MAX + K_MIN
    K[:] = 0.8 * W[:, None] * K / np.sum(K, axis=1)[:, None]

    theta = np.column_stack((W, Y0, R, K))

    kursl = KurSL(theta)
    _, _, s_gen = kursl.generate(t)
    s_gen = np.sum(s_gen, axis=0)
    t = t[:-1]

    ####################################################
    ## Estimate peaks present in signal
    preprocess = Preprocessor(max_osc=oscN, nH=nH)
    theta_init = preprocess.compute_prior(t, s_gen)
    peaks = theta_init[:, 0] * 0.5 / np.pi

    ####################################################
    ## Plot extracted frequencies in spectrum
    plt.figure()

    freq = np.fft.fftfreq(len(t), dt)