def test_weighted(): np.random.seed(1234) t = np.arange(100) y0 = (+0.4 * (t >= 5) + 0.9 * (t >= 10) - 0.2 * (t >= 20) + 0.2 * (t >= 50) + 1.1 * (t >= 70)) y = y0 + 0.05 * np.random.rand(y0.size) y = y.tolist() w = [1] * len(y) y[15] = 2 right, values, dists = solve_potts(y, w=w, gamma=0.1) assert right == [5, 10, 15, 16, 20, 50, 70, 100] steps = detect_steps(y, w=w) steps_pos = [s[0] for s in steps] assert steps_pos == [0, 5, 10, 15, 16, 20, 50, 70] w[15] = 0.1 right, values, dists = solve_potts(y, w=w, gamma=0.1) assert right == [5, 10, 20, 50, 70, 100] steps = detect_steps(y, w=w) steps_pos = [s[0] for s in steps] assert steps_pos == [0, 5, 10, 20, 50, 70] # Missing weights and data should be handled properly y[35] = None w[23] = None steps = detect_steps(y, w=w) steps_pos = [s[0] for s in steps] assert steps_pos == [0, 5, 10, 20, 50, 70]
def test_zero_weight(): t = list(range(50)) y = [1.0 * (tt > 25) for tt in t] w = [0 if tt >= 20 and tt < 30 else 1 for tt in t] # Due to zero weight, part of the data is not assigned to belong to a step steps = detect_steps(y, w=w) steps_pos = [s[:2] for s in steps] assert steps_pos == [(0, 20), (30, 50)] # A small weight allows to find the actual step w = [1e-6 if ww == 0 else 1 for ww in w] steps = detect_steps(y, w=w) steps_pos = [s[:2] for s in steps] assert steps_pos == [(0, 26), (26, 50)]
def test_weighted(): np.random.seed(1234) t = np.arange(100) y0 = (+ 0.4 * (t >= 5) + 0.9 * (t >= 10) - 0.2 * (t >= 20) + 0.2 * (t >= 50) + 1.1 * (t >= 70)) y = y0 + 0.05 * np.random.rand(y0.size) y = y.tolist() w = [1]*len(y) y[15] = 2 right, values, dists = solve_potts(y, w=w, gamma=0.1) assert right == [5, 10, 15, 16, 20, 50, 70, 100] steps = detect_steps(y, w=w) steps_pos = [s[0] for s in steps] assert steps_pos == [0, 5, 10, 15, 16, 20, 50, 70] w[15] = 0.1 right, values, dists = solve_potts(y, w=w, gamma=0.1) assert right == [5, 10, 20, 50, 70, 100] steps = detect_steps(y, w=w) steps_pos = [s[0] for s in steps] assert steps_pos == [0, 5, 10, 20, 50, 70] # Missing weights and data should be handled properly y[35] = None w[23] = None steps = detect_steps(y, w=w) steps_pos = [s[0] for s in steps] assert steps_pos == [0, 5, 10, 20, 50, 70]
def test_detect_regressions(use_rangemedian): try: np.random.seed(1234) except NameError: # work around a bug in old pypy/pytest pytest.skip("test needs numpy") return for seed in [1234, 5678, 8901, 2345]: np.random.seed(seed) t = np.arange(4000) y = 0.7 * np.random.rand(t.size) y -= 0.3 * (t >= 1000) y += 2.0 * (t >= 3234 + (seed % 123)) y += 2.0 * ((t >= 3264 + (seed % 53)) & (t < 3700)) y -= 2.7 * ((t >= 3350) & (t < 3500 + (seed % 71))) y = y.tolist() y[123] = None y[1234] = np.nan steps = detect_steps(y) steps_lr = [(l, r) for l, r, _, _, _ in steps] k = steps[0][1] assert 990 <= k <= 1010 assert steps_lr == [(0, k), (k, 3234 + (seed % 123)), (3234 + (seed % 123), 3264 + (seed % 53)), (3264 + (seed % 53), 3350), (3350, 3500 + (seed % 71)), (3500 + (seed % 71), 3700), (3700, 4000)] steps_v = [x[2] for x in steps] assert np.allclose(steps_v, [0.35, 0.05, 2.05, 4.05, 1.15, 4.05, 2.05], rtol=0.3) # The expected mean error is 0.7 <|U(0,1) - 1/2|> = 0.7/4 steps_err = [x[4] for x in steps] assert np.allclose(steps_err, [0.7 / 4] * 7, rtol=0.3) # Check detect_regressions new_value, best_value, regression_pos = detect_regressions(steps) assert regression_pos == [ (3233 + (seed % 123), (3233 + (seed % 123) + 1), steps_v[1], steps_v[2]), (3499 + (seed % 71), 3499 + (seed % 71) + 1, steps_v[4], steps_v[5]) ] assert np.allclose(best_value, 0.7 / 2 - 0.3, rtol=0.3, atol=0) assert np.allclose(new_value, 0.7 / 2 - 0.3 + 2, rtol=0.3, atol=0)
def test_detect_regressions(use_rangemedian): try: np.random.seed(1234) except NameError: # work around a bug in old pypy/pytest pytest.skip("test needs numpy") return for seed in [1234, 5678, 8901, 2345]: np.random.seed(seed) t = np.arange(4000) y = 0.7 * np.random.rand(t.size) y -= 0.3 * (t >= 1000) y += 2.0 * (t >= 3234 + (seed % 123)) y += 2.0 * ((t >= 3264 + (seed % 53)) & (t < 3700)) y -= 2.7 * ((t >= 3350) & (t < 3500 + (seed % 71))) y = y.tolist() y[123] = None y[1234] = np.nan steps = detect_steps(y) steps_lr = [(l, r) for l, r, _, _, _ in steps] k = steps[0][1] assert 990 <= k <= 1010 assert steps_lr == [(0, k), (k, 3234 + (seed % 123)), (3234 + (seed % 123), 3264 + (seed % 53)), (3264 + (seed % 53), 3350), (3350, 3500 + (seed % 71)), (3500 + (seed % 71), 3700), (3700, 4000)] steps_v = [x[2] for x in steps] assert np.allclose(steps_v, [0.35, 0.05, 2.05, 4.05, 1.15, 4.05, 2.05], rtol=0.3) # The expected mean error is 0.7 <|U(0,1) - 1/2|> = 0.7/4 steps_err = [x[4] for x in steps] assert np.allclose(steps_err, [0.7/4]*7, rtol=0.3) # Check detect_regressions new_value, best_value, regression_pos = detect_regressions(steps) assert regression_pos == [(3233 + (seed % 123), (3233 + (seed % 123) + 1), steps_v[1], steps_v[2]), (3499 + (seed % 71), 3499 + (seed % 71) + 1, steps_v[4], steps_v[5])] assert np.allclose(best_value, 0.7/2 - 0.3, rtol=0.3, atol=0) assert np.allclose(new_value, 0.7/2 - 0.3 + 2, rtol=0.3, atol=0)
def time_detect_regressions(self): steps = step_detect.detect_steps(self.y) step_detect.detect_regressions(steps)