Files
age_cache_simulation/00_aoi_caching_simulation/aoi_cache_simulation.ipynb

1042 lines
201 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"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",
"\n",
"# Types of cache\n",
"class CacheType(Enum):\n",
" LRU = 1\n",
" RANDOM_EVICTION = 2\n",
" TTL = 3\n",
"\n",
"# Constants\n",
"SEED = 42\n",
"DATABASE_OBJECTS = 100 # Number of objects in the database\n",
"ACCESS_COUNT_LIMIT = 1000 # Total time to run the simulation\n",
"EXPERIMENT_BASE_DIR = \"./experiments/\"\n",
"TEMP_BASE_DIR = \"./.aoi_cache/\"\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": "markdown",
"id": "9a37d7a3-3e11-4b89-8dce-6091dd38b16f",
"metadata": {},
"source": [
"How to set certain parameters for specific scenarios\n",
"\n",
"\n",
"| Name | Cache Capacity | MAX_REFRESH_RATE | cache_type | CACHE_TTL |\n",
"| -------------------- | -------------------- | ---------------- | ------------------------- | --------- |\n",
"| Default | DATABASE_OBJECTS | 1< | CacheType.LRU | 5 |\n",
"| No Refresh | DATABASE_OBJECTS | 0 | CacheType.LRU | 5 |\n",
"| Infinite TTL | DATABASE_OBJECTS / 2 | 0 | CacheType.LRU | 0 |\n",
"| Random Eviction (RE) | DATABASE_OBJECTS / 2 | 1< | CacheType.RANDOM_EVICTION | 5 |\n",
"| RE without Refresh | DATABASE_OBJECTS / 2 | 0 | CacheType.RANDOM_EVICTION | 5 |\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "3d0ab5b1-162a-42c8-80a3-d31f763101f1",
"metadata": {},
"outputs": [],
"source": [
"# Configuration (Just example, will be overwritten in next block\n",
"CACHE_CAPACITY = DATABASE_OBJECTS # Maximum number of objects the cache can hold\n",
"\n",
"# MAX_REFRESH_RATE is used as the maximum for a uniform\n",
"# distribution for mu.\n",
"# If MAX_REFRESH_RATE is 0, we do not do any refreshes.\n",
"MAX_REFRESH_RATE = 0\n",
"\n",
"cache_type = CacheType.LRU\n",
"\n",
"# CACHE_TTL is used to determin which TTL to set when an\n",
"# object is pulled into the cache\n",
"# If CACHE_TTL is set to 0, the TTL is infinite\n",
"CACHE_TTL = 5\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "3ff299ca-ec65-453b-b167-9a0f7728a207",
"metadata": {},
"outputs": [],
"source": [
"configurations = {\n",
" \"default\": (DATABASE_OBJECTS, 10, CacheType.LRU, 5),\n",
" \"No Refresh\": (DATABASE_OBJECTS, 0, CacheType.LRU, 5),\n",
" \"Infinite TTL\": (int(DATABASE_OBJECTS / 2), 0, CacheType.LRU, 0),\n",
" \"Random Eviction\": (int(DATABASE_OBJECTS / 2), 10, CacheType.RANDOM_EVICTION, 5),\n",
" \"RE without Refresh\": (int(DATABASE_OBJECTS / 2), 0, CacheType.RANDOM_EVICTION, 5),\n",
" \"No Refresh (0.5s ttl)\": (DATABASE_OBJECTS, 0, CacheType.TTL, 0.5),\n",
" \"No Refresh (1.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.TTL, 1),\n",
" \"No Refresh (2.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.TTL, 2),\n",
" \"No Refresh (3.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.TTL, 3),\n",
" \"No Refresh (4.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.TTL, 4),\n",
" \"No Refresh (5.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.TTL, 5),\n",
"}\n",
"\n",
"experiment_name = \"No Refresh (5.0s ttl)\"\n",
"config = configurations[experiment_name]\n",
"\n",
"CACHE_CAPACITY = config[0]\n",
"MAX_REFRESH_RATE = config[1]\n",
"cache_type = config[2]\n",
"CACHE_TTL = config[3]\n",
"\n",
"if cache_type == CacheType.TTL:\n",
" assert CACHE_TTL > 0, \"Needs CACHE_TTL to be greater than 0 when using TTL-Cache.\"\n",
" assert CACHE_CAPACITY >= DATABASE_OBJECTS, \"Cache Size needs to be greater or equal to the amount of Database Objects.\""
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5cea042f-e9fc-4a1e-9750-de212ca70601",
"metadata": {},
"outputs": [],
"source": [
"class Database:\n",
" def __init__(self):\n",
" # Each object now has a specific refresh rate 'mu'\n",
" self.data = {i: f\"Object {i}\" for i in range(1, DATABASE_OBJECTS + 1)}\n",
" self.lambda_values = {i: np.random.zipf(ZIPF_CONSTANT) for i in range(1, DATABASE_OBJECTS + 1)} # Request rate 'lambda' for each object\n",
" # Refresh rate 'mu' for each object\n",
" if MAX_REFRESH_RATE == 0:\n",
" self.mu_values = {i: 0 for i in range(1,DATABASE_OBJECTS + 1)} \n",
" else:\n",
" self.mu_values = {i: np.random.uniform(1, MAX_REFRESH_RATE) for i in range(1, DATABASE_OBJECTS + 1)}\n",
" self.next_request = {i: np.random.exponential(1/self.lambda_values[i]) for i in range(1, DATABASE_OBJECTS + 1)}\n",
"\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": 5,
"id": "499bf543-b2c6-4e4d-afcc-0a6665ce3ae1",
"metadata": {},
"outputs": [],
"source": [
"class Cache:\n",
" def __init__(self, env, db, cache_type):\n",
" self.cache_type = cache_type\n",
" self.env = env\n",
" self.db = db\n",
" self.storage = {} # Dictionary to store cached objects\n",
" self.ttl = {} # Dictionary to store TTLs\n",
" self.initial_fetch = {} # Dictionary to store when an object was fetched from the databse to determine the age\n",
" self.cache_size_over_time = [] # To record cache state at each interval\n",
" self.cache_next_request_over_time = []\n",
" self.request_log = {i: [] for i in range(1, DATABASE_OBJECTS + 1)}\n",
" self.hits = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track hits per object\n",
" self.misses = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track misses per object\n",
" self.cumulative_age = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track cumulative age per object\n",
" self.access_count = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Track access count per object\n",
" self.next_refresh = {} # Track the next refresh time for each cached object\n",
" self.object_start_time = {} # Used as helper variable to determine the starting time of an object in the cache\n",
" self.cumulative_cache_time = {i: 0 for i in range(1, DATABASE_OBJECTS + 1)} # Stores the cumulative time the object has spent between its eviction and when it was first pulled into the cache\n",
" \n",
" def get(self, obj_id):\n",
" if obj_id in self.storage:\n",
" # Cache hit: Refresh TTL if TTL-Cache\n",
" if self.cache_type == CacheType.TTL:\n",
" if self.ttl[obj_id] > env.now:\n",
" self.ttl[obj_id] = env.now + CACHE_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 = (env.now - self.initial_fetch[obj_id])\n",
" self.cumulative_age[obj_id] += age\n",
"\n",
" # Cache hit: Refresh database object\n",
" # self.initial_fetch[obj_id] = env.now\n",
" else:\n",
" assert obj_id not in self.storage.keys(), \"Found object in cache on miss.\"\n",
" assert obj_id not in self.initial_fetch.keys(), \"Found age timer on miss.\"\n",
" assert obj_id not in self.object_start_time.keys(), \"Found cache time ratio timer on miss.\"\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 self.cache_type == CacheType.TTL:\n",
" assert obj_id not in self.ttl.keys(), \"Found cache time ratio timer on miss.\"\n",
" self.ttl[obj_id] = env.now + CACHE_TTL\n",
" else:\n",
" if len(self.storage) == DATABASE_OBJECTS:\n",
" if self.cache_type == CacheType.LRU:\n",
" self.evict_oldest()\n",
" elif self.cache_type == CacheType.RANDOM_EVICTION:\n",
" self.evict_random()\n",
" elif self.cache-type == CacheType.TTL:\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] += 0\n",
" \n",
" # Cache miss: Fetch the object from the database\n",
" self.storage[obj_id] = self.db.get_object(obj_id)\n",
" self.initial_fetch[obj_id] = env.now\n",
" self.object_start_time[obj_id] = env.now\n",
" \n",
" if MAX_REFRESH_RATE != 0:\n",
" self.next_refresh[obj_id] = env.now + np.random.exponential(1/self.db.mu_values[obj_id]) # Schedule refresh\n",
" \n",
" def evict_oldest(self):\n",
" \"\"\"Remove the oldest item from the cache to make space.\"\"\"\n",
" oldest_id = min(self.initial_fetch, key=self.initial_fetch.get) # Find the oldest item by age\n",
" print(f\"[{env.now:.2f}] Cache: Evicting oldest object {oldest_id} to make space at {self.ttl[oldest_id]:.2f}\")\n",
" self.cumulative_cache_time[obj_id] += (env.now - self.object_start_time[obj_id])\n",
" del self.storage[oldest_id]\n",
" del self.initial_fetch[oldest_id]\n",
" del self.object_start_time[obj_id]\n",
"\n",
" def evict_random(self):\n",
" \"\"\"Remove a random item from the cache to make space.\"\"\"\n",
" random_id = np.random.choice(list(self.storage.keys())) # Select a random key from the cache\n",
" print(f\"[{env.now:.2f}] Cache: Evicting random object {random_id} to make space at {self.ttl[random_id]:.2f}\")\n",
" self.cumulative_cache_time[obj_id] += (env.now - self.object_start_time[obj_id])\n",
" del self.storage[random_id]\n",
" del self.initial_fetch[random_id]\n",
" del self.object_start_time[obj_id]\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",
" obj = self.db.get_object(obj_id)\n",
" self.storage[obj_id] = obj\n",
" if self.cache_type == CacheType.TTL:\n",
" self.ttl[obj_id] = env.now + CACHE_TTL\n",
" self.cumulative_cache_time[obj_id] += (env.now - self.object_start_time[obj_id])\n",
" # print(f\"[{env.now:.2f}] Cache: Refreshed object {obj_id}\")\n",
" \n",
" def check_expired(self):\n",
" \"\"\"Increment age of each cached object.\"\"\"\n",
" if self.cache_type == CacheType.TTL:\n",
" for obj_id in list(self.ttl.keys()):\n",
" if self.ttl[obj_id] <= env.now:\n",
" # Remove object if its TTL expired\n",
" # print(f\"[{env.now:.2f}] Cache: Object {obj_id} expired\")\n",
" self.cumulative_cache_time[obj_id] += (env.now - self.object_start_time[obj_id])\n",
" del self.storage[obj_id]\n",
" del self.ttl[obj_id]\n",
" del self.initial_fetch[obj_id]\n",
" del self.object_start_time[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((env.now, len(self.storage)))\n",
" self.cache_next_request_over_time.append((env.now, self.db.next_request.copy()))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7286d498-aa6c-4efb-bb28-fe29736eab64",
"metadata": {},
"outputs": [],
"source": [
"def age_cache_process(env, cache):\n",
" \"\"\"Process that ages cache objects over time, removes expired items, and refreshes based on object-specific intervals.\"\"\"\n",
" last_full_second = 0\n",
" while True:\n",
" cache.check_expired() # Remove expired objects\n",
"\n",
" if MAX_REFRESH_RATE != 0:\n",
" # Refresh objects based on their individual refresh intervals\n",
" for obj_id in list(cache.storage.keys()):\n",
" # Check if it's time to refresh this object based on next_refresh\n",
" if env.now >= cache.next_refresh[obj_id]:\n",
" cache.refresh_object(obj_id)\n",
" # Schedule the next refresh based on the object's mu\n",
" cache.next_refresh[obj_id] = env.now + np.random.exponential(1/cache.db.mu_values[obj_id])\n",
" \n",
" cache.record_cache_state() # Record cache state at each time step\n",
" yield env.timeout(0.05) # Run every second"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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",
" obj_id, next_request = min(cache.db.next_request.items(), key=lambda x: x[1])\n",
" yield env.timeout(next_request - env.now)\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",
" if env.now >= next_request:\n",
" # print(f\"[{env.now:.2f}] Client: Requesting object {obj_id}\")\n",
" cache.get(obj_id)\n",
" \n",
" # print(f\"[{env.now:.2f}] Client: Schedule next request for {obj_id}\")\n",
" next_request = env.now + np.random.exponential(1/cache.db.lambda_values[obj_id])\n",
" cache.request_log[obj_id].append(next_request)\n",
" cache.db.next_request[obj_id] = next_request\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] += (env.now - cache.object_start_time[obj_id])\n",
" event.succeed()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c8516830-9880-4d9e-a91b-000338baf9d6",
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# Initialize simulation environment\n",
"env = simpy.Environment()\n",
"\n",
"# Instantiate components\n",
"db = Database()\n",
"cache = Cache(env, db, cache_type)\n",
"stop_event = env.event()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "2ba34b36-9ed5-4996-9600-11dfd25d8e60",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Progress: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 999/1000 [00:05<00:00, 182.11it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Simulation ended after 1056.5430396768973 seconds.\n",
"CPU times: user 5.01 s, sys: 614 ms, total: 5.63 s\n",
"Wall time: 5.5 s\n"
]
}
],
"source": [
"%%time\n",
"\n",
"# Start processes\n",
"env.process(age_cache_process(env, cache))\n",
"env.process(client_request_process(env, cache, stop_event))\n",
"\n",
"# Run the simulation\n",
"env.run(until=stop_event)\n",
"simulation_end_time = env.now"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "3b6f7c1f-ea54-4496-bb9a-370cee2d2751",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Object 1: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 86.27, Expected Age = 0.49\n",
"Object 2: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 518.48, Expected Age = 0.50\n",
"Object 3: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 130.46, Expected Age = 0.49\n",
"Object 4: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 65.80, Expected Age = 0.49\n",
"Object 5: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 516.46, Expected Age = 0.50\n",
"Object 6: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 88.47, Expected Age = 0.49\n",
"Object 7: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 525.33, Expected Age = 0.50\n",
"Object 8: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 144.73, Expected Age = 0.49\n",
"Object 9: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 113.08, Expected Age = 0.49\n",
"Object 10: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 69.91, Expected Age = 0.49\n",
"Object 11: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 545.38, Expected Age = 0.50\n",
"Object 12: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 85.16, Expected Age = 0.49\n",
"Object 13: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 86.42, Expected Age = 0.49\n",
"Object 14: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 89.83, Expected Age = 0.49\n",
"Object 15: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 518.96, Expected Age = 0.50\n",
"Object 16: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 540.84, Expected Age = 0.50\n",
"Object 17: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 122.01, Expected Age = 0.49\n",
"Object 18: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 134.20, Expected Age = 0.49\n",
"Object 19: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 526.43, Expected Age = 0.50\n",
"Object 20: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 75.73, Expected Age = 0.49\n",
"Object 21: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 95.90, Expected Age = 0.49\n",
"Object 22: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 63.96, Expected Age = 0.49\n",
"Object 23: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 139.96, Expected Age = 0.49\n",
"Object 24: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 528.02, Expected Age = 0.50\n",
"Object 25: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 122.85, Expected Age = 0.49\n",
"Object 26: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 96.64, Expected Age = 0.49\n",
"Object 27: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 79.15, Expected Age = 0.49\n",
"Object 28: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 532.88, Expected Age = 0.50\n",
"Object 29: Hit Rate = 1.00, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 203.43, Expected Age = 0.50\n",
"Object 30: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 128.23, Expected Age = 0.49\n",
"Object 31: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 145.19, Expected Age = 0.49\n",
"Object 32: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 533.60, Expected Age = 0.50\n",
"Object 33: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 134.02, Expected Age = 0.49\n",
"Object 34: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 524.09, Expected Age = 0.50\n",
"Object 35: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 116.60, Expected Age = 0.49\n",
"Object 36: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 134.98, Expected Age = 0.49\n",
"Object 37: Hit Rate = 1.00, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 174.10, Expected Age = 0.50\n",
"Object 38: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 531.44, Expected Age = 0.50\n",
"Object 39: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 529.81, Expected Age = 0.50\n",
"Object 40: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 79.26, Expected Age = 0.49\n",
"Object 41: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 529.68, Expected Age = 0.50\n",
"Object 42: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 525.51, Expected Age = 0.50\n",
"Object 43: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 534.66, Expected Age = 0.50\n",
"Object 44: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 222.32, Expected Age = 0.49\n",
"Object 45: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 71.63, Expected Age = 0.49\n",
"Object 46: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 95.27, Expected Age = 0.49\n",
"Object 47: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 530.73, Expected Age = 0.50\n",
"Object 48: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 142.18, Expected Age = 0.49\n",
"Object 49: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 70.83, Expected Age = 0.49\n",
"Object 50: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 83.70, Expected Age = 0.49\n",
"Object 51: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 528.00, Expected Age = 0.50\n",
"Object 52: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 527.27, Expected Age = 0.50\n",
"Object 53: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 150.62, Expected Age = 0.49\n",
"Object 54: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 95.04, Expected Age = 0.49\n",
"Object 55: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 120.14, Expected Age = 0.49\n",
"Object 56: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 106.77, Expected Age = 0.49\n",
"Object 57: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 144.58, Expected Age = 0.49\n",
"Object 58: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 525.37, Expected Age = 0.50\n",
"Object 59: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 530.54, Expected Age = 0.50\n",
"Object 60: Hit Rate = 1.00, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 132.33, Expected Age = 0.50\n",
"Object 61: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 530.68, Expected Age = 0.50\n",
"Object 62: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 63.55, Expected Age = 0.49\n",
"Object 63: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 81.29, Expected Age = 0.49\n",
"Object 64: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 522.91, Expected Age = 0.50\n",
"Object 65: Hit Rate = 1.00, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 159.42, Expected Age = 0.50\n",
"Object 66: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 529.66, Expected Age = 0.50\n",
"Object 67: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 74.62, Expected Age = 0.49\n",
"Object 68: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 529.53, Expected Age = 0.50\n",
"Object 69: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 136.06, Expected Age = 0.49\n",
"Object 70: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 98.80, Expected Age = 0.49\n",
"Object 71: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 532.41, Expected Age = 0.50\n",
"Object 72: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 140.26, Expected Age = 0.49\n",
"Object 73: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 86.30, Expected Age = 0.49\n",
"Object 74: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 140.32, Expected Age = 0.49\n",
"Object 75: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 527.98, Expected Age = 0.50\n",
"Object 76: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 530.24, Expected Age = 0.50\n",
"Object 77: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 259.58, Expected Age = 0.50\n",
"Object 78: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 528.38, Expected Age = 0.50\n",
"Object 79: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 525.00, Expected Age = 0.50\n",
"Object 80: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 70.65, Expected Age = 0.49\n",
"Object 81: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 142.99, Expected Age = 0.49\n",
"Object 82: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 528.39, Expected Age = 0.50\n",
"Object 83: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 527.83, Expected Age = 0.50\n",
"Object 84: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 127.04, Expected Age = 0.49\n",
"Object 85: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 133.20, Expected Age = 0.49\n",
"Object 86: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 538.40, Expected Age = 0.50\n",
"Object 87: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.99, Average Age = 94.57, Expected Age = 0.49\n",
"Object 88: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 530.51, Expected Age = 0.50\n",
"Object 89: Hit Rate = 1.00, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 131.36, Expected Age = 0.50\n",
"Object 90: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 104.07, Expected Age = 0.49\n",
"Object 91: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 525.81, Expected Age = 0.50\n",
"Object 92: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 530.95, Expected Age = 0.50\n",
"Object 93: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 524.21, Expected Age = 0.50\n",
"Object 94: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 1.00, Average Age = 137.10, Expected Age = 0.49\n",
"Object 95: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 533.23, Expected Age = 0.50\n",
"Object 96: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.98, Average Age = 82.53, Expected Age = 0.49\n",
"Object 97: Hit Rate = 0.99, Expected Hit Rate = 0.99, Average Time spend in Cache: 0.98, Average Age = 40.14, Expected Age = 0.49\n",
"Object 98: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 527.31, Expected Age = 0.50\n",
"Object 99: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 524.64, Expected Age = 0.50\n",
"Object 100: Hit Rate = 1.00, Expected Hit Rate = 1.00, Average Time spend in Cache: 1.00, Average Age = 526.64, Expected Age = 0.50\n"
]
}
],
"source": [
"statistics = []\n",
"# Calculate and print hit rate and average age for each object\n",
"for obj_id in range(1, DATABASE_OBJECTS + 1):\n",
" if cache.access_count[obj_id] != 0:\n",
" hit_rate = cache.hits[obj_id] / max(1, cache.access_count[obj_id]) # Avoid division by zero\n",
" expected_hit_rate = 1-math.exp(-db.lambda_values[obj_id]*CACHE_TTL)\n",
" avg_cache_time = cache.cumulative_cache_time[obj_id] / max(1, simulation_end_time) # Only average over hits\n",
" avg_age = cache.cumulative_age[obj_id] / max(1, cache.access_count[obj_id])\n",
" expected_age = pow(hit_rate,2) / 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_hitrate\": expected_hit_rate, \"avg_cache_time\":avg_cache_time, \"avg_age\": avg_age, \"expected_age\": expected_age})"
]
},
{
"cell_type": "code",
"execution_count": 11,
"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": 12,
"id": "80971714-44f1-47db-9e89-85be7c885bde",
"metadata": {},
"outputs": [
{
"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>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",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1060</td>\n",
" <td>1048</td>\n",
" <td>12</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.988679</td>\n",
" <td>0.986652</td>\n",
" <td>0.002027</td>\n",
" <td>86.266415</td>\n",
" <td>0.488743</td>\n",
" <td>85.777672</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3141</td>\n",
" <td>3140</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0.999682</td>\n",
" <td>0.999596</td>\n",
" <td>0.000086</td>\n",
" <td>518.478962</td>\n",
" <td>0.499682</td>\n",
" <td>517.979280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1060</td>\n",
" <td>1054</td>\n",
" <td>6</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.994340</td>\n",
" <td>0.992451</td>\n",
" <td>0.001888</td>\n",
" <td>130.457732</td>\n",
" <td>0.494356</td>\n",
" <td>129.963377</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1053</td>\n",
" <td>1041</td>\n",
" <td>12</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.988604</td>\n",
" <td>0.995039</td>\n",
" <td>-0.006435</td>\n",
" <td>65.802517</td>\n",
" <td>0.488669</td>\n",
" <td>65.313848</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2073</td>\n",
" <td>2072</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0.999518</td>\n",
" <td>0.999509</td>\n",
" <td>0.000008</td>\n",
" <td>516.463009</td>\n",
" <td>0.499518</td>\n",
" <td>515.963491</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",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>1026</td>\n",
" <td>1015</td>\n",
" <td>11</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.989279</td>\n",
" <td>0.983446</td>\n",
" <td>0.005833</td>\n",
" <td>82.531337</td>\n",
" <td>0.489336</td>\n",
" <td>82.042001</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>1015</td>\n",
" <td>1001</td>\n",
" <td>14</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0.986207</td>\n",
" <td>0.984133</td>\n",
" <td>0.002074</td>\n",
" <td>40.135630</td>\n",
" <td>0.486302</td>\n",
" <td>39.649328</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>39278</td>\n",
" <td>39277</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>37</td>\n",
" <td>0.999975</td>\n",
" <td>0.999964</td>\n",
" <td>0.000011</td>\n",
" <td>527.312192</td>\n",
" <td>0.499975</td>\n",
" <td>526.812217</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>4158</td>\n",
" <td>4157</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>0.999759</td>\n",
" <td>0.999997</td>\n",
" <td>-0.000237</td>\n",
" <td>524.637562</td>\n",
" <td>0.499760</td>\n",
" <td>524.137803</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>2084</td>\n",
" <td>2083</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>0.999520</td>\n",
" <td>0.999942</td>\n",
" <td>-0.000421</td>\n",
" <td>526.641909</td>\n",
" <td>0.499520</td>\n",
" <td>526.142389</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>100 rows × 11 columns</p>\n",
"</div>"
],
"text/plain": [
" access_count hits misses mu lambda hit_rate avg_cache_time \\\n",
"1 1060 1048 12 0 1 0.988679 0.986652 \n",
"2 3141 3140 1 0 3 0.999682 0.999596 \n",
"3 1060 1054 6 0 1 0.994340 0.992451 \n",
"4 1053 1041 12 0 1 0.988604 0.995039 \n",
"5 2073 2072 1 0 2 0.999518 0.999509 \n",
".. ... ... ... .. ... ... ... \n",
"96 1026 1015 11 0 1 0.989279 0.983446 \n",
"97 1015 1001 14 0 1 0.986207 0.984133 \n",
"98 39278 39277 1 0 37 0.999975 0.999964 \n",
"99 4158 4157 1 0 4 0.999759 0.999997 \n",
"100 2084 2083 1 0 2 0.999520 0.999942 \n",
"\n",
" cache_time_delta avg_age expected_age age_delta \n",
"1 0.002027 86.266415 0.488743 85.777672 \n",
"2 0.000086 518.478962 0.499682 517.979280 \n",
"3 0.001888 130.457732 0.494356 129.963377 \n",
"4 -0.006435 65.802517 0.488669 65.313848 \n",
"5 0.000008 516.463009 0.499518 515.963491 \n",
".. ... ... ... ... \n",
"96 0.005833 82.531337 0.489336 82.042001 \n",
"97 0.002074 40.135630 0.486302 39.649328 \n",
"98 0.000011 527.312192 0.499975 526.812217 \n",
"99 -0.000237 524.637562 0.499760 524.137803 \n",
"100 -0.000421 526.641909 0.499520 526.142389 \n",
"\n",
"[100 rows x 11 columns]"
]
},
"execution_count": 12,
"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(db.mu_values, orient='index', columns=['mu'])\n",
"lmbda = pd.DataFrame.from_dict(db.lambda_values, orient='index', columns=['lambda'])\n",
"hit_rate = pd.DataFrame(stats['hit_rate'])\n",
"hit_rate.index = range(1,DATABASE_OBJECTS + 1)\n",
"avg_cache_time = pd.DataFrame(stats['avg_cache_time'])\n",
"avg_cache_time.index = range(1,DATABASE_OBJECTS + 1)\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(1,DATABASE_OBJECTS + 1)\n",
"avg_age = pd.DataFrame(stats['avg_age'])\n",
"avg_age.index = range(1,DATABASE_OBJECTS + 1)\n",
"expected_age = (0.5*pow(hit_rate,2)).rename(columns={'hit_rate': \"expected_age\"})\n",
"age_delta = pd.DataFrame((avg_age.to_numpy()-expected_age.to_numpy()), columns=['age_delta'])\n",
"age_delta.index = range(1,DATABASE_OBJECTS + 1)\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(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)\n",
"merged.to_csv(f\"{TEMP_BASE_DIR}/details.csv\", index_label=\"obj_id\")\n",
"merged"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "8630b3e8-50d1-4590-833d-27651d84a366",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"access_count 1026.000000\n",
"hits 1015.000000\n",
"misses 11.000000\n",
"mu 0.000000\n",
"lambda 1.000000\n",
"hit_rate 0.989279\n",
"avg_cache_time 0.983446\n",
"cache_time_delta 0.005833\n",
"avg_age 82.531337\n",
"expected_age 0.489336\n",
"age_delta 82.042001\n",
"Name: 96, dtype: float64"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"merged.iloc[merged['cache_time_delta'].argmax()]"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "01f8f9ee-c278-4a22-8562-ba02e77f5ddd",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAACWAAAAHWCAYAAADzMbJhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAADNFklEQVR4nOzdd3wUdf7H8ffupvdGKoGE0HtTlK7SRFFsYO/lLKeep556NuxdrKfe2ctZUX82ECtWUJHeOwQIpPe2u78/NjPZlpDEhCTn6/l4+JDszs5+Z3bmO9/vdz7z+VqcTqdTAAAAAAAAAAAAAAAAAIBms7Z3AQAAAAAAAAAAAAAAAACgsyIACwAAAAAAAAAAAAAAAABaiAAsAAAAAAAAAAAAAAAAAGghArAAAAAAAAAAAAAAAAAAoIUIwAIAAAAAAAAAAAAAAACAFiIACwAAAAAAAAAAAAAAAABaiAAsAAAAAAAAAAAAAAAAAGghArAAAAAAAAAAAAAAAAAAoIUIwAIAAAAAAAAAAAAAAACAFiIACwAAAAAAoIm++eYbWSwWvfvuu+1dlCbJycnRySefrPj4eFksFs2dO7fV1r1t2zZZLBY99NBDB1z29ttvl8ViabXvPhgsFotuv/329i5Gq7BYLLriiivauxidWkZGhs4999z2LgYAAAAAAOigCMACAAAAAAAdyksvvSSLxaKQkBBlZ2f7vD9x4kQNHDiwHUrW+fztb3/TggULdOONN+rVV1/VtGnTGl2+rKxMd955pwYPHqywsDBFR0dr3LhxeuWVV+R0Og9SqZvv008/7TTBUt98841OPPFEJScnKygoSImJiZoxY4bmzZvX3kVrFTU1NXr88cd1yCGHKDIyUhERETrkkEP0+OOPq6ampr2LZzKCKZvyHwAAAAAAwIEEtHcBAAAAAAAA/KmqqtJ9992nJ554or2L0ml99dVXOv7443XttdcecNmcnBwdddRRWrt2rU499VRdccUVqqys1HvvvadzzjlHn376qV5//XXZbLZml+Pmm2/WDTfc0JJNaJJPP/1UTz31VKsGYVVUVCggoHWHzm677Tbdcccd6tWrly655BJ1795deXl5+vTTT3XSSSfp9ddf1+mnn96q33kwlZWV6ZhjjtG3336rY489Vueee66sVqvmz5+vq666SvPmzdMnn3yi8PDw9i6q+vXrp1dffdXjtRtvvFERERH65z//6bP8+vXrZbXyLCsAAAAAAPCPACwAAAAAANAhDR06VP/+97914403KjU1tb2Lc1CVlZW1SpDKvn37FBMT06RlzznnHK1du1bvv/++jjvuOPP1K6+8Utddd50eeughDRs2TP/4xz+aXY6AgIBWD2ZqayEhIa26vnfffVd33HGHTj75ZL3xxhsKDAw037vuuuu0YMGCDpUhqiWuueYaffvtt3riiSc8pjy89NJL9dRTT+mKK67Qtddeq3/9618HrUxOp1OVlZUKDQ31eD0pKUlnnnmmx2v33XefEhISfF6XpODg4DYtJwAAAAAA6Nx4bAsAAAAAAHRIN910k+x2u+67775Gl9u2bZssFoteeukln/csFotHVqTbb79dFotFGzZs0Jlnnqno6Gh16dJFt9xyi5xOp3bu3Knjjz9eUVFRSk5O1sMPP+z3O+12u2666SYlJycrPDxcxx13nHbu3Omz3OLFizVt2jRFR0crLCxMEyZM0A8//OCxjFGmNWvW6PTTT1dsbKzGjh3b6DZv2bJFp5xyiuLi4hQWFqbDDjtMn3zyifm+MY2j0+nUU089dcCp1H7++WctWLBA5557rkfwleHee+9Vr169dP/996uiosLn/UcffVTdu3dXaGioJkyYoFWrVvndRm+vvfaaRowYodDQUMXFxenUU09tcD9Onz5dsbGxCg8P1+DBg/XYY49Jks4991w99dRTkuR32rg333xTI0aMUGRkpKKiojRo0CDzs41p6NjZtGmTzj33XMXExCg6OlrnnXeeysvLD7i+W265RXFxcXrhhRc8gq8MU6dO1bHHHitJqq6u1q233qoRI0YoOjpa4eHhGjdunL7++mufzzkcDj322GMaNGiQQkJC1KVLF02bNk2//vqrz7IffPCBBg4cqODgYA0YMEDz58/3WSY7O1vnn3++kpKSzOVeeOGFA27frl279Pzzz+vII4/0CL4yXH755TriiCP0n//8R7t27ZIkDRw4UEcccYTfbUpLS9PJJ5/s8drcuXM1YMAAhYSEKCkpSZdccokKCgo8PpuRkaFjjz1WCxYs0MiRIxUaGqpnn332gOU/kIyMDJ177rnm38Y59v333+vKK69Uly5dFBMTo0suuUTV1dUqLCzU2WefrdjYWMXGxur666/3mcazqdsEAAAAAAA6PgKwAAAAAABAh5SZmamzzz5b//73v7V79+5WXffs2bPlcDh03333adSoUbrrrrs0d+5cTZ48WWlpabr//vvVs2dPXXvttVq0aJHP5++++2598skn+sc//qErr7xSCxcu1KRJkzyCk7766iuNHz9excXFuu2223TPPfeosLBQRx55pJYsWeKzzlNOOUXl5eW65557dNFFFzVY9pycHI0ePVoLFizQZZddprvvvluVlZU67rjj9P7770uSxo8fb06vNnnyZL366qs+0625++ijjyRJZ599tt/3AwICdPrpp6ugoMAngOyVV17R448/rssvv1w33nijVq1apSOPPFI5OTkNfp/k2odnn322evXqpUceeURXX321vvzyS40fP16FhYXmcgsXLtT48eO1Zs0aXXXVVXr44Yd1xBFH6OOPP5YkXXLJJZo8ebIkmdtpbOvChQt12mmnKTY2Vvfff7/uu+8+TZw40WcbmmPWrFkqKSnRvffeq1mzZumll17SnDlzGv3Mxo0btW7dOs2cOVORkZEH/I7i4mL95z//0cSJE3X//ffr9ttv1/79+zV16lQtW7bMY9kLLrhAV199tdLT03X//ffrhhtuUEhIiH7++WeP5b7//ntddtllOvXUU/XAAw+osrJSJ510kvLy8sxlcnJydNhhh+mLL77QFVdcoccee0w9e/bUBRdcoLlz5zZa5s8++0x2u73BY0hyHV+1tbVm4Nfs2bO1aNEi7d2716esu3fv1qmnnmq+dskll+i6667TmDFj9Nhjj+m8887T66+/rqlTp/pkDlu/fr1OO+00TZ48WY899piGDh3aaNn/iL/+9a/auHGj5syZo+OOO07PPfecbrnlFs2YMUN2u1333HOPxo4dqwcffNDnHGzONgEAAAAAgA7OCQAAAAAA0IG8+OKLTknOX375xbl582ZnQECA88orrzTfnzBhgnPAgAHm31u3bnVKcr744os+65LkvO2228y/b7vtNqck58UXX2y+Vltb6+zatavTYrE477vvPvP1goICZ2hoqPOcc84xX/v666+dkpxpaWnO4uJi8/W3337bKcn52GOPOZ1Op9PhcDh79erlnDp1qtPhcJjLlZeXOzMzM52TJ0/2KdNpp53WpP1z9dVXOyU5v/vuO/O1kpISZ2ZmpjMjI8Npt9s9tv/yyy8/4DpnzpzplOQsKChocJl58+Y5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LVrk8frTTz/dZuV55ZVXPKZae/fdd7Vnzx4dffTRkqQRI0YoKytLDz30kEpLS30+v3///hZ/9/Tp07VkyRL99NNP5mtlZWV67rnnlJGR0aIMVaNHj9akSZP04osv6uOPP/Z5/5///Kc2bNig66+/3idY5IMPPlB2drb595IlS7R48WJzX/hz4oknymazac6cOT6Zo5xOpznt4/Dhw5WZmam5c+f6BNi5fy48PFySbxCe9/SRVqvVDJKrqqpqsHxtYc6cOcrLy9OFF16o2tpan/c///xzc98b2ZPct3Hx4sUev7kknXTSSXI6nZozZ47P+pqbuc1ms+mkk07Se++9p1WrVvm8f6BjNj09Xeedd56++OIL/etf//J5/5lnntFXX32lCy64QF27dvV4b/bs2fr555/1wgsvKDc312P6QUmaNWuW7Ha77rzzTp/11tbW+vzuncH/4jYBAAAAAPBnRgYsAAAAAADQKfzzn//Uq6++qvXr12vAgAEe71144YW67777dOGFF2rkyJFatGiRNmzY0GZliYuL09ixY3XeeecpJydHc+fOVc+ePXXRRRdJcgX6/Oc//9HRRx+tAQMG6LzzzlNaWpqys7P19ddfKyoqSh999FGLvvuGG27Qf//7Xx199NG68sorFRcXp5dffllbt27Ve++9J6u1Zc/bvfLKKzrqqKN0/PHH6/TTT9e4ceNUVVWlefPm6ZtvvtHs2bN13XXX+XyuZ8+eGjt2rC699FJVVVVp7ty5io+P1/XXX9/gd2VlZemuu+7SjTfeqG3btmnmzJmKjIzU1q1b9f777+viiy/WtddeK6vVqn/961+aMWOGhg4dqvPOO08pKSlat26dVq9erQULFkhyBbxJ0pVXXqmpU6fKZrPp1FNP1YUXXqj8/HwdeeSR6tq1q7Zv364nnnhCQ4cONafMO1hmz56tlStX6u6779bvv/+u0047Td27d1deXp7mz5+vL7/8Um+88YYkV0ayefPm6YQTTtAxxxyjrVu36plnnlH//v09AvqOOOIInXXWWXr88ce1ceNGTZs2TQ6HQ999952OOOIIXXHFFc0q43333aevv/5ao0aN0kUXXaT+/fsrPz9fS5cu1RdffKH8/PxGP//oo49q3bp1uuyyyzR//nwz09WCBQv04YcfasKECXr44Yd9Pjdr1ixde+21uvbaaxUXF+eTgWvChAm65JJLdO+992rZsmWaMmWKAgMDtXHjRr3zzjt67LHHdPLJJzdrW9vb/+I2AQAAAADwZ0YAFgAAAAAA6BR69uypM888Uy+//LLPe7feeqv279+vd999V2+//baOPvpoffbZZ0pMTGyTstx0001asWKF7r33XpWUlOioo47S008/rbCwMHOZiRMn6qefftKdd96pJ598UqWlpUpOTtaoUaN0ySWXtPi7k5KS9OOPP+of//iHnnjiCVVWVmrw4MH66KOPdMwxx7R4vSkpKVqyZIkefvhhvfPOO3rvvfcUEBCgwYMH66WXXtLZZ5/td6q/s88+W1arVXPnztW+fft06KGH6sknn1RKSkqj33fDDTeod+/eevTRR80MTunp6ZoyZYqOO+44c7mpU6fq66+/1pw5c/Twww/L4XAoKyvLDHaTXBm1/vrXv+rNN9/Ua6+9JqfTqVNPPVVnnnmmnnvuOT399NMqLCxUcnKyZs+erdtvv73FgWp/xF133aUjjzxSjz/+uP71r38pPz9fsbGxOuyww/Thhx+a233uuedq7969evbZZ7VgwQL1799fr732mt555x198803Hut88cUXNXjwYD3//PO67rrrFB0drZEjR2r06NHNLl9SUpKWLFmiO+64Q/PmzdPTTz+t+Ph4DRgwwO/0n94iIiL05Zdf6umnn9Zrr72m6667Tk6nU3379tXcuXN12WWXKTAw0OdzXbt21ejRo/XDDz/owgsv9LvMM888oxEjRujZZ5/VTTfdpICAAGVkZOjMM8/0mRazs/hf3CYAAAAAAP6sLM7m5iMHAAAAAAAAmuGWW27Rvffe63fqPQAAAAAAAKCzO/iP+gEAAAAAAOBPZc+ePUpISGjvYgAAAAAAAABtgikIAQAAAAAA0Ca2bNmi999/X++8846OPfbY9i4OAAAAAAAA0CbIgAUAAAAAAIA2sWjRIs2ZM0cTJkzQI4880t7FAQAAAAAAANqExel0Otu7EAAAAAAAAAAAAAAAAADQGZEBCwAAAAAAAAAAAAAAAABaiAAsAAAAAAAAAAAAAAAAAGihgPYuQEfgcDi0e/duRUZGymKxtHdxAAAAAAAAAAAAAAAAALQzp9OpkpISpaamymptOM8VAViSdu/erfT09PYuBgAAAAAAAAAAAAAAAIAOZufOneratWuD7xOAJSkyMlKSa2dF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1dpVWKmYtCxp6zZ1iwvVHcf191jmt+0FeuLrLQqNitP06Year1f+ni2tX61BaVH6++RekqTnv9+m79yefjHW6+6Fs4ebWTG27C/THZ+skySF2Jx68rShCggI0NbcMs35eJ3H55K6dldR9k5JUmmN6/fz9uPmPGnlbz6vd40J0V0zXefsiz9s17d1Gc/OODRdk/snmsu51y1GHT4mK14XjcvQN+v366Wfdig6IVnTpw+VJD16gLrQm1E3Vjmsik5MknL26vRDu2pKf98MTu6255Xrto/WyhkQounTJ5ivL9mWL63wrf/u+HittuSWe+x/47M5P26XNq/XYZmx+ktdVidju43MX5L06s879OW6/eqa2UvTj+rpt1w78sulX79XcIBVz5457IDb3xzfb8rTf753lX1K/0SfTFCrdxfrwc83KjAsUtOnj/Z4L7uwQvrlOwXaLPr3WcOb9H2frtyrt3/LVnxyV02f7tqXi7fmS6t+lSRNmjLNfLJ52c5CadkSJUQE6aGTB5n7L6tLuG45pm+j3/PGkp36fM0+pXbvqelTeumOFd9IqtZdx/c3n8jfW1SpG95frVpLoKZPn+p3PSuzi6RlixUXHqgLx2bogQUbJUmPzx7sc/09sk8XnX14N63fW6J752+QNSRC06eP0Rt7f5EKXNeJIydPVWjd3YVt32yRtm0yPx8bFqhHZw32WOdnq/bqrV+zPV5zBEdJKtV5o7trQu8EnzIb+8nf+iRXJquLXv1dknTxuAyNzorX64t3auHafereo5emT/J/HC7amCutWqrucWGac1w/Sa6nF92va/sqfeuMJR+tlbJ36vghKTphWH29ffl/l6msyi5rRIK0rz67m3cdKLkykV275AtJTj100kBd+94q17Ye3k0T/WTpk6Qv1+3Xqz/vkCQ9csogxTXyJLZU364cOXqc/r11mVRWYbYtl2wt0NPfbpEkPX/2cNmsFnM/j8qM1aUTeujW/1ujHfkNZ1My6onwYJueOm2o+fpt/7dW292eUkzv2U/Tx2Ro8/4y6bcfFB5k01OnD/VdoR+/7yjUY19tliT9+6xhCrRZVVReo6vedtWH3Xv1kTa7nu52Boaoz6De0rqVHut46dwR+nZDrl78cbui45M0fXp9nfP7J2ulnTs1rX+iFm8rUEF5jUYcNtbMZrd4a7600nUuj554lE+GCUly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2+265ZZblJmZqdDQUGVlZenOO++U0+k0l3E6nbr11luVkpKi0NBQTZo0SRs3bmzHUqMt1dYFYAXayIAFAAAAAAAAAAAAAACA9tehA7Duv/9+/etf/9KTTz6ptWvX6v7779cDDzygJ554wlzmgQce0OOPP65nnnlGixcvVnh4uKZOnarKysp2LDnaijEFoY0pCAEAAAAAAAAAAAAAANABBLR3ARrz448/6vjjj9cxxxwjScrIyNB///tfLVmyRJIr+9XcuXN188036/jjj5ckvfLKK0pKStIHH3ygU089td3KjrbBFIQAAAAAAAAAAAAAAADoSDp0ANbo0aP13HPPacOGDerdu7eWL1+u77//Xo888ogkaevWrdq7d68mTZpkfiY6OlqjRo3STz/91GAAVlVVlaqqqsy/i4uLJUk1NTWqqalpwy1CSxm/S63dLkmyOh38VgCAAzKuFVwzAADNxTUEANASXD8AAC3B9QMA0BJcP4CDo6nnWIcOwLrhhhtUXFysvn37ymazyW636+6779YZZ5whSdq7d68kKSkpyeNzSUlJ5nv+3HvvvZozZ47P659//rnCwsJacQvQ2vbu2y/JqjWrVurTfSvauzgAgE5i4cKF7V0EAEAnxTUEANASXD8AAC3B9QMA0BJcP4C2VV5e3qTlOnQA1ttvv63XX39db7zxhgYMGKBly5bp6quvVmpqqs4555wWr/fGG2/UNddcY/5dXFys9PR0TZkyRVFRUa1RdLSympoaLVy4UHFx8VJhgYYNHaLpQ1Pbu1gAgA7OuH5MnjxZgYGB7V0cAEAnwjUEANASXD8AAC3B9QMA0BJcP4CDw5hV70A6dADWddddpxtuuMGcSnDQoEHavn277r33Xp1zzjlKTk6WJOXk5CglJcX8XE5OjoYOHdrgeoODgxUcHOzzemBgIBVTB+eURZIUGBjAbwUAaDKu8QCAluIaAgBoCa4fAICW4PoBAGgJrh9A22rq+WVt43L8IeXl5bJaPYtos9nkcDgkSZmZmUpOTtaXX35pvl9cXKzFixfr8MMPP6hlxcFhdzolSVaLpZ1LAgAAAAAAAAAAAAAAAHTwDFgzZszQ3XffrW7dumnAgAH6/fff9cgjj+j888+XJFksFl199dW666671KtXL2VmZuqWW25RamqqZs6c2b6FR5twuOKvZLMSgAUAAAAAAAAA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kyTrrbtO9t1382auCICWoKqqKlOmTMlee+2VioqK5i4HgBZEDwGgIfQPABpC/wCgIfQPWDNqdtX7NHUKYB100EHFx4sWLcqkSZOyySabZMiQIUmSRx99NM8991y+//3v17/ST9C3b99ssskmtdY23njj/M///E+SpE+fPkmSuXPnpm/fvsVz5s6dm6222mq1123btm3atm270npFRYU/mEpYzRaErVu18nMCoF70eAAaSg8BoCH0DwAaQv8AoCH0D2hadf39qlMA68wzzyw+PuaYY3LiiSfm7LPPXumcN954ox4lfrpddtkls2fPrrX24osvZsCAAUmSgQMHpk+fPpk6dWoxcFVZWZnHHnssxx9/fKPWQvMrFD76XF7HaWwAAAAAAAAAANDUyuv7gltuuSXf/e53V1r/zne+U5xM1VjGjBmTRx99NOedd15efvnl3HDDDbn66qszcuTIJElZWVlGjx6dc845J7///e/zzDPP5Lvf/W769etXa2oXnw/L81cpLxfAAgAAAAAAAACgNNRpAtaK2rdvn0ceeSSDBg2qtf7II4+kXbt2jVZYkmy//fa57bbbMn78+Jx11lkZOHBgLrvsshx66KHFc37wgx/kgw8+yHHHHZf33nsvu+66a+65555Gr4XmV134KHjVqt6xQQAAAAAAAAAAaBr1DmCNHj06xx9/fJ588snssMMOSZLHHnss11xzTU4//fRGL3D//ffP/vvvv9rjZWVlOeuss3LWWWc1+temtFTbghAAAAAAAAAAgBJT7wDWuHHjsv766+e//uu/8t///d9Jko033jjXXnttvvnNbzZ6gVCjuAWhABYAAAAAAAAAACWi3gGsJPnmN78pbMUaVzMBq1W5ABYAAAAAAAAAAKWhvCEveu+99/KLX/wiP/zhDzNv3rwkyZNPPpl//OMfjVocrKhQ3IKweesAAAAAAAAAAIAa9Z6ANWvWrAwdOjRdu3bN3/72txxzzDHp3r17br311rz++uu5/vrrm6JOSPXyz+USWAAAAAAAAAAAlIh6T8AaO3ZsjjjiiLz00ktp165dcX3ffffNtGnTGrU4WFHNBKxWZQJYAAAAAAAAAACUhnoHsGbMmJHvfe97K62vs846mTNnTqMUBatSnIAlgAUAAAAAAAAAQImodwCrbdu2qaysXGn9xRdfTM+ePRulKFiV6uUTsGxB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AAAAACgl9Z6A9cEHH9SafFVj3rx5adu2baMUBf+qYAtCAAAAAAAAAABKUL0DWF/60pdy/fXXF5+XlZWluro6F110Ub7yla80anHwr8oksAAAAAAAAAAAKCH13oLwoosuyp577pknnngiS5YsyQ9+8IM899xzmTdvXh555JGmqBFsQQgAAAAAAAAAQEmq9wSszTbbLC+++GJ23XXXHHjggfnggw/yta99LX/+85/zxS9+sSlqBFsQAgAAAAAAAABQkuo9AStJunbtmtNOO62xa4HVKsQELAAAAAAAAAAASk+DAljvvvtufvnLX+aFF15IkmyyySY58sgj071790YtDmrUTMAqNwILAAAAAAAAAIASUu8tCKdNm5YvfOELufzyy/Puu+/m3XffzeWXX56BAwdm2rRpTVEjFANYRmABAAAAAAAAAFBK6j0Ba+TIkTn44INz5ZVXplWrVkmSZcuW5fvf/35GjhyZZ555ptGLhI+3IJTAAgAAAAAAAACgdNR7AtbLL7+ck08+uRi+SpJWrVpl7Nixefnllxu1OKhRMwHLDoQAAAAAAAAAAJSSegewttlmm7zwwgsrrb/wwgvZcsstG6Uo+FfFAFbzlgEAAAAAAAAAALXUaQvCWbNmFR+feOKJOemkk/Lyyy9np512SpI8+uijmThxYi644IKmqZJ/e8vzVyk3AgsAAAAAAAAAgBJSpwDWVlttlbKyshRqxhAl+cEPfrDSed/+9rdz8MEHN151sFz18vee/BUAAAAAAAAAAKWkTgGsV199tanrgE9W+PRTAAAAAAAAAABgTatTAGvAgAFNXQd8okJMwAIAAAAAAAAAoPTUKYD1r9588808/PDDeeutt1JdXV3r2IknntgohcGKana/LJfAAgAAAAAAAACghNQ7gHXdddfle9/7Xtq0aZMePXqkbIVATFlZmQAWTaJ6eQBL/AoAAAAAAAAAgFJS7wDW6aefnjPOOCPjx49PeXl5U9QEK/l4C0IRLAAAAAAAAAAASke9E1QLFy7MIYccInzFGlUwAQsAAAAAAAAAgBJU7xTV0UcfnVtuuaUpaoFPJ4EFAAAAAAAAAEAJqfcWhOeff37233//3HPPPdl8881TUVFR6/gll1zSaMVBjZoJWOW2IAQAAAAAAAAAoIQ0KIB17733ZqONNkqSlK0QiCkTjqGJVC9PYHmHAQAA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AAAAAACUDgEsWoTiBCx7EAIAAAAAAAAAUEIEsGgRzL8CAAAAAAAAAKAUCWDRMiwfgWUAFgAAAAAAAAAApUQAixbh4y0Im7cOAAAAAAAAAABYkQAWLULNFoRlkcACAAAAAAAAAKB0CGDRIpiABQAAAAAAAABAKRLAokUoLJ+BJX8FAAAAAAAAAEApEcCiRfh4ApYIFgAAAAAAAAAApUMAixah0NwFAAAAAAAAAADAKrRu7gKgTooTsJq3DAAAAAAAAACg4ZYtW5aqqqrmLgOSJK1atUrr1q0/845sAli0CIXlCSz5KwAAAAAAAABomRYsWJC///3vKRTsg0Xp6NChQ/r27Zs2bdo0+BoCWLQIheIELBEsAAAAAAAAAGhpli1blr///e/p0KFDevbs6d//aXaFQiFLlizJ22+/nVdffTWDBg1KeXl5g64lgEWLUJN99ccvAAAAAAAAALQ8VVVVKRQK6dmzZ9q3b9/c5UCSpH379qmoqMhrr72WJUuWpF27dg26TsNiW7CG1YwfFIAFAAAAAAAAgJbL5CtKTUOnXtW6RiPUAU3OBCwAAAAAAAAAAEqRABYtQqGYwBLBAgAAAAAAAACgdAhg0aKIXwEAAAAAAAAApegLX/hCLrvsss98zppWijWtTqnWKoBFi2IAFgAAAAAAAACwJr3xxhs56qij0q9fv7Rp0yYDBgzISSedlH/+85/1vtaMGTNy3HHHNVptjRFIaqyaXn755Rx55JFZd91107Zt2wwcODDf+ta38sQTT3zma5c6ASxahMLyPQjLzMACAAAAAAAAANaQV155Jdttt11eeuml3HjjjXn55ZczefLkTJ06NUOGDMm8efPqdb2ePXumQ4cOTVRtwzRGTU888US23XbbvPjii7nqqqvy/PPP57bbbsvgwYNz8sknN1KlpUsAixahsPyzCVgAAAAAAAAA0PIVCoUsXLK0WT5qhsDUxciRI9OmTZvcd999+fKXv5z11lsv++yzT/74xz/mH//4R0477bRa57///vv51re+lY4dO2adddbJxIkTax3/14lV7733Xo455pj07NkzXbp0yR577JGnn3661mvuuOOObL/99mnXrl3WXnvtfPWrX02S7L777nnttdcyZsyYlJWVpWx5qOK1117LAQcckLXWWisdO3bMpptumrvuumu19/ivNZWVleUXv/hFvvrVr6ZDhw4ZNGhQfv/736/29YVCIUcccUQGDRqUhx56KPvtt1+++MUvZquttsqZZ56Z3/3ud8VzTz311Gy44Ybp0KFD1l9//Zx++umpqqqq0/3WWLhwYY466qh07tw56623Xq6++upax994441885vfTLdu3dK9e/cceOCB+dvf/rba+htD6ya9+ho0ceLE/OQnP8mcOXOy5ZZb5oorrsgOO+zQ3GXRSGr+7JO/AgAAAAAAAICW78OqZdnkjHub5Ws/f9bwdGjz6ZGZefPm5d577825556b9u3b1zrWp0+fHHroobn55pszadKkYvjpJz/5SX74wx9mwoQJuffee3PSSSdlww03zF577bXKr/GNb3wj7du3z913352uXbvmqquuyp577pkXX3wx3bt3zx/+8Id89atfzWmnnZbrr78+S5YsKYapbr311my55ZY57rjjcuyxxxavOXLkyCxZsiTTpk1Lx44d8/zzz6dTp071+h5NmDAhF110UX7yk5/kiiuuyKGHHprXXnst3bt3X+ncp556Ks8991xuuOGGlJevPAuqW7duxcedO3fOddddl379+uWZZ57Jsccem86dO+cHP/hBknzi/da4+OKLc/bZZ+eHP/xhfvvb3+b444/Pl7/85Wy00UapqqrK8OHDM2TIkDz00ENp3bp1zjnnnOy9996ZNWtW2rRpU6/vQ119LgJYN998c8aOHZvJkydnxx13zGWXXZbhw4dn9uzZ6dWrV3OXRyMoLJ+BZQIWAAAAAAAAALAmvPTSSykUCtl4441XeXzjjTfOu+++m7fffruYT9lll10ybty4JMmGG26YRx55JJdeeukqA1gPP/xwHn/88bz11ltp27ZtkuSnP/1pbr/99vz2t7/Ncccdl3PPPTeHHHJIJkyYUHzdlltumSTp3r17WrVqlc6dO6dPnz7F46+//npGjBiRzTffPEmy/vrr1/vejzjiiHzrW99Kkpx33nm5/PLL8/jjj2fvvfde5fcpSQYPHvyp1/3Rj35UfPyFL3wh//mf/5mbbrqpGMD6pPutse++++b73/9+ko8mal166aV54IEHstFGG+Xmm29OdXV1fvGLXxRDcddee226deuWP/3pTxk2bFh9vg119rkIYF1yySU59thjc+SRRyZJJk+enD/84Q+55pprim9qWraPp/9JYAEAAAAAAABAS9e+olWeP2t4s33t+qjPloVDhgxZ6fmK2/ut6Omnn86CBQvSo0ePWusffvhh/vrXvyb5aLrUitOt6uLEE0/M8ccfn/vuuy9Dhw7NiBEjssUWW9TrGiue37Fjx3Tp0iVvvfXWKs+tz/fn5ptvzuWXX56//vWvWbBgQZYuXZouXboUj9flflesraysLH369CnW9vTTT+fll19O586da71m0aJFxe9pU2jxAawlS5Zk5syZGT9+fHGtvLw8Q4cOzfTp01f5msWLF2fx4sXF55WVlUmSqqqqlfaVpDRUV1cv/7zMzwiAOqvpGXoHAPWlhwDQEPoHAA2hfwDQEC2xf1RVVaVQKKS6urqYAWjXeuXt6taEQqFQp9DQ+uuvn7Kysjz//PM58MADVzr+/PPPZ6211kqPHj2K91Rzjyt+rSQrrVVXV+f9999P3759c//996907W7duqW6ujrt27ev9T1b3f2sePyoo47KXnvtlT/84Q+ZMmVKzj///Pz0pz/NqFGj6nyNVq1a1XpeVlaWpUuXrrKODTbYoPj9+NdpVSuaPn16Dj300Pz4xz/OsGHD0rVr19x888255JJLitety/22bt16pdqWLVtW/J5uu+22+X//7/+t9LqePXuu8rrV1dUpFAqpqqpKq1a1w3l1/R1r8QGsd955J8uWLUvv3r1rrffu3Tt/+ctfVvma888/v9aoshr33XdfOnTo0CR18tm8/U55kvI8/9xzuevtZ5u7HABamClTpjR3CQC0UHoIAA2hfwDQEPoHAA3RkvpH69at06dPnyxYsCBLlixp7nLqpKKiIl/5ylcyadKkHHXUUWnfvn3x2Ny5c3PDDTfk4IMPzvvvv5/koyDPww8/XBwElCQPPfRQNthgg+JadXV1Fi1alMrKymy00UaZM2dOFi1alPXWW2+lr19ZWZlNNtkk9957b0aMGLHKGlu3bp0PPvig1tdMkq5du+bb3/52vv3tb2fChAm56qqr8t3vfneV11ixphoffvhhreeFQmGlc2qsv/76GTx4cH76059mn332SXl57WDd/Pnz07Vr1zzwwAPp379/rSDYyy+/nEKhULzup93vqmpdtmxZFi9enMrKymy88ca5+eab065du1qTtWqsqv4lS5bkww8/zLRp07J06dJaxxYuXLjKOv5Viw9gNcT48eMzduzY4vPKysr0798/w4YNW+U3n+a37ubzMvWhx/LNvb+Udbp3au5yAGghqqqqMmXKlOy1116pqKho7nIAaEH0EAAaQv8AoCH0DwAaoiX2j0WLFuWNN95Ip06d0q5du+Yup84mTZqUXXfdNQcffHDOOuusDBw4MM8991xOPfXUrLPOOrnooouKWZPy8vI8/vjjueqqq3LggQfmj3/8Y373u9/ljjvuqHVOTTjoP/7jPzJkyJB897vfzQUXXJANN9wwb775Zu66664cdNBB2W677TJhwoTstddeGTx4cA4++OAsXbo0d999d37wgx8kSQYOHJjHH38877//ftq2bZu11147Y8aMyd57750NN9ww7777bqZPn55NN910tZmYFWuq0b59+1rPy8rKVhtqSpJrr702w4YNywEHHJDx48dn8ODBWbBgQe68885MmTIlDzzwQDbbbLP8/e9/z1133ZXtt98+d911V/7whz+krKyseN1Pu99V1dqqVau0bds2Xbp0ydFHH52JEyfm8MMPz49//OOsu+66ee2113LbbbfllFNOybrrrrtS7YsWLUr79u2z2267rfTeXFVga1VafABr7bXXTqtWrTJ37txa63Pnzk2fPn1W+Zq2bdumbdu2K61XVFS0mD+Y/t1s0b97/t6tkHW6d/IzAqDe9HgAGkoPAaAh9A8AGkL/AKAhWlL/WLZsWcrKylJeXr7ShKRSttFGG+WJJ57ImWeemUMOOSTz5s1Lnz59ctBBB+XMM89Mjx49ap1/8sknZ+bMmTnrrLPSpUuXXHLJJdlnn31qnVPzfUiSu+66K6eddlqOPvrovP322+nTp09222239O3bN+Xl5dljjz1yyy235Oyzz86FF16YLl26ZLfddiu+/uyzz873vve9DBo0KIsXLy5uJXjCCSfk73//e7p06ZK99947l1566Sd+31esKckqf06f9LPbaaed8sQTT+Tcc8/N9773vbzzzjvp27dvdt5551x22WUpLy/PQQcdlDFjxuTEE0/M4sWLs99+++X000/Pj3/84+J1P+1+V1XrimudOnXKtGnTcuqpp+brX/963n///ayzzjrZc889061bt1XWX15enrKyslX+PtX196usUJdNLUvcjjvumB122CFXXHFFko/Gja233noZNWpUxo0b96mvr6ysTNeuXTN//nwTsEpUVVVV7rrrruy7774tpnkA0Pz0DwAaSg8BoCH0DwAaQv8AoCFaYv9YtGhRXn311QwcOLBFTcBqbH379s3ZZ5+dY445prlLYblPem/WNVPU4idgJcnYsWNz+OGHZ7vttssOO+yQyy67LB988EGOPPLI5i4NAAAAAAAAAIB/cwsXLswjjzySuXPnZtNNN23ucmhkn4sA1sEHH5y33347Z5xxRubMmZOtttoq99xzT3r37t3cpQEAAAAAAAAA8G/u6quvztlnn53Ro0dnyJAhzV0OjexzEcBKklGjRmXUqFHNXQYAAAAAAAAAANQyevTojB49urnLoImUN3cBAAAAAAAAAAAALZUAFgAAAAAAAAAAa0ShUGjuEqCWxnhPCmABAAAAAAAAANCkWrVqlSRZsmRJM1cCtS1cuDBJUlFR0eBrtG6sYgAAAAAAAAAAYFVat26dDh065O23305FRUXKy80MonkVCoUsXLgwb731Vrp161YMCTaEABYAAAAAAAAAAE2qrKwsffv2zauvvprXXnutucuBom7duqVPnz6f6RoCWAAAAAAAAAAANLk2bdpk0KBBtiGkZFRUVHymyVc1BLAAAAAAAAAAAFgjysvL065du+YuAxqVDTUBAAAAAAAAAAAaSAALAAAAAAAAAACggQSwAAAAAAAAAAAAGqh1cxdQCgqFQpKksrKymSthdaqqqrJw4cJUVlamoqKiucsBoIXQPwBoKD0EgIbQPwBoCP0DgIbQP2DNqMkS1WSLVkcAK8n777+fJOnfv38zVwIAAAAAAAAAAJSS999/P127dl3t8bLCp0W0/g1UV1fnzTffTOfOnVNWVtbc5bAKlZWV6d+/f95444106dKlucsBoIXQPwBoKD0EgIbQPwBoCP0DgIbQP2DNKBQKef/999OvX7+Ul5ev9jwTsJKUl5dn3XXXbe4yqIMuXbpoHgDUm/4BQEPpIQA0hP4BQEPoHwA0hP4BTe+TJl/VWH00CwAAAAAAAAAAgE8kgAUAAAAAAAAAANBAAli0CG3bts2ZZ56Ztm3bNncpALQg+gcADaWHANAQ+gcADaF/ANAQ+geUlrJCoVBo7iIAAAAAAAAAAABaIhOwAAAAAAAAAAAAGkgACwAAAAAAAAAAoIEEsAAAAAAAAAAAABpIAAsAAAAAAAAAAKCBBLBoESZOnJgvfOELadeuXXbcccc8/vjjzV0SAM3k/PPPz/bbb5/OnTunV69eOeiggzJ79uxa5yxatCgjR45Mjx490qlTp4wYMSJz586tdc7rr7+e/fbbLx06dEivXr1yyimnZOnSpWvyVgBoRhdccEHKysoyevTo4pr+AcDq/OMf/8h3vvOd9OjRI+3bt8/mm2+eJ554oni8UCjkjDPOSN++fdO+ffsMHTo0L730Uq1rzJs3L4ceemi6dOmSbt265eijj86CBQvW9K0AsIYsW7Ysp59+egYOHJj27dvni1/8Ys4+++wUCoXiOfoHANOmTcsBBxyQfv36paysLLfffnut443VK2bNmpUvfelLadeuXfr375+LLrqoqW8N/u0IYFHybr755owdOzZnnnlmnnzyyWy55ZYZPnx43nrrreYuDYBm8OCDD2bkyJF59NFHM2XKlFRVVWXYsGH54IMPiueMGTMmd9xxR2655ZY8+OCDefPNN/O1r32teHzZsmXZb7/9smTJkvzv//5vfvWrX+W6667LGWec0Ry3BMAaNmPGjFx11VXZYostaq3rHwCsyrvvvptddtklFRUVufvuu/P888/n4osvzlprrVU856KLLsrll1+eyZMn57HHHkvHjh0zfPjwLFq0qHjOoYcemueeey5TpkzJnXfemWnTpuW4445rjlsCYA248MILc+WVV+ZnP/tZXnjhhVx44YW56KKLcsUVVxTP0T8A+OCDD7Lllltm4sSJqzzeGL2isrIyw4YNy4ABAzJz5sz85Cc/yY9//ONcffXVTX5/8O+krLBi1B5K0I477pjtt98+P/vZz5Ik1dXV6d+/f0444YSMGzeumasDoLm9/fbb6dWrVx588MHstttumT9/fnr27JkbbrghX//615Mkf/nLX7Lxxhtn+vTp2WmnnXL33Xdn//33z5tvvpnevXsnSSZPnpxTTz01b7/9dtq0adOctwRAE1qwYEG22WabTJo0Keecc0622mqrXHbZZfoHAKs1bty4PPLII3nooYdWebxQKKRfv345+eST85//+Z9Jkvnz56d379657rrrcsghh+SFF17IJptskhkzZmS77bZLktxzzz3Zd9998/e//z39+vVbY/cDwJqx//77p3fv3vnlL39ZXBsxYkTat2+f//7v/9Y/AFhJWVlZbrvtthx00EFJGu+/Na688sqcdtppmTNnTvHvr8aNG5fbb789f/nLX5rlXuHzyAQsStqSJUsyc+bMDB06tLhWXl6eoUOHZvr06c1YGQClYv78+UmS7t27J0lmzpyZqqqqWr1j8ODBWW+99Yq9Y/r06dl8882L/3ieJMOHD09lZWWee+65NVg9AGvayJEjs99++9XqE4n+AcDq/f73v892222Xb3zjG+nVq1e23nrr/PznPy8ef/XVVzNnzpxaPaRr167Zcccda/WQbt26Ff9BJEmGDh2a8vLyPPbYY2vuZgBYY3beeedMnTo1L774YpLk6aefzsMPP5x99tknif4BwKdrrF4xffr07LbbbrX+58Hhw4dn9uzZeffdd9fQ3cDnX+vmLgA+yTvvvJNly5bV+geOJOndu7c0LgCprq7O6NGjs8suu2SzzTZLkuL/wdGtW7da5/bu3Ttz5swpnrOq3lJzDIDPp5tuuilPPvlkZsyYsdIx/QOA1XnllVdy5ZVXZuzYsfnhD3+YGTNm5MQTT0ybNm1y+OGHF3vAqnrEij2kV69etY63bt063bt310MAPqfGjRuXysrKDB48OK1atcqyZcty7rnn5tBDD00S/QOAT9VYvWLOnDkZOHDgSteoObbi9upAwwlgAQAt1siRI/Pss8/m4Ycfbu5SAChxb7zxRk466aRMmTIl7dq1a+5yAGhBqqurs9122+W8885Lkmy99dZ59tlnM3ny5Bx++OHNXB0Apeo3v/lNfv3rX+eGG27IpptumqeeeiqjR49Ov3799A8AgM8hWxBS0tZee+20atUqc+fOrbU+d+7c9OnTp5mqAqAUjBo1KnfeeWceeOCBrLvuusX1Pn36ZMmSJXnvvfdqnb9i7+jTp88qe0vNMQA+f2bOnJm33nor22yzTVq3bp3WrVvnwQcfzOWXX57WrVund+/e+gcAq9S3b99ssskmtdY23njjvP7660k+7gGf9PdXffr0yVtvvVXr+NKlSzNv3jw9BOBz6pRTTsm4ceNyyCGHZPPNN89hhx2WMWPG5Pzzz0+ifwDw6RqrV/g7LVgzBLAoaW3atMm2226bqVOnFteqq6szderUDBkypBkrA6C5FAqFjBo1Krfddlvuv//+lcbmbrvttqmoqKjVO2bPnp3XX3+92DuGDBmSZ555ptZ/lEyZMiVdunRZ6R9WAPh82HPPPfPMM8/kqaeeKn5st912OfTQQ4uP9Q8AVmWXXXbJ7Nmza629+OKLGTBgQJJk4MCB6dOnT60eUllZmccee6xWD3nvvfcyc+bM4jn3339/qqurs+OOO66BuwBgTVu4cGHKy2v/M1yrVq1SXV2dRP8A4NM1Vq8YMmRIpk2blqqqquI5U6ZMyUYbbWT7QWhEtiCk5I0dOzaHH354tttuu+ywww657LLL8sEHH+TII49s7tIAaAYjR47MDTfckN/97nfp3LlzcQ/zrl27pn379unatWuOPvrojB07Nt27d0+XLl1ywgknZMiQIdlpp52SJMOGDcsmm2ySww47LBdddFHmzJmTH/3oRxk5cmTatm3bnLcHQBPp3LlzNttss1prHTt2TI8ePYrr+gcAqzJmzJjsvPPOOe+88/LNb34zjz/+eK6++upcffXVSZKysrKMHj0655xzTgYNGpSBAwfm9NNPT79+/XLQQQcl+Whi1t57751jjz02kydPTlVVVUaNGpVDDjkk/fr1a8a7A6CpHHDAATn33HOz3nrrZdNNN82f//znXHLJJTnqqKOS6B8AfGTBggV5+eWXi89fffXVPPXUU+nevXvWW2+9RukV3/72tzNhwoQcffTROfXUU/Pss8/mv/7rv3LppZc2xy3D51ZZoVAoNHcR8Gl+9rOf5Sc/+UnmzJmTrbbaKpdffrn/uwPg31RZWdkq16+99tocccQRSZJFixbl5JNPzo033pjFixdn+PDhmTRpUq1Ruq+99lqOP/74/OlPf0rHjh1z+OGH54ILLkjr1vLpAP8udt9992y11Va57LLLkugfAKzenXfemfHjx+ell17KwIEDM3bs2Bx77LHF44VCIWeeeWauvvrqvPfee9l1110zadKkbLjhhsVz5s2bl1GjRuWOO+5IeXl5RowYkcsvvzydOnVqjlsCoIm9//77Of3003PbbbflrbfeSr9+/fKtb30rZ5xxRtq0aZNE/wAg+dOf/pSvfOUrK60ffvjhue666xqtV8yaNSsjR47MjBkzsvbaa+eEE07IqaeeukbuEf5dCGABAAAAAAAAAAA0UPmnnwIAAAAAAAAAAMCqCGABAAAAAAAAAAA0kAAWAAAAAAAAAABAAwlgAQAAAAAAAAAANJAAFgAAAAAAAAAAQAMJYAEAAAAAAAAAADSQABYAAAAAAAAAAEADCWABAAAAAAAAAAA0kAAWAAAAAC3eEUcckYMOOqjZvv5hhx2W8847r07nHnLIIbn44oubuCIAAAAA1pSyQqFQaO4iAAAAAGB1ysrKPvH4mWeemTFjxqRQKKRbt25rpqgVPP3009ljjz3y2muvpVOnTp96/rPPPpvddtstr776arp27boGKgQAAACgKQlgAQAAAFDS5syZU3x8880354wzzsjs2bOLa506dapT8KmpHHPMMWndunUmT55c59dsv/32OeKIIzJy5MgmrAwAAACANcEWhAAAAACUtD59+hQ/unbtmrKyslprnTp1WmkLwt133z0nnHBCRo8enbXWWiu9e/fOz3/+83zwwQc58sgj07lz52ywwQa5++67a32tZ599Nvvss086deqU3r1757DDDss777yz2tqWLVuW3/72tznggANqrU+aNCmDBg1Ku3bt0rt373z961+vdfyAAw7ITTfd9Nm/OQAAAAA0OwEsAAAAAD6XfvWrX2XttdfO448/nhNOOCHHH398vvGNb2TnnXfOk08+mWHDhuWwww7LwoULkyTvvfde9thjj2y99dZ54okncs8992Tu3Ln55je/udqvMWvWrMyfPz/bbbddce2JJ57IiSeemLPOOiuzZ8/OPffck912263W63bYYYc8/vjjWbx4cdPcPAAAAABrjAAWAAAAAJ9LW265ZX70ox9l0KBBGT9+fNq1a5e11147xx57bAYNGpQzzjgj//znPzNr1qwkyc9+9rNsvfXWOe+88zJ48OBsvfXWueaaa/LAAw/kxRdfXOXXeO2119KqVav06tWruPb666+nY8eO2X///TNgwIBsvfXWOfHEE2u9rl+/flmyZEmt7RUBAAAAaJkEsAAAAAD4XNpiiy2Kj1u1apUePXpk8803L6717t07SfLWW28lSZ5++uk88MAD6dSpU/Fj8ODBSZK//vWvq/waH374Ydq2bZuysrLi2l577ZUBAwZk/fXXz2GHHZZf//rXxSlbNdq3b58kK60DAAAA0PIIYAEAAADwuVRRUVHreVlZWa21mtBUdXV1kmTBggU54IAD8tRTT9X6eOmll1baQrDG2muvnYULF2bJkiXFtc6dO+fJJ5/MjTfemL59++aMM87Illtumffee694zrx585IkPXv2bJR7BQAAAKD5CGABAAAAQJJtttkmzz33XL7whS9kgw02qPXRsWPHVb5mq622SpI8//zztdZbt26doUOH5qKLLsqsWbPyt7/9Lffff3/x+LPPPpt11103a6+9dpPdDwAAAABrhgAWAAAAACQZOXJk5s2bl29961uZMWNG/vrXv+bee+/NkUcemWXLlq3yNT179sw222yThx9+uLh255135vLLL89TTz2V1157Lddff32qq6uz0UYbFc956KGHMmzYsCa/JwAAAACangAWAAAAACTp169fHnnkkSxbtizDhg3L5ptvntGjR6dbt24pL1/9X6Mdc8wx+fWvf1183q1bt9x6663ZY489svHGG2fy5Mm58cYbs+mmmyZJFi1alNtvvz3HHntsk98TAAAAAE2vrFAoFJq7CAAAAABoqT788MNstNFGufnmmzNkyJBPPf/KK6/Mbbfdlvvuu28NVAcAAABAUzMBCwAAAAA+g/bt2+f666/PO++8U6fzKyoqcsUVVzRxVQAAAACsKSZgAQAAAAAAAAAANJAJWAAAAAAAAAAAAA0kgAUAAAAAAAAAANBAAlgAAAAAAAAAAAANJIAFAAAAAAAAAADQQAJYAAAAAAAAAAAADSSABQAAAAAAAAAA0EACWAAAAAAAAAAAAA0kgAUAAAAAAAAAANBAAlgAAAAAAAAAAAAN9P8BvbqykyPNpZIAAAAASUVORK5CYII=",
"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": 15,
"id": "f30a0497-9b2e-4ea9-8ebf-6687de19aaa9",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAq4AAAIjCAYAAADC0ZkAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABBCElEQVR4nO3deVxV1f7/8fdB5YADg6AMDjiR8xSmoqldo8zMMsnSryUO35sZ5kBp0qRZiWmlWQ7XrqkNXrtqWnavmqlhmlMOqZlDhGkqOAIOCQbr90c/zrcjUHg8etj2ej4e+/HwrLXO3h8WR3i7XWcdmzHGCAAAACjhvDxdAAAAAFAcBFcAAABYAsEVAAAAlkBwBQAAgCUQXAEAAGAJBFcAAABYAsEVAAAAlkBwBQAAgCUQXAEAAGAJBFcAuEpbtmxRmzZtVK5cOdlsNu3YscPTJTmpUaOG7rnnHpefb7PZNGbMGPcVVEwHDx6UzWbTa6+95vI5+vbtqxo1aritJnefryhz5syRzWbTwYMHHW1X+30EbgQEV8AivvvuOz388MOqUqWK7Ha7wsPD1bt3b3333XeeLu0v7dKlS+rRo4dOnz6tSZMm6f3331dERISnywKAG1JpTxcA4M99/PHH6tWrlypWrKgBAwaoZs2aOnjwoGbNmqWFCxdq/vz5uv/++z1d5l9SSkqKfvrpJ73zzjv63//9X0+Xg2vsnXfeUV5enqfLAP6yCK5ACZeSkqJHHnlEtWrV0tq1a1WpUiVH39ChQ9WuXTs98sgj2rlzp2rVquXBSgu6cOGCypYt6+kyrqnjx49LkgICAjxbCK6LMmXKeLoE4C+NpQJACTdx4kRduHBBM2fOdAqtkhQcHKx//OMfOn/+vCZMmODUd+TIEQ0YMEDh4eGy2+2qWbOmBg0apJycHMeYjIwMDR8+XDVq1JDdblfVqlXVp08fnTx5UlLh6+wk6csvv5TNZtOXX37paLvtttvUqFEjbd26Ve3bt1fZsmX1zDPPSJI++eQTdenSxVFL7dq19dJLLyk3N9fpvPnn2LNnj/72t7+pbNmyqlKlSoGvTZIuXryoMWPG6KabbpKPj4/CwsLUvXt3paSkOMbk5eVp8uTJatiwoXx8fBQSEqKBAwfqzJkzxZr71atXq127dipXrpwCAgJ033336fvvv3f09+3bVx06dJAk9ejRQzabTbfddtsfnjMjI0PDhg1TtWrVZLfbVadOHb366qsF7uK99tpratOmjYKCguTr66uoqCgtXLiw0HN+8MEHatmypcqWLavAwEC1b99en3/+eYFx69atU8uWLeXj46NatWrpvffeK9Y8XO6nn37S448/rrp168rX11dBQUHq0aNHgddJ/utn3bp1GjJkiCpVqqSAgAANHDhQOTk5ysjIUJ8+fRQYGKjAwECNHDlSxphCrzlp0iRFRETI19dXHTp00O7duwuMWbJkiRo1aiQfHx81atRIixcvLvRcVzK3l7t8jevv1+HOnDlTtWvXlt1u1y233KItW7YU65zfffedOnbsKF9fX1WtWlUvv/zyH97V/fzzz9WsWTP5+PioQYMG+vjjj4t1HeBGwB1XoIRbunSpatSooXbt2hXa3759e9WoUUP/+c9/HG1Hjx5Vy5YtlZGRoUcffVT16tXTkSNHtHDhQl24cEHe3t46d+6c2rVrp++//179+/fXzTffrJMnT+rTTz/Vzz//rODg4Cuu9dSpU+rcubN69uyphx9+WCEhIZJ+CzDly5dXQkKCypcvr9WrV+uFF15QVlaWJk6c6HSOM2fO6K677lL37t314IMPauHChXr66afVuHFjde7cWZKUm5ure+65R6tWrVLPnj01dOhQnT17VitXrtTu3btVu3ZtSdLAgQM1Z84c9evXT0OGDFFqaqrefvttbd++XevXr//Du2dffPGFOnfurFq1amnMmDH65Zdf9NZbb6lt27batm2batSooYEDB6pKlSoaN26chgwZoltuucXxNRfmwoUL6tChg44cOaKBAweqevXq+vrrr5WYmKhjx45p8uTJjrFvvvmm7r33XvXu3Vs5OTmaP3++evTooc8++0xdunRxjHvxxRc1ZswYtWnTRmPHjpW3t7c2bdqk1atX684773SM++GHH/TAAw9owIABiouL07vvvqu+ffsqKipKDRs2LP43Wb+9Ge3rr79Wz549VbVqVR08eFDTp0/Xbbfdpj179hS4y/7EE08oNDRUL774ojZu3KiZM2cqICBAX3/9tapXr65x48bpv//9ryZOnKhGjRqpT58+Ts9/7733dPbsWcXHx+vixYt688031bFjR+3atcsx359//rliY2PVoEEDJSUl6dSpU+rXr5+qVq1aoP7izu2VmDdvns6ePauBAwfKZrNp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vv3220K3DMofk//u/N+vvczNzdXMmTOLXX/+najf33nKycnRtGnTin2Oy8XGxurkyZN6++23C/TlX+fBBx9Ubm6uXnrppQJjfv311z8MWWFhYWrWrJnmzp3rNG737t36/PPPdffdd7tU94MPPqgNGzZoxYoVBfoyMjL066+/Svptzmw2m9Od7YMHD2rJkiVOz+nWrZu8vLw0duzYAnc6r+WdvlKlShU4/1tvvVXknfirtWTJEh05csTxePPmzdq0aZNjl4nff79+v1Rh5cqV2rNnT4HaizO318vdd9+tjRs3avPmzY62EydOFPk/BUePHnX6O5uVlaX33ntPzZo1Y5kA/hK44wqUcJGRkZo7d6569+6txo0bF/jkrJMnT+pf//qXI2RK0rhx4/T555+rQ4cOevTRR1W/fn0dO3ZMCxYs0Lp16xQQEKARI0Zo4cKF6tGjh/r376+oqCidPn1an376qWbMmKGmTZuqYcOGat26tRITE3X69GlVrFhR8+fPdwSs4mjTpo0CAwMVFxenIUOGyGaz6f3337+qYNWnTx+99957SkhI0ObNm9WuXTudP39eX3zxhR5//HHdd9996tChgwYOHKikpCTt2LFDd955p8qUKaMDBw5owYIFevPNN/XAAw8UeY2JEyeqc+fOio6O1oABAxzbYfn7+2vMmDEu1T1ixAh9+umnuueeexxbUZ0/f167du3SwoULdfDgQQUHB6tLly564403dNddd+l//ud/dPz4cU2dOlV16tRxWjZSp04dPfvss3rppZfUrl07de/eXXa7XVu2bFF4eLiSkpJcqvPP3HPPPXr//ffl7++vBg0aaMOGDfriiy8UFBR0Ta5Xp04d3XrrrRo0aJCys7M1efJkBQUFOS25SEpKUpcuXXTrrbeqf//+On36tN566y01bNhQ586dc4wr7txeLyNHjtT777+vu+66S0OHDnVshxUREVFoPTfddJMGDBigLVu2KCQkRO+++67S09M9dscYuO48sZUBgCu3c+dO06tXLxMWFmbKlCljQkNDTa9evcyuXbsKHf/TTz+ZPn36mEqVKhm73W5q1apl4uPjTXZ2tmPMqVOnzODBg02VKlWMt7e3qVq1qomLizMnT550jElJSTExMTHGbrebkJAQ88wzz5iVK1cWuh1Ww4YNC61l/fr1pnXr1sbX19eEh4ebkSNH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AC7n8j6uGRkZ+uc//6nExESdPn1akrRnzx4dP37cbcUBAAAA+Vy647pz507dfvvtCggI0MGDB/X3v/9dFStW1Mcff6xDhw7pvffec3edAAAA+Itz6Y5rQkKC+vXrpwMHDsjHx8fRfvfdd2vt2rVuKw4AAADI51Jw3bJliwYOHFigvUqVKkpLS7vqogAAAIDLuRRc7Xa7srKyCrTv379flSpVuuqiAAAAgMu5FFzvvfdejR07VpcuXZIk2Ww2HTp0SE8//bRiY2PdWiAAAAAguRhcX3/9dZ07d06VK1fWL7/8og4dOqhOnTqqUKGCXnnlFXfXCAAAALi2q4C/v79Wrlyp9evX69tvv9W5c+d08803KyYmxt31AQAAAJJcDK752rZtq7Zt27qrFgAAAKBILi0VGDJkiKZMmVKg/e2339awYcOutiYAAACgAJeC66JFiwq909qmTRstXLjwqosCAAAALudScD116pT8/f0LtPv5+enkyZNXXRQAAABwOZeCa506dbR8+fIC7cuWLVOtWrWuuigAAADgci69OSshIUGDBw/WiRMn1LFjR0nSqlWr9Prrr2vy5MnurA8AAACQ5GJw7d+/v7Kzs/XKK6/opZdekiTVqFFD06dPV58+fdxaIAAAACBdxXZYgwYN0qBBg3TixAn5+vqqfPny7qwLAAAAcHJV+7hKUqVKldxRBwAAAPCHXHpzVnp6uh555BGFh4erdOnSKlWqlNMBAAAAuJtLd1z79u2rQ4cO6fnnn1dYWJhsNpu76wIAAACcuBRc161bp6+++krNmjVzczkAAABA4VxaKlCtWjUZY9xdCwAAAFAkl4Lr5MmTNWrUKB08eNDN5QAAAACFc2mpwEMPPaQLFy6odu3aKlu2rMqUKePUf/r0abcUBwAAAORzKbjy6VgAAAC43lwKrnFxce6uAwAAAPhDLq1xlaSUlBQ999xz6tWrl44fPy5JWrZsmb777ju3FQcAAADkcym4Jicnq3Hjxtq0aZM+/vhjnTt3TpL07bffavTo0W4tEAAAAJBcDK6jRo3Syy+/rJUrV8rb29vR3rFjR23cuNFtxQEAAAD5XAquu3bt0v3331+gvXLlyjp58uRVFwUAAABczqXgGhAQoGPHjhVo3759u6pUqXLVRQEAAACXcym49uzZU08//bTS0tJks9mUl5en9evX66mnnlKf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4uHKS45BgwYZf39/8+WXX5pjx445jgsXLjjGPPbYY6Z69epm9erV5ptvvjHR0dEmOjrag1WXPKNGjTLJyckmNTXV7Ny504waNcrYbDbz+eefG2OYw6vx+10FjGEui+PJJ580X375pUlNTTXr1683MTExJjg42Bw/ftwYwxwW1+bNm03p0qXNK6+8Yg4cOGA+/PBDU7ZsWfPBBx84xvB7pnhyc3NN9erVzdNPP12gz9OvR4LrVXjrrbdM9erVjbe3t2nZsqXZuHGjp0sq0dasWWMkFTji4uKMMb9tVfL888+bkJAQY7fbze2332727dvn2aJLmMLmT5KZPXu2Y8wvv/xiHn/8cRMYGGjKli1r7r//fnPs2DHPFV0C9e/f30RERBhvb29TqVIlc/vttztCqzHM4dW4PLgyl3/uoYceMmFhYcbb29tUqVLFPPTQQ+aHH35w9DOHxbd06VLTqFEjY7fbTb169czMmTOd+vk9UzwrVqwwkgqdG0+/Hm3GGHN97u0CAAAArmONKwAAACyB4AoAAABLILgCAADAEgiuAAAAsASCKwAAACyB4AoAAABLILgCAADAEgiuAAAAsASCKwDcAA4ePCibzaYdO3Z4uhQAuGYIrgDgJn379pXNZtP48eOd2pcsWSKbzeahqgDgxkFwBQA38vHx0auvvqozZ854uhS3yMnJ8XQJAOBAcAUAN4qJiVFoaKiSkpIK7R8zZoyaNWvm1DZ58mTVqFHD8bhv377q1q2bxo0bp5CQEAUEBGjs2LH69ddfNWLECFWsWFFVq1bV7NmzC5x/7969atOmjXx8fNSoUSMlJyc79e/evVudO3dW+fLlFRISokceeUQnT5509N92220aPHiwhg0bpuDgYHXq1Mn1yQAANyO4AoAblSpVSuPGjdNbb72ln3/+2eXzrF69WkePHtXatWv1xhtvaPTo0brnnnsUGBioTZs26bHHHtPAgQMLXGPEiBF68skntX37dkVHR6tr1646deqUJCkjI0MdO3ZU8+bN9c0332j58uVKT0/Xgw8+6HSOuXPnytvbW+vXr9eMGTNc/hoAwN0IrgDgZvfff7+aNWum0aNHu3yOihUrasqUKapbt6769++vunXr6sKFC3rmmWcUGRmpxMREeXt7a926dU7PGzx4sGJjY1W/fn1Nnz5d/v7+mjVrliTp7bffVvPmzTVu3DjVq1dPzZs317vvvqs1a9Zo//79jnNERkZqwoQJqlu3rurWrevy1wAA7kZwBYBr4NVXX9XcuXP1/fffu/T8hg0bysvr/35Eh4SEqHHjxo7HpUqVUlBQkI4fP+70vOjoaMefS5curRYtWjhq+Pbbb7VmzRqVL1/ecdSrV0+SlJKS4nheVFSUSzUDwLVW2tMFAMCNqH379urUqZMSExPVt29fR7uXl5eMMU5jL126VOD5ZcqUcXpss9kKbcvLyyt2TefOnVPXrl316quvFugLCwtz/LlcuXLFPicAXE8EVwC4RsaPH69mzZo5/Xd7pUqVlJaWJmOMY4ssd+69unHjRrVv316S9Ouvv2rr1q0aPHiwJOnmm2/WokWLVKNGDZUuzY9/ANbDUgEAuEYaN26s3r17a8qUKY622267TSdOnNCECROUkpKiqVOnatmyZW675tSpU7V48WLt3btX8fHxOnPmjPr37y9Jio+P1+nTp9WrVy9t2bJFKSkpWrFihfr166fc3Fy31QAA1wrBFQCuobFjxzr9d379+vU1bdo0TZ06VU2bNtXmzZv11FNPue1648eP1/jx49W0aVOtW7dOn376qYKDgyVJ4eHhWr9+vXJzc3XnnXeqcePGGjZsmAICApzW0wJASWUzly+2AgAAAEog/okNAAAASyC4AgAAwBIIrgAAALAEgisAAAAsgeAKAAAASyC4AgAAwBIIrgAAALAEgisAAAAsgeAKAAAASyC4AgAAwBIIrgAAALCE/wdDda1wJWY5swAAAABJRU5ErkJggg==",
"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(list(db.lambda_values.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": 16,
"id": "c192564b-d3c6-40e1-a614-f7a5ee787c4e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAs0AAAIoCAYAAACSxtawAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABuJUlEQVR4nO3deVyU5f7/8fcMMIAgiIgsLkBpmrhrKraaJPX1eNKso2ZpauWCmVJ58ndK0+rY8bRZuWSWtlianbS0cknT6kDunRSXY6VZKeDCoiQgzPX7wy/zdQIdxDsH9fV8PHg8nPv6zDXXfBj0ze0919iMMUYAAAAATsvu7QUAAAAA1R2hGQAAAPCA0AwAAAB4QGgGAAAAPCA0AwAAAB4QmgEAAAAPCM0AAACAB4RmAAAAwANCMwAAAOABoRnAJemee+6RzWbT3r17z3muvXv3ymaz6Z577jnnuQAA1ROhGYClygLkzTff7O2lwAJffvmlbDabbDabFi5c6O3lVDs5OTl66qmnlJiYqPDwcPn5+SkiIkJJSUl6+eWXdezYMW8v8YxuuOEG2Ww2by8DuCAQmgEAp/X6669Lkmw2m9544w0vr6Z6WbVqlRo1aqTHH39ceXl5uuOOOzR27Fj17t1b+/fv16hRo9SqVStvLxOARXy9vQAAQPWUn5+vDz74QC1btlRkZKRWrFihn3/+WQ0aNPD20rzuP//5j3r06CFJeuedd9S/f/9yNWvWrNG4cePO99IA/EE40wzAa/Ly8vSPf/xD119/vWJiYuRwOBQTE6MBAwbohx9+KFf/xBNPyGazac2aNZozZ45atGihwMBAxcfH66WXXpIkGWP03HPPqUmTJgoICFDjxo311ltvnXYNTqdTU6ZMUePGjRUQEKD4+HhNmjRJJ06cKFdbWlqqf/zjH2rUqJECAgLUqFEjTZ48WU6ns8K5v/jiCw0ePFhNmjRRcHCwgoOD1b59e82aNavSPeratavsdrt++umnCsdHjRolm82mlStXuo7961//0vXXX6+6desqICBAMTExSkpK0r/+9a9KP64kvffee/rtt980YMAADRgwQE6nU3Pnzj1tfXZ2th566CE1adJEgYGBql27tjp27Khnn322XO1//vMf9e/fX/Xr15e/v7+io6N18803a8mSJeVqP/roI3Xt2lVhYWEKCAhQ8+bN9eyzz6q0tNStzul0avbs2erQoYNq166twMBA1a9fXz169NCaNWvcas+1R6NGjdLx48f18ssvVxiYpZOXPvz+cSVpzpw56tixo+s10bFjxwr7OnfuXNlstgrH1qxZI5vNpieeeMLtuM1m0w033KCsrCwNHDhQderUUWBgoDp16lRuLTabTWvXrnX9ueyLa/OB0zAAYKE9e/YYSSY5OdljbXp6unE4HCY5OdmMGDHCPPLII6ZHjx7Gx8fH1K5d2+zdu9etfsKECUaSufXWW01oaKgZMGCAGTVqlKlXr56RZF577TUzYsQIExkZaYYMGWKGDx9uwsLCjCSzdu1at7kGDhxoJJkePXqY2rVrm2HDhpmHH37YNGnSxEgyvXv3LrfewYMHG0kmPj7epKammhEjRpg6deqYP/3pT0aSGThwoFt9cnKyufzyy03//v3NX//6VzN06FATGxtrJJnU1NRK9XPOnDlGknn66afLjZ04ccJERESYmJgYU1paaowxZvr06UaSiY6ONvfff78ZN26cGTRokElISDD9+/ev1GOWueqqq4yPj485cOCAKSgoMMHBwSY+Pt44nc5ytTt37jTR0dFGkrnmmmvM2LFjTUpKirnhhhtMWFiYW+0HH3xgHA6H8fPzM7fddpsZN26cGTJkiGnevLm59dZb3WofffRRI8nUq1fPDB482IwZM8a0b9/eSDK33367W+3YsWONJHP55ZeblJQU8+ijj5q7777bxMfHm7/97W+uunPt0e7du40k06BBA1ffK+uBBx5wPZ9Ro0a5vX5HjRrlVlv2vZ8zZ065eb744gsjyUyYMMHtuCTTqlUr06hRI9OuXTszevRoc+eddxofHx/jcDjM1q1bXbUTJkxwvR4nTJjg+lq0aNFZPSfgUkFoBmCpswnNubm55vDhw+WOr1692tjtdnPvvfe6HS8LzbVr1zY//PCD6/i+ffuMw+EwoaGh5oorrjDZ2dmusW+++cYVjk9VFpojIiLMzz//7DpeVFRkrrvuOiPJfPDBB67jZSGlVatW5tixY67jv/zyi6lTp06FofnHH38s99xOnDhhbrrpJuPj42N++uknDx0yJj8/3wQGBppmzZqVG1uyZImRZB5++GHXsbZt2xqHw2GysrLK1R86dMjj45X57rvvyn0fBwwYYCSZzz//vFx9WZCdNWtWubFT+5uZmWmCgoJMUFCQ2bx58xlrV6xY4VrDqT13Op1m2LBh5b5HtWvXNjExMaagoKDcvKe+zs61R3PnzjWSzF133eWx9lRr1641ksyVV15pcnNzXcePHDlirrjiCiPJfPnll67jVQ3NksyIESPcAv3s2bONJDN06FC3+uuvv95w/gyoHC7PAOA1oaGhql27drnjXbp0UUJCgj7//PMK7/fggw/qsssuc91u0KCBrrnmGuXl5elvf/ubIiIiXGMdO3bUZZddpv/85z+nnat+/fqu2w6HQ08//bQkuf23eNklHuPHj1dQUJDreL169fTggw9WOHd8fHy5Y76+vho2bJhKS0v1xRdfVHi/U9WsWVM9e/bU9u3btXnzZrext99+W5J01113uR338/OTn59fubnCw8M9Pl6ZsjcADhgwwHWs7M9lY2XWr1+vjRs36rrrrtN9991Xbq5T+/vmm2+qoKBADz30kNq0aXPG2ldeeUWSNGvWLLee22w2PfPMM7LZbHrvvffc7u9wOOTj41Nu3t+/zs6lR5mZmeXWWhlvvvmmpJOXGYWGhrqOh4WFacKECZJ0xstfKisoKEj/+Mc/ZLf/3z/xAwcOlK+vrzZs2HDO8wOXKt4ICMCr1qxZoxdffFHr1q3ToUOHVFJS4hpzOBwV3qd169bljkVHR59xbN26dRXOde2115Y7lpiYKF9fX23ZssV1rCx0V1Rf0TFJOnr0qJ599lktXrxYP/zwgwoKCtzG9+/fX+H9fu/uu+/We++9p7fffltt27aVdPJNekuWLFGLFi3cdmjo27evxo4dq+bNm+vOO+9Uly5ddM011ygkJKRSjyVJRUVFeuedd1SzZk316tXLdbxLly5q0KCBFi1apJycHIWFhUk6GZolqVu3bh7nPpvab775RkFBQafdtSMwMFA7d+503e7bt6+mT5+u5s2bq2/fvurSpYsSExMVGBjodj8relQVZa+nG264odxYly5dJEnffvvtOT/OFVdcoeDgYLdjvr6+ioyMVG5u7jnPD1yqCM0AvGbhwoXq06ePgoODlZycrLi4ONWoUcP15qfTvfmtonDj6+t7xrFTw/ipIiMjyx3z8fFReHi48vLyXMfy8vJkt9tVp06dSs1RXFysG264QZs3b1abNm109913Kzw8XL6+vtq7d6/efPNNFRUVVbim3+vWrZsiIyM1f/58Pfvss/Lx8dEHH3yg48eP6+6773arffjhhxUeHq4ZM2boueee07PPPitfX191795dL7zwQoVnv39v8eLFOnz4sAYNGuQWOO12u/r3769nnnlG7777rlJSUly9kU6edffkbGqPHDmikpISTZw48bQ1p/4iMnXqVMXHx2vOnDl66qmn9NRTTykgIEB/+ctf9Nxzz7m+d+fao6ioKEnSr7/+6vE5nCo/P192u93tf0LKREZGymazKT8//6zmrMjpwr+vr2+5N08CqDxCMwCveeKJJxQQEKBNmzapcePGbmPz588/L2vIyspSkyZN3I6Vlpbq8OHDbmE4NDRUTqdThw4dKhd6srKyys370UcfafPmzRoyZIhmz57tNjZ//nzXf9VXho+Pj/r166cXX3xRn3/+uZKTk/X222/LbrfrzjvvdKu12WwaPHiwBg8erMOHD+urr77Se++9p/fff1+7d+/Wd999V+HlC6cqu/xizpw5mjNnzmlrykJzrVq1JFUuRJ5aGxcXd8bakJAQ2Ww2HTp0yOO80slQ+PDDD+vhhx/W/v37tXbtWs2ZM0dvvfWWMjMztXz5cknn3qOrr75a0sn/JXE6nW6XQXh6Pk6nUwcPHlTdunXdxrKzs2WMcQu8ZfNW9Avfqb/QATg/uKYZgNf88MMPuvLKK8sF5gMHDujHH388L2v46quvyh1LT09XSUmJ2zW3ZZdAVFRf0bGyLfNuvfXWStV7UnZG+Z133tHPP/+stWvXqkuXLmc8YxseHq6ePXtqwYIFuvHGG7V9+3Z9//33Z3ycn376SatWrVJkZKSGDBlS4Vd8fLy2bNniutygQ4cOkqQVK1Z4fB5nU9uxY0cdPnxYu3fv9lj7ezExMerXr5+WLVumRo0a6fPPP9fx48fL1VWlR40aNdJ1112nn3/+2eMvP6f+b0LZ66mibejKjp16eVHZ5S8V/TJy6qVD56LslwPOQAOeEZoBeE1sbKy+//57tzO1hYWFGj58eIX7JP8Rpk6dql9++cV1u7i4WH/7298kyW2/2rLQOmnSJLdLAn799VdNnTq13LyxsbGSpK+//trt+Nq1a/Xaa6+d9Trbtm2rZs2aadGiRXr11VdljCl3aYZ0MnwZY9yOnThxQkeOHJEkBQQEnPFx5syZI6fTqaFDh2r27NkVfj366KOS/u+M9FVXXaWrrrpKX375ZYXP7dTQN3DgQAUHB+u5556r8PrdU2tHjRolSa4zwr+XmZmpHTt2SDoZTtPS0srVFBQU6NixY/Lz83OduT3XHkknXzeBgYEaOXKkFixYUGHNV199pRtvvNF1e+DAgZKkiRMnul2GkZeX57oEpaxGktq1ayebzab58+ersLDQdXz37t0VvuaqouwNkj///LMl8wEXMy7PAPCH2Lp162k/JKFp06Z69NFH9cADD+iBBx5QmzZtdPvtt6ukpEQrV66UMUatWrU67Y4XVurUqZNatWqlPn36KCgoSEuWLNGuXbt02223qXfv3q66Ll26aNCgQa4PVenVq5eKioq0YMECderUSUuXLnWbt0ePHoqLi9OUKVO0bds2NW/eXLt27dLSpUvVq1cvffDBB2e91rvvvlvjxo3TlClTVKNGDbf1lenZs6dCQkLUqVMnxcbG6sSJE1q5cqW2b9+u22+/3RXmK+J0OjVnzhyPH3DRp08fjR49WvPmzdOzzz6rgIAAzZs3TzfccIPuv/9+vf3220pMTFRhYaEyMjK0ZcsWV+itW7eu3nrrLfXt21cdOnTQn//8ZzVp0kSHDh3SunXrFBcXp8WLF0uSbr75Zj3++ON68skn1ahRI918882KjY3V4cOH9f333+urr77SU089pSuvvFLHjx/X1VdfrSuuuELt2rVTw4YNdezYMS1dulSZmZl6+OGH5e/vf849KtO6dWstWbJEf/nLX9S3b19NmjRJ1113nWrXrq0jR47o3//+t7Zu3apGjRq57nPdddfpgQce0Msvv6zmzZurd+/eMsboX//6l3755ReNGjVK1113nau+7Gz5u+++q3bt2unmm29Wdna2Fi1apJtvvvmsP6ymIjfeeKM++OAD9e7dW7fccosCAgLUqlUr16cdAjiFN/e7A3DxKdun+Uxf119/vTHm5H67M2fONAkJCSYgIMBERUWZIUOGmOzs7Ar3jy3bp/mLL74o97hl+y7v2bOn3FhFc5XV//DDD+aZZ54xjRo1Mg6Hw8TGxponnnjCFBUVlZunpKTETJ482Vx22WXG4XCYyy67zPz9738333///Wn3ae7du7eJiIgwNWrUMFdddZWZP3/+affY9WTfvn3GbrcbSaZfv34V1kyfPt38+c9/NrGxsSYgIMCEh4ebDh06mBkzZpji4uIzzr98+XK378+Z9O/f30gy8+bNcx3LzMw0Dz74oKs/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QvNLL72kvn37uh0bNGiQGjdurObNm6t9+/bKzs62ZIEAAACAt1UpNM+ePVuRkZGu28uXL9ebb76p+++/Xy+//LJ+/PFHTZw40bJFAgAAAN5UpQ83+emnn3TllVe6br///vuKj4/XjBkzJEmZmZl6++23rVkhAAAA4GVVOtNsjHG7vWLFCt1yyy2u23FxccrMzDy3lQEAAADVRJVC8xVXXKFFixZJOnlpxv79+91C8y+//KJatWpZskAAAADA26p0ecbDDz+sO++8U2FhYSooKNCVV16p5ORk1/jq1avVunVrq9YIAAAAeFWVQnPfvn0VHh6uTz/9VLVq1dKIESPk63tyqiNHjqh27dq6++67LV0oAAAA4C1VCs2SdNNNN+mmm24qd7x27dr68MMPz2lRAAAAQHVS5dD8e7/99pvmz5+voqIi/c///I9iY2OtmhoAAADwqiqF5iFDhmjdunXatm2bJKm4uFidOnVy3Q4NDdXq1avVpk0b61YKAAAAeEmVds/44osvdNttt7luv/vuu9q2bZvmzZunbdu2KSoqig83AQAAwEWjSqE5MzNTcXFxrtuLFy9W+/bt1a9fPzVr1kz33Xef1q1bZ9UaAQAAAK+qUmgOCgpSbm6uJKmkpERr1qxx23KuZs2aysvLs2SBAAAAgLdV6Zrmtm3b6rXXXlOXLl308ccf6+jRo+rRo4dr/IcfflBkZKRliwQAAAC8qUqh+emnn1ZycrLat28vY4xuv/12dejQwTW+aNEiXX311ZYtEgAAAPCmKoXm9u3ba+fOnUpLS1OtWrV0/fXXu8Zyc3M1YsQIt2MAAADAhazK+zRHRETo1ltvLXe8Vq1aevDBB89pUQAAAEB1UqU3AkpSaWmp5s+fr6FDh6pXr17aunWrJCkvL08ffvihsrKyLFskAAAA4E1VCs25ubm6+uqrdeedd+q9997Txx9/rIMHD0qSgoODNWrUKE2dOtXShQIAAADeUqXQ/OijjyojI0PLly/Xjz/+KGOMa8zHx0e33367Pv30U8sWCQAAAHhTlULz4sWL9cADD+imm26SzWYrN37FFVdo796957o2AAAAoFqoUmjOy8tTfHz8acdPnDihkpKSKi8KAAAAqE6qFJovv/xybd68+bTjK1asULNmzaq8KAAAAKA6qVJovvfee/XGG29owYIFruuZbTabioqK9Le//U3Lli3T0KFDLV0oAAAA4C1V2qf5wQcfVEZGhvr166datWpJku68804dPnxYJSUlGjp0qIYMGWLlOgEAAACvqVJottlseu211zRw4EB98MEH2r17t5xOpy6//HL95S9/0XXXXWf1OgEAAACvqfInAkrSNddco2uuucaqtQAAAADVUpWuad6zZ4+WLFly2vElS5aw5RwAAAAuGlU60/zwww8rPz9fPXr0qHB82rRpqlWrlubPn39OiwMAAACqgyqdaU5PT9dNN9102vGuXbvqq6++qvKiAAAAgOqkSqE5JydHNWvWPO14cHCwDh8+XOVFAQAAANVJlUJzw4YN9e9///u041999ZXq169f5UUBAAAA1UmVQnO/fv303nvv6aWXXpLT6XQdLy0t1dSpU7VgwQLdeeedli0SAAAA8KYqvRFw3Lhx+vrrrzV69Gg9/fTTatKkiSRp165dOnjwoG644Qb97W9/s3ShAAAAgLdU6Uyzv7+/VqxYoddff10dOnTQoUOHdOjQIXXo0EFvvPGGPv/8c/n7+1u9VgAAAMArqhSaJclut2vQoEFasmSJtm/fru3bt2vJkiW65557ZLdXbdoZM2aoZcuWCgkJUUhIiBITE/XZZ5+5xgsLC5WSkqLw8HAFBwerd+/eysrKcptj37596t69u2rUqKG6devqkUceUUlJiVvNmjVr1LZtW/n7+6tRo0aaO3duubVMmzZNcXFxCggIUMeOHbV+/foqPScAAABc+KqUbo8cOaLvvvvutONbt25VTk7OWc9bv359PfPMM9q0aZM2btyoG2+8UbfeeqsyMjIkSWPGjNGSJUu0cOFCrV27Vvv379dtt93mun9paam6d++u4uJipaWl6c0339TcuXM1fvx4V82ePXvUvXt3denSRd9++61Gjx6te++9V8uXL3fVLFiwQKmpqZowYYI2b96sVq1aKTk5WdnZ2Wf9nAAAAHARMFUwYMAA07Fjx9OOJyYmmsGDB1dl6nLCwsLM7NmzTW5urvHz8zMLFy50je3YscNIMunp6cYYYz799FNjt9tNZmamq2bGjBkmJCTEFBUVGWOMGTt2rElISHB7jD59+pjk5GTX7Q4dOpiUlBTX7dLSUhMTE2MmT55c6XXn5eUZSSYvL+/snvBplJaWmgMHDpjS0lJL5ruU0Uvr0Evr0Evr0Etr0Efr0EvrWN3Ls8lrVXoj4OrVqzV8+PDTjvfo0UMzZ86sWor/X6WlpVq4cKEKCgqUmJioTZs26cSJE0pKSnLVNG3aVA0bNlR6ero6deqk9PR0tWjRQpGRka6a5ORkDR8+XBkZGWrTpo3S09Pd5iirGT16tCSpuLhYmzZt0rhx41zjdrtdSUlJSk9PP+16i4qKVFRU5Lqdn58vSXI6nW47jFSV0+mUMcaSuS519NI69NI69NI69NIa9NE69NI6VvfybOapUmg+ePCg6tSpc9rx8PDwKl/KsHXrViUmJqqwsFDBwcFatGiRmjVrpm+//VYOh0O1atVyq4+MjFRmZqYkKTMz0y0wl42XjZ2pJj8/X8ePH1dOTo5KS0srrNm5c+dp1z158mRNnDix3PGDBw+qsLCwck/+DJxOp/Ly8mSMqfI14ziJXlqHXlqHXlqHXlqDPlqHXlrH6l4ePXq00rVVCs3R0dHasmXLacc3bdqkiIiIqkytJk2a6Ntvv1VeXp4++OADDRw4UGvXrq3SXOfTuHHjlJqa6rqdn5+vBg0aKCIiQiEhIec8v9PplM1mU0REBD9w54heWodeWodeWodeWoM+WodeWsfqXgYEBFS6tkqhuWfPnpo2bZpuueUW/fnPf3Yb++ijjzRnzpwzXr5xJg6HQ40aNZIktWvXThs2bNDUqVPVp08fFRcXKzc31+1sc1ZWlqKioiRJUVFR5Xa5KNtd49Sa3++4kZWVpZCQEAUGBsrHx0c+Pj4V1pTNURF/f/8Kt9mz2+2W/YDYbDZL57uU0Uvr0Evr0Evr0Etr0Efr0EvrWNnLs5mjSo/2xBNPqEmTJurVq5fatm2rAQMGaMCAAWrbtq1uu+02XXHFFRVeqlAVTqdTRUVFateunfz8/LRq1SrX2K5du7Rv3z4lJiZKkhITE7V161a3S0NWrlypkJAQNWvWzFVz6hxlNWVzOBwOtWvXzq3G6XRq1apVrhoAAABcWqp0pjk0NFTffPONpkyZog8//FAffPCBJOnyyy/X448/rkceeURBQUFnPe+4ceN0yy23qGHDhjp69KjeffddrVmzRsuXL1doaKiGDBmi1NRU1a5dWyEhIXrggQeUmJioTp06SZK6deumZs2a6e6779aUKVOUmZmpxx57TCkpKa6zwMOGDdMrr7yisWPHavDgwVq9erXef/99ffLJJ651pKamauDAgWrfvr06dOigF198UQUFBRo0aFBV2gUAAIALXJVCsyQFBQVp4sSJpz2jnJOTo7CwsLOaMzs7WwMGDNCBAwcUGhqqli1bavny5brpppskSS+88ILsdrt69+6toqIiJScna/r06a77+/j4aOnSpRo+fLgSExMVFBSkgQMHatKkSa6a+Ph4ffLJJxozZoymTp2q+vXra/bs2UpOTnbV9OnTRwcPHtT48eOVmZmp1q1ba9myZeXeHAgAAIBLg80YY6yarKioSB9//LHmzZunZcuWWbJrxIUqPz9foaGhysvLs+yNgNnZ2apbty7XQ50jemkdemkdemkdemkN+mgdemkdq3t5NnmtymeayxhjtGrVKs2bN0+LFi1Sfn6+IiIidOedd57r1AAAAEC1UOXQvGnTJs2bN0/z589XZmambDab+vbtq5EjR6pTp06y2WxWrhMAAADwmrMKzT/++KPmzZunefPmaffu3apXr5769++vDh06qE+fPurduzc7TAAAAOCiU+nQnJiYqPXr16tOnTq6/fbbNXv2bF1zzTWSpB9++OEPWyAA/JGcTqcyMjJcb15OSEjgmkMAQDmVDs3r1q1TfHy8nn/+eXXv3l2+vud8OTQAeFVaWpqmzZylXXt/VXFJqRy+PmoSV08pw+5X586dvb08AEA1UunTKa+88oqio6PVq1cvRUVFaejQofriiy9k4eYbAHDepKWlaezjk7TzWIDibhmqNoMmKe6WodpVEKCxj09SWlqat5cIAKhGKh2aR4wYoa+//lo//PCDRo8era+++kpdu3ZVvXr1NH78eNlsNt78B+CC4HQ6NW3mLB0PjVOrHoMVGh0rXz9/hUbHquWfBquwVpymv/qanE6nt5cKAKgmzvrCvfj4eD322GPavn27NmzYoL59+2rNmjUyxmjEiBG6//77tXTp0kt6j2YA1VtGRoZ27f1V8Vcllftl32azKbZ9V+3c84syMjK8tEIAQHVzTu92adeunZ5//nn9/PPPWrFihZKTk7VgwQL9+c9/Vp06daxaIwBYKicnR8UlpQqqE1XheHB4lIpLSpWTk3OeVwYAqK4seYu43W5XUlKS5s6dq6ysLL333nvq2rWrFVMDgOXCwsLk8PVRwaHMCsePHc6Uw9dHYWFh53llAIDqyvJ9lQICAtSnTx999NFHVk8NAJZISEhQk7h62rvx83JvZjbG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KUmKjIx0Ox4ZGekay8zMVN26dd3GfX19Vbt2bbea+Pj4cnOUjYWFhSkzM/OMj1ORyZMna+LEieWOHzx40O3ykapyOp3Ky8uTMYbfUk9jx44d+mTZcv2adVglpU75+thVLzJc3W9O1q233ip/f399sOgjHf3xMwWUNFSdfft0WaSfeg+boJtvvlnZ2dnefgoXHF6X1qGX1qGX1qCP1qGX1rG6l0ePHq107QUTmqu7cePGuZ2dzs/PV4MGDRQREWHZ5Rk2m00RERH8wFUgPT1d45+eouOhcYpvn6ygOpEqOJSltZtWad3TU/TMxMc0YMAA3XnnnVqyZIlycnL05+Qb1aNHDy7JOAe8Lq1DL61DL61BH61DL61jdS8DAgIqXXvBpIWoqChJUlZWlqKjo13Hs7Ky1Lp1a1fN788WlpSU6MiRI677R0VFKSsry62m7LanmrLxivj7+8vf37/ccbvdbtkPiM1ms3S+i4XT6dT0V1/TbyGxavWnQbL977ZyIdGxatF9kL5b+oZmzJqtxMREORwO9erVi2vLLMTr0jr00jr00hr00Tr00jpW9vJs5rhgvnPx8fGKiorSqlWrXMfy8/O1bt06JSYmSpISExOVm5urTZs2uWpWr14tp9Opjh07umq+/PJLnThxwlWzcuVKNWnSRGFhYa6aUx+nrKbscVC9ZGRkaNfeXxV/VZIrMJex2WyKbd9VO/f8ooyMDC+tEAAAXOiqVWg+duyYvv32W3377beSTr7579tvv9W+fftks9k0evRoPfXUU/r444+1detWDRgwQDExMa4dNq688krdfPPNuu+++7R+/Xr9+9//1siRI9W3b1/XdmJ33nmnHA6HhgwZooyMDC1YsEBTp051u7TiwQcf1LJly/Tcc89p586deuKJJ7Rx40aNHDnyfLcEp3A6ndq6dau+/PJLbd261XXxfk5OjopLShVUp+L/CQgOj1JxSalycnLO53IBAMBFpFpdnrFx40Z16dLFdbssyA4cOFBz587V2LFjVVBQoPvvv1+5ubm65pprtGzZMrfrUebNm6eRI0eqa9eustvt6t27t1566SXXeGhoqFasWKGUlBS1a9dOderU0fjx4932cu7cubPeffddPfbYY/p//+//qXHjxlq8eLGaN29+HrqAiqSlpWnazFnatfdXFZeUyuHroyZx9ZQy7H6FhYXJ4euj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",
"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": 17,
"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(list(db.mu_values.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": 18,
"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": 19,
"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": 20,
"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": 21,
"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
}