def test_cache(cache_size, max_items, zipf_param, item_count, method): all_items = [i for i in range(int(max_items / 10))] Z = Accu_Zipfian(max_items, zipf_param) if method == "LRU": cache = LRUCache(cache_size) elif method == "Hyper": cache = HyperbolicCache(cache_size, 64) elif method == "LFU": cache = LFUCache(cache_size) cnt_hits = 0 cnt_miss = 0 for i in range(0, item_count): if i % 100 == 0: next_key = random.choice(all_items) else: next_key = 1 + Z.get_next(np.random.random())[0] #if next_key in all_items: # all_items.remove(next_key) ret_val = cache.get(next_key) if ret_val == 1: #found in cache cnt_hits += 1 else: #cache-miss cnt_miss += 1 cache.put(next_key, 0, 0) print(method, "Miss rate:", 100.0 * cnt_miss / (cnt_hits + cnt_miss))
def test_put_update(self): capacity = 1 cache = LRUCache(capacity) cache.put(1, 3) cache.put(1, 5) value = cache.get(1) self.assertEqual(5, value)
def test_put_hit_capacity_update(self): capacity = 2 cache = LRUCache(capacity) cache.put(1, 3) cache.put(2, 5) cache.put(1, 2) value = cache.get(1) self.assertEqual(2, value)
def test_get_expired(self): capacity = 2 cache = LRUCache(capacity) cache.put(1, 3) cache.put(2, 5) cache.get(1) cache.put(3, 6) value = cache.get(2) self.assertEqual(-1, value)
def test_del_should_do_no_op_when_key_not_found(self): lru_cache = LRUCache(3) lru_cache.put(1, "abc") lru_cache.put(2, "edf") lru_cache.put(3, "ghi") lru_cache.delete(4) self.assertEqual(lru_cache._get_head_value(), "ghi", "Failed")
def test_lru_cache_generic(self): lru = LRUCache(2) self.assertEqual(lru.put(1, 1), None) self.assertEqual(lru.put(2, 2), None) self.assertEqual(lru.get(1), 1) self.assertEqual(lru.put(3, 3), None) self.assertEqual(lru.get(2), -1) self.assertEqual(lru.put(4, 4), None) self.assertEqual(lru.get(1), -1) self.assertEqual(lru.get(3), 3) self.assertEqual(lru.get(4), 4)
def test_expired_after_update(self): capacity = 2 cache = LRUCache(capacity) cache.put(2, 1) cache.put(1, 1) cache.put(2, 3) cache.put(4, 1) value = cache.get(1) self.assertEqual(-1, value) value = cache.get(2) self.assertEqual(3, value)
def test_reset_should_clear(self): lru_cache = LRUCache(3) lru_cache.put("a", "abc") lru_cache.put("b", "edf") lru_cache.put("c", "ghi") self.assertEqual(len(lru_cache._get_cache()), 3, "Failed") lru_cache.reset() self.assertEqual(len(lru_cache._get_cache()), 0, "Failed")
def test_get_should_make_it_top(self): lru_cache = LRUCache(3) lru_cache.put(1, "abc") lru_cache.put(2, "edf") lru_cache.put(3, "ghi") self.assertEqual(lru_cache._get_head_key(), 3, "Failed") lru_cache.get(1) self.assertEqual(lru_cache._get_head_key(), 1, "Failed")
def test(self): cache = LRUCache(2) cache.put(1, 1) cache.put(2, 2) cache.get(1) cache.get(1) cache.get(2) cache.put(3, 3) actual = cache.get(2) self.assertEqual(-1, actual)
def test_cache(self): test_actions = ["LRUCache", "put", "put", "put", "put", "put", "get", "put", "get", "get", "put", "get", "put", "put", "put", "get", "put", "get", "get", "get", "get", "put", "put", "get", "get", "get", "put", "put", "get", "put", "get", "put", "get", "get", "get", "put", "put", "put", "get", "put", "get", "get", "put", "put", "get", "put", "put", "put", "put", "get", "put", "put", "get", "put", "put", "get", "put", "put", "put", "put", "put", "get", "put", "put", "get", "put", "get", "get", "get", "put", "get", "get", "put", "put", "put", "put", "get", "put", "put", "put", "put", "get", "get", "get", "put", "put", "put", "get", "put", "put", "put", "get", "put", "put", "put", "get", "get", "get", "put", "put", "put", "put", "get", "put", "put", "put", "put", "put", "put", "put"] test_input = [[10], [10, 13], [3, 17], [6, 11], [10, 5], [9, 10], [13], [2, 19], [2], [3], [5, 25], [8], [9, 22], [5, 5], [1, 30], [11], [9, 12], [7], [5], [8], [9], [4, 30], [9, 3], [9], [10], [10], [6, 14], [3, 1], [3], [10, 11], [8], [2, 14], [1], [5], [4], [11, 4], [12, 24], [5, 18], [13], [7, 23], [8], [12], [3, 27], [2, 12], [5], [2, 9], [13, 4], [8, 18], [1, 7], [6], [9, 29], [8, 21], [5], [6, 30], [1, 12], [10], [4, 15], [7, 22], [11, 26], [8, 17], [9, 29], [5], [3, 4], [11, 30], [12], [4, 29], [3], [9], [6], [3, 4], [1], [10], [3, 29], [10, 28], [1, 20], [11, 13], [3], [3, 12], [3, 8], [10, 9], [3, 26], [8], [7], [5], [13, 17], [2, 27], [11, 15], [12], [9, 19], [2, 15], [3, 16], [1], [12, 17], [9, 1], [6, 19], [4], [5], [5], [8, 1], [11, 7], [5, 2], [9, 28], [1], [2, 2], [7, 4], [4, 22], [7, 24], [9, 26], [13, 28], [11, 26]] lru = None result = [] for i in range(len(test_actions)): if test_actions[i] is "LRUCache": lru = LRUCache(test_input[i][0]) result.append(None) elif test_actions[i] is "get": result.append(lru.get(test_input[i][0])) elif test_actions[i] is "put": lru.put(test_input[i][0], test_input[i][1]) result.append(None) self.assertListEqual([None, None, None, 1, None, -1, None, -1, 3, 4], result)
def test_dynworkload(workload, cache_size, max_items, zipf_param, item_count, method): if method == "LRU": cache = LRUCache(cache_size) elif method == "Hyper": cache = HyperbolicCache(cache_size, 64) elif method == "HyperLFU": cache = HyperLFUCache(cache_size, 100) elif method == "LFU": cache = LFUCache(cache_size) cnt_hits = 0 cnt_miss = 0 for i in range(0, item_count): next_key = workload[i] ret_val = cache.get(next_key) if ret_val == 1: cnt_hits += 1 else: cnt_miss += 1 cache.put(next_key, 0, 0) print(method, "Miss rate:", 100.0 * cnt_miss / (cnt_hits + cnt_miss))
def test(self): cache = LRUCache(3) cache.put(1, 1) #1 cache.put(2, 2) #2,1 self.assertEqual(cache.get(1), 1) #1,2 cache.get(1) #// returns 1 cache.put(3, 3) #// evicts key 2 #3,1,2 self.assertEqual(cache.get(2), 2) #// returns -1 (not found) #2,3,1 cache.put(4, 4) #// evicts key 1 #4,2,3,1 self.assertEqual(cache.get(1), -1) #// returns -1 (not found) self.assertEqual(cache.get(3), 3) #// returns 3 cache.get(4) #// returns 4 self.assertEqual(cache.head.value, 4) cache.put(4, 2) self.assertEqual(cache.size, 3) self.assertEqual(cache.head.value, 2) self.assertEqual(cache.get(4), 2)
def test_put_should_add_new_and_evict_tail(self): lru_cache = LRUCache(3) lru_cache.put(1, "abc") lru_cache.put(2, "edf") lru_cache.put(3, "ghi") lru_cache.put(4, "jkl") self.assertIsNone(lru_cache.get(1), "Failed") self.assertEqual(lru_cache.get(4), "jkl", "Failed")
def test_item_removal_with_get(self): lru_cache = LRUCache(3) lru_cache.put(1, "abc") lru_cache.put(2, "edf") lru_cache.put(3, "ghi") lru_cache.get(1) lru_cache.put(4, "jkl") self.assertIsNone(lru_cache.get(2), "Failed")
def test_put_should_place_item_at_top_and_update_existing_key_value(self): lru_cache = LRUCache(3) lru_cache.put(1, "abc") lru_cache.put(2, "edf") lru_cache.put(3, "ghi") self.assertEqual(lru_cache._get_head_key(), 3, "Failed") lru_cache.put(2, "jkl") self.assertEqual(lru_cache._get_head_key(), 2, "Failed") self.assertEqual(lru_cache.get(2), "jkl", "Failed")
def test_lru_cache(self): cache = LRUCache(2) cache.put(1, 1) cache.put(2, 2) actual = cache.get(1) self.assertEqual(1, actual) cache.put(3, 3) actual = cache.get(2) self.assertEqual(-1, actual) cache.put(4, 4) actual = cache.get(1) self.assertEqual(-1, actual) actual = cache.get(3) self.assertEqual(3, actual) actual = cache.get(4) self.assertEqual(4, actual)
def test_del_should_remove_key_value(self): lru_cache = LRUCache(3) lru_cache.put(1, "abc") lru_cache.put(2, "edf") lru_cache.put(3, "ghi") #deleting head lru_cache.delete(3) self.assertEqual(lru_cache._get_head_key(), 2, "Failed") self.assertEqual(lru_cache._get_head_value(), "edf", "Failed") self.assertIsNone(lru_cache.get(3), "Failed") #deleting tail lru_cache.put(3, "ghi") lru_cache.delete(1) self.assertEqual(lru_cache._get_tail_key(), 2, "Failed")
def test_lru_cache(): my_cache = LRUCache(2) my_cache.put(1, 1) my_cache.put(2, 2) assert len(my_cache) == 2 assert 1 == my_cache.get(1) # returns 1 my_cache.put(3, 3) # evicts key 2 assert 2 not in my_cache.cache_data assert -1 == my_cache.get(2) # returns -1 (not found) my_cache.put(4, 4) # evicts key 1 assert 1 not in my_cache.cache_data assert my_cache.get(1) == -1 # returns -1 (not found) assert my_cache.get(3) == 3 # returns 3 assert my_cache.get(4) == 4 # returns 4
def test_get_key_exists(self): capacity = 1 cache = LRUCache(capacity) cache.put(1, 3) value = cache.get(1) self.assertEqual(3, value)