def test_merge(self): observer1 = ObserverAggregator() observer2 = ObserverAggregator() mmsc_checkpoint1 = MinMaxSumCountAggregator._TYPE(3, 150, 101, 3) mmsc_checkpoint2 = MinMaxSumCountAggregator._TYPE(1, 33, 44, 2) checkpoint1 = ObserverAggregator._TYPE(*(mmsc_checkpoint1 + (23, ))) checkpoint2 = ObserverAggregator._TYPE(*(mmsc_checkpoint2 + (27, ))) observer1.mmsc.checkpoint = mmsc_checkpoint1 observer2.mmsc.checkpoint = mmsc_checkpoint2 observer1.checkpoint = checkpoint1 observer2.checkpoint = checkpoint2 observer1.merge(observer2) self.assertEqual( observer1.checkpoint, ( min(checkpoint1.min, checkpoint2.min), max(checkpoint1.max, checkpoint2.max), checkpoint1.sum + checkpoint2.sum, checkpoint1.count + checkpoint2.count, checkpoint2.last, ), )
def test_merge(self): mmsc1 = MinMaxSumCountAggregator() mmsc2 = MinMaxSumCountAggregator() checkpoint1 = MinMaxSumCountAggregator._TYPE(3, 150, 101, 3) checkpoint2 = MinMaxSumCountAggregator._TYPE(1, 33, 44, 2) mmsc1.checkpoint = checkpoint1 mmsc2.checkpoint = checkpoint2 mmsc1.merge(mmsc2) self.assertEqual( mmsc1.checkpoint, MinMaxSumCountAggregator._merge_checkpoint(checkpoint1, checkpoint2), )
def test_merge_with_empty(self): mmsc1 = MinMaxSumCountAggregator() mmsc2 = MinMaxSumCountAggregator() checkpoint1 = MinMaxSumCountAggregator._TYPE(3, 150, 101, 3) mmsc1.checkpoint = checkpoint1 mmsc1.merge(mmsc2) self.assertEqual(mmsc1.checkpoint, checkpoint1)
def test_merge_with_empty(self): observer1 = ObserverAggregator() observer2 = ObserverAggregator() mmsc_checkpoint1 = MinMaxSumCountAggregator._TYPE(3, 150, 101, 3) checkpoint1 = ObserverAggregator._TYPE(*(mmsc_checkpoint1 + (23, ))) observer1.mmsc.checkpoint = mmsc_checkpoint1 observer1.checkpoint = checkpoint1 observer1.merge(observer2) self.assertEqual(observer1.checkpoint, checkpoint1)
def call_update(mmsc): min_ = float("inf") max_ = float("-inf") sum_ = 0 count_ = 0 for _ in range(0, 100000): val = random.getrandbits(32) mmsc.update(val) if val < min_: min_ = val if val > max_: max_ = val sum_ += val count_ += 1 return MinMaxSumCountAggregator._TYPE(min_, max_, sum_, count_)
def test_merge(self): mmsc1 = MinMaxSumCountAggregator() mmsc2 = MinMaxSumCountAggregator() checkpoint1 = MinMaxSumCountAggregator._TYPE(3, 150, 101, 3) checkpoint2 = MinMaxSumCountAggregator._TYPE(1, 33, 44, 2) mmsc1.checkpoint = checkpoint1 mmsc2.checkpoint = checkpoint2 mmsc1.last_update_timestamp = 100 mmsc2.last_update_timestamp = 123 mmsc1.merge(mmsc2) mmsc1_checkpoint = mmsc1.checkpoint mmsc1.checkpoint = checkpoint1 mmsc2.checkpoint = checkpoint2 mmsc1.merge(mmsc2) self.assertEqual(mmsc1_checkpoint, mmsc1.checkpoint) self.assertEqual(mmsc1.last_update_timestamp, 123)
def test_concurrent_update_and_checkpoint(self): mmsc = MinMaxSumCountAggregator() checkpoint_total = MinMaxSumCountAggregator._TYPE(2**32, 0, 0, 0) with concurrent.futures.ThreadPoolExecutor(max_workers=1) as ex: fut = ex.submit(self.call_update, mmsc) while not fut.done(): mmsc.take_checkpoint() checkpoint_total = MinMaxSumCountAggregator._merge_checkpoint( checkpoint_total, mmsc.checkpoint) mmsc.take_checkpoint() checkpoint_total = MinMaxSumCountAggregator._merge_checkpoint( checkpoint_total, mmsc.checkpoint) self.assertEqual(checkpoint_total, fut.result())
def test_concurrent_update_and_checkpoint(self): mmsc0 = MinMaxSumCountAggregator() mmsc1 = MinMaxSumCountAggregator() mmsc1.checkpoint = MinMaxSumCountAggregator._TYPE(2**32, 0, 0, 0) with concurrent.futures.ThreadPoolExecutor(max_workers=1) as ex: fut = ex.submit(self.call_update, mmsc0) while not fut.done(): mmsc0.take_checkpoint() mmsc0.merge(mmsc1) mmsc1.checkpoint = mmsc0.checkpoint mmsc0.take_checkpoint() mmsc0.merge(mmsc1) self.assertEqual(mmsc0.checkpoint, fut.result())