def test_set_min_max(): # without momentum g = Gauge(5, 10) assert g.get_max() == 10 assert g.get_min() == 0 assert g.get() == 5 g.set_range(max=100, min=10) assert g.get_max() == 100 assert g.get_min() == 10 assert g.get() == 10 g.set_min(10) assert g.get() == 10 g.set_min(5) assert g.get() == 10 g.set_range(max=5, min=0) assert g.get_max() == 5 assert g.get_min() == 0 assert g.get() == 5 # with momentum g = Gauge(5, 10, at=0) g.add_momentum(+1) assert g.determination == [(0, 5), (5, 10)] g.set_max(50, at=0) assert g.determination == [(0, 5), (45, 50)] g.set_min(40, at=0) assert g.determination == [(0, 40), (10, 50)]
def test_thin_momenta(): g = Gauge(0, 100, at=0) for x in range(1000): g.add_momentum(+1000000000, since=x, until=x + 1e-10) assert_all_in_range(g) assert g.get(0) == 0 assert g.get(1001) == 100 for x, y in zip(range(9999), range(1, 10000)): assert 0 <= g.get(x / 10.) <= g.get(y / 10.) <= 100
def test_hypergauge_with_different_base_time(): g = Gauge(0, Gauge(10, 100, at=100), at=0) g.add_momentum(+1) assert g.max_gauge.get(0) == 10 assert g.get(10) == 10 g = Gauge(0, Gauge(10, 100, at=0), at=100) g.add_momentum(+1) assert g.max_gauge.get(100) == 10 assert g.get(110) == 10
def test_over_max_on_hypergauge(): g = Gauge(1, Gauge(10, 20, at=0), at=0) g.max_gauge.add_momentum(+1) with pytest.raises(ValueError): g.set(20, at=0) g.set(20, at=0, outbound=OK) assert g.get(at=0) == 20 g.set(20, at=10) assert g.get(at=10) == 20 assert g.get(at=0) == 20 # past was forgot
def test_decr_max_hyper(): g = Gauge(0, Gauge(10, 100, at=0), at=0) g.add_momentum(+2) g.add_momentum(-1) assert g.base[TIME] == 0 assert g.get(10) == 10 g.max_gauge.decr(5, at=10) assert g.base[TIME] == 10 assert g.get(10) == 5 assert g.get(20) == 5
def test_same_determination(): g = Gauge(10, 100, at=0) g.add_momentum(+1, since=5, until=10) g.add_momentum(+1, since=20, until=30) g.add_momentum(-2, since=50, until=60) fg = FrozenGauge(g) assert fg.get(0) == g.get(0) == 10 assert fg.get(10) == g.get(10) == 15 assert fg.get(30) == g.get(30) == 25 assert fg.get(60) == g.get(60) == 5 assert fg.get(100) == g.get(100) == 5
def test_decr_max_normal(): g = Gauge(0, 10, at=0) g.add_momentum(+2) g.add_momentum(-1) assert g.base[TIME] == 0 assert g.get(10) == 10 g.set_max(5, at=10) g.set(10, outbound=OK, at=10) assert g.base[TIME] == 10 assert g.get(10) == 10 assert g.get(15) == 5 assert g.get(20) == 5
def test_ok_outbound(): g = Gauge(1, 10) with pytest.raises(ValueError): g.set(11) with pytest.raises(ValueError): g.incr(100) with pytest.raises(ValueError): g.decr(100) g.set(10) assert g.get() == 10 g.set(11, outbound=OK) assert g.get() == 11
def test_momenta_order(): g = Gauge(0, 50, at=0) g.add_momentum(+3, since=0, until=5) g.add_momentum(+2, since=1, until=4) g.add_momentum(+1, since=2, until=3) assert g.get(0) == 0 assert g.get(1) == 3 assert g.get(2) == 8 assert g.get(3) == 14 g.decr(1, at=3) assert g.get(3) == 13 assert g.get(4) == 18 assert g.get(5) == 21
def test_clear_momenta(): g = Gauge(0, 10, at=0) g.add_momentum(+1) g.clear_momenta(at=5) assert g.get(5) == 5 assert g.determination == [(5, 5)] # clear momenta when the value is out of the range g.add_momentum(+1) g.set(15, outbound=OK, at=10) g.clear_momenta(at=10) assert g.get(10) == 15 assert g.determination == [(10, 15)] # rebase by Gauge.clear_momenta() g.clear_momenta(100) assert g.get() == 100
def test_forget_past(): g = Gauge(0, 50, at=0) g.add_momentum(+1, since=0, until=5) g.add_momentum(0, since=0) g.add_momentum(0, until=999) assert g.get(0) == 0 assert g.get(1) == 1 assert g.get(2) == 2 assert g.get(3) == 3 assert g.get(4) == 4 assert g.get(5) == 5 assert g.get(10) == 5 assert g.get(20) == 5 assert len(g.momenta) == 3 g.forget_past(at=30) assert len(g.momenta) == 2
def test_clamped_by_max_gauge(): # in_range, decr max -> clamp g = Gauge(10, Gauge(20, 20, at=0), at=0) assert g.get(0) == 10 g.max_gauge.set(5, at=0) assert g.get(0) == 5 # in_range, incr max -> not clamp g.max_gauge.set(15, at=0) assert g.get(0) == 5 # outbound, decr max -> not clamp g.set(20, outbound=OK, at=0) assert g.get(0) == 20 g.max_gauge.set(10, at=0) assert g.get(0) == 20 # time-skewed g = Gauge(10, Gauge(20, 20, at=0), at=0) g.max_gauge.set(5, at=10) assert g.base[TIME] == 10 assert g.base[VALUE] == 5
def test_case8_simple(): max_ = Gauge(10, 10, at=0) max_.add_momentum(-1) g = Gauge(10, max_, at=0) max_.forget_past(at=2) with pytest.raises(ValueError): max_.forget_past(at=1) # forget older past. assert g.get(99999) == approx(0)
def test_clamp_outbound(): g = Gauge(1, 10) g.set(11, outbound=CLAMP) assert g.get() == 10 g.incr(100, outbound=CLAMP) assert g.get() == 10 g.decr(100, outbound=CLAMP) assert g.get() == 0 g.incr(3, outbound=CLAMP) assert g.get() == 3 g.decr(1, outbound=CLAMP) assert g.get() == 2 g.set(100, outbound=OK) g.incr(3, outbound=CLAMP) assert g.get() == 100 g.decr(3, outbound=CLAMP) assert g.get() == 97 g.set(98, outbound=CLAMP) assert g.get() == 97 g.set(97, outbound=CLAMP) assert g.get() == 97 g.set(96, outbound=CLAMP) assert g.get() == 96
def test_case3(): g = Gauge(0, 10, at=0) assert g.get(0) == 0 g.add_momentum(+1, since=0) assert g.get(10) == 10 g.incr(3, outbound=OK, at=11) assert g.get(11) == 13 g.add_momentum(-1, since=13) assert g.get(13) == 13 assert g.get(14) == 12 assert g.get(15) == 11 assert g.get(16) == 10 assert g.get(17) == 10
def test_life(): with t(0): life = Gauge(100, 100) life.add_momentum(-1) assert life.get() == 100 with t(1): assert life.get() == 99 with t(2): assert life.get() == 98 with t(10): assert life.get() == 90 life.incr(1) assert life.get() == 91 with t(11): assert life.get() == 90
def test_forget_past_before_base_time(): g = Gauge(0, 100, at=100) g.add_momentum(+1) assert g.get(100) == 0 assert g.get(150) == 50 assert g.get(200) == 100 with pytest.raises(ValueError): g.forget_past(at=50) assert g.get(100) == 0 assert g.get(150) == 50 assert g.get(200) == 100 g.forget_past(at=150) assert g.get(100) == 50 assert g.get(150) == 50 assert g.get(200) == 100 with pytest.raises(ValueError): g.forget_past(0, at=100) assert g.get(100) == 50 assert g.get(150) == 50 assert g.get(200) == 100
def test_no_momentum(): g = Gauge(1, 10, at=0) assert g.determination == [(0, 1)] assert g.get() == 1
def test_invalidate_returns(): g = Gauge(0, 100, at=0) assert not g.invalidate() g.get(0) assert g.invalidate() assert not g.invalidate()
def test_case5(): g = Gauge(1, 1, 0, at=0) for x in range(11): g.add_momentum(-0.1, since=x, until=x + 1) assert g.get(11) == 0 # adjusted by min=0
def test_hypergauge_past_bugs(zigzag, bidir): """Regression testing for hyper-gauge.""" # just one momentum g1 = Gauge(5, Gauge(5, 10, at=0), Gauge(5, 10, at=0), at=0) g1.max_gauge.add_momentum(+1) g1.min_gauge.add_momentum(-1) assert g1.determination == [(0, 5)] g1.add_momentum(+0.1, until=100) assert g1.determination == [(0, 5), (50, 10), (100, 10)] # floating-point inaccuracy problem 1 g1 = Gauge(3, bidir, zigzag, at=0) g1.add_momentum(+6, since=0, until=1) g1.add_momentum(-6, since=1, until=2) g1.add_momentum(+6, since=2, until=3) g1.add_momentum(-6, since=3, until=4) g1.add_momentum(+6, since=4, until=5) g1.add_momentum(-6, since=5, until=6) g1.add_momentum(+6, since=6, until=7) g1.add_momentum(-6, since=7, until=8) g1.add_momentum(+6, since=8, until=9) g1.add_momentum(-6, since=9, until=10) g1.add_momentum(+6, since=10, until=11) g1.add_momentum(-6, since=11, until=12) assert round_determination(g1.determination, precision=2) == [ (0, 3), (0.4, 5.4), (1, 6), (1.8, 1.2), (2, 1), (3, 7), (3.8, 2.2), (4, 2), (4.57, 5.43), (5, 5), (5.71, 0.71), (6, 1), (6.8, 5.8), (7, 6), (7.6, 2.4), (8, 2), (8.83, 7), (9, 7), (9.8, 2.2), (10, 2), (10.57, 5.43), (11, 5), (11.71, 0.71), (12, 1)] # float problem 2 g2 = Gauge(0, Gauge(1, 1, at=0), at=0) for x in range(10): g2.add_momentum(+0.1, since=x, until=x + 1) g2.max_gauge.add_momentum(-0.1, since=0, until=6) g2.max_gauge.add_momentum(+0.5, since=6, until=10) assert round(g2.get(5), 1) == 0.5 assert round(g2.get(6), 1) == 0.4 assert round(g2.get(7), 1) == 0.5 assert round(g2.get(8), 1) == 0.6 assert round(g2.get(9), 1) == 0.7 assert round(g2.get(10), 1) == 0.8 # float problem 3 g3_max_max = Gauge(3, bidir, zigzag, at=0) g3_max_max.add_momentum(+6, since=0, until=1) g3_max_max.add_momentum(-6, since=1, until=2) g3_max_max.add_momentum(+6, since=2, until=3) g3_max_max.add_momentum(-6, since=3, until=4) g3_max_max.add_momentum(+6, since=4, until=5) g3_max_max.add_momentum(-6, since=5, until=6) g3_max_max.add_momentum(+6, since=6, until=7) g3_max_max.add_momentum(-6, since=7, until=8) g3_max_max.add_momentum(+6, since=8, until=9) g3_max_max.add_momentum(-6, since=9, until=10) g3_max_max.add_momentum(+6, since=10, until=11) g3_max_max.add_momentum(-6, since=11, until=12) g3_max = Gauge(0, g3_max_max, at=0) for x in range(10): g3_max.add_momentum(+0.1, since=x) r = random.Random(10) g3 = Gauge(0, shift_gauge(zigzag, +3), g3_max, at=0) for x in range(10): g3.add_momentum(r.uniform(-10, 10), since=x, until=x + 1) assert round(g3.get(9), 1) == 2.9 # not 2.4133871928 # bound at first g4 = Gauge(0, 10, Gauge(0, 10, at=1), at=0) g4.min_gauge.add_momentum(+1, until=11) g4.add_momentum(-1, until=10) assert g4.get(10) == 9 # not -10 assert g4.determination == [(0, 0), (1, 0), (10, 9), (11, 10)] # floor is dense than ceil r = random.Random(2810856076715324514) g5 = Gauge(0, shift_gauge(zigzag, +3), g3, at=0) for x in range(4): g5.add_momentum(r.uniform(-10, 10), since=x, until=x + 1) assert round(g5.get(4), 1) == 5.0 # not 11.8
def test_hypergauge_past_bugs(zigzag, bidir): """Regression testing for hyper-gauge.""" # just one momentum g1 = Gauge(5, Gauge(5, 10, at=0), Gauge(5, 10, at=0), at=0) g1.max_gauge.add_momentum(+1) g1.min_gauge.add_momentum(-1) assert g1.determination == [(0, 5)] g1.add_momentum(+0.1, until=100) assert g1.determination == [(0, 5), (50, 10), (100, 10)] # floating-point inaccuracy problem 1 g1 = Gauge(3, bidir, zigzag, at=0) g1.add_momentum(+6, since=0, until=1) g1.add_momentum(-6, since=1, until=2) g1.add_momentum(+6, since=2, until=3) g1.add_momentum(-6, since=3, until=4) g1.add_momentum(+6, since=4, until=5) g1.add_momentum(-6, since=5, until=6) g1.add_momentum(+6, since=6, until=7) g1.add_momentum(-6, since=7, until=8) g1.add_momentum(+6, since=8, until=9) g1.add_momentum(-6, since=9, until=10) g1.add_momentum(+6, since=10, until=11) g1.add_momentum(-6, since=11, until=12) assert round_determination(g1.determination, precision=2) == [ (0, 3), (0.4, 5.4), (1, 6), (1.8, 1.2), (2, 1), (3, 7), (3.8, 2.2), (4, 2), (4.57, 5.43), (5, 5), (5.71, 0.71), (6, 1), (6.8, 5.8), (7, 6), (7.6, 2.4), (8, 2), (8.83, 7), (9, 7), (9.8, 2.2), (10, 2), (10.57, 5.43), (11, 5), (11.71, 0.71), (12, 1) ] # float problem 2 g2 = Gauge(0, Gauge(1, 1, at=0), at=0) for x in range(10): g2.add_momentum(+0.1, since=x, until=x + 1) g2.max_gauge.add_momentum(-0.1, since=0, until=6) g2.max_gauge.add_momentum(+0.5, since=6, until=10) assert round(g2.get(5), 1) == 0.5 assert round(g2.get(6), 1) == 0.4 assert round(g2.get(7), 1) == 0.5 assert round(g2.get(8), 1) == 0.6 assert round(g2.get(9), 1) == 0.7 assert round(g2.get(10), 1) == 0.8 # float problem 3 g3_max_max = Gauge(3, bidir, zigzag, at=0) g3_max_max.add_momentum(+6, since=0, until=1) g3_max_max.add_momentum(-6, since=1, until=2) g3_max_max.add_momentum(+6, since=2, until=3) g3_max_max.add_momentum(-6, since=3, until=4) g3_max_max.add_momentum(+6, since=4, until=5) g3_max_max.add_momentum(-6, since=5, until=6) g3_max_max.add_momentum(+6, since=6, until=7) g3_max_max.add_momentum(-6, since=7, until=8) g3_max_max.add_momentum(+6, since=8, until=9) g3_max_max.add_momentum(-6, since=9, until=10) g3_max_max.add_momentum(+6, since=10, until=11) g3_max_max.add_momentum(-6, since=11, until=12) g3_max = Gauge(0, g3_max_max, at=0) for x in range(10): g3_max.add_momentum(+0.1, since=x) r = random.Random(10) g3 = Gauge(0, shift_gauge(zigzag, +3), g3_max, at=0) for x in range(10): g3.add_momentum(r.uniform(-10, 10), since=x, until=x + 1) assert round(g3.get(9), 1) == 2.9 # not 2.4133871928 # bound at first g4 = Gauge(0, 10, Gauge(0, 10, at=1), at=0) g4.min_gauge.add_momentum(+1, until=11) g4.add_momentum(-1, until=10) assert g4.get(10) == 9 # not -10 assert g4.determination == [(0, 0), (1, 0), (10, 9), (11, 10)] # floor is dense than ceil r = random.Random(2810856076715324514) g5 = Gauge(0, shift_gauge(zigzag, +3), g3, at=0) for x in range(4): g5.add_momentum(r.uniform(-10, 10), since=x, until=x + 1) assert round(g5.get(4), 1) == 5.0 # not 11.8