class Equilibrium(object): gauge = None speed = None def __init__(self, medium, speed): self.speed = speed self.medium = medium @property def medium(self): return self._medium @medium.setter def medium(self, medium, at=None): at = now_or(at) self._medium = medium if self.gauge is None: self.gauge = Gauge(medium, medium, medium) return value = self.gauge.clear_momenta(at) if value == medium: self.gauge._set_limits(medium, medium, at=at) return if value < medium: self.gauge.set_max(medium, at=at) velocity = +self.speed elif value > medium: self.gauge.set_min(medium, at=at) velocity = -self.speed self.gauge.add_momentum(velocity, since=at)
def test_case1(): g = Gauge(0, 5, at=0) g.add_momentum(+1) g.add_momentum(-2, since=1, until=3) g.add_momentum(+1, since=5, until=7) assert g.determination == [ (0, 0), (1, 1), (2, 0), (3, 0), (5, 2), (6.5, 5), (7, 5)]
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_case1(): g = Gauge(0, 5, at=0) g.add_momentum(+1) g.add_momentum(-2, since=1, until=3) g.add_momentum(+1, since=5, until=7) assert g.determination == [(0, 0), (1, 1), (2, 0), (3, 0), (5, 2), (6.5, 5), (7, 5)]
def test_in_range(): g = Gauge(20, 10, at=0) assert not g.in_range(0) assert not g.in_range(20) g.add_momentum(-1) assert not g.in_range(0) assert g.in_range(20)
def test_hypergauge_hybrid1(): # hybrid 1: same velocity of `g` and `g.max_gauge`. # (suggested by @hybrid0) g = Gauge(0, Gauge(1, 5, at=0), at=0) g.add_momentum(+1) g.max_gauge.add_momentum(+1, since=1) assert g.determination == [(0, 0), (1, 1), (5, 5)]
def test_make_momentum(): g = Gauge(0, 10, at=0) m = g.add_momentum(+1) assert isinstance(m, Momentum) with pytest.raises(TypeError): g.add_momentum(m, since=1) with pytest.raises(TypeError): g.add_momentum(m, until=2)
def test_intersection_of_vertical_segment_reversed(): f = FakeGauge([(0, 0), (1e-309, -1)]) g = Gauge(-2.5, 0, f, at=-1) g.add_momentum(+2) g.add_momentum(-1) assert \ round_determination(g.determination, precision=1) == \ [(-1, -2.5), (0, -0.5), (0.5, 0)]
def test_hypergauge_case2(): g = Gauge(12, 100, at=0) g.add_momentum(+1, since=1, until=6) g.add_momentum(-1, since=3, until=8) g.set_max(Gauge(15, 15, at=0), at=0) g.max_gauge.add_momentum(-1, until=4) g.max_gauge.add_momentum(+1, since=4, until=6) assert g.determination == [ (0, 12), (1, 12), (2, 13), (3, 12), (4, 11), (6, 11), (8, 9)]
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_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_case2(): g = Gauge(12, 100, at=0) g.add_momentum(+1, since=1, until=6) g.add_momentum(-1, since=3, until=8) g.set_max(Gauge(15, 15, at=0), at=0) g.max_gauge.add_momentum(-1, until=4) g.max_gauge.add_momentum(+1, since=4, until=6) assert g.determination == [(0, 12), (1, 12), (2, 13), (3, 12), (4, 11), (6, 11), (8, 9)]
def random_gauge2(random=random, far=1000, near=1, until=20): # 0 <= g <= (near ~ far) g_max = Gauge(random.uniform(near, far), far, near, at=0) value = random.uniform(0, g_max.max_value) g = Gauge(value, g_max, at=0) for x in range(0, until, 5): g_max.add_momentum(random.uniform(-far, +far), since=x, until=x + 5) for x in range(0, until, 2): g.add_momentum(random.uniform(-far, +far), since=x, until=x + 2) return g
def test_pickle(): g = Gauge(0, 10, at=0) r = Random(17171771) for x in range(10000): since = r.randrange(1000) until = since + 1 + r.randrange(1000) g.add_momentum(r.uniform(-10, +10), since=since, until=until) data = pickle.dumps(g) g2 = pickle.loads(data) assert g.determination == g2.determination
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_set_range(): g = Gauge(0, 100, at=0) g.add_momentum(+1) assert g.determination == [(0, 0), (100, 100)] g.set_range(Gauge(100, 100, at=0), Gauge(0, 100, at=0), at=0) g.max_gauge.add_momentum(-1, until=40) g.min_gauge.add_momentum(+1, until=40) assert g.determination == [(0, 0), (60, 60)] g.clear_momenta(at=30) g.add_momentum(-1) assert g.determination == [(30, 30), (40, 40)]
def test_hypergauge_case3(): g = Gauge(12, 100, at=0) g.add_momentum(+1, since=1, until=6) g.add_momentum(-1, since=3, until=8) g.set_max(10, at=0) g.set(12, outbound=OK, at=0) assert g.determination == [(0, 12), (1, 12), (3, 12), (5, 10), (6, 10), (8, 8)] g.set_max(Gauge(10, 100, at=0), at=0) assert g.determination == [(0, 12), (1, 12), (3, 12), (5, 10), (6, 10), (8, 8)]
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_hypergauge_case3(): g = Gauge(12, 100, at=0) g.add_momentum(+1, since=1, until=6) g.add_momentum(-1, since=3, until=8) g.set_max(10, at=0) g.set(12, outbound=OK, at=0) assert g.determination == [ (0, 12), (1, 12), (3, 12), (5, 10), (6, 10), (8, 8)] g.set_max(Gauge(10, 100, at=0), at=0) assert g.determination == [ (0, 12), (1, 12), (3, 12), (5, 10), (6, 10), (8, 8)]
def test_intersection_of_vertical_segment(): assert 0 != 1e-309 assert math.isinf(1 / 1e-309) f = FakeGauge([(0, 0), (1e-309, 1)]) assert f.get(0.000000000000000000000) == 0 assert f.get(0.000000000000000000001) == 1 g = Gauge(2.5, f, at=-1) g.add_momentum(-2) g.add_momentum(+1) assert \ round_determination(g.determination, precision=1) == \ [(-1, 2.5), (0, 0.5), (0.5, 0)]
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_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 zigzag(): g = Gauge(1, Gauge(2, 3, 2, at=0), Gauge(1, 1, 0, at=0), at=0) for x in range(6): g.max_gauge.add_momentum(+1, since=x * 2, until=x * 2 + 1) g.max_gauge.add_momentum(-1, since=x * 2 + 1, until=x * 2 + 2) g.min_gauge.add_momentum(-1, since=x * 2, until=x * 2 + 1) g.min_gauge.add_momentum(+1, since=x * 2 + 1, until=x * 2 + 2) for x in range(3): t = sum(y * 2 for y in range(x + 1)) g.add_momentum(+1, since=t, until=t + (x + 1)) g.add_momentum(-1, since=t + (x + 1), until=t + 2 * (x + 1)) return g
def test_decr_max_before_base_time(): # decr max earlier than the gauge's base time. g = Gauge(0, Gauge(10, 100, at=10), at=5) g.add_momentum(+1) assert g.determination == [(5, 0), (15, 10)] with pytest.raises(ValueError): g.max_gauge.decr(5, at=0) assert g.determination == [(5, 0), (15, 10)] g.max_gauge.incr(10, at=10) assert g.determination == [(10, 5), (25, 20)]
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_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_hypergauge_zigzag2(): g = Gauge(2, Gauge(3, 5, 3, at=0), Gauge(2, 2, 0, at=0), at=0) for x in range(5): g.max_gauge.add_momentum(+1, since=x * 4, until=x * 4 + 2) g.max_gauge.add_momentum(-1, since=x * 4 + 2, until=x * 4 + 4) g.min_gauge.add_momentum(-1, since=x * 4, until=x * 4 + 2) g.min_gauge.add_momentum(+1, since=x * 4 + 2, until=x * 4 + 4) for x in range(4): t = sum(y * 2 for y in range(x + 1)) g.add_momentum(+1, since=t, until=t + (x + 1)) g.add_momentum(-1, since=t + (x + 1), until=t + 2 * (x + 1)) assert g.determination == [(0, 2), (1, 3), (2, 2), (3.5, 3.5), (4, 3), (6, 1), (8, 3), (9, 4), (11.5, 1.5), (12, 2), (14.5, 4.5), (16, 3), (18.5, 0.5), (20, 2)]
def shift_gauge(gauge, delta=0): """Adds the given delta to a gauge.""" if gauge.max_gauge is None: max_ = gauge.max_value + delta else: max_ = shift_gauge(gauge.max_gauge, delta) if gauge.min_gauge is None: min_ = gauge.min_value + delta else: min_ = shift_gauge(gauge.min_gauge, delta) g = Gauge(gauge.base[VALUE] + delta, max_, min_, gauge.base[TIME]) for momentum in gauge.momenta: g.add_momentum(momentum) return g
def test_velocity(): g = Gauge(0, 10, at=0) g.add_momentum(+1, since=2) g.add_momentum(+1, since=4, until=6) assert g.velocity(at=0) == 0 assert g.velocity(at=2) == +1 assert g.velocity(at=3) == +1 assert g.velocity(at=4) == +2 assert g.velocity(at=5) == +2 assert g.velocity(at=6) == +1 assert g.velocity(at=7) == +1 assert g.velocity(at=8) == +1 assert g.velocity(at=9) == +1 assert g.velocity(at=10) == 0
def test_hypergauge_zigzag2(): g = Gauge(2, Gauge(3, 5, 3, at=0), Gauge(2, 2, 0, at=0), at=0) for x in range(5): g.max_gauge.add_momentum(+1, since=x * 4, until=x * 4 + 2) g.max_gauge.add_momentum(-1, since=x * 4 + 2, until=x * 4 + 4) g.min_gauge.add_momentum(-1, since=x * 4, until=x * 4 + 2) g.min_gauge.add_momentum(+1, since=x * 4 + 2, until=x * 4 + 4) for x in range(4): t = sum(y * 2 for y in range(x + 1)) g.add_momentum(+1, since=t, until=t + (x + 1)) g.add_momentum(-1, since=t + (x + 1), until=t + 2 * (x + 1)) assert g.determination == [ (0, 2), (1, 3), (2, 2), (3.5, 3.5), (4, 3), (6, 1), (8, 3), (9, 4), (11.5, 1.5), (12, 2), (14.5, 4.5), (16, 3), (18.5, 0.5), (20, 2)]
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_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_permanent(): g = Gauge(10, 10, at=0) g.add_momentum(-1) assert g.determination == [(0, 10), (10, 0)] g = Gauge(0, 10, at=0) g.add_momentum(+1) assert g.determination == [(0, 0), (10, 10)] g = Gauge(12, 10, at=0) g.add_momentum(-1) assert g.determination == [(0, 12), (2, 10), (12, 0)] g = Gauge(5, 10, at=0) g.add_momentum(+1, since=3) assert g.determination == [(0, 5), (3, 5), (8, 10)] g = Gauge(5, 10, at=0) g.add_momentum(+1, until=8) assert g.determination == [(0, 5), (5, 10), (8, 10)]
def test_clear_momentum_events(): g = Gauge(0, 10, at=0) m = g.add_momentum(+1, since=10, until=20) assert list(g.momentum_events()) == \ [(0, NONE, None), (10, ADD, m), (20, REMOVE, m), (+inf, NONE, None)] # assert len(g._events) == 2 g.remove_momentum(m) assert list(g.momentum_events()) == [(0, NONE, None), (+inf, NONE, None)]