Frank_LBM/scripts/manifold.ipynb
2024-11-04 18:10:36 +08:00

164 lines
34 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pickle\n",
"import pycuda.driver as cuda\n",
"import sys\n",
"import os\n",
"from datetime import datetime\n",
"\n",
"current_dir = os.path.dirname(os.path.abspath(\"__file__\"))\n",
"parent_dir = os.path.abspath(os.path.join(current_dir, os.pardir))\n",
"output_dir = os.path.join(parent_dir, \"output\")\n",
"os.makedirs(output_dir, exist_ok=True)\n",
"sys.path.append(parent_dir)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"cuda.init()\n",
"\n",
"context = cuda.Device(3).make_context()\n",
"\n",
"DATA_TYPE = np.float32\n",
"\n",
"from env_manifold import CustomEnv\n",
"context.push()\n",
"env = CustomEnv(device_id=3)\n",
"context.pop()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"size = [2, 2, 2]\n",
"\n",
"def generate_random_group(size, low, high):\n",
" intervals = np.linspace(low, high, size + 1)\n",
" group = np.concatenate([np.random.uniform(intervals[i], intervals[i+1], 1) for i in range(size)])\n",
" return np.sort(group)\n",
"\n",
"group1 = generate_random_group(size[0], -1, 1)\n",
"group2 = generate_random_group(size[1], -1, 1)\n",
"group3 = generate_random_group(size[2], -1, 1)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2024-10-29 11:23:57 - (0, 0, 0)\n",
"2024-10-29 11:24:39 - (0, 0, 1)\n",
"2024-10-29 11:25:21 - (0, 1, 0)\n",
"2024-10-29 11:26:03 - (0, 1, 1)\n",
"2024-10-29 11:26:45 - (1, 0, 0)\n",
"2024-10-29 11:27:27 - (1, 0, 1)\n",
"2024-10-29 11:28:09 - (1, 1, 0)\n",
"2024-10-29 11:28:51 - (1, 1, 1)\n"
]
}
],
"source": [
"data = np.empty(size, dtype=object)\n",
"for i, a1 in enumerate(sorted(group1)):\n",
" for j, a2 in enumerate(sorted(group2)):\n",
" for k, a3 in enumerate(sorted(group3)):\n",
" context.push()\n",
" action = np.array([a1, a2, a3], dtype=np.float32)\n",
" env.reset()\n",
" for _ in range(400):\n",
" _, _, _, _, _ = env.step(action)\n",
" context.pop()\n",
" fifo = np.array(env.fifo_states.copy())\n",
" data[i, j, k] = {'action': action, 'fifo': fifo}\n",
" current_time = datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n",
" print(f\"{current_time} - ({i}, {j}, {k})\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"with open(os.path.join(output_dir, \"manifold_test.pkl\"), 'wb') as f:\n",
" pickle.dump(data, f)\n",
"\n",
"# with open(os.path.join(output_dir, \"manifold_test.pkl\"), 'rb') as f:\n",
"# data = pickle.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.44718933 0.01895384 0.4848376 ]\n",
"[ 2.3110747 -1.8382945 1.3480661 1.072888 -3.6636636 -4.1307545]\n"
]
},
{
"data": {
"image/png": "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ZRlZu52fi43Bch2SzU3i00u403kfyYYDTL+PVSrnM44H9tP7xjfY+i//5ziENH/0Rym/9rX5jHavh+V6u2flPG88y5ANh1j2zqyF52F5LvHyCvHSElYpwJ2cwpmeymfcd2Yss34/Pw9VKqTdLk61il2r5+cI18GqVEg3Nnb2SQYmIxsM8hkdP8hnr2vVs7OMxuTnnp1vNx6fjww7x0yMOzVN2mphuQ7OxATZYEjW749nToty1b5917Ksa2ZGRERE5Fxpq8Uz73wXpt+n9NrXcuS3P7tzq0Nejuv223fDMKTdbu96iIiI7DWn2WTmg/8YHIfZj35UIeQquqaCyEMPPUSz2Rw/Dh48WHSRRETkJjH9oQ9x52PfpPa2txZdlJvKNRVEHnzwQVqt1vhx8uTJooskIiI3Ccuy8s8MyVV1Tf35bhAEBDsf2hIREZEb3zU1IyIiIiI3lz2dEel2uzz77LPj31944QW+9a1vMTU1xaFDh/Zy0yIiInId2NMg8sgjj/DOd75z/PvHP/5xAN7//vfzm7/5m3u5aREREbkO7GkQecc73qHvaREREZEXpc+IiIiISGEURERERKQwCiIiIiJSGAURERERKYyCiIiIiBRGQUREREQKoyAiIiIihVEQERERkcIoiIiIiEhhFERERESkMAoiIiIiUhgFERERESmMgoiIiIgURkFERERECqMgIiIiIoVREBEREZHCKIiIiIhIYRREREREpDAKIiIiIlIYBREREREpjIKIiIiIFEZBRERERAqjICIiIiKFURARERGRwiiIiIiISGEURERERKQwCiIiIiJSGAURERERKYyCiIiIiBRGQUREREQKoyAiIiIihVEQERERkcIoiIiIiEhhFERERESkMAoiIiIiUhgFERERESmMgoiIiIgURkFERERECqMgIiIiIoVREBEREZHCKIiIiIhIYa5KEPn1X/91jh49SqlU4r777uOrX/3q1disiIiIXOP2PIj89m//Nh/72Mf4+Z//eR577DHe9ra38e53v5sTJ07s9aZFRETkGmcZY8xebuDNb34zb3jDG/j0pz89fu6uu+7ive99Lw899NAl39tut2k2m7RaLRqNxl4WU0RERF4hV3L93tMZkSiKePTRR3nggQd2Pf/AAw/w9a9//YLlwzCk3W7veoiIiMiNa0+DyPr6OmmaMj8/v+v5+fl5VlZWLlj+oYceotlsjh8HDx7cy+KJiIhIwa7Kh1Uty9r1uzHmgucAHnzwQVqt1vhx8uTJq1E8ERERKYi7lyufmZnBcZwLZj/W1tYumCUBCIKAIAj2skgiIiJyDdnTGRHf97nvvvv44he/uOv5L37xi7zlLW/Zy02LiIjIdWBPZ0QAPv7xj/MTP/ETvPGNb+T+++/nP/7H/8iJEyf40Ic+tNebFhERkWvcngeRH/uxH2NjY4N//a//NcvLy9xzzz380R/9EYcPH97rTYuIiMg1bs//PyJ/E/r/iIiIiFx/rpn/j4iIiIjIpSiIiIiISGEURERERKQwCiIiIiJSGAURERERKYyCiIiIiBRGQUREREQKoyAiIiIihVEQERERkcIoiIiIiEhhFERERESkMAoiIiIiUhgFERERESmMgoiIiIgURkFERERECqMgIiIiIoVREBEREZHCKIiIiIhIYRREREREpDAKIiIiIlIYBREREREpjIKIiIiIFEZBRERERAqjICIiIiKFURARERGRwiiIiIiISGEURERERKQwCiIiIiJSGAURERERKYyCiIiIiBRGQUREREQKoyAiIiIihVEQERERkcIoiIiIiEhhFERERESkMAoiIiIiUhgFERERESmMgoiIiIgURkFERERECqMgIiIiIoVREBEREZHC7GkQ+bf/9t/ylre8hUqlwsTExF5uSkRERK5DexpEoijife97Hz/zMz+zl5sRERGR65S7lyv/V//qXwHwm7/5m3u5GREREblO7WkQuVJhGBKG4fj3drtdYGlERERkr11TH1Z96KGHaDab48fBgweLLpKIiIjsoSsOIp/85CexLOuSj0ceeeRlFebBBx+k1WqNHydPnnxZ6xEREZHrwxXfmvnIRz7Cj//4j19ymSNHjryswgRBQBAEL+u9IiIicv254iAyMzPDzMzMXpRFREREbjJ7+mHVEydOsLm5yYkTJ0jTlG9961sA3HbbbdRqtb3ctIiIiFwH9jSI/MIv/AK/9Vu/Nf799a9/PQBf+tKXeMc73rGXmxYREZHrgGWMMUUX4sW0222azSatVotGo1F0cUREROQyXMn1+5r6810RERG5uSiIiIiISGEURERERKQwCiIiIiJSGAURERERKYyCiIiIiBRGQUREREQKoyAiIiIihVEQERERkcIoiIiIiEhhFERERESkMAoi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RERERAqjICIiIiKFURARERGRwiiIiIiISGEURERERKQwCiIiIiJSGAURERERKYyCiIiIiBRGQUREREQKoyAiIiIihVEQERERkcIoiIiIiEhhFERERESkMAoiIiIiUhgFERERESmMgoiIiIgURkFERERECqMgIiIiIoVREBEREZHCKIiIiIhIYRREREREpDAKIiIiIlIYBREREREpjIKIiIiIFEZBRERERAqjICIiIiKFURARERGRwiiIiIiISGH2NIj88A//MIcOHaJUKrG4uMhP/MRPsLS0tJebFBERkevIngaRd77znfz3//7fefrpp/nc5z7Hc889x9//+39/LzcpIiIi1xHLGGOu1sZ+//d/n/e+972EYYjneS+5fLvdptls0mq1aDQaV6GEIiIi8jd1Jddv9yqVic3NTf7rf/2vvOUtb3nREBKGIWEYjn9vt9tXq3giIiJSgD3/sOo//+f/nGq1yvT0NCdOnOD3fu/3XnTZhx56iGazOX4cPHhwr4snIiIiBbriIPLJT34Sy7Iu+XjkkUfGy//Tf/pPeeyxx/jCF76A4zj85E/+JC92N+jBBx+k1WqNHydPnnz5NRMREZFr3hV/RmR9fZ319fVLLnPkyBFKpdIFz586dYqDBw/y9a9/nfvvv/8lt6XPiIiIiFx/9vQzIjMzM8zMzLysgo0yz7mfAxEREZGb1559WPUv//Iv+cu//Eve+ta3Mjk5yfPPP88v/MIvcOutt17WbIiIiIjc+Pbsw6rlcpnf+Z3f4Qd+4Ae48847+amf+inuueceHn74YYIg2KvNioiIyHVkz2ZEXvOa1/Bnf/Zne7V6ERERuQHou2ZERESkMAoiIiIiUhgFERERESmMgoiIiIgURkFERERECqMgIiIiIoVREBEREZHCKIiIiIhIYRREREREpDAKIiIiIlIYBREREREpjIKIiIiIFEZBRERERAqjICIiIiKFURARERGRwiiIiIiISGEURERERKQwCiIiIiJSGAURERERKYyCiIiIiBRGQUREREQKoyAiIiIihVEQERERkcIoiIiIiEhhFERERESkMAoiIiJyxYwx9FohaZoVXZS/sc2lHr3tsOhi3LTcogtQhH474vT3ttg41aWzNSSNMsp1H8e3cRwL27GJw5TWmQGT8xX8ssOwl5AmGeWaR2cr5PTTW6RxxuJtExhj8AKH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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_data = data[0,1,1]['fifo'][:,0]\n",
"import matplotlib.pyplot as plt\n",
"plt.plot(plot_data)\n",
"print(data[1,1,1]['action'])\n",
"print(np.mean(plot_data, axis=0))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "pycuda_3_10",
"language": "python",
"name": "python3"
},
"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.10.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}