d5d163f098
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
1218 lines
208 KiB
Plaintext
1218 lines
208 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"id": "71f85f2a-423f-44d2-b80d-da9ac8d3961a",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import simpy\n",
|
||
"import random\n",
|
||
"import numpy as np\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"import pandas as pd\n",
|
||
"from enum import Enum\n",
|
||
"import os\n",
|
||
"import shutil\n",
|
||
"from tqdm import tqdm\n",
|
||
"import math\n",
|
||
"from dataclasses import dataclass, field\n",
|
||
"from typing import List, Union, Dict\n",
|
||
"\n",
|
||
"# Constants\n",
|
||
"SEED = 42\n",
|
||
"ACCESS_COUNT_LIMIT = 1000 # Total time to run the simulation\n",
|
||
"EXPERIMENT_BASE_DIR = \"./experiments/\"\n",
|
||
"TEMP_BASE_DIR = \"./.aoi_cache/\"\n",
|
||
"BASE_FILE = pd.read_csv(\"../calculated.csv\")\n",
|
||
"BASE_FILE.index += 1\n",
|
||
"\n",
|
||
"ZIPF_CONSTANT = 2 # Shape parameter for the Zipf distribution (controls skewness) Needs to be: 1< \n",
|
||
"\n",
|
||
"# Set random seeds\n",
|
||
"random.seed(SEED)\n",
|
||
"np.random.seed(SEED)\n",
|
||
"\n",
|
||
"os.makedirs(TEMP_BASE_DIR, exist_ok=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "d88effd8-d92b-47d1-9e15-527166073e81",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Types of cache\n",
|
||
"class EvictionStrategy(Enum):\n",
|
||
" LRU = 1\n",
|
||
" RANDOM_EVICTION = 2\n",
|
||
" TTL = 3"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "1d6a3c67-f9a5-4d9c-8ade-e1ca6944867c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"@dataclass\n",
|
||
"class DatabaseObject:\n",
|
||
" id: int\n",
|
||
" data: str\n",
|
||
" lambda_value: int\n",
|
||
" mu_value: Union[float, None]\n",
|
||
" ttl: Union[float, None]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "f40af914-a6c3-4e44-b7de-b3b40a743fb2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"@dataclass\n",
|
||
"class CacheObject:\n",
|
||
" id: int # id of object\n",
|
||
" data: DatabaseObject # body of object\n",
|
||
" initial_fetch_timer: float # time at which the object was initially pulled into the cache (object_start_time)\n",
|
||
" age_timer: float # time at which the object was last pulled into the cache (initial fetch)\n",
|
||
" next_refresh: Union[float, None] # scheduled time for the object to be requested (for refresh cache)\n",
|
||
" next_expiry: Union[float, None] # scheduled time for the object to be evicted (for ttl cache) (ttl)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"id": "00a944e4-842b-49ba-bb36-587d9c12fdf4",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Base class for all cache types\n",
|
||
"@dataclass\n",
|
||
"class SimulationConfig:\n",
|
||
" db_objects: Union[int, List[DatabaseObject]]\n",
|
||
" cache_size: int\n",
|
||
" eviction_strategy: EvictionStrategy\n",
|
||
"\n",
|
||
" def __post_init__(self):\n",
|
||
" if not hasattr(self, 'eviction_strategy') or self.eviction_strategy is None:\n",
|
||
" raise ValueError(\"Eviction strategy must be defined in subclasses.\")\n",
|
||
" \n",
|
||
" def generate_objects(self):\n",
|
||
" if isinstance(self.db_objects, int):\n",
|
||
" self.db_objects = [\n",
|
||
" DatabaseObject(id=i, data=f\"Generated Object {i}\", lambda_value=np.random.zipf(ZIPF_CONSTANT), mu_value=None, ttl=None) \n",
|
||
" for i in range(self.db_objects)\n",
|
||
" ]\n",
|
||
"\n",
|
||
" def from_file(self, path: str, lambda_column_name: str):\n",
|
||
" df = pd.read_csv(path)\n",
|
||
" lambdas = df[lambda_column_name]\n",
|
||
"\n",
|
||
" self.db_objects = [\n",
|
||
" DatabaseObject(id=i, data=f\"Generated Object {i}\", lambda_value=[i], mu_value=None, ttl=None) \n",
|
||
" for i in range(self.db_objects)\n",
|
||
" ]\n",
|
||
" \n",
|
||
"# Specific cache type variants\n",
|
||
"@dataclass\n",
|
||
"class TTLSimulation(SimulationConfig):\n",
|
||
" eviction_strategy: EvictionStrategy = field(default=EvictionStrategy.TTL, init=False)\n",
|
||
" \n",
|
||
" def generate_objects(self, fixed_ttl):\n",
|
||
" if isinstance(self.db_objects, int):\n",
|
||
" self.db_objects = [\n",
|
||
" DatabaseObject(id=i, data=f\"Generated Object {i}\", lambda_value=np.random.zipf(ZIPF_CONSTANT), mu_value=None, ttl=fixed_ttl) \n",
|
||
" for i in range(self.db_objects)\n",
|
||
" ]\n",
|
||
" \n",
|
||
" def from_file(self, path: str, lambda_column_name: str, ttl_column_name: str):\n",
|
||
" df = pd.read_csv(path)\n",
|
||
" lambdas = df[lambda_column_name]\n",
|
||
" ttls = df[ttl_column_name]\n",
|
||
"\n",
|
||
" self.db_objects = [\n",
|
||
" DatabaseObject(id=i, data=f\"Generated Object {i}\", lambda_value=lambdas[i], mu_value=None, ttl=ttls[i]) \n",
|
||
" for i in range(self.db_objects)\n",
|
||
" ]\n",
|
||
" \n",
|
||
"@dataclass\n",
|
||
"class LRUSimulation(SimulationConfig):\n",
|
||
" eviction_strategy: EvictionStrategy = field(default=EvictionStrategy.LRU, init=False)\n",
|
||
"\n",
|
||
"@dataclass\n",
|
||
"class RandomEvictionSimulation(SimulationConfig):\n",
|
||
" eviction_strategy: EvictionStrategy = field(default=EvictionStrategy.RANDOM_EVICTION, init=False)\n",
|
||
"\n",
|
||
"@dataclass\n",
|
||
"class RefreshSimulation(TTLSimulation):\n",
|
||
" def generate_objects(self, fixed_ttl, max_refresh_rate):\n",
|
||
" if isinstance(self.db_objects, int):\n",
|
||
" self.db_objects = [\n",
|
||
" DatabaseObject(id=i, data=f\"Generated Object {i}\", lambda_value=np.random.zipf(ZIPF_CONSTANT), mu_value=np.random.uniform(1, max_refresh_rate), ttl=fixed_ttl) \n",
|
||
" for i in range(self.db_objects)\n",
|
||
" ]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"id": "5cea042f-e9fc-4a1e-9750-de212ca70601",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"class Database:\n",
|
||
" data: Dict[int, DatabaseObject]\n",
|
||
" \n",
|
||
" def __init__(self, data: List[DatabaseObject]):\n",
|
||
" self.data = {i: data[i] for i in range(len(data))}\n",
|
||
"\n",
|
||
" def get_object(self, obj_id):\n",
|
||
" # print(f\"[{env.now:.2f}] Database: Fetched {self.data.get(obj_id, 'Unknown')} for ID {obj_id}\")\n",
|
||
" return self.data.get(obj_id, None)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"id": "499bf543-b2c6-4e4d-afcc-0a6665ce3ae1",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"class Cache:\n",
|
||
" capacity: int\n",
|
||
" eviction_strategy: EvictionStrategy\n",
|
||
" cache_size_over_time: List[int] # To record cache state at each interval\n",
|
||
" storage: Dict[int, CacheObject]\n",
|
||
" hits: Dict[int, int] # hit counter for each object\n",
|
||
" misses: Dict[int, int] # miss counter for each object\n",
|
||
" access_count: Dict[int, int] # access counter for each object (should be hit+miss)\n",
|
||
" next_request: Dict[int, float] # scheduled time for each object to be requested\n",
|
||
" cumulative_age: Dict[int, List[float]] # list of ages of each object at the time it was requested (current time - age_timer)\n",
|
||
" cumulative_cache_time: Dict[int, List[float]] # list of total time of each object spent in cache when it was evicted (current time - initial fetch time)\n",
|
||
" request_log: Dict[int, List[float]] # list of timestamps when each object was requested\n",
|
||
" \n",
|
||
" def __init__(self, env, db, simulation_config):\n",
|
||
" self.env = env\n",
|
||
" self.db = db\n",
|
||
" self.capacity = simulation_config.cache_size\n",
|
||
" self.eviction_strategy = simulation_config.eviction_strategy\n",
|
||
" self.cache_size_over_time = []\n",
|
||
" self.storage = {}\n",
|
||
"\n",
|
||
" db_object_count = len(self.db.data)\n",
|
||
" \n",
|
||
" self.hits = {i: 0 for i in range(db_object_count)}\n",
|
||
" self.misses = {i: 0 for i in range(db_object_count)}\n",
|
||
" self.access_count = {i: 0 for i in range(db_object_count)}\n",
|
||
" self.next_request = {i: np.random.exponential(1/self.db.data[i].lambda_value) for i in range(len(self.db.data))}\n",
|
||
" self.cumulative_age = {i: [] for i in range(db_object_count)}\n",
|
||
" self.cumulative_cache_time = {i: [] for i in range(db_object_count)}\n",
|
||
" self.request_log = {i: [] for i in range(db_object_count)}\n",
|
||
"\n",
|
||
" \n",
|
||
" def get(self, obj_id):\n",
|
||
" assert len(self.storage) <= self.capacity, f\"Too many objects in cache ({len(self.storage)}). \"\n",
|
||
"\n",
|
||
" # Schedule next request\n",
|
||
" next_request = self.env.now + np.random.exponential(1/self.db.data[obj_id].lambda_value)\n",
|
||
" self.request_log[obj_id].append(next_request)\n",
|
||
" self.next_request[obj_id] = next_request\n",
|
||
" # print(f\"[{self.env.now:.2f}] Client: Schedule next request for {obj_id}@{next_request:.2f}\")\n",
|
||
" \n",
|
||
" if obj_id in self.storage:\n",
|
||
" # Cache hit: Refresh TTL if TTL-Cache\n",
|
||
" if self.storage[obj_id].next_expiry:\n",
|
||
" assert self.env.now <= self.storage[obj_id].next_expiry, f\"[{self.env.now:.2f}] Cache should never hit on an expired cache entry.\"\n",
|
||
" self.storage[obj_id].next_expiry = self.env.now + self.db.data[obj_id].ttl\n",
|
||
" \n",
|
||
" # Cache hit: increment hit count and update cumulative age\n",
|
||
" self.hits[obj_id] += 1\n",
|
||
" self.access_count[obj_id] += 1\n",
|
||
" age = self.env.now - self.storage[obj_id].age_timer\n",
|
||
" self.cumulative_age[obj_id].append(age)\n",
|
||
"\n",
|
||
" assert len(self.cumulative_age[obj_id]) == self.access_count[obj_id], f\"[{self.env.now:.2f}] Age values collected and object access count do not match.\"\n",
|
||
"\n",
|
||
" # print(f\"[{env.now:.2f}] {obj_id} Hit: Current Age {age:.2f} (Average: {sum(self.cumulative_age[obj_id])/len(self.cumulative_age[obj_id]):.2f}) \")\n",
|
||
" else:\n",
|
||
" # Cache miss: Add TTL if TTL-Cache\n",
|
||
" # When full cache: If Non-TTL-Cache: Evict. If TTL-Cache: Don't add to Cache.\n",
|
||
" if len(self.storage) == self.capacity:\n",
|
||
" if self.eviction_strategy == EvictionStrategy.LRU:\n",
|
||
" self.evict_oldest()\n",
|
||
" elif self.eviction_strategy == EvictionStrategy.RANDOM_EVICTION:\n",
|
||
" self.evict_random()\n",
|
||
" elif self.eviction_strategy == EvictionStrategy.TTL:\n",
|
||
" # print(f\"[{self.env.now:.2f}] Cache: Capacity reached. Not accepting new request.\")\n",
|
||
" return\n",
|
||
" \n",
|
||
" # Cache miss: increment miss count\n",
|
||
" self.misses[obj_id] += 1\n",
|
||
" self.access_count[obj_id] += 1\n",
|
||
" self.cumulative_age[obj_id].append(0)\n",
|
||
"\n",
|
||
" # Cache miss: Construct CacheObject from Database Object\n",
|
||
" db_object = self.db.get_object(obj_id)\n",
|
||
" initial_fetch_timer=self.env.now\n",
|
||
" age_timer=self.env.now\n",
|
||
" next_refresh = (self.env.now + np.random.exponential(1/db_object.mu_value)) if db_object.mu_value is not None else None\n",
|
||
" next_expiry = (self.env.now + db_object.ttl) if db_object.ttl is not None else None\n",
|
||
" cache_object = CacheObject(id=obj_id, data=db_object, \n",
|
||
" initial_fetch_timer=initial_fetch_timer, age_timer=age_timer, \n",
|
||
" next_refresh=next_refresh, next_expiry=next_expiry\n",
|
||
" )\n",
|
||
" self.storage[obj_id] = cache_object\n",
|
||
" \n",
|
||
" assert len(self.cumulative_age[obj_id]) == self.access_count[obj_id], f\"[{self.env.now:.2f}] Age values collected and object access count do not match.\"\n",
|
||
" \n",
|
||
" # print(f\"[{env.now:.2f}] {obj_id} Miss: Average Age {sum(self.cumulative_age[obj_id])/len(self.cumulative_age[obj_id]):.2f} \")\n",
|
||
"\n",
|
||
" def refresh_object(self, obj_id):\n",
|
||
" \"\"\"Refresh the object from the database to keep it up-to-date. TTL is increased on refresh.\"\"\"\n",
|
||
" assert obj_id in self.storage, f\"[{self.env.now:.2f}] Refreshed object has to be in cache\"\n",
|
||
" db_object = self.db.get_object(obj_id)\n",
|
||
" age_timer = self.env.now\n",
|
||
" next_refresh = self.env.now + np.random.exponential(1/db_object.mu_value)\n",
|
||
" # next_expiry = self.env.now + db_object.ttl if db_object.ttl is not None else None\n",
|
||
"\n",
|
||
" self.storage[obj_id].data = db_object\n",
|
||
" self.storage[obj_id].age_timer = age_timer\n",
|
||
" self.storage[obj_id].next_refresh = next_refresh\n",
|
||
"\n",
|
||
" # print(f\"[{self.env.now:.2f}] Cache: Refreshed object {obj_id}\")\n",
|
||
" \n",
|
||
" def evict_oldest(self):\n",
|
||
" \"\"\"Remove the oldest item from the cache to make space.\"\"\"\n",
|
||
" assert self.capacity == len(self.storage), f\"[{self.env.now:.2f}] Expecting cache to be at capacity\"\n",
|
||
" oldest_id = min(self.storage.items(), key=lambda item: item[1].initial_fetch_timer)[0]\n",
|
||
" \n",
|
||
" # print(f\"[{self.env.now:.2f}] Cache: Evicting oldest object {oldest_id}.\")\n",
|
||
" self.cumulative_cache_time[oldest_id].append(self.env.now - self.storage[oldest_id].initial_fetch_timer)\n",
|
||
" del self.storage[oldest_id]\n",
|
||
" \n",
|
||
" def evict_random(self):\n",
|
||
" \"\"\"Remove a random item from the cache to make space.\"\"\"\n",
|
||
" assert self.capacity == len(self.storage), f\"[{self.env.now:.2f}] Expecting cache to be at capacity\"\n",
|
||
" random_id = np.random.choice(list(self.storage.keys())) # Select a random key from the cache\n",
|
||
" \n",
|
||
" # print(f\"[{self.env.now:.2f}] Cache: Evicting random object {random_id}.\")\n",
|
||
" self.cumulative_cache_time[random_id].append(self.env.now - self.storage[random_id].initial_fetch_timer)\n",
|
||
" del self.storage[random_id]\n",
|
||
" \n",
|
||
" def check_expired(self, obj_id):\n",
|
||
" \"\"\"Remove object if its TTL expired.\"\"\"\n",
|
||
" assert self.storage, f\"[{self.env.now:.2f}] Expecting cache to be not empty\"\n",
|
||
" assert self.env.now >= self.storage[obj_id].next_expiry\n",
|
||
" \n",
|
||
" # print(f\"[{self.env.now:.2f}] Cache: Object {obj_id} expired\")\n",
|
||
" self.cumulative_cache_time[obj_id].append(self.env.now - self.storage[obj_id].initial_fetch_timer)\n",
|
||
" del self.storage[obj_id]\n",
|
||
"\n",
|
||
" \n",
|
||
" def record_cache_state(self):\n",
|
||
" \"\"\"Record the current cache state (number of objects in cache) over time.\"\"\"\n",
|
||
" self.cache_size_over_time.append((self.env.now, len(self.storage)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"id": "687f5634-8edf-4337-b42f-bbb292d47f0f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def client_request_process(env, cache, event):\n",
|
||
" \"\"\"Client process that makes requests for objects from the cache.\"\"\"\n",
|
||
" last_print = 0\n",
|
||
" with tqdm(total=ACCESS_COUNT_LIMIT, desc=\"Progress\", leave=True) as pbar:\n",
|
||
" while True:\n",
|
||
" request_id, next_request = min(cache.next_request.items(), key=lambda x: x[1])\n",
|
||
" expiry_id = -1\n",
|
||
" next_expiry = float('inf')\n",
|
||
" refresh_id = -1\n",
|
||
" next_refresh = float('inf')\n",
|
||
"\n",
|
||
" if cache.storage:\n",
|
||
" expiry_id, next_expiry = min(cache.storage.items(), key=lambda x: x[1].next_expiry if x[1].next_expiry is not None else float('inf'))\n",
|
||
" next_expiry = cache.storage[expiry_id].next_expiry\n",
|
||
" refresh_id, next_refresh = min(cache.storage.items(), key=lambda x: x[1].next_refresh if x[1].next_refresh is not None else float('inf'))\n",
|
||
" next_refresh = cache.storage[refresh_id].next_refresh\n",
|
||
"\n",
|
||
" events = [\n",
|
||
" (request_id, next_request),\n",
|
||
" (expiry_id, next_expiry),\n",
|
||
" (refresh_id, next_refresh)\n",
|
||
" ]\n",
|
||
"\n",
|
||
" event_id, event_timestamp = min(events, key=lambda x: x[1] if x[1] is not None else float('inf'))\n",
|
||
" \n",
|
||
" # if event_id == request_id and event_timestamp == next_request:\n",
|
||
" # print(f\"[{env.now:.2f}] Waiting for request...\")\n",
|
||
" # elif event_id == expiry_id and event_timestamp == next_expiry:\n",
|
||
" # print(f\"[{env.now:.2f}] Waiting for expiry until...\")\n",
|
||
" # elif event_id == refresh_id and event_timestamp == next_refresh:\n",
|
||
" # print(f\"[{env.now:.2f}] Waiting for refresh...\")\n",
|
||
" \n",
|
||
" yield(env.timeout(event_timestamp - env.now))\n",
|
||
"\n",
|
||
" if event_id == request_id and event_timestamp == next_request:\n",
|
||
" assert env.now >= next_request, f\"[{env.now}] Time for request should've been reached for Object {request_id}\"\n",
|
||
" cache.get(request_id)\n",
|
||
" elif event_id == expiry_id and event_timestamp == next_expiry:\n",
|
||
" assert env.now >= next_expiry, f\"[{env.now}] Time for expiry should've been reached for Object {expiry_id}\"\n",
|
||
" cache.check_expired(expiry_id)\n",
|
||
" elif event_id == refresh_id and event_timestamp == next_refresh:\n",
|
||
" assert env.now >= next_refresh, f\"[{env.now}] Time for refresh should've been reached for Object {refresh_id}\"\n",
|
||
" cache.refresh_object(refresh_id)\n",
|
||
" else:\n",
|
||
" assert False, \"Unreachable\"\n",
|
||
"\n",
|
||
" # For progress bar\n",
|
||
" if (int(env.now) % 1) == 0 and int(env.now) != last_print:\n",
|
||
" last_print = int(env.now)\n",
|
||
" pbar.n = min(cache.access_count.values())\n",
|
||
" pbar.refresh()\n",
|
||
" \n",
|
||
" # Simulation stop condition\n",
|
||
" if all(access_count >= ACCESS_COUNT_LIMIT for access_count in cache.access_count.values()):\n",
|
||
" print(f\"Simulation ended after {env.now} seconds.\")\n",
|
||
" for obj_id in cache.storage.keys():\n",
|
||
" cache.cumulative_cache_time[obj_id].append(env.now - cache.storage[obj_id].initial_fetch_timer)\n",
|
||
" event.succeed()\n",
|
||
" \n",
|
||
" cache.record_cache_state()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"id": "c8516830-9880-4d9e-a91b-000338baf9d6",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"class Simulation:\n",
|
||
" def __init__(self, simulation_config: Union[TTLSimulation, LRUSimulation, RandomEvictionSimulation, RefreshSimulation]):\n",
|
||
" # Initialize simulation environment\n",
|
||
" self.env = simpy.Environment()\n",
|
||
" \n",
|
||
" # Instantiate components\n",
|
||
" self.db = Database(simulation_config.db_objects)\n",
|
||
" self.cache = Cache(self.env, self.db, simulation_config)\n",
|
||
"\n",
|
||
" def run_simulation(self):\n",
|
||
" # Start processes\n",
|
||
" # env.process(age_cache_process(env, cache))\n",
|
||
" stop_event = self.env.event()\n",
|
||
" self.env.process(client_request_process(self.env, self.cache, stop_event))\n",
|
||
" \n",
|
||
" # Run the simulation\n",
|
||
" self.env.run(until=stop_event)\n",
|
||
" self.end_time = self.env.now"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"id": "e269b607-16b9-46d0-8a97-7324f2002c72",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# config = RandomEvictionSimulation(100, 10)\n",
|
||
"# config.generate_objects()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"id": "33fdc5fd-1f39-4b51-b2c7-6ea6acf2b753",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# config = LRUSimulation(100, 10)\n",
|
||
"# config.generate_objects()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"id": "6c391bfd-b294-4ff7-8b22-51777368a6b9",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# config = RefreshSimulation(100, 80)\n",
|
||
"# config.generate_objects(1, 10)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"id": "0a444c9d-53dd-4cab-b8f1-100ad3ab213a",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"config = TTLSimulation(100, 10)\n",
|
||
"config.from_file(\"../calculated.csv\", \"lambda\", \"optimal_TTL\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"id": "66f65699-a3c9-48c4-8f1f-b9d7834c026a",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Progress: 100%|█████████████████████████████████████████████████████████████████████████████████████████▊| 998/1000 [00:10<00:00, 98.43it/s]"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Simulation ended after 1423.771050302509 seconds.\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"%%time\n",
|
||
"\n",
|
||
"simulation = Simulation(config)\n",
|
||
"simulation.run_simulation()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"id": "6f900c68-1f34-48d1-b346-ef6ea6911fa5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"cache = simulation.cache\n",
|
||
"db = simulation.db\n",
|
||
"simulation_end_time = simulation.end_time\n",
|
||
"database_object_count = len(db.data)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 16,
|
||
"id": "3b6f7c1f-ea54-4496-bb9a-370cee2d2751",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Object 0: Hit Rate = 0.06, Expected Hit Rate = 0.05, Average Time spend in Cache: 0.04, Average Age = 0.00, Expected Age = 0.03\n",
|
||
"Object 1: Hit Rate = 0.04, Expected Hit Rate = 0.05, Average Time spend in Cache: 0.04, Average Age = 0.00, Expected Age = 0.02\n",
|
||
"Object 2: Hit Rate = 0.40, Expected Hit Rate = 0.40, Average Time spend in Cache: 0.35, Average Age = 0.03, Expected Age = 0.09\n",
|
||
"Object 3: Hit Rate = 0.24, Expected Hit Rate = 0.23, Average Time spend in Cache: 0.19, Average Age = 0.01, Expected Age = 0.08\n",
|
||
"Object 4: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 5: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 6: Hit Rate = 0.79, Expected Hit Rate = 0.78, Average Time spend in Cache: 0.75, Average Age = 0.05, Expected Age = 0.05\n",
|
||
"Object 7: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 8: Hit Rate = 0.22, Expected Hit Rate = 0.23, Average Time spend in Cache: 0.19, Average Age = 0.01, Expected Age = 0.08\n",
|
||
"Object 9: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 10: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 11: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 12: Hit Rate = 0.23, Expected Hit Rate = 0.23, Average Time spend in Cache: 0.19, Average Age = 0.01, Expected Age = 0.08\n",
|
||
"Object 13: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 14: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 15: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 16: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 17: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 18: Hit Rate = 0.65, Expected Hit Rate = 0.65, Average Time spend in Cache: 0.60, Average Age = 0.06, Expected Age = 0.08\n",
|
||
"Object 19: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 20: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 21: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 22: Hit Rate = 0.68, Expected Hit Rate = 0.67, Average Time spend in Cache: 0.63, Average Age = 0.06, Expected Age = 0.08\n",
|
||
"Object 23: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 24: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 25: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 26: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 27: Hit Rate = 0.33, Expected Hit Rate = 0.33, Average Time spend in Cache: 0.28, Average Age = 0.02, Expected Age = 0.09\n",
|
||
"Object 28: Hit Rate = 0.05, Expected Hit Rate = 0.05, Average Time spend in Cache: 0.04, Average Age = 0.00, Expected Age = 0.02\n",
|
||
"Object 29: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 30: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 31: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 32: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 33: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 34: Hit Rate = 0.39, Expected Hit Rate = 0.40, Average Time spend in Cache: 0.35, Average Age = 0.03, Expected Age = 0.09\n",
|
||
"Object 35: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 36: Hit Rate = 0.05, Expected Hit Rate = 0.05, Average Time spend in Cache: 0.04, Average Age = 0.00, Expected Age = 0.03\n",
|
||
"Object 37: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 38: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 39: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 40: Hit Rate = 0.33, Expected Hit Rate = 0.33, Average Time spend in Cache: 0.28, Average Age = 0.02, Expected Age = 0.09\n",
|
||
"Object 41: Hit Rate = 0.45, Expected Hit Rate = 0.45, Average Time spend in Cache: 0.39, Average Age = 0.04, Expected Age = 0.09\n",
|
||
"Object 42: Hit Rate = 0.40, Expected Hit Rate = 0.40, Average Time spend in Cache: 0.34, Average Age = 0.03, Expected Age = 0.09\n",
|
||
"Object 43: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 44: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 45: Hit Rate = 0.69, Expected Hit Rate = 0.69, Average Time spend in Cache: 0.65, Average Age = 0.06, Expected Age = 0.07\n",
|
||
"Object 46: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 47: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 48: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 49: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 50: Hit Rate = 0.05, Expected Hit Rate = 0.05, Average Time spend in Cache: 0.04, Average Age = 0.00, Expected Age = 0.03\n",
|
||
"Object 51: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 52: Hit Rate = 0.22, Expected Hit Rate = 0.23, Average Time spend in Cache: 0.18, Average Age = 0.01, Expected Age = 0.08\n",
|
||
"Object 53: Hit Rate = 0.04, Expected Hit Rate = 0.05, Average Time spend in Cache: 0.04, Average Age = 0.00, Expected Age = 0.02\n",
|
||
"Object 54: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 55: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 56: Hit Rate = 0.57, Expected Hit Rate = 0.58, Average Time spend in Cache: 0.52, Average Age = 0.05, Expected Age = 0.08\n",
|
||
"Object 57: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 58: Hit Rate = 0.05, Expected Hit Rate = 0.05, Average Time spend in Cache: 0.04, Average Age = 0.00, Expected Age = 0.03\n",
|
||
"Object 59: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 60: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 61: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 62: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 63: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 64: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 65: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 66: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 67: Hit Rate = 0.22, Expected Hit Rate = 0.23, Average Time spend in Cache: 0.19, Average Age = 0.01, Expected Age = 0.08\n",
|
||
"Object 68: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 69: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 70: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 71: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 72: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 73: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 74: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 75: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 76: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 77: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 78: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 79: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 80: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 81: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 82: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 83: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 84: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 85: Hit Rate = 0.55, Expected Hit Rate = 0.55, Average Time spend in Cache: 0.50, Average Age = 0.05, Expected Age = 0.09\n",
|
||
"Object 86: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 87: Hit Rate = 0.22, Expected Hit Rate = 0.23, Average Time spend in Cache: 0.18, Average Age = 0.01, Expected Age = 0.08\n",
|
||
"Object 88: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 89: Hit Rate = 0.40, Expected Hit Rate = 0.40, Average Time spend in Cache: 0.34, Average Age = 0.03, Expected Age = 0.10\n",
|
||
"Object 90: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 91: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 92: Hit Rate = 0.40, Expected Hit Rate = 0.40, Average Time spend in Cache: 0.35, Average Age = 0.03, Expected Age = 0.10\n",
|
||
"Object 93: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 94: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 95: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 96: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 97: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n",
|
||
"Object 98: Hit Rate = 0.55, Expected Hit Rate = 0.55, Average Time spend in Cache: 0.50, Average Age = 0.05, Expected Age = 0.09\n",
|
||
"Object 99: Hit Rate = 0.00, Expected Hit Rate = 0.00, Average Time spend in Cache: 0.00, Average Age = 0.00, Expected Age = 0.00\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"statistics = []\n",
|
||
"# Calculate and print hit rate and average age for each object\n",
|
||
"for obj_id in range(database_object_count):\n",
|
||
" if cache.access_count[obj_id] != 0:\n",
|
||
" hit_rate = cache.hits[obj_id] / max(1, cache.access_count[obj_id])\n",
|
||
" expected_hit_rate = 1-math.exp(-db.data[obj_id].lambda_value*(db.data[obj_id].ttl if db.data[obj_id].ttl is not None else 1))\n",
|
||
" avg_cache_time = sum(cache.cumulative_cache_time[obj_id]) / max(1, simulation_end_time) \n",
|
||
" avg_age = sum(cache.cumulative_age[obj_id]) / max(len(cache.cumulative_age[obj_id]), 1)\n",
|
||
" expected_age = hit_rate / (db.data[obj_id].lambda_value * (1 - pow(hit_rate,2)))\n",
|
||
" print(f\"Object {obj_id}: Hit Rate = {hit_rate:.2f}, Expected Hit Rate = {expected_hit_rate:.2f}, Average Time spend in Cache: {avg_cache_time:.2f}, Average Age = {avg_age:.2f}, Expected Age = {expected_age:.2f}\")\n",
|
||
" statistics.append({\"obj_id\": obj_id,\"hit_rate\": hit_rate, \"expected_hit_rate\": expected_hit_rate, \"avg_cache_time\":avg_cache_time, \"avg_age\": avg_age, \"expected_age\": expected_age})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"id": "b2d18372-cdba-4151-ae32-5bf45466bf94",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"stats = pd.DataFrame(statistics)\n",
|
||
"stats.to_csv(f\"{TEMP_BASE_DIR}/hit_age.csv\",index=False)\n",
|
||
"stats.drop(\"obj_id\", axis=1).describe().to_csv(f\"{TEMP_BASE_DIR}/overall_hit_age.csv\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 18,
|
||
"id": "80971714-44f1-47db-9e89-85be7c885bde",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/tmp/ipykernel_1122751/3693436280.py:26: RuntimeWarning: invalid value encountered in divide\n",
|
||
" age_delta_p = pd.DataFrame(np.where(expected_age.to_numpy().T[0] != 0, age_delta.to_numpy().T[0] / expected_age.to_numpy().T[0], 0), columns=['age_delta in %'])\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>access_count</th>\n",
|
||
" <th>hits</th>\n",
|
||
" <th>misses</th>\n",
|
||
" <th>mu</th>\n",
|
||
" <th>lambda</th>\n",
|
||
" <th>hit_rate</th>\n",
|
||
" <th>optimal_hitrates</th>\n",
|
||
" <th>expected_hit_rate</th>\n",
|
||
" <th>expected_hit_rate_delta</th>\n",
|
||
" <th>avg_cache_time</th>\n",
|
||
" <th>cache_time_delta</th>\n",
|
||
" <th>avg_age</th>\n",
|
||
" <th>expected_age</th>\n",
|
||
" <th>age_delta</th>\n",
|
||
" <th>age_delta in %</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>2194</td>\n",
|
||
" <td>122</td>\n",
|
||
" <td>2072</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.055606</td>\n",
|
||
" <td>0.0513</td>\n",
|
||
" <td>0.051241</td>\n",
|
||
" <td>0.004366</td>\n",
|
||
" <td>0.039414</td>\n",
|
||
" <td>0.016193</td>\n",
|
||
" <td>0.000781</td>\n",
|
||
" <td>0.027889</td>\n",
|
||
" <td>-0.027108</td>\n",
|
||
" <td>-0.971993</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>2237</td>\n",
|
||
" <td>98</td>\n",
|
||
" <td>2139</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>0.043809</td>\n",
|
||
" <td>0.0513</td>\n",
|
||
" <td>0.051241</td>\n",
|
||
" <td>-0.007432</td>\n",
|
||
" <td>0.040331</td>\n",
|
||
" <td>0.003478</td>\n",
|
||
" <td>0.000547</td>\n",
|
||
" <td>0.021946</td>\n",
|
||
" <td>-0.021399</td>\n",
|
||
" <td>-0.975066</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>6160</td>\n",
|
||
" <td>2458</td>\n",
|
||
" <td>3702</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>0.399026</td>\n",
|
||
" <td>0.4000</td>\n",
|
||
" <td>0.400105</td>\n",
|
||
" <td>-0.001079</td>\n",
|
||
" <td>0.346128</td>\n",
|
||
" <td>0.052898</td>\n",
|
||
" <td>0.030540</td>\n",
|
||
" <td>0.094918</td>\n",
|
||
" <td>-0.064378</td>\n",
|
||
" <td>-0.678247</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>3576</td>\n",
|
||
" <td>842</td>\n",
|
||
" <td>2734</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>0.235459</td>\n",
|
||
" <td>0.2254</td>\n",
|
||
" <td>0.225316</td>\n",
|
||
" <td>0.010143</td>\n",
|
||
" <td>0.187388</td>\n",
|
||
" <td>0.048071</td>\n",
|
||
" <td>0.012580</td>\n",
|
||
" <td>0.083093</td>\n",
|
||
" <td>-0.070513</td>\n",
|
||
" <td>-0.848607</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>1106</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1106</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95</th>\n",
|
||
" <td>1000</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1000</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>96</th>\n",
|
||
" <td>1055</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1055</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>97</th>\n",
|
||
" <td>1063</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1063</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>98</th>\n",
|
||
" <td>11421</td>\n",
|
||
" <td>6278</td>\n",
|
||
" <td>5143</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>9.0</td>\n",
|
||
" <td>0.549689</td>\n",
|
||
" <td>0.5528</td>\n",
|
||
" <td>0.552733</td>\n",
|
||
" <td>-0.003044</td>\n",
|
||
" <td>0.495182</td>\n",
|
||
" <td>0.054507</td>\n",
|
||
" <td>0.048121</td>\n",
|
||
" <td>0.087522</td>\n",
|
||
" <td>-0.039401</td>\n",
|
||
" <td>-0.450188</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>99</th>\n",
|
||
" <td>1091</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1091</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>1.0</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>100 rows × 15 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" access_count hits misses mu lambda hit_rate optimal_hitrates \\\n",
|
||
"0 2194 122 2072 None 2.0 0.055606 0.0513 \n",
|
||
"1 2237 98 2139 None 2.0 0.043809 0.0513 \n",
|
||
"2 6160 2458 3702 None 5.0 0.399026 0.4000 \n",
|
||
"3 3576 842 2734 None 3.0 0.235459 0.2254 \n",
|
||
"4 1106 0 1106 None 1.0 0.000000 0.0000 \n",
|
||
".. ... ... ... ... ... ... ... \n",
|
||
"95 1000 0 1000 None 1.0 0.000000 0.0000 \n",
|
||
"96 1055 0 1055 None 1.0 0.000000 0.0000 \n",
|
||
"97 1063 0 1063 None 1.0 0.000000 0.0000 \n",
|
||
"98 11421 6278 5143 None 9.0 0.549689 0.5528 \n",
|
||
"99 1091 0 1091 None 1.0 0.000000 0.0000 \n",
|
||
"\n",
|
||
" expected_hit_rate expected_hit_rate_delta avg_cache_time \\\n",
|
||
"0 0.051241 0.004366 0.039414 \n",
|
||
"1 0.051241 -0.007432 0.040331 \n",
|
||
"2 0.400105 -0.001079 0.346128 \n",
|
||
"3 0.225316 0.010143 0.187388 \n",
|
||
"4 0.000000 0.000000 0.000000 \n",
|
||
".. ... ... ... \n",
|
||
"95 0.000000 0.000000 0.000000 \n",
|
||
"96 0.000000 0.000000 0.000000 \n",
|
||
"97 0.000000 0.000000 0.000000 \n",
|
||
"98 0.552733 -0.003044 0.495182 \n",
|
||
"99 0.000000 0.000000 0.000000 \n",
|
||
"\n",
|
||
" cache_time_delta avg_age expected_age age_delta age_delta in % \n",
|
||
"0 0.016193 0.000781 0.027889 -0.027108 -0.971993 \n",
|
||
"1 0.003478 0.000547 0.021946 -0.021399 -0.975066 \n",
|
||
"2 0.052898 0.030540 0.094918 -0.064378 -0.678247 \n",
|
||
"3 0.048071 0.012580 0.083093 -0.070513 -0.848607 \n",
|
||
"4 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
|
||
".. ... ... ... ... ... \n",
|
||
"95 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
|
||
"96 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
|
||
"97 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
|
||
"98 0.054507 0.048121 0.087522 -0.039401 -0.450188 \n",
|
||
"99 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
|
||
"\n",
|
||
"[100 rows x 15 columns]"
|
||
]
|
||
},
|
||
"execution_count": 18,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"access_count = pd.DataFrame.from_dict(cache.access_count, orient='index', columns=['access_count'])\n",
|
||
"hits = pd.DataFrame.from_dict(cache.hits, orient='index', columns=['hits'])\n",
|
||
"misses = pd.DataFrame.from_dict(cache.misses, orient='index', columns=['misses'])\n",
|
||
"mu = pd.DataFrame.from_dict({l: db.data[l].mu_value for l in range(database_object_count)}, orient='index', columns=['mu'])\n",
|
||
"lmbda = pd.DataFrame.from_dict({l: db.data[l].lambda_value for l in range(database_object_count)}, orient='index', columns=['lambda'])\n",
|
||
"\n",
|
||
"hit_rate = pd.DataFrame(stats['hit_rate'])\n",
|
||
"hit_rate.index = range(database_object_count)\n",
|
||
"optimal_hitrate = pd.DataFrame(BASE_FILE['optimal_hitrates'])\n",
|
||
"optimal_hitrate.index = range(database_object_count)\n",
|
||
"expected_hit_rate = pd.DataFrame(stats['expected_hit_rate'])\n",
|
||
"expected_hit_rate.index = range(database_object_count)\n",
|
||
"expected_hit_rate_delta = pd.DataFrame((hit_rate.to_numpy()-expected_hit_rate.to_numpy()), columns=['expected_hit_rate_delta'])\n",
|
||
"expected_hit_rate_delta.index = range(database_object_count)\n",
|
||
"avg_cache_time = pd.DataFrame(stats['avg_cache_time'])\n",
|
||
"avg_cache_time.index = range(database_object_count)\n",
|
||
"cache_time_delta = pd.DataFrame((hit_rate.to_numpy()-avg_cache_time.to_numpy()), columns=['cache_time_delta'])\n",
|
||
"cache_time_delta.index = range(database_object_count)\n",
|
||
"\n",
|
||
"avg_age = pd.DataFrame(stats['avg_age'])\n",
|
||
"avg_age.index = range(database_object_count)\n",
|
||
"expected_age = pd.DataFrame(stats['expected_age'])\n",
|
||
"expected_age.index = range(database_object_count)\n",
|
||
"age_delta = pd.DataFrame((avg_age.to_numpy()-expected_age.to_numpy()), columns=['age_delta'])\n",
|
||
"age_delta.index = range(database_object_count)\n",
|
||
"age_delta_p = pd.DataFrame(np.where(expected_age.to_numpy().T[0] != 0, age_delta.to_numpy().T[0] / expected_age.to_numpy().T[0], 0), columns=['age_delta in %'])\n",
|
||
"age_delta_p.index = range(database_object_count)\n",
|
||
"\n",
|
||
"merged = access_count.merge(hits, left_index=True, right_index=True).merge(misses, left_index=True, right_index=True) \\\n",
|
||
" .merge(mu, left_index=True, right_index=True).merge(lmbda, left_index=True, right_index=True) \\\n",
|
||
" .merge(hit_rate, left_index=True, right_index=True).merge(optimal_hitrate, left_index=True, right_index=True).merge(expected_hit_rate, left_index=True, right_index=True).merge(expected_hit_rate_delta, left_index=True, right_index=True) \\\n",
|
||
" .merge(avg_cache_time, left_index=True, right_index=True).merge(cache_time_delta, left_index=True, right_index=True) \\\n",
|
||
" .merge(avg_age, left_index=True, right_index=True).merge(expected_age, left_index=True, right_index=True).merge(age_delta, left_index=True, right_index=True).merge(age_delta_p, left_index=True, right_index=True)\n",
|
||
"merged.to_csv(f\"{TEMP_BASE_DIR}/details.csv\", index_label=\"obj_id\")\n",
|
||
"merged"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 19,
|
||
"id": "01f8f9ee-c278-4a22-8562-ba02e77f5ddd",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAACVcAAAHWCAYAAAB5HisgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADQdklEQVR4nOzdd5wTdf7H8XeyuyxL2WWX3nsvIiBVpIsIKnd6gooi1hMV0RPFgorlQE8R9Gycvdx5FtSfnoJd7Iq9gICCBQWkLt3dZH5/hISUSd1JMklez8eDx4NNJjOf+c63zzcTh2EYhgAAAAAAAAAAAAAAAAAAAZzpDgAAAAAAAAAAAAAAAAAA7IjFVQAAAAAAAAAAAAAAAABggsVVAAAAAAAAAAAAAAAAAGCCxVUAAAAAAAAAAAAAAAAAYILFVQAAAAAAAAAAAAAAAABggsVVAAAAAAAAAAAAAAAAAGCCxVUAAAAAAAAAAAAAAAAAYILFVQAAAAAAAAAAAAAAAABggsVVAAAAAAAAAAAAAAAAAGCCxVUAAAAAAACS3nzzTTkcDj311FPpDiUmGzZs0HHHHae6devK4XBo/vz5lu177dq1cjgcuvnmm6Nue80118jhcFh27FRwOBy65ppr0h2GJRwOh84777x0h5HRWrVqpVNPPTXdYQAAAAAAAJticRUAAAAAAEiZBx98UA6HQ9WrV9e6detC3h86dKi6deuWhsgyz4UXXqglS5bosssu0yOPPKIjjjgi4va7du3Sddddpx49eqhGjRoqKSnR4MGD9fDDD8swjBRFHb8XX3wxYxZCvfnmm/rzn/+sRo0aqVq1amrQoIGOOuooLVq0KN2hWaKiokK33XabDjnkENWuXVu1atXSIYccottuu00VFRXpDs/Hu1Ayln8AAAAAAADR5Kc7AAAAAAAAkHv27dunuXPn6vbbb093KBnr9ddf1zHHHKOLL7446rYbNmzQiBEjtHz5ck2cOFHnnXee9u7dq6efflqTJ0/Wiy++qMcee0x5eXlxx3HllVdq5syZiZxCTF588UXdcccdli6w2rNnj/LzrZ0Wu/rqq3Xttdeqffv2Ovvss9WyZUtt3rxZL774oo499lg99thjOvHEEy09Zirt2rVLY8eO1VtvvaVx48bp1FNPldPp1OLFi3XBBRdo0aJF+t///qeaNWumO1R17txZjzzySMBrl112mWrVqqUrrrgiZPvvvvtOTiffQQUAAAAAAOZYXAUAAAAAAFKuZ8+e+te//qXLLrtMTZo0SXc4KbVr1y5LFqBs3LhRderUiWnbyZMna/ny5XrmmWd09NFH+16fNm2aZsyYoZtvvlkHH3ywLr300rjjyM/Pt3yhUrJVr17d0v099dRTuvbaa3Xcccfp3//+twoKCnzvzZgxQ0uWLLHVk50ScdFFF+mtt97S7bffHvAzhOecc47uuOMOnXfeebr44ot11113pSwmwzC0d+9eFRUVBbzesGFDTZo0KeC1uXPnql69eiGvS1JhYWFS4wQAAAAAAJmNr2QBAAAAAICUu/zyy+VyuTR37tyI261du1YOh0MPPvhgyHsOhyPgaUbXXHONHA6HVq5cqUmTJqmkpET169fXrFmzZBiGfv75Zx1zzDEqLi5Wo0aNdMstt5ge0+Vy6fLLL1ejRo1Us2ZNHX300fr5559Dtvvwww91xBFHqKSkRDVq1NCQIUP07rvvBmzjjenbb7/ViSeeqNLSUh166KERz/mHH37QX/7yF5WVlalGjRrq37+//ve///ne9/60omEYuuOOO6L+vNkHH3ygJUuW6NRTTw1YWOU1Z84ctW/fXjfeeKP27NkT8v6tt96qli1bqqioSEOGDNHXX39teo7BHn30UfXu3VtFRUUqKyvTxIkTw6bjkUceqdLSUtWsWVM9evTQggULJEmnnnqq7rjjDkky/Sm3xx9/XL1791bt2rVVXFys7t27+z4bSbi8s3r1ap166qmqU6eOSkpKNGXKFO3evTvq/mbNmqWysjLdf//9AQurvEaPHq1x48ZJkv744w9dddVV6t27t0pKSlSzZk0NHjxYb7zxRsjn3G63FixYoO7du6t69eqqX7++jjjiCC1btixk22effVbdunVTYWGhunbtqsWLF4dss27dOp122mlq2LChb7v7778/6vn98ssvuu+++zR8+PCAhVVe5557roYNG6Z7771Xv/zyiySpW7duGjZsmOk5NW3aVMcdd1zAa/Pnz1fXrl1VvXp1NWzYUGeffba2bt0a8NlWrVpp3LhxWrJkifr06aOioiLdc889UeOPplWrVjr11FN9f3vL2DvvvKNp06apfv36qlOnjs4++2z98ccf2rZtm0455RSVlpaqtLRUl1xySchPa8Z6TgAAAAAAwP5YXAUAAAAAAFKudevWOuWUU/Svf/1Lv/76q6X7njBhgtxut+bOnat+/frp+uuv1/z58zVq1Cg1bdpUN954o9q1a6eLL75YS5cuDfn8DTfcoP/973+69NJLNW3aNL3yyisaOXJkwMKj119/XYcddpjKy8t19dVX6+9//7u2bdum4cOH66OPPgrZ51/+8hft3r1bf//733XmmWeGjX3Dhg0aOHCglixZoqlTp+qGG27Q3r17dfTRR+uZZ56RJB122GG+nzwbNWqUHnnkkZCfQPP3/PPPS5JOOeUU0/fz8/N14oknauvWrSGLwx5++GHddtttOvfcc3XZZZfp66+/1vDhw7Vhw4awx5M8aXjKKaeoffv2mjdvnqZPn67XXntNhx12mLZt2+bb7pVXXtFhhx2mb7/9VhdccIFuueUWDRs2TC+88IIk6eyzz9aoUaMkyXee3nN95ZVXdMIJJ6i0tFQ33nij5s6dq6FDh4acQzyOP/547dixQ3PmzNHxxx+vBx98ULNnz474mVWrVmnFihUaP368ateuHfUY5eXluvfeezV06FDdeOONuuaaa/T7779r9OjR+vzzzwO2Pf300zV9+nQ1b95cN954o2bOnKnq1avrgw8+CNjunXfe0dSpUzVx4kTddNNN2rt3r4499lht3rzZt82GDRvUv39/vfrqqzrvvPO0YMECtWvXTqeffrrmz58fMeaXXnpJLpcrbB6SPPmrsrLSt6hrwoQJWrp0qdavXx8S66+//qqJEyf6Xjv77LM1Y8YMDRo0SAsWLNCUKVP02GOPafTo0SFP/Pruu+90wgknaNSoUVqwYIF69uwZMfaqOP/887Vq1SrNnj1bRx99tBYuXKhZs2bpqKOOksvl0t///ncdeuih+sc//hFSBuM5JwAAAAAAYHMGAAAAAABAijzwwAOGJOPjjz82vv/+eyM/P9+YNm2a7/0hQ4YYXbt29f29Zs0aQ5LxwAMPhOxLknH11Vf7/r766qsNScZZZ53le62ystJo1qyZ4XA4jLlz5/pe37p1q1FUVGRMnjzZ99obb7xhSDKaNm1qlJeX+15/4oknDEnGggULDMMwDLfbbbRv394YPXq04Xa7fdvt3r3baN26tTFq1KiQmE444YSY0mf69OmGJOPtt9/2vbZjxw6jdevWRqtWrQyXyxVw/ueee27UfY4fP96QZGzdujXsNosWLTIkGbfddpthGAfSvaioyPjll19823344YeGJOPCCy8MOUevtWvXGnl5ecYNN9wQcIyvvvrKyM/P971eWVlptG7d2mjZsmVIbP7peu655xpmU1gXXHCBUVxcbFRWVkZNg2Dh8s5pp50WsN2f/vQno27duhH39dxzzxmSjFtvvTWmY1dWVhr79u0LeG3r1q1Gw4YNA47/+uuvG5ICyoeXf/pIMqpVq2asXr3a99oXX3xhSDJuv/1232unn3660bhxY2PTpk0B+5o4caJRUlJi7N69O2zM3nz52Wefhd3m008/NSQZF110kWEYhvHdd9+FxGAYhjF16lSjVq1avuO9/fbbhiTjscceC9hu8eLFIa+3bNnSkGQsXrw4bBzhdO3a1RgyZIjpey1btgyoC7z1VHAZHzBggOFwOIy//vWvvte8dYz/vuM5JwAAAAAAYH88uQoAAAAAAKRFmzZtdPLJJ2vhwoX67bffLNvvGWec4ft/Xl6e+vTpI8MwdPrpp/ter1Onjjp27Kgffvgh5POnnHJKwBOIjjvuODVu3FgvvviiJOnzzz/XqlWrdOKJJ2rz5s3atGmTNm3apF27dmnEiBFaunSp3G53wD7/+te/xhT7iy++qL59+wb8dGCtWrV01llnae3atfr2229jSwQ/O3bskKSIT1XyvldeXh7w+vjx49W0aVPf33379lW/fv18aWFm0aJFcrvdOv74431ps2nTJjVq1Ejt27f3/fzdZ599pjVr1mj69OmqU6dOwD4i/cyhV506dbRr1y698sorUbeNVfB1Gjx4sDZv3hySLv6878Xy1CrJkyerVasmyfPTcVu2bFFlZaX69OmjTz/91Lfd008/LYfDoauvvjpkH8HpM3LkSLVt29b3d48ePVRcXOzL34Zh6Omnn9ZRRx0lwzACrsvo0aO1ffv2gGMHSyQPdejQQT179tR///tf3zYul0tPPfWUjjrqKBUVFUmSnnzySZWUlGjUqFEBcfXu3Vu1atUK+bnE1q1ba/To0WHjsNLpp58ekNb9+vULqUu8dYx/XRLvOQEAAAAAAHvLT3cAAAAAAAAgd1155ZV65JFHNHfuXC1YsMCSfbZo0SLg75KSElWvXl316tULed3/Z9O82rdvH/C3w+FQu3bttHbtWkmen4GTpMmTJ4eNYfv27SotLfX93bp165hi//HHH9Wv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hmHo+uuvV1ZWlr7++mtdcskl6tKli/r376+HH35YH330kX3ee++9V926dVN0dLQ6d+6sBx98UBaLxaXttSktLdUNN9yguLg4dejQQa+99prD9L179+raa69VYmKikpOTdcUVV2j37t11lt8dwjy6dAAAAAAAAAAAAAAAALQoJy2V6vXQAp+se/NfLlBsaGiD8x09elQLFizQ448/rqioKIdp6enpmjx5subOnauXX37Zntj09NNP689//rMeeeQRLViwQHfccYe6deumCy64wOk6rrnmGkVFRenzzz9XQkKCXn31VZ1//vnavn27kpOT9dlnn2nChAm6//779fbbb6u8vNyeKPXhhx+qX79+mjZtmm666Sb7MmfMmKHy8nItW7ZMMTEx2rp1q2JjYxu1jx555BHNmjVLTz/9tF544QVNnjxZeXl5Sk5OrjXv+vXrtWXLFr377rsKCan9DKfExET7/+Pi4vTmm28qIyNDmzZt0k033aS4uDjdc889klTv9to888wzeuyxx/TnP/9ZH3zwgaZPn65Ro0ape/fuslgsGj9+vLKzs/X1118rLCxMf/3rX3XhhRdq48aNCg8Pb9R+cBXJVQAAAAAAAAAAAAAAAGhRduzYIcMw1LNnT6fTe/bsqWPHjunQoUNKTU2VJI0YMUL33XefJKlbt2765ptv9OyzzzpNrlq+fLlWrVqlgoICRURESJL+9re/6b///a8++OADTZs2TY8//rgmTpyoRx55xP69fv36SZKSk5MVGhqquLg4paen26fv2bNHV199tfr06SNJ6ty5c6O3/frrr9ekSZMkSU888YSef/55rVq1ShdeeKHT/SRJPXr0aHC5DzzwgP3/HTt21B//+EfNmTPHnlxV3/baXHzxxbrlllskVT0J69lnn9WSJUvUvXt3zZ07V1arVf/85z/tCW9vvPGGEhMT9dVXX2ncuHGN2Q0uI7kKAAAAAAAAAAAAAAAAbhNlDtXWR8d7dZ1Wq1UlxSWKMjf81KrqGvMawezs7Fp/V3/lXnUbNmzQ8ePH1apVK4fPT548qZ07d0qqeipU9adSueL222/X9OnTtXDhQo0dO1ZXX321+vbt26hlVJ8/JiZG8fHxKigocDpvY/bP3Llz9fzzz2vnzp06fvy4KioqFB8fb5/uyvZWL5vJZFJ6erq9bBs2bNBPP/2kuLg4h++U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",
|
||
"text/plain": [
|
||
"<Figure size 3000x500 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Extract recorded data for plotting\n",
|
||
"times, cache_sizes = zip(*cache.cache_size_over_time)\n",
|
||
"\n",
|
||
"# Plot the cache size over time\n",
|
||
"plt.figure(figsize=(30, 5))\n",
|
||
"plt.plot(times, cache_sizes, label=\"Objects in Cache\")\n",
|
||
"plt.xlabel(\"Time (s)\")\n",
|
||
"plt.ylabel(\"Number of Cached Objects\")\n",
|
||
"plt.title(\"Number of Objects in Cache Over Time\")\n",
|
||
"plt.legend()\n",
|
||
"plt.grid(True)\n",
|
||
"plt.savefig(f\"{TEMP_BASE_DIR}/objects_in_cache_over_time.pdf\")\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 20,
|
||
"id": "f30a0497-9b2e-4ea9-8ebf-6687de19aaa9",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAq4AAAIjCAYAAADC0ZkAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABDgUlEQVR4nO3deVxVdeL/8fdF5YILFxFlUcQ19y1KRVMbo8ysNGmxryUuv7IGK2WypKY0a8S00iytqSlaJsfGtWWmzC1KQzOX1EwzwrAUzAVwSTD4/P7oy/12BRSuwOHo6/l4nMfD+zkfzn3z4WTvTuceHMYYIwAAAKCa87E6AAAAAFAWFFcAAADYAsUVAAAAtkBxBQAAgC1QXAEAAGALFFcAAADYAsUVAAAAtkBxBQAAgC1QXAEAAGALFFcAOE8bN25Ur169VKdOHTkcDm3dutXqSB6aNWum66+/3uuvdzgcmjJlSsUFKqO9e/fK4XDomWee8foYI0eOVLNmzSosU0UfrzRvvPGGHA6H9u7d6x47358jcCGguAI28c033+iOO+5Q48aN5XQ6FR4eruHDh+ubb76xOtpF7fTp07rlllt05MgRzZo1S2+//bYiIyOtjgUAF6SaVgcAcG5LlizR7bffrqCgII0ZM0bNmzfX3r179dprr2nRokVasGCBbrrpJqtjXpTS0tL0448/6tVXX9X/+3//z+o4qGSvvvqqCgsLrY4BXLQorkA1l5aWpjvvvFMtWrTQZ599poYNG7r3PfDAA+rTp4/uvPNObdu2TS1atLAwaXEnT55U7dq1rY5RqQ4ePChJCgwMtDYIqkStWrWsjgBc1LhVAKjmZs6cqZMnT+qVV17xKK2SFBwcrL///e86ceKEZsyY4bHv559/1pgxYxQeHi6n06nmzZvr3nvvVX5+vntOdna2JkyYoGbNmsnpdKpJkyYaMWKEDh06JKnk++wk6dNPP5XD4dCnn37qHrvyyivVsWNHbdq0SX379lXt2rX1yCOPSJLee+89DRo0yJ2lZcuWevLJJ1VQUOBx3KJj7Ny5U3/6059Uu3ZtNW7cuNj3JkmnTp3SlClTdMkll8jPz09hYWEaOnSo0tLS3HMKCws1e/ZsdejQQX5+fgoJCdHYsWN19OjRMq396tWr1adPH9WpU0eBgYEaPHiwvv32W/f+kSNHql+/fpKkW265RQ6HQ1deeeVZj5mdna3x48crIiJCTqdTrVq10tNPP13sKt4zzzyjXr16qUGDBvL391dUVJQWLVpU4jH/+c9/qnv37qpdu7bq16+vvn376pNPPik2b+3aterevbv8/PzUokULvfXWW2VahzP9+OOP+vOf/6w2bdrI399fDRo00C233FLsPCk6f9auXav7779fDRs2VGBgoMaOHav8/HxlZ2drxIgRql+/vurXr6+HHnpIxpgS33PWrFmKjIyUv7+/+vXrpx07dhSbs2zZMnXs2FF+fn7q2LGjli5dWuKxyrO2ZzrzHtc/3of7yiuvqGXLlnI6nbr88su1cePGMh3zm2++Uf/+/eXv768mTZroqaeeOutV3U8++URdu3aVn5+f2rdvryVLlpTpfYALAVdcgWrugw8+ULNmzdSnT58S9/ft21fNmjXTf/7zH/fY/v371b17d2VnZ+vuu+9W27Zt9fPPP2vRokU6efKkfH19dfz4cfXp00fffvutRo8erUsvvVSHDh3S+++/r59++knBwcHlznr48GENHDhQw4YN0x133KGQkBBJvxeYunXrKiEhQXXr1tXq1av1+OOPKzc3VzNnzvQ4xtGjR3Xttddq6NChuvXWW7Vo0SI9/PDD6tSpkwYOHChJKigo0PXXX69Vq1Zp2LBheuCBB3Ts2DGtWLFCO3bsUMuWLSVJY8eO1RtvvKFRo0bp/vvvV3p6ul588UVt2bJF69atO+vVs5UrV2rgwIFq0aKFpkyZol9//VUvvPCCevfurc2bN6tZs2YaO3asGjdurGnTpun+++/X5Zdf7v6eS3Ly5En169dPP//8s8aOHaumTZvqiy++UGJiog4cOKDZs2e75z7//PO68cYbNXz4cOXn52vBggW65ZZb9OGHH2rQoEHueU888YSmTJmiXr16aerUqfL19dWGDRu0evVqXXPNNe5533//vW6++WaNGTNGcXFxev311zVy5EhFRUWpQ4cOZf8h6/cPo33xxRcaNmyYmjRpor179+qll17SlVdeqZ07dxa7yn7fffcpNDRUTzzxhNavX69XXnlFgYGB+uKLL9S0aVNNmzZN//3vfzVz5kx17NhRI0aM8Pj6t956S8eOHVN8fLxOnTql559/Xv3799f27dvd6/3JJ58oNjZW7du3V1JSkg4fPqxRo0apSZMmxfKXdW3LY/78+Tp27JjGjh0rh8OhGTNmaOjQofrhhx/Oep5lZmbqT3/6k3777TdNmjRJderU0SuvvCJ/f/8S5+/Zs0e33Xab7rnnHsXFxSk5OVm33HKLPv74Y1199dVeZQdsxQCotrKzs40kM3jw4LPOu/HGG40kk5uba4wxZsSIEcbHx8ds3Lix2NzCwkJjjDGPP/64kWSWLFlS6pzk5GQjyaSnp3vsX7NmjZFk1qxZ4x7r16+fkWRefvnlYsc7efJksbGxY8ea2rVrm1OnThU7xltvveUey8vLM6GhoSY2NtY99vrrrxtJ5rnnnis1++eff24kmXfeecdj/8cff1zi+Jm6du1qGjVqZA4fPuwe+/rrr42Pj48ZMWKEe6xoLRYuXHjW4xljzJNPPmnq1KljvvvuO4/xSZMmmRo1apiMjAz32Jlrlp+fbzp27Gj69+/vHtuzZ4/x8fExN910kykoKPCYX7QOxhgTGRlpJJnPPvvMPXbw4EHjdDrNX/7yl3PmlmQmT55cajZjjElNTS32sys6fwYMGOCRJzo62jgcDnPPPfe4x3777TfTpEkT069fP/dYenq6kWT8/f3NTz/95B7fsGGDkWQmTJjgHuvatasJCwsz2dnZ7rFPPvnESDKRkZEeWcuytqWJi4vzOF5RxgYNGpgjR464x9977z0jyXzwwQdnPd748eONJLNhwwb32MGDB43L5Sr2z17Rz3Hx4sXusZycHBMWFma6det2zuzAhYBbBYBq7NixY5KkevXqnXVe0f7c3FwVFhZq2bJluuGGG3TZZZcVm+twOCRJixcvVpcuXUr8UFfRnPJyOp0aNWpUsfE/Xj06duyYDh06pD59+ujkyZPatWuXx9y6devqjjvucL/29fVV9+7d9cMPP7jHFi9erODgYN13332lZl+4cKFcLpeuvvpqHTp0yL1FRUWpbt26WrNmTanfx4EDB7R161aNHDlSQUFB7vHOnTvr6quv1n//+98yrEZxCxcuVJ8+fVS/fn2PTDExMSooKNBnn33mnvvHNTt69KhycnLUp08fbd682T2+bNkyFRYW6vHHH5ePj+df52f+DNu3b+9x1b5hw4Zq06aNx7qW1R+znT59WocPH1arVq0UGBjoka/ImDFjPPL06NFDxhiNGTPGPVajRg1ddtllJeYZMmSIGjdu7H7dvXt39ejRw/1zKPp5xcXFyeVyueddffXVat++/Vnzl7a25XXbbbepfv367tdFa32u9f3vf/+rnj17qnv37u6xhg0bavjw4SXODw8P9/hnNiAgQCNGjNCWLVuUmZnpdX7ALrhVAKjGigppUYEtzR8L7i+//KLc3Fx17NjxrF+Tlpam2NjYign6vxo3bixfX99i4998843++te/avXq1crNzfXYl5OT4/G6SZMmxUpX/fr1tW3bNvfrtLQ0tWnTRjVrlv5X2J49e5STk6NGjRqVuL/oQ1Ul+fHHHyVJbdq0KbavXbt2Wr58uU6cOKE6deqUeozSMm3btq3YvcolZfrwww/11FNPaevWrcrLy3OP/3Ft0tLS5OPjU2I5O1PTpk2LjdWvX7/M9/v+0a+//qqkpCQlJyfr559/9rgv9cyfZ0nvXVQuIyIiio2XlKd169bFxi655BL9+9//lvR/P6+S5rVp06ZYIS3L2pbXmd9jUYk91/r++OOP6tGjR7Hxks49SWrVqlWxnJdccomk3++3DQ0NLXNmwI4orkA15nK5FBYW5lHaSrJt2zY1btxYAQEB+vXXXyvs/Uv7F/mZH6oqUtJ9ednZ2erXr58CAgI0depUtWzZUn5+ftq8ebMefvjhYh9CqVGjRonHNqV8aKc0hYWFatSokd55550S95dWHitTYWGhrr76aj300EMl7i8qIJ9//rluvPFG9e3bV/PmzVNYWJhq1aql5ORkzZ8/36v3rqh1lX6/ZzU5OVnjx49XdHS0XC6XHA6Hhg0bVuKHikp775LGvclTHpWxtlLFri+A0lFcgWru+uuv16uvvqq1a9fqiiuuKLb/888/1969ezV27FhJvxeygICAEj91/UctW7Y855yiq0bZ2dke40VXuMri008/1eHDh7VkyRL17dvXPZ6enl7mY5ypZcuW2rBhg06fPl3qB19atmyplStXqnfv3qV+0KU0Rb9AYPfu3cX27dq1S8HBweW+2lqU6fjx44qJiTnrvMWLF8vPz0/Lly+X0+l0jycnJxc7XmFhoXbu3KmuXbuWO4+3Fi1apLi4OD377LPusVOnThU7TyrKnj17io1999137k/3F/28Spp35s+wrGtbVSIjI8uUu8j3338vY4zHf1R+9913klQlv9ELsBr3uALV3MSJE+Xv76+xY8fq8OHDHvuOHDmie+65R7Vr19bEiRMlST4+PhoyZIg++OADffXVV8WOV3QFKDY2Vl9//XWJjwwqmlP06fw/3ntZUFCgV155pcz5i65E/fHKU35+vubNm1fmY5wpNjZWhw4d0osvvlhsX9H73HrrrSooKNCTTz5ZbM5vv/121pIVFhamrl276s033/SYt2PHDn3yySe67rrrvMp96623KjU1VcuXLy+2Lzs7W7/99puk39fM4XB4XNneu3evli1b5vE1Q4YMkY+Pj6ZOnVrsSmdlXumrUaNGseO/8MILpV6JP1/Lli3Tzz//7H795ZdfasOGDe6nTPzx5/XHWxVWrFihnTt3FstelrWtKtddd53Wr1+vL7/80j32yy+/lPp/Cvbv3+/xz2xubq7eeustde3aldsEcFHgiitQzbVu3Vpvvvmmhg8frk6dOhX7zVmHDh3Sv/71L3fJlKRp06bpk08+Ub9+/XT33XerXbt2OnDggBYuXKi1a9cqMDBQEydO1KJFi3TLLbdo9OjRioqK0pEjR/T+++/r5ZdfVpcuXdShQwf17NlTiYmJOnLkiIKCgrRgwQJ3wSqLXr16qX79+oqLi9P9998vh8Oht99++7yK1YgRI/TWW28pISFBX375pfr06aMTJ05o5cqV+vOf/6zBgwerX79+Gjt2rJKSkrR161Zdc801qlWrlvbs2aOFCxfq+eef180331zqe8ycOVMDBw5UdHS0xowZ434clsvl0pQpU7zKPXHiRL3//vu6/vrr3Y+iOnHihLZv365FixZp7969Cg4O1qBBg/Tcc8/p2muv1f/8z//o4MGDmjt3rlq1auVx20irVq306KOP6sknn1SfPn00dOhQOZ1Obdy4UeHh4UpKSvIq57lcf/31evvtt+VyudS+fXulpqZq5cqVatCgQaW8X6tWrXTFFVfo3nvvVV5enmbPnq0GDRp43HKRlJSkQYMG6YorrtDo0aN15MgRvfDCC+rQoYOOHz/unlfWta0qDz30kN5++21de+21euCBB9yPw4qMjCwxzyWXXKIxY8Zo48aNCgkJ0euvv66srCzLrhgDVc6KRxkAKL9t27aZ22+/3YSFhZlatWqZ0NBQc/vtt5vt27eXOP/HH380I0aMMA0bNjROp9O0aNHCxMfHm7y8PPecw4cPm3HjxpnGjRsbX19f06RJExMXF2cOHTrknpOWlmZiYmKM0+k0ISEh5pFHHjErVqwo8XFYHTp0KDHLunXrTM+e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T2vHjh3Kzs5W//79KyQYAAAA8EdeFdelS5cWGyssLNS9996rli1bnncoAAAA4EwVdo+rj4+PEhISNGvWrIo6JAAAAOBWoR/OSktL02+//VaRhwQAAAAkeXmrQEJCgsdrY4wOHDig//znP4qLi6uQYAAAAMAfeVVct2zZ4vHax8dHDRs21LPPPnvOJw4AAAAA3vCquK5Zs6aicwAAAABn5dU9runp6dqzZ0+x8T179mjv3r3nmwkAAAAoxqviOnLkSH3xxRfFxjds2KCRI0eebyYAAACgGK+K65YtW9S7d+9i4z179tTWrVvPNxMAAABQjFfF1eFw6NixY8XGc3JyVFBQcN6hAAAAgDN5VVz79u2rpKQkj5JaUFCgpKQkXXHFFRUWDgAAACji1VMFnn76afXt21dt2rRRnz59JEmff/65cnNztXr16goNCAAAAEheXnFt3769tm3bpltvvVUHDx7UsWPHNGLECO3atUsdO3as6IwAAACAd1dcJSk8PFzTpk2ryCwAAABAqby64pqcnKyFCxcWG1+4cKHefPPN8w4FAAAAnMmr4pqUlKTg4OBi440aNeIqLAAAACqFV8U1IyNDzZs3LzYeGRmpjIyM8w4FAAAAnMmr4tqoUSNt27at2PjXX3+tBg0anHcoAAAA4ExeFdfbb79d999/v9asWaOCggIVFBRo9erVeuCBBzRs2LCKzggAAAB491SBJ598Unv37tVVV12lmjV/P0RBQYHi4uK4xxUAAACVwqvi6uvrq3fffVcPPvig9u7dK39/f3Xq1EmRkZEVnQ8AAACQ5EVxzc7O1qOPPqp3331XR48elSTVr19fw4YN01NPPaXAwMCKzggAAACUr7geOXJE0dHR+vnnnzV8+HC1a9dOkrRz50698cYbWrVqlb744gvVr1+/UsICAADg4lWu4jp16lT5+voqLS1NISEhxfZdc801mjp1qmbNmlWhIQEAAIByPVVg2bJleuaZZ4qVVkkKDQ3VjBkztHTp0goLBwAAABQpV3E9cOCAOnToUOr+jh07KjMz87xDAQAAAGcqV3ENDg7W3r17S92fnp6uoKCg880EAAAAFFOu4jpgwAA9+uijys/PL7YvLy9Pjz32mK699toKCwcAAAAUKfeHsy677DK1bt1a8fHxatu2rYwx+vbbbzVv3jzl5eXp7bffrqysAAAAuIiV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k5yc7J7z66+/mj//+c+mfv36pnbt2uamm24yBw4csC50FTvXGmVkZJi+ffuaoKAg43Q6TatWrczEiRNNTk6OtcGryOjRo01kZKTx9fU1DRs2NFdddZW7tBrD+WPM2dfoYj9/SnNmca3q88hhjDGVcy0XAAAAqDjc4woAAABboLgCAADAFiiuAAAAsAWKKwAAAGyB4goAAABboLgCAADAFiiuAAAAsAWKKwAAAGyB4goAF4C9e/fK4XC4f5c6AFyIKK4AUEFGjhwph8Oh6dOne4wvW7ZMDofDolQAcOGguAJABfLz89PTTz+to0ePWh2lQuTn51sdAQDcKK4AUIFiYmIUGhqqpKSkEvdPmTJFXbt29RibPXu2mjVr5n49cuRIDRkyRNOmTVNISIgCAwM1depU/fbbb5o4caKCgoLUpEkTJScnFzv+rl271KtXL/n5+aljx45KSUnx2L9jxw4NHDhQdevWVUhIiO68804dOnTIvf/KK6/UuHHjNH78eAUHB2vAgAHeLwYAVDCKKwBUoBo1amjatGl64YUX9NNPP3l9nNWrV2v//v367LPP9Nxzz2ny5Mm6/vrrVb9+fW3YsEH33HOPxo4dW+w9Jk6cqL/85S/asmWLoqOjdcMNN+jw4cOSpOzsbPXv31/dunXTV199pY8//lhZWVm69dZbPY7x5ptvytfXV+vWrdPLL7/s9fcAABWN4goAFeymm25S165dNXnyZK+PERQUpDlz5qhNmzYaPXq02rRpo5MnT+qRRx5R69atlZiYKF9fX61du9bj68aNG6fY2Fi1a9dOL730klwul1577TVJ0osvvqhu3bpp2rRpatu2rbp166bXX39da9as0Xfffec+RuvWrTVjxgy1adNGbdq08fp7AICKRnEFgErw9NNP680339S3337r1dd36NBBPj7/91d0SEiIOnXq5H5do0YNNWjQQAcPHvT4uujoaPefa9asqcsuu8yd4euvv9aaNWtUt25d99a2bVtJUlpamvvroqKivMoMAJWtptUBAOBC1LdvXw0YMECJiYkaOXKke9zHx0fGGI+5p0+fLvb1tWrV8njtcDhKHCssLCxzpuPHj+uGG27Q008/XWxfWFiY+8916tQp8zEBoCpRXAGgkkyfPl1du3b1+N/tDRs2VGZmpowx7kdkVeSzV9evX6++fftKkn777Tdt2rRJ48aNkyRdeumlWrx4sZo1a6aaNfnrH4D9cKsAAFSSTp06afjw4ZozZ4577Morr9Qvv/yiGTNmKC0tTXPnztVHH31UYe85d+5cLV26VLt27VJ8fLyOHj2q0aNHS5Li4+N15MgR3X777dq4caPS0tK0fPlyjRo1SgUFBRWWAQAqC8UVACrR1KlTPf53frt27TRv3jzNnTtXXbp00ZdffqkHH3ywwt5v+vTpmj59urp06aK1a9fq/fffV3BwsCQpPDxc69atU0FBga655hp16tRJ48ePV2BgoMf9tABQXTnMmTdbAQAAANUQ/4kNAAAAW6C4AgAAwBYorgAAALAFiisAAABsgeIKAAAAW6C4AgAAwBYorgAAALAFiisAAABsgeIKAAAAW6C4AgAAwBYorgAAALCF/w9b6VuwdhkbCQAAAABJRU5ErkJggg==",
|
||
"text/plain": [
|
||
"<Figure size 800x600 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from collections import Counter\n",
|
||
"# Count occurrences of each number\n",
|
||
"count = Counter([l.lambda_value for l in db.data.values()])\n",
|
||
"\n",
|
||
"# Separate the counts into two lists for plotting\n",
|
||
"x = list(count.keys()) # List of unique numbers\n",
|
||
"y = list(count.values()) # List of their respective counts\n",
|
||
"\n",
|
||
"# Plot the data\n",
|
||
"plt.figure(figsize=(8, 6))\n",
|
||
"plt.bar(x, y, color='skyblue')\n",
|
||
"\n",
|
||
"# Adding labels and title\n",
|
||
"plt.xlabel('Number')\n",
|
||
"plt.ylabel('Occurrences')\n",
|
||
"plt.title('Occurance of each lambda in db')\n",
|
||
"plt.savefig(f\"{TEMP_BASE_DIR}/lambda_distribution.pdf\")\n",
|
||
"\n",
|
||
"# Show the plot\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 21,
|
||
"id": "c192564b-d3c6-40e1-a614-f7a5ee787c4e",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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ma1bt55z7erVq501/L7nDofDjB49uszvUa1atUy9evVMXl5emeP+/jw73x7NmzfPSDJ//etf3a79vQ0bNhhJpnnz5iY7O9s5fvz4cdOkSRMjyXz22WfOcU9DsyQzduxYl0D/xhtvGElm1KhRLuuvu+46w/UzwBq2ZwDwmtDQUNWqVavMePfu3RUXF6dPPvmk3Ofdc889uvrqq52PGzRooGuvvVY5OTn6xz/+oYiICOdcly5ddPXVV+vbb78967Hq16/vfOzn56fHHntMklz+Wbx0i8eUKVMUFBTkHL/qqqt0zz33lHvs2NjYMmO+vr4aPXq0SkpKtG7dunKf93s1atTQLbfcou+//15bt251mXv77bclSX/9619dxqtVq6Zq1aqVOVZ4eLjb1ytV+gHAO+64wzlW+uvSuVKbN2/W119/ra5du+quu+4qc6zf9/ett95SXl6e7r33XrVr1+6ca1966SVJ0muvvebSc5vNpscff1w2m03vvvuuy/P9/Pzk4+NT5rhnnmfn06OMjIwytVrx1ltvSTq9zSg0NNQ5HhYWpqlTp0rSObe/WBUUFKR//vOfstv/73/xQ4cOla+vr7766qvzPj5wpeKDgAC8av369Xruuee0adMmHT16VMXFxc45Pz+/cp/Ttm3bMmN169Y959ymTZvKPdYf//jHMmMJCQny9fXVN9984xwrDd3lrS9vTJJOnDihp556Sh988IH27NmjvLw8l/mDBw+W+7wz3X777Xr33Xf19ttvq3379pJOf0hv+fLlatWqlcsdGgYNGqRJkyapZcuWuu2229S9e3dde+21CgkJsfRaklRQUKB33nlHNWrUUL9+/Zzj3bt3V4MGDbR06VJlZWUpLCxM0unQLEm9evVye+yKrN24caOCgoLOeteOwMBA7dy50/l40KBBevnll9WyZUsNGjRI3bt3V0JCggIDA12eVxk98kTp+dStW7cyc927d5ckbdu27bxfp0mTJgoODnYZ8/X1VWRkpLKzs8/7+MCVitAMwGsWL16sgQMHKjg4WElJSYqJiVH16tWdH34624ffygs3vr6+55z7fRj/vcjIyDJjPj4+Cg8PV05OjnMsJydHdrtdtWvXtnSMwsJCdevWTVu3blW7du10++23Kzw8XL6+vtq3b5/eeustFRQUlFvTmXr16qXIyEgtXLhQTz31lHx8fLRkyRKdOnVKt99+u8va++67T+Hh4XrllVf09NNP66mnnpKvr6/69OmjZ599ttyr32f64IMPdOzYMQ0bNswlcNrtdg0ZMkSPP/64FixYoOTkZGdvpNNX3d2pyNrjx4+ruLhY06ZNO+ua3/9F5Pnnn1dsbKzmzp2rRx99VI8++qgCAgL0l7/8RU8//bTz9+58exQVFSVJ+vXXX92+h9/Lzc2V3W53+ZeQUpGRkbLZbMrNza3QMctztvDv6+tb5sOTAKwjNAPwmkceeUQBAQHasmWLGjdu7DK3cOHCi1LD4cOH1bRpU5exkpISHTt2zCUMh4aGyuFw6OjRo2VCz+HDh8scd9myZdq6datGjBihN954w2Vu4cKFzn+qt8LHx0eDBw/Wc889p08++URJSUl6++23Zbfbddttt7mstdlsGj58uIYPH65jx47p888/17vvvqv33ntPu3fv1nfffVfu9oXfK91+MXfuXM2dO/esa0pDc82aNSVZC5G/XxsTE3POtSEhIbLZbDp69Kjb40qnQ+F9992n++67TwcPHtSGDRs0d+5c/etf/1JGRoZWrVol6fx79Ic//EHS6X8lcTgcLtsg3L0fh8OhI0eOqE6dOi5zmZmZMsa4BN7S45b3F77f/4UOwMXBnmYAXrNnzx41b968TGA+dOiQfvrpp4tSw+eff15mLC0tTcXFxS57bku3QJS3vryx0lvm3XzzzZbWu1N6Rfmdd97Rzz//rA0bNqh79+7nvGIbHh6uW265RYsWLdL111+v77//Xj/++OM5X2f//v1au3atIiMjNWLEiHJ/YmNj9c033zi3G3Tu3FmStHr1arfvoyJru3TpomPHjmn37t1u156pXr16Gjx4sFauXKlGjRrpk08+0alTp8qs86RHjRo1UteuXfXzzz+7/cvP7/81ofR8Ku82dKVjv99eVLr9pby/jPx+69D5KP3LAVegAfcIzQC8Jjo6Wj/++KPLldr8/HyNGTOm3PskXwjPP/+8fvnlF+fjwsJC/eMf/5Akl/vVlobW6dOnu2wJ+PXXX/X888+XOW50dLQk6YsvvnAZ37Bhg15//fUK19m+fXu1aNFCS5cu1auvvipjTJmtGdLp8GWMcRkrKirS8ePHJUkBAQHnfJ25c+fK4XBo1KhReuONN8r9efDBByX93xXpTp06qVOnTvrss8/KfW+/D31Dhw5VcHCwnn766XL37/5+7fjx4yXJeUX4TBkZGfrhhx8knQ6nqampZdbk5eXp5MmTqlatmvPK7fn2SDp93gQGBmrcuHFatGhRuWs+//xzXX/99c7HQ4cOlSRNmzbNZRtGTk6OcwtK6RpJ6tChg2w2mxYuXKj8/Hzn+O7du8s95zxR+gHJn3/+uVKOB1zO2J4B4ILYvn37Wb8koVmzZnrwwQd199136+6771a7du00YMAAFRcXa82aNTLGqE2bNme940Vlio+PV5s2bTRw4EAFBQVp+fLl2rVrl2699Vb179/fua579+4aNmyY80tV+vXrp4KCAi1atEjx8fFasWKFy3H79u2rmJgYPfHEE9qxY4datmypXbt2acWKFerXr5+WLFlS4Vpvv/12TZ48WU888YSqV6/uUl+pW265RSEhIYqPj1d0dLSKioq0Zs0aff/99xowYIAzzJfH4XBo7ty5br/gYuDAgZowYYLmz5+vp556SgEBAZo/f766deumkSNH6u2331ZCQoLy8/OVnp6ub775xhl669Spo3/9618aNGiQOnfurD/96U9q2rSpjh49qk2bNikmJkYffPCBJKl37956+OGHNWPGDDVq1Ei9e/dWdHS0jh07ph9//FGff/65Hn30UTVv3lynTp3SH/7wBzVp0kQdOnRQw4YNdfLkSa1YsUIZGRm677775O/vf949KtW2bVstX75cf/nLXzRo0CBNnz5dXbt2Va1atXT8+HF9+eWX2r59uxo1auR8TteuXXX33XfrxRdfVMuWLdW/f38ZY/Tvf/9bv/zyi8aPH6+uXbs615deLV+wYIE6dOig3r17KzMzU0uXLlXv3r0r/GU15bn++uu1ZMkS9e/fXzfeeKMCAgLUpk0b57cdAvgdb97vDsDlp/Q+zef6ue6664wxp++3O3v2bBMXF2cCAgJMVFSUGTFihMnMzCz3/rGl92let25dmdctve/y3r17y8yVd6zS9Xv27DGPP/64adSokfHz8zPR0dHmkUceMQUFBWWOU1xcbGbOnGmuvvpq4+fnZ66++mrzv//7v+bHH388632a+/fvbyIiIkz16tVNp06dzMKFC896j113Dhw4YOx2u5FkBg8eXO6al19+2fzpT38y0dHRJiAgwISHh5vOnTubV155xRQWFp7z+KtWrXL5/TmXIUOGGElm/vz5zrGMjAxzzz33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hYWFys7Odll/+PBhRUVFSZKioqLK3E2j9LG7NSEhIQoMDFTt2rXl4+NT7prSYwAAAODK4lFonjZtmvbs2aNmzZrp73//u+bNm6d58+Zp8uTJatasmfbs2VPu/l5POBwOFRQUqEOHDqpWrZrWrl3rnNu1a5cOHDighIQESVJCQoK2b9/ucpeLNWvWKCQkRC1atHCu+f0xSteUHsPPz08dOnRwWeNwOLR27VrnGgAAAFxZPNqecf311+s///mP7r//fj3++OMuc23bttXbb7+t7t27V/i4kydP1o033qiGDRvqxIkTWrBggdavX69Vq1YpNDRUI0aMUEpKimrVqqWQkBDdfffdSkhIUHx8vCSpV69eatGihW6//XY98cQTysjI0EMPPaTk5GTn1onRo0frpZde0qRJkzR8+HB9+umneu+99/TRRx8560hJSdHQoUPVsWNHde7cWc8995zy8vI0bNgwT9oFAACAS5xHoVmSevbsqW+++UYZGRnO+zJHR0ef1xaGzMxM3XHHHTp06JBCQ0PVunVrrVq1SjfccIMk6dlnn5Xdblf//v1VUFCgpKQkvfzyy87n+/j4aMWKFRozZowSEhIUFBSkoUOHavr06c41sbGx+uijjzRx4kQ9//zzql+/vt544w0lJSU51wwcOFBHjhzRlClTlJGRobZt22rlypVlPhwIAACAK4NH92mGe7m5uQoNDbV037/fczgcyszMVJ06ddjsfw70yRr6ZA19soY+WUOfrKFP1tErazzpU0XymuXO7969WwEBAZo0adI5191///0KDAzU3r17rR4aAAAAqNIsh+YXXnhBUVFReuyxx8657rHHHlNUVJReeOGF8y4OAAAAqAosh+bVq1dr0KBBqlat2jnX+fn5adCgQfr444/PuzgAAACgKrAcmg8cOKCmTZtaWtu4cWPnhwMBAACAS53l0Ozv76+TJ09aWpuXlyc/Pz+PiwIAAACqEsuhuVmzZvrkk08srV27dq2aN2/ucVEAAABAVWI5NA8cOFArVqzQBx98cM51y5Yt04oVKzRw4MDzrQ0AAACoEiyH5rFjx6pdu3b685//rDFjxujLL79Ubm6ujDHKzc3Vl19+qTFjxmjAgAFq06aNxo4deyHrBgAAAC4ay98I6O/vr1WrVmno0KF69dVX9dprr5VZY4xR79699a9//cv5tdUAAADA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t92m6Oho1atXT999950eeOAB7dq1S++//74Xq734tm/froSEBOXn5ys4OFhLly5VixYttG3bNs6n3zlbnyTOpd9buHChtm7dqq+++qrM3IX8bxShGZeMG2+80fnr1q1bq0uXLoqOjtZ7772nESNGeLEyXC4GDRrk/HWrVq3UunVrXXPNNVq/fr169Ojhxcq8Izk5WTt27OCzAxacrVcjR450/rpVq1aqW7euevTooT179uiaa6652GV6TdOmTbVt2zbl5ORoyZIlGjp0qDZs2ODtsqqcs/WpRYsWnEv/388//6x77rlHa9asUUBAwEV9bbZnVAG1a9eWj49PmU92Hj58WFFRUV6qquqrWbOmmjRpoh9//NHbpVRppecQ51fFXX311apdu/YVeY6NGzdOK1as0Lp161S/fn3neFRUlAoLC5Wdne2y/ko+n87Wq/J06dJFkq64c8rPz0+NGjVShw4dNHPmTLVp00bPP/8859MZztan8lyp59KWLVuUmZmp9u3by9fXV76+vtqwYYNeeOEF+fr6KjIy8oKdU4TmKsDPz08dOnTQ2rVrnWMOh0Nr16512csEVydPntSePXtUt25db5dSpcXGxioqKsrl/MrNzdWmTZs4v9z45ZdfdOzYsSvqHDPGaNy4cVq6dKk+/fRTxcbGusx36NBB1apVczmfdu3apQMHDlxx55O7XpVn27ZtknRFnVPlcTgcKigo4Hxyo7RP5blSz6UePXpo+/bt2rZtm/OnY8eOGjJkiPPXF+qcYntGFZGSkqKhQ4eqY8eO6ty5s5577jnl5eVp2LBh3i6tyrjvvvvUt29fRUdH6+DBg5o6dap8fHw0ePBgb5fmdSdPnnS52rB3715t27ZNtWrVUsOGDTVhwgQ9+uijaty4sWJjY/Xwww+rXr16uuWWW7xXtBecq0+1atXStGnT1L9/f0VFRWnPnj2aNGmSGjVqpKSkJC9WfXElJydrwYIFWrZsmWrUqOHcAxgaGqrAwECFhoZqxIgRSklJUa1atRQSEqK7775bCQkJio+P93L1F5e7Xu3Zs0cLFizQ//zP/yg8PFzfffedJk6cqK5du5a5RdblbPLkybrxxhvVsGFDnThxQgsWLND69eu1atUqzqffOVefOJf+T40aNVw+NyBJQUFBCg8Pd45fsHPqvO69gUr14osvmoYNGxo/Pz/TuXNns3HjRm+XVKUMHDjQ1K1b1/j5+ZmrrrrKDBw40Pz444/eLqtKWLdunZFU5mfo0KHGmNO3nXv44YdNZGSk8ff3Nz169DC7du3ybtFecK4+/fbbb6ZXr14mIiLCVKtWzURHR5u77rrLZGRkeLvsi6q8/kgyc+fOda45deqUGTt2rAkLCzPVq1c3/fr1M4cOHfJe0V7irlcHDhwwXbt2NbVq1TL+/v6mUaNG5v777zc5OTneLfwiGz58uImOjjZ+fn4mIiLC9OjRw6xevdo5z/l02rn6xLl0bmfeju9CnVM2Y4w5v9gNAAAAXN7Y0wwAAAC4QWgGAAAA3CA0AwAAAG4QmgEAAAA3CM0AAACAG4RmAAAAwA1CMwAAAOAGoRkAAABwg9AMAPBITEyMbrrpJo+fP2/ePNlsNu3bt6/yigKAC4TQDACXkNKg+fXXX3u7FAC4ohCaAQAAADcIzQAAAIAbhGYAuIwUFhZqypQp6tChg0JDQxUUFKQ//vGPWrduncu6ffv2yWaz6amnntKsWbN09dVXq3r16urVq5d+/vlnGWM0Y8YM1a9fX4GBgbr55pt1/Pjxcl9z9erVatu2rQICAtSiRQu9//77Zdakp6fr+uuvV2BgoOrXr69HH31UDoejzLply5apT58+qlevnvz9/XXNNddoxowZKikpqZwGAYCHbMYY4+0iAADWzJs3T8OGDdNXX32ljh07lpk/evSoWrdurcGDB6tx48Y6ceKE3nzzTf3000/avHmz2rZtK+l0aI6NjVXbtm1VWFioO++8U8ePH9cTTzyh9u3b6/rrr9f69es1aNAg/fjjj3rxxRf1t7/9TXPmzHG+VkxMjPz9/ZWZmanRo0erTp06mjt3rtLT07Vy5UrdcMMNkqSMjAy1bt1axcXFuueeexQUFKTXXntNgYGB+u6777R3717FxMRIkvr16yc/Pz916tRJwcHB+vTTT7V48WLdd999evLJJy94fwHgrAwA4JIxd+5cI8l89dVX5c4XFxebgoICl7GsrCwTGRlphg8f7hzbu3evkWQiIiJMdna2c3zy5MlGkmnTpo0pKipyjg8ePNj4+fmZ/Px851h0dLSRZP797387x3JyckzdunVNu3btnGMTJkwwksymTZucY5mZmSY0NNRIMnv37nWO//bbb2Xe06hRo0z16tVdXhsALja2ZwDAZcTHx0d+fn6SJIfDoePHj6u4uFgdO3bU1q1by6z/85//rNDQUOfjLl26SJL++te/ytfX12W8sLBQv/76q8vz69Wrp379+jkfh4SE6I477tA333yjjIwMSdJ//vMfxcfHq3Pnzs51ERERGjJkSJl6AgMDnb8+ceKEjh49qj/+8Y/67bfftHPnzgr1AgAqE6EZAC4zb731llq3bq2AgACFh4crIiJCH330kXJycsqsbdiwocvj0gDdoEGDcsezsrJcxhs1aiSbzeYy1qRJE0ly3n95//79aty4cZnXbtq0aZmx9PR09evXT6GhoQoJCVFERIT++te/SlK59QPAxeLrfgkA4FLxzjvv6G9/+5tuueUW3X///apTp458fHw0c+ZM7dmzp8x6Hx+fco9ztnFzAT8Gk52dreuuu04hISGaPn26rrnmGgUEBGjr1q164IEHyv3gIABcLIRmALiMLFmyRFdffbXef/99lyvAU6dOvSCv9+OPP8oY4/Ja//3vfyXJ+eG+6Oho7d69u8xzd+3a5fJ4/fr1OnbsmN5//3117drVOb53794LUDkAVAzbMwDgMlJ6hfj3V4Q3bdqktLS0C/J6Bw8e1NKlS52Pc3Nz9a9//Utt27ZVVFSUJOl//ud/tHHjRm3evNm57siRI5o/f77b2gsLC/Xyyy9fkNoBoCK40gwAl6A5c+Zo5cqVZca7deum999/X/369VOfPn20d+9ezZ49Wy1atNDJkycrvY4mTZpoxIgR+uqrrxQZGak5c+bo8OHDmjt3rnPNpEmT9Pbbb6t3794ut5yLjo7Wd99951yXmJiosLAwDR06VOPHj5fNZtPbb799QbeEAIBVhGYAuAS98sor5Y4fOHBAJ0+e1KuvvqpVq1apRYsWeuedd7R48WKtX7++0uto3LixXnzxRd1///3atWuXYmNjtWjRIiUlJTnX1K1bV+vWrdPdd9+txx9/XOHh4Ro9erTq1aunESNGONeFh4drxYoVuvfee/XQQw8pLCxMf/3rX9WjRw+X4wGAN/DlJgAAAIAb7GkGAAAA3CA0AwAAAG4QmgEAAAA3CM0AAACAG4RmAAAAwA1CMwAAAOAGoRkAAABwg9AMAAAAuEFoBgAAANwgNAMAAABuEJoBAAAANwjNAAAAgBv/DzgEwSpwKuqHAAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 800x600 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Plotting lambda against access_count.\n",
|
||
"\n",
|
||
"plt.figure(figsize=(8, 6))\n",
|
||
"plt.scatter(merged['lambda'], merged['access_count'], alpha=0.7, edgecolor='k')\n",
|
||
"plt.title('Lambda vs Access Count', fontsize=14)\n",
|
||
"plt.xlabel('Lambda', fontsize=12)\n",
|
||
"plt.ylabel('Access Count', fontsize=12)\n",
|
||
"plt.grid(alpha=0.3)\n",
|
||
"\n",
|
||
"plt.savefig(f\"{TEMP_BASE_DIR}/lambda_vs_access_count.pdf\")\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"id": "00a12eea-c805-4209-9143-48fa65619873",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArcAAAIjCAYAAAAZajMiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABEDElEQVR4nO3dfXzO9f////sxsxMnO3OyGYuZ5TxENHLy0aJSUStv3sppUZGkE1ahkCHvEpG33oV6V4qik/cbCRFJYs6iYm0RNiezE/Y2bM/vH/12/Drapu3YseOYV7fr5XJcLh3P19njeHiNe689X6/DZowxAgAAACzAy9MFAAAAAK5CuAUAAIBlEG4BAABgGYRbAAAAWAbhFgAAAJZBuAUAAIBlEG4BAABgGYRbAAAAWAbhFgAAAJZBuAXwl7Z9+3Z17NhRVatWlc1m065duzxdkoMGDRrotttu83QZTrPZbHruuefK/TjdunVTt27d7O+//PJL2Ww2LV++vEz7nTlzppo0aaL8/PwyVugZzz33nGw2m0v3+cde79+/X97e3tq3b59LjwM4i3ALuMH333+ve++9V3Xr1pWvr6/Cw8M1YMAAff/9954u7S/t4sWLuueee5Senq6XX35Zb7/9turXr+/pslBBZGVlacaMGRo3bpy8vPjnsjjNmjVTr169NHHiRE+XAkiSvD1dAGB1H330kfr376+QkBANGzZMkZGRSklJ0RtvvKHly5dr6dKluvPOOz1d5l9SUlKSfvnlF73++uu6//77PV2OJf3vf/+Tt/eV+U/Nm2++qUuXLql///6eLqXCe/DBB3XrrbcqKSlJUVFRni4Hf3FX5t84wBUiKSlJ9913nxo2bKhNmzapVq1a9mWPPvqoOnfurPvuu0979uxRw4YNPVhpYTk5OapSpYqnyyhXJ06ckCQFBQV5thAL8/Pz83QJTlu0aJHuuOOOP/0Mly5dUn5+vnx8fNxUWcUTGxur4OBgLVmyRJMnT/Z0OfiL4/csQDl68cUXlZOTo4ULFzoEW0mqWbOm/vnPf+rcuXOaOXOmw7KjR49q2LBhCg8Pl6+vryIjI/XQQw/pwoUL9nUyMjL02GOPqUGDBvL19VW9evU0cOBAnTp1SpK0ePFi2Ww2paSkOOy7YC7il19+aR/r1q2bWrRooR07dqhLly6qUqWKnn76aUnSxx9/rF69etlriYqK0pQpU5SXl+ew34J97N+/X//3f/+nKlWqqG7duoU+mySdP39ezz33nK6++mr5+fmpTp06uuuuu5SUlGRfJz8/X7Nnz1bz5s3l5+en0NBQjRgxQmfOnClR79evX6/OnTuratWqCgoKUu/evXXgwAH78sGDB6tr166SpHvuuUc2m81hHmFRMjIyNGbMGEVERMjX11eNGjXSjBkzCs3HnDVrljp27KgaNWrI399fbdu2LXbu57///W+1b99eVapUUXBwsLp06aLPP/+80HqbN29W+/bt5efnp4YNG+qtt9760x6kpKTIZrNp1qxZmjdvnho2bKgqVaqoR48eOnLkiIwxmjJliurVqyd/f3/17t1b6enpDvsobs5sgwYNNHjw4D+t4Y/bF8wBPXTokAYPHqygoCAFBgZqyJAhysnJ+dP9SdLChQsVFRUlf39/tW/fXl999VWx6+bl5enpp59WWFiYqlatqjvuuENHjhz502MkJydrz549io2NdRj/fU9nz56tqKgo+fr6av/+/ZL+/LyTfjv3GjRoUOiYRc2PtdlsGjVqlFauXKkWLVrI19dXzZs31+rVqwttv3nzZl133XXy8/NTVFSU/vnPfxb7+f7973+rbdu28vf3V0hIiPr161dkX0ra68qVK6tbt276+OOPiz0m4C5cuQXK0aeffqoGDRqoc+fORS7v0qWLGjRooP/85z/2sWPHjql9+/bKyMjQ8OHD1aRJEx09elTLly9XTk6OfHx8dPbsWXXu3FkHDhzQ0KFDde211+rUqVP65JNP9Ouvv6pmzZqlrvX06dO65ZZb1K9fP917770KDQ2V9FtIrlatmsaOHatq1app/fr1mjhxorKysvTiiy867OPMmTO6+eabddddd6lv375avny5xo0bp5YtW+qWW26R9FvYuO2227Ru3Tr169dPjz76qLKzs7V27Vrt27fP/ivNESNGaPHixRoyZIhGjx6t5ORkvfrqq0pMTNSWLVtUuXLlYj/LF198oVtuuUUNGzbUc889p//973+aO3euOnXqpJ07d6pBgwYaMWKE6tatq2nTpmn06NG67rrr7J+5KDk5OeratauOHj2qESNG6KqrrtLXX3+t+Ph4HT9+XLNnz7av+8orr+iOO+7QgAEDdOHCBS1dulT33HOPPvvsM/Xq1cu+3vPPP6/nnntOHTt21OTJ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3XffderYZe1rcduXZb/FnUcl5apzpbzUqFFDly5dUnZ2dpG/fbncfN0/U9qfTVf2Kj8/XzabTatWrSpyv8VdqS6JgrDtzJx/wJUIt0A5uu222/T6669r8+bNuuGGGwot/+qrr5SSkqIRI0ZI+i20BQQE/Ok3/URFRf3pOgVXwjIyMhzGC67IlMSXX36p06dP66OPPlKXLl3s48nJySXexx9FRUVp27ZtunjxYrE3hUVFRemLL75Qp06dSh0iCr6E4ccffyy07IcfflDNmjWdunoWFRWls2fPFrp7/o8+/PBD+fn5ac2aNfL19bWPL1q0qND+8vPztX//frVu3brU9bhLcHBwoXPowoULOn78uNtrKfizPXjwoLp3724fv3jxopKTk9WqVatC2xw8eNDhvTFGhw4d0jXXXHPZYzVp0kTSb+f6n637+9pKct4V1VOpdD+bv1erVi35+/sX+qxF1RMVFSVjjCIjI+3/Q1YUZ3qdnJwsLy+vy+4XcAfm3ALl6Mknn5S/v79GjBih06dPOyxLT0/Xgw8+qCpVqujJJ5+UJHl5ealPnz769NNP9d133xXaX8GVmri4OO3evVsrVqwodp2COXq/nwual5enhQsXlrj+gis7v79CdOHCBc2fP7/E+/ijuLg4nTp1Sq+++mqhZQXH6du3r/Ly8jRlypRC61y6dKnIYFCgTp06at26tZYsWeKw3r59+/T555/r1ltvdaruvn37auvWrVqzZk2hZRkZGbp06ZKk33pms9kcrsKlpKRo5cqVDtv06dNHXl5emjx5cqEr4BXl6qX023n0+3NI+u3xUGW9cuuMdu3aqVatWlqwYIHDY/EWL15c7Dnx1ltvOUwNWr58uY4fP25/ekdxYmJiJKnIn8OilOa8i4qKUmZmpsNvdY4fP17kz3NJVKpUST179tTKlSt1+PBh+/iBAwcKna933XWXKlWqpOeff77QeWaMsf895Uyvd+zYoebNmxc7JxdwF67cAuUoOjpaS5Ys0YABA9SyZctC31B26tQpvffeew43i0ybNk2ff/65unbtquHDh6tp06Y6fvy4li1bps2bNysoKEhPPvmkli9frnvuuUdDhw5V27ZtlZ6erk8++UQLFixQq1at1Lx5c11//fWKj49Xenq6QkJCtHTpUnsIK4mOHTsqODhYgwYN0ujRo2Wz2fT222+XKXwN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hx/UtGlTbd26Vddff32J9puVlaXAwEBlZmYqICCgPD+C3fTEU245DgAAQHkY36amW49X0rxWoa/c/lFmZqYkKSQkRJK0Y8cOXbx4UbGxsfZ1mjRpoquuukpbt24tdj+5ubnKyspyeAEAAODKd8WE2/z8fI0ZM0adOnVSixYtJEmpqany8fFRUFCQw7qhoaFKTU0tdl8JCQkKDAy0vyIiIsqzdAAAALjJFRNuR44cqX379mnp0qVl3ld8fLwyMzPtryNHjrigQgAAAHiat6cLKIlRo0bps88+06ZNm1SvXj37eFhYmC5cuKCMjAyHq7dpaWkKCwsrdn++vr7y9fUtz5IBAADgARX6yq0xRqNGjdKKFSu0fv16RUZGOixv27atKleurHXr1tnHfvzxRx0+fFgxMTHuLhcAAAAeVqGv3I4cOVLvvvuuPv74Y1WvXt0+jzYwMFD+/v4KDAzUsGHDNHbsWIWEhCggIECPPPKIYmJiSvykBAAAAFhHhQ63r732miSpW7duDuOLFi3S4MGDJUkvv/yyvLy8FBcXp9zcXPXs2VPz5893c6UAAACoCCp0uC3JI3j9/Pw0b948zZs3zw0VAQAAoCKr0HNuAQAAgNIg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIAAMAyCLcAAACwDMItAAAALINwCwAAAMsg3AIA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yb5d27ZtnaoZAMqbt6cLAIC/qi5duqhnz56Kj4/X4MGD7eNeXl4yxjise/HixULbV65c2eG9zWYrciw/P7/ENZ09e1a33367ZsyYUWhZnTp17P9dtWrVEu8TANyJcAsAHjR9+nS1bt3a4Vf7tWrVUmpqqowx9seDufLZtN988426dOkiSbp06ZJ27NihUaNGSZKuvfZaffjhh2rQoIG8vfknAsCVh2kJAOBBLVu21IABAzRnzhz7WLdu3XTy5EnNnDlTSUlJmjdvnlatWuWyY86bN08rVqzQDz/8oJEjR+rMmTMaOnSoJGnkyJFKT09X//79tX37diUlJWnNmjUaMmSI8vLyXFYDAJQXwi0AeNjkyZMdpg40bdpU8+fP17x589SqVSt9++23euKJJ1x2vOnTp2v69Olq1aqVNm/erE8++UQ1a9aUJIWHh2vLli3Ky8tTjx491LJlS40ZM0ZBQUEO83sBoKKymT9O7AIAAACuUPxvOAAAACyDcAsAAADLINwCAADAMgi3AAAAsAzCLQAAACyDcAsAAADLINwCAADAMgi3AAAAsAzCLQAAACyDcAsAAADLINwCAADAMv4fVvQCaHUDfkEAAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"<Figure size 800x600 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from collections import Counter\n",
|
||
"# Count occurrences of each number\n",
|
||
"count = Counter(np.array([l.mu_value if l.mu_value is not None else 0.0 for l in db.data.values() ]).round(0))\n",
|
||
"\n",
|
||
"# Separate the counts into two lists for plotting\n",
|
||
"x = list(count.keys()) # List of unique numbers\n",
|
||
"y = list(count.values()) # List of their respective counts\n",
|
||
"\n",
|
||
"# Plot the data\n",
|
||
"plt.figure(figsize=(8, 6))\n",
|
||
"plt.bar(x, y, color='skyblue')\n",
|
||
"\n",
|
||
"# Adding labels and title\n",
|
||
"plt.xlabel('Number')\n",
|
||
"plt.ylabel('Occurrences')\n",
|
||
"plt.title('Occurance of each mu in db (rounded)')\n",
|
||
"\n",
|
||
"# Show the plot\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 23,
|
||
"id": "adbfeb40-76bd-4224-ac45-65c7b2b2cb7b",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def plot_requests(object_id: int):\n",
|
||
" mu = db.mu_values[object_id]\n",
|
||
" lmb = db.lambda_values[object_id]\n",
|
||
" rq_log = np.array(cache.request_log[object_id])\n",
|
||
" df = rq_log[1:] - rq_log[:-1]\n",
|
||
" pd.DataFrame(df, columns=[f\"{object_id}, mu:{mu:.2f}, lambda: {lmb:.2f}\"]).plot()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 24,
|
||
"id": "1f550686-3463-4e50-be83-ceafb27512b0",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def print_rate(object_id: int):\n",
|
||
" # Calculate time intervals between consecutive events\n",
|
||
" intervals = np.diff(np.array(cache.request_log[object_id])) # Differences between each event time\n",
|
||
" \n",
|
||
" # Calculate the rate per second for each interval\n",
|
||
" rates = 1 / intervals # Inverse of the time interval gives rate per second\n",
|
||
" \n",
|
||
" # Optional: Calculate the average event rate over all intervals\n",
|
||
" average_rate = np.mean(rates)\n",
|
||
" print(\"Average event rate per second:\", average_rate)\n",
|
||
" print(\"The mu is: \", db.lambda_values[object_id])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"id": "b47990b1-0231-43ac-8bc5-8340abe4a8b3",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# os.makedirs(EXPERIMENT_BASE_DIR, exist_ok=True)\n",
|
||
"# folder_name = experiment_name.replace(\" \", \"_\").replace(\"(\", \"\").replace(\")\", \"\").replace(\".\", \"_\")\n",
|
||
"# folder_path = os.path.join(EXPERIMENT_BASE_DIR, folder_name)\n",
|
||
"# os.makedirs(folder_path, exist_ok=True)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 26,
|
||
"id": "db83cad4-7cc6-4702-ae3a-d1af30a561d2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# file_names = os.listdir(TEMP_BASE_DIR)\n",
|
||
" \n",
|
||
"# for file_name in file_names:\n",
|
||
"# shutil.move(os.path.join(TEMP_BASE_DIR, file_name), folder_path)"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "graphs",
|
||
"language": "python",
|
||
"name": "graphs"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.7"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|