age_cache_simulation/aoi_cache_experiment_eval.ipynb
Tuan-Dat Tran f9d48e6fe4 fix(simulation): Evaluation of age was based on hits instead of access_count
Signed-off-by: Tuan-Dat Tran <tuan-dat.tran@tudattr.dev>
2024-11-28 15:57:19 +01:00

442 lines
63 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": "ae430903-55a2-47ed-87c6-677b1fb44198",
"metadata": {},
"outputs": [],
"source": [
"from enum import Enum\n",
"import os\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "9d6920fc-8633-4754-a762-ece23af18877",
"metadata": {},
"outputs": [],
"source": [
"# Types of cache\n",
"class CacheType(Enum):\n",
" LRU = 1\n",
" RANDOM_EVICTION = 2\n",
"\n",
"\n",
"DATABASE_OBJECTS = 100 # Number of objects in the database"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "9b8c0686-1bab-47a4-9f9f-e5a11167ea8c",
"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.LRU, 0.5),\n",
" \"No Refresh (1.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 1),\n",
" \"No Refresh (2.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 2),\n",
" \"No Refresh (3.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 3),\n",
" \"No Refresh (4.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 4),\n",
" \"No Refresh (5.0s ttl)\": (DATABASE_OBJECTS, 0, CacheType.LRU, 5),\n",
"}\n",
"\n",
"experiments = [k.replace(\" \", \"_\").replace(\"(\", \"\").replace(\")\", \"\").replace(\".\", \"_\") for k in configurations.keys()]\n",
"experiments = [os.path.join(\"./experiments/\",e, \"overall_hit_age.csv\") for e in experiments if \"_ttl\" in e]\n",
"experiments = [{'ttl': '.'.join(file.split('/')[2].split(\"_\")[2:4]),'data': pd.read_csv(file)} for file in experiments]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5be1df01-5dc8-43fe-a597-72ba76eefc0f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'ttl': '0.5s',\n",
" 'data': {'hit_rate': 0.458669533255314, 'avg_age': 0.2405818161600988}},\n",
" {'ttl': '1.0s',\n",
" 'data': {'hit_rate': 0.619673736493892, 'avg_age': 0.4976340127164911}},\n",
" {'ttl': '2.0s',\n",
" 'data': {'hit_rate': 0.769815289387402, 'avg_age': 1.0034930453709514}},\n",
" {'ttl': '3.0s',\n",
" 'data': {'hit_rate': 0.7906927824364712, 'avg_age': 1.479522176980214}},\n",
" {'ttl': '4.0s',\n",
" 'data': {'hit_rate': 0.8461611168860607, 'avg_age': 1.966244726179581}},\n",
" {'ttl': '5.0s',\n",
" 'data': {'hit_rate': 0.8689161003980432, 'avg_age': 2.469801316710304}}]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"stats = [\n",
" {'ttl': e['ttl'],\n",
" 'data': {\n",
" \"hit_rate\": e['data']['hit_rate'][1], \n",
" \"avg_age\": e['data']['avg_age'][1]\n",
" }\n",
" } for e in experiments]\n",
"stats"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "26030d03-b970-4e88-9c9a-e96ef79181c6",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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bVvrmDFjsp+bzWZrtWrVrJMnT861/5w5c6xlypS57mtOnz7dWrt2bau3t7e1cuXK1nvuuacwS0YpJMm6dOnS6/Z54YUXrI0aNbJrGzx4sLV3797Zz7/66itr48aNrT4+Ptby5ctbe/ToYU1JSXFEyShF/vrrL6sk67p16/Lsc99991n79etn19auXTvr6NGjs5/zsxOOUK5cOeusWbNyPca4RFG6ePGitU6dOtaYmBhrRESEddy4cXn2ZWyiqEycONHarFmzfPcvaWOTme4ikJ6eru3bt+v222/PbnNzc9Ptt9+uzZs353leSkqKatSoobCwsBy/Qd+2bZuefvppvfbaa4qLi9PKlSvVtWtXh34OQJI2b95sN5YlqXfv3tlj+dSpUxo6dKgefvhh/fHHH4qNjVVUVJSsVqszykUJkpSUJEkqX758nn1uND752YnCZjabtWDBAqWmpqpDhw659mFcoiiNGTNG/fr1yzHmcsPYRFE6cOCAqlWrplq1amnYsGE6duxYnn1L2tj0cHYBpcGZM2dkNpsVHBxs1x4cHKx9+/blek69evX0ySefqGnTpkpKStLbb7+tjh07au/evQoNDdWxY8fk7++vO++8U4GBgapRo4ZatGhRFB8HpVxCQkKuYzk5OVmXL1/WqVOnlJmZqaioKNWoUUOS1KRJE2eUihLEYrHomWeeUadOndS4ceM8++U1PhMSEiSJn50oNLt371aHDh105coVBQQEaOnSpWrYsGGufRmXKCoLFizQjh07tHXr1nz1Z2yiqLRr105z585VvXr1dOrUKU2aNEldunTRnj17FBgYmKN/SRubzHS7qA4dOuihhx5S8+bNFRERoSVLlqhSpUr68MMPJUk9e/ZUjRo1VKtWLT344IOaN2+eLl265OSqAalZs2bq0aOHmjRponvvvVcff/yxzp8/7+yyUMyNGTNGe/bs0YIFC27pdfjZicJSr1497dy5U1u2bNETTzyh4cOH6/fff7+p12JcojAcP35c48aN07x58wpt8V3GJgpL3759de+996pp06bq3bu3vv/+e124cEGLFi26qdcrbmOT0F0EKlasKHd3dyUmJtq1JyYmqkqVKvl6DU9PT7Vo0UIHDx6UJAUGBmrHjh368ssvVbVqVb3yyitq1qyZLly4UNjlA3aqVKmS61gOCgqSr6+v3N3dFRMToxUrVqhhw4aaNm2a6tWrpyNHjjipYhR3Y8eO1Xfffae1a9cqNDT0un3zGp9ZP2v52YnC4uXlpdq1a6tVq1aaPHmymjVrpnfffTfXvoxLFIXt27frr7/+UsuWLeXh4SEPDw+tW7dO7733njw8PGQ2m3Ocw9iEs5QtW1Z169bNzjbXKmljk9BdBLy8vNSqVSutXr06u81isWj16tV53v91LbPZrN27d6tq1arZbR4eHrr99tv1f//3f/rtt9/0559/as2aNYVeP3C1Dh062I1lSYqJibEbyyaTSZ06ddKkSZP066+/ysvLS0uXLi3qUlHMWa1WjR07VkuXLtWaNWtUs2bNG56Tn/HJz044gsViUVpaWq7HGJcoCj169NDu3bu1c+fO7Efr1q01bNgw7dy5U+7u7jnOYWzCWVJSUnTo0CG7bHO1kjY2uae7iIwfP17Dhw9X69at1bZtW0VHRys1NVUjR46UJD300EMKCQnR5MmTJUmvvfaa2rdvr9q1a+vChQt66623dPToUT366KOSpO+++06HDx9W165dVa5cOX3//feyWCyqV6+e0z4jiqeUlBS73zIeOXJEO3fuVPny5VW9enVNmDBB8fHx+uyzzyRJjz/+uN5//3298MILevjhh7VmzRotWrRIy5cvlyRt2bJFq1evVq9evVS5cmVt2bJFp0+fVoMGDZzy+VB8jRkzRvPnz9c333yjwMDA7Pu4ypQpI19fX0k5f3aOGzdOEREReuedd9SvXz8tWLBA27Zt00cffSSJn50oHBMmTFDfvn1VvXp1Xbx4UfPnz1dsbGz21omMSzhDYGBgjjUv/P39VaFChex2xiac5fnnn1f//v1Vo0YNnTx5UhMnTpS7u7uGDh0qqRSMTWcvn16aTJs2zVq9enWrl5eXtW3bttaff/45+1hERIR1+PDh2c+feeaZ7L7BwcHWO+64w7pjx47s4xs2bLBGRERYy5UrZ/X19bU2bdrUunDhwqL8OCgh1q5da5WU45E1HocPH26NiIjIcU7z5s2tXl5e1lq1alnnzJmTfez333+39u7d21qpUiWrt7e3tW7dutZp06YV3QdCiZHbuJRkN96u/dlptVqtixYtstatW9fq5eVlbdSokXX58uXZx/jZicLw8MMPW2vUqGH18vKyVqpUydqjRw/rqlWrso8zLuEqrt0yjLEJZxk8eLC1atWqVi8vL2tISIh18ODB1oMHD2YfL+lj02S1so8PAAAAAACOwD3dAAAAAAA4CKEbAAAAAAAHIXQDAAAAAOAghG4AAAAAAByE0A0AAAAAgIMQugEAAAAAcBBCNwAAAAAADkLoBgAAAADAQQjdAACUQHFxcapSpYouXrzo7FJuSXh4uKKjo/PVt3379vr6668dWxAAAAVE6AYAwEFMJtN1H926dbvhcalgwTPLhAkT9NRTTykwMLDwP5iLeumll/Tiiy/KYrE4uxQAALJ5OLsAAABKqlOnTmV/vXDhQr3yyiuKi4vLbktPT5eXl5ck6fjx42rbtq1+/PFHNWrUSJKyjxXUsWPH9N1332natGm3UH3x07dvXz366KNasWKF+vXr5+xyAACQxEw3AAAOU6VKlexHmTJlZDKZ7NqqV6+e/XWlSpUkSRUqVMhuK1++/E2976JFi9SsWTOFhIRktx09elT9+/dXuXLl5O/vr0aNGun777/PPr5nzx717dtXAQEBCg4O1oMPPqgzZ85kH7dYLPq///s/1a5dW97e3qpevbr+/e9/Zx/fvXu3unfvLl9fX1WoUEGPPfaYUlJSso+PGDFCAwcO1Ntvv62qVauqQoUKGjNmjDIyMrL7/PXXX+rfv798fX1Vs2ZNzZs3z+5zWa1Wvfrqq6pevbq8vb1VrVo1Pf3009nH3d3ddccdd2jBggU39X0DAMARCN0AAJQwGzZsUOvWre3axowZo7S0NK1fv167d+/Wm2++qYCAAEnShQsX1L17d7Vo0ULbtm3TypUrlZiYqPvuuy/7/AkTJug///mPXn75Zf3++++aP3++goODJUmpqanq3bu3ypUrp61bt+qrr77Sjz/+qLFjx9rVsHbtWh06dEhr167Vp59+qrlz52ru3LnZx0eMGKHjx49r7dq1Wrx4sWbMmKG//vor+/jXX3+tqVOn6sMPP9SBAwe0bNkyNWnSxO492rZtqw0bNhTK9xEAgMLA5eUAAJQwR48ezRG6jx07pnvuuSc7pNaqVSv72Pvvv68WLVrojTfeyG775JNPFBYWpv3796tq1ap699139f7772v48OGSpNtuu02dO3eWJM2fP19XrlzRZ599Jn9//+zX7N+/v958883scF6uXDm9//77cnd3V/369dWvXz+tXr1ao0aN0v79+7VixQr98ssvatOmjSRp9uzZatCg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mwZcIjk52cjOzjb3bTabERYWZsydO7fR8StWrDC6dOnS7DEXL15sREdHG76+vkZQUJDx2GOPtWTIaIckGRs3bmx2zKxZs4z4+HiHtrFjxxppaWnm/vr16417773X8PPzM7p162akpqYadXV1zggZ7Uh1dbUhydi1a1eTY8aMGWNkZGQ4tA0aNMiYOnWquc+1E84QGBho/O1vf2u0j7yEK9XW1hp33323sW3bNiMlJcWYMWNGk2PJTbhKbm6ukZiYeMvj21pustLtAleuXNGhQ4c0fPhws61Dhw4aPny49u7d2+S8uro6RUVFKSIiosFf0A8ePKjp06frpZdeUllZmd577z0NHTrUqecBSNLevXsdclmS0tLSzFyuqqrSuHHjNHnyZB07dkw7d+7UqFGjZPB2QvxIFy5ckCR169atyTE3y0+unWhpNptNa9asUX19vQYPHtzoGPISrpSdna2MjIwGOdcYchOudPz4cYWFhal3794aP368Kioqmhzb1nLT290BtAdnz56VzWZTcHCwQ3twcLD++9//NjonJiZGb7zxhhISEnThwgXNnz9fP/3pT3XkyBGFh4eroqJC/v7++sUvfqGAgABFRUUpKSnJFaeDdu6rr75qNJcvXryoS5cuqaqqSteuXdOoUaMUFRUlSerbt687QkUbYrfblZOToyFDhujee+9tclxT+fnVV19JEtdOtJiSkhINHjxY3377rTp16qSNGzfqnnvuaXQseQlXWbNmjQ4fPqwDBw7c0nhyE64yaNAg5efnKyYmRlVVVXrxxRf1wAMPqLS0VAEBAQ3Gt7XcZKXbQw0ePFgTJ07Ufffdp5SUFG3YsEE9evTQ0qVLJUk///nPFRUVpd69e2vChAlatWqVvvnmGzdHDUiJiYlKTU1V3759NXr0aC1btkznz593d1ho5bKzs1VaWqo1a9b8qONw7URLiYmJUXFxsfbv369f/epXysrK0tGjR3/QschLtITKykrNmDFDq1atarGH75KbaCnp6ekaPXq0EhISlJaWpi1btqimpkbr1q37QcdrbblJ0e0Cd955p7y8vHTmzBmH9jNnzigkJOSWjtGxY0clJSXps88+kyQFBATo8OHD+sc//qHQ0FDNmTNHiYmJqqmpaenwAQchISGN5nLnzp1ltVrl5eWlbdu2aevWrbrnnnu0aNEixcTE6OTJk26KGK3dtGnTtGnTJhUVFSk8PLzZsU3l541rLddOtBQfHx9FR0erf//+mjt3rhITE7Vw4cJGx5KXcIVDhw6purpa/fr1k7e3t7y9vbVr1y699tpr8vb2ls1mazCH3IS7dO3aVX369DFrm+9ra7lJ0e0CPj4+6t+/vwoLC802u92uwsLCJu//+j6bzaaSkhKFhoaabd7e3ho+fLheeeUVffLJJ/r888+1Y8eOFo8f+K7Bgwc75LIkbdu2zSGXLRaLhgwZohdffFEfffSRfHx8tHHjRleHilbOMAxNmzZNGzdu1I4dO3TXXXfddM6t5CfXTjiD3W7X5cuXG+0jL+EKqampKikpUXFxsbkNGDBA48ePV3Fxsby8vBrMITfhLnV1dSovL3eobb6rreUm93S7yMyZM5WVlaUBAwYoOTlZCxYsUH19vSZNmiRJmjhxonr27Km5c+dKkl566SXdf//9io6OVk1NjV599VWdOnVKU6ZMkSRt2rRJJ06c0NChQxUYGKgtW7bIbrcrJibGbeeI1qmurs7hr4wnT55UcXGxunXrpsjISM2ePVunT5/WypUrJUlPP/208vLyNGvWLE2ePFk7duzQunXrtHnzZknS/v37VVhYqBEjRigoKEj79+/X119/rbi4OLecH1qv7OxsrV69Wv/85z8VEBBg3sfVpUsXWa1WSQ2vnTNmzFBKSor+9Kc/KSMjQ2vWrNHBgwf1+uuvS+LaiZYxe/ZspaenKzIyUrW1tVq9erV27txpvjqRvIQ7BAQENHjmhb+/v7p37262k5twl9/85jfKzMxUVFSUvvzyS+Xm5srLy0vjxo2T1A5y092PT29PFi1aZERGRho+Pj5GcnKysW/fPrMvJSXFyMrKMvdzcnLMscHBwcYjjzxiHD582Ozfs2ePkZKSYgQGBhpWq9VISEgw1q5d68rTQRtRVFRkSGqw3cjHrKwsIyUlpcGc++67z/Dx8TF69+5trFixwuw7evSokZaWZvTo0cPw9fU1+vTpYyxatMh1J4Q2o7G8lOSQb9+/dhqGYaxbt87o06eP4ePjY8THxxubN282+7h2oiVMnjzZiIqKMnx8fIwePXoYqampxr///W+zn7yEp/j+K8PITbjL2LFjjdDQUMPHx8fo2bOnMXbsWOOzzz4z+9t6bloMg/f4AAAAAADgDNzTDQAAAACAk1B0AwAAAADgJBTdAAAAAAA4CUU3AAAAAABOQtENAAAAAICTUHQDAAAAAOAkFN0AAAAAADgJRTcAAAAAAE5C0Q0AQBtUVlamkJAQ1dbWujuUH6VXr15asGDBLY29//779fbbbzs3IAAAbhNFNwAATmKxWJrdHnzwwZv2S7dXeN4we/ZsPfPMMwoICGj5E/NQv/vd7/Tb3/5Wdrvd3aEAAGDydncAAAC0VVVVVea/165dqzlz5qisrMxsu3Llinx8fCRJlZWVSk5O1vbt2xUfHy9JZt/tqqio0KZNm7Ro0aIfEX3rk56erilTpmjr1q3KyMhwdzgAAEhipRsAAKcJCQkxty5dushisTi0RUZGmv/u0aOHJKl79+5mW7du3X7Q565bt06JiYnq2bOn2Xbq1CllZmYqMDBQ/v7+io+P15YtW8z+0tJSpaenq1OnTgoODtaECRN09uxZs99ut+uVV15RdHS0fH19FRkZqT/84Q9mf0lJiYYNGyar1aru3bvrqaeeUl1dndn/xBNPaOTIkZo/f75CQ0PVvXt3ZWdn6+rVq+aY6upqZWZmymq16q677tKqVasczsswDL3wwguKjIyUr6+vwsLCNH36dLPfy8tLjzzyiNasWfODvjcAAJyBohsAgDZmz549GjBggENbdna2Ll++rN27d6ukpEQvv/yyOnXqJEmqqanRsGHDlJSUpIMHD+q9997TmTNnNGbMGHP+7NmzNW/ePD3//PM6evSoVq9ereDgYElSfX290tLSFBgYqAMHDmj9+vXavn27pk2b5hBDUVGRysvLVVRUpDfffFP5+fnKz883+5944glVVlaqqKhIb731lpYsWaLq6mqz/+2339Zf/vIXLV26VMePH9c777yjvn37OnxGcnKy9uzZ0yLfIwAALYGflwMA0MacOnWqQdFdUVGhxx57zCxSe/fubfbl5eUpKSlJf/zjH822N954QxEREfr0008VGhqqhQsXKi8vT1lZWZKkn/zkJ/rZz34mSVq9erW+/fZbrVy5Uv7+/uYxMzMz9fLLL5vFeWBgoPLy8uTl5aXY2FhlZGSosLBQTz75pD799FNt3bpVH374oQYOHChJWr58ueLi4hzOISQkRMOHD1fHjh0VGRmp5ORkh/MMCwtTZWWl7Ha7OnRgbQEA4H78bwQAQBtz6dIl+fn5ObRNnz5dv//97zVkyBDl5ubqk08+Mfs+/vhjFRUVqVOnTuYWGxsrSSovL9exY8d0+fJlpaamNvp5x44dU2JiollwS9KQIUNkt9sd7mGPj4+Xl5eXuR8aGmquZB87dkze3t7q37+/2R8bG6uuXbua+6NHj9alS5fUu3dvPfnkk9q4caOuXbvmEIvVapXdbtfly5dv9esCAMCpKLoBAGhj7rzzTp0/f96hbcqUKTpx4oQmTJigkpISDRgwwHzQWl1dnTIzM1VcXOywHT9+XEOHDpXVam2RuDp27Oiwb7FYbutJ4xERESorK9OSJUtktVr161//WkOHDnW4L/zcuXPy9/dvsZgBAPixKLoBAGhjkpKSdPTo0QbtERERevrpp7VhwwY9++yzWrZsmSSpX79+OnLkiHr16qXo6GiHzd/fX3fffbesVqsKCwsb/by4uDh9/PHHqq+vN9vef/99dejQQTExMbcUc2xsrK5du6ZDhw6ZbWVlZaqpqXEYZ7ValZmZqddee007d+7U3r17VVJSYvaXlpYqKSnplj4TAABXoOgGAKAVOH36dIOV6O+vZt+QlpamvXv3ymazmW05OTkqKCjQyZMndfjwYRUVFZn3S2dnZ+vcuXMaN26cDhw4oPLychUUFGjSpEmy2Wzy8/PTc889p1mzZmnlypUqLy/Xvn37tHz5cknS+PHj5efnp6ysLJWWlqqoqEjPPPOMJkyYYN7PfTMxMTF6+OGHNXXqVO3fv1+HDh3SlClTHFas8/PztXz5cpWWlurEiRP6+9//LqvVqqioKHPMnj17NGLEiNv+fgEAcBaKbgAAWoH58+crKSnJYdu8eXOjY9PT0+Xt7a3t27ebbTabTdnZ2YqLi9PDDz+sPn36aMmSJZKuP3zs/fffl81m04gRI9S3b1/l5OSoa9eu5sPInn/+eT377LOaM2eO4uLiNHbsWPN+7DvuuEMFBQU6d+6cBg4cqMcff1ypqanKy8u7rXNcsWKFwsLClJKSolGjRumpp55SUFCQ2d+1a1ctW7ZMQ4YMUUJCgrZv365//etf6t69u6Trf5j44IMPNGnSpNv6XAAAnMliGIbh7iAAAEDLWrx4sd59910VFBS4OxSXee6553T+/Hm9/vrr7g4FAAATrwwDAKANmjp1qmpqalRbW6uAgAB3h+MSQUFBmjlzprvDAADAASvdAAAAAAA4Cfd0AwAAAADgJBTdAAAAAAA4CUU3AAAAAABOQtENAAAAAICTUHQDAAAAAOAkFN0AAAAAADgJRTcAAAAAAE5C0Q0AAAAAgJNQdAMAAAAA4CQU3QAAAAAAOMn/Adso0VEvTSN3AAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 1000x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Extract TTL, hit_rate, and avg_age from data\n",
"ttls = [entry['ttl'] for entry in stats]\n",
"hit_rates = [entry['data']['hit_rate'] for entry in stats]\n",
"avg_ages = [entry['data']['avg_age'] for entry in stats]\n",
"\n",
"# Plotting\n",
"plt.figure(figsize=(10, 6))\n",
"\n",
"# Plot hit_rate\n",
"plt.subplot(2, 1, 1)\n",
"plt.plot(ttls, hit_rates, marker='o', color='b', label='Hit Rate')\n",
"plt.xlabel('TTL (seconds)')\n",
"plt.ylabel('Hit Rate')\n",
"plt.title('Hit Rate vs TTL')\n",
"plt.grid(True)\n",
"\n",
"# Plot avg_age\n",
"plt.subplot(2, 1, 2)\n",
"plt.plot(ttls, avg_ages, marker='o', color='r', label='Avg Age')\n",
"plt.xlabel('TTL (seconds)')\n",
"plt.ylabel('Avg Age')\n",
"plt.title('Avg Age vs TTL')\n",
"plt.grid(True)\n",
"\n",
"# Show the plots\n",
"plt.tight_layout()\n",
"plt.savefig(\"./experiments/hr_and_age_vs_ttl\")\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "c4a8220e-9a21-42db-889a-26d901672f5e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['0.5s', '1.0s', '2.0s', '3.0s', '4.0s', '5.0s']"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ttls"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "58a7865b-6ce6-4960-8dc5-c926d5463949",
"metadata": {},
"outputs": [],
"source": [
"pd.DataFrame(hit_rates, columns=[\"hit_rates\"], index=ttls).to_markdown('./experiments/hit_rates.md')\n",
"pd.DataFrame(avg_ages, columns=[\"avg_ages\"], index=ttls).to_markdown('./experiments/avg_ages.md')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "a92dcf86-d0ae-4f5c-937f-aeac45ac0dea",
"metadata": {},
"outputs": [],
"source": [
"details = [k.replace(\" \", \"_\").replace(\"(\", \"\").replace(\")\", \"\").replace(\".\", \"_\") for k in configurations.keys()]\n",
"details = [os.path.join(\"./experiments/\",e, \"details.csv\") for e in details if \"_ttl\" in e]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "0ffb1366-83ea-49ab-83ca-945ed993ef3f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['./experiments/No_Refresh_0_5s_ttl/details.csv',\n",
" './experiments/No_Refresh_1_0s_ttl/details.csv',\n",
" './experiments/No_Refresh_2_0s_ttl/details.csv',\n",
" './experiments/No_Refresh_3_0s_ttl/details.csv',\n",
" './experiments/No_Refresh_4_0s_ttl/details.csv',\n",
" './experiments/No_Refresh_5_0s_ttl/details.csv']"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"details"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "6e48f78f-15a3-4788-8ac9-6ad1fabbee26",
"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>0.5s</th>\n",
" <th>1.0s</th>\n",
" <th>2.0s</th>\n",
" <th>3.0s</th>\n",
" <th>4.0s</th>\n",
" <th>5.0s</th>\n",
" </tr>\n",
" <tr>\n",
" <th>obj_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>1</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",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>45</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>98</th>\n",
" <td>37</td>\n",
" <td>1</td>\n",
" <td>52</td>\n",
" <td>2</td>\n",
" <td>13</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>99</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>18</td>\n",
" <td>3</td>\n",
" <td>19</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>100</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>100 rows × 6 columns</p>\n",
"</div>"
],
"text/plain": [
" 0.5s 1.0s 2.0s 3.0s 4.0s 5.0s\n",
"obj_id \n",
"1 1 1 5 1 1 1\n",
"2 3 2 2 1 1 1\n",
"3 1 3 3 1 1 1\n",
"4 1 2 6 1 3 3\n",
"5 2 1 1 1 2 1\n",
"... ... ... ... ... ... ...\n",
"96 1 1 2 45 1 7\n",
"97 1 3 7 1 1 3\n",
"98 37 1 52 2 13 1\n",
"99 4 1 18 3 19 2\n",
"100 2 1 1 1 1 2\n",
"\n",
"[100 rows x 6 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pd.concat([pd.read_csv(file,index_col=\"obj_id\")['lambda'].rename(f\"{'.'.join(file.split('/')[2].split(\"_\")[2:4])}\") for file in details], axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "3e0ddc4a-bede-4921-8ce8-427ef028e19e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"43624"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sum(pd.read_csv(\"./experiments/No_Refresh_0_5s_ttl/details.csv\",index_col=\"obj_id\")['access_count'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e324fbe8-24a6-49e8-96b9-d1a1a49f9644",
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}