Spaces:
Sleeping
Sleeping
Upload 19 files
Browse files- And_Or_Games.ipynb +97 -0
- Commutative_Diagrams.ipynb +0 -0
- DiGraph_Code.ipynb +1051 -0
- Direction_Fields_of_Numeric_Energy_Integral_Mapped_to_Reals.ipynb +0 -0
- E_Approximata.ipynb +179 -0
- Folding_Circle_into_Cone_Code.ipynb +0 -0
- Fractal_Partitioning_with_Zeta_Function.ipynb +0 -0
- Genetic Fragment.ipynb +83 -0
- Limbertwig_V_4_Ultra.ipynb +0 -0
- Logic_Kernel_3.ipynb +0 -0
- Logic_Vector_9.ipynb +0 -0
- Phenomenological_Velocity_Strings.ipynb +0 -0
- Programs_Tesselogical.ipynb +0 -0
- Spiraling_Vortex_Shell_Graph_(Phenomenological_Velocity).ipynb +0 -0
- Tessellogical_Game.ipynb +129 -0
- Time_Compass.ipynb +573 -0
- factorial_digit_occurences.ipynb +0 -0
- hexagon_tessellation_games_of_quasi_quanta_topology.py +524 -0
- quasi_quanta_hyperbolic_distance.ipynb +0 -0
And_Or_Games.ipynb
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"nbformat": 4,
|
| 3 |
+
"nbformat_minor": 0,
|
| 4 |
+
"metadata": {
|
| 5 |
+
"colab": {
|
| 6 |
+
"provenance": []
|
| 7 |
+
},
|
| 8 |
+
"kernelspec": {
|
| 9 |
+
"name": "python3",
|
| 10 |
+
"display_name": "Python 3"
|
| 11 |
+
},
|
| 12 |
+
"language_info": {
|
| 13 |
+
"name": "python"
|
| 14 |
+
}
|
| 15 |
+
},
|
| 16 |
+
"cells": [
|
| 17 |
+
{
|
| 18 |
+
"cell_type": "code",
|
| 19 |
+
"execution_count": 1,
|
| 20 |
+
"metadata": {
|
| 21 |
+
"id": "1a1jwC2DF-nh",
|
| 22 |
+
"outputId": "cea92afe-7070-458f-8011-f15ffc8db5f6",
|
| 23 |
+
"colab": {
|
| 24 |
+
"base_uri": "https://localhost:8080/",
|
| 25 |
+
"height": 607
|
| 26 |
+
}
|
| 27 |
+
},
|
| 28 |
+
"outputs": [
|
| 29 |
+
{
|
| 30 |
+
"output_type": "display_data",
|
| 31 |
+
"data": {
|
| 32 |
+
"text/plain": [
|
| 33 |
+
"<Figure size 1200x600 with 2 Axes>"
|
| 34 |
+
],
|
| 35 |
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACS3ElEQVR4nOzdeVjU5f7/8dfgAoqAAiKYigSaC5qpaYRpmkakZmlZHv26ZLtY4mnzlLtlttqmlpl2OpZt1mnTMltM0lxaTqaZGh6tQFQScEOEz+8PfzPHEZD5DDPM9nxcl9eJz3xm5mbyat7nfd/367YYhmEIAAAAAAAAqEFBnh4AAAAAAAAAAg9NKQAAAAAAANQ4mlIAAAAAAACocTSlAAAAAAAAUONoSgEAAAAAAKDG0ZQCAAAAAABAjaMpBQAAAAAAgBpHUwoAAAAAAAA1jqYUAAAAAAAAahxNKQA4ze7du2WxWLRkyRJPD8XrfPnll7JYLPryyy89PRQAAOAlqA8qt2TJElksFu3evdvTQwG8Fk0pwMvMmzdPFotF3bt3r/Qei8Uii8WiJ554otxj1i+/TZs22a5NmzbN9hyLxaL69eurRYsWGjhwoBYvXqzi4mJTY/z55581YsQInXPOOQoODlbTpk01fPhw/fzzz6Zex5Nee+01zZ0719PDsDN69Gi7f0/BwcFq3bq1pkyZouPHj3t6eBXyxs8RAIDKmKlhrDWV9U/t2rV1zjnnaPTo0frjjz9MvW9WVpauueYaNWnSRMHBwWrZsqVuvfVW7dmzx1W/mtvNmzfP6ybtLr30Urt/R/Xq1VPHjh01d+5clZWVeXp4FfLGzxHwpNqeHgAAe0uXLlXLli21YcMG7dy5U0lJSZXe+9hjj+n2229X/fr1HXrt+fPnq0GDBiouLtYff/yhTz75RDfeeKPmzp2rDz/8UM2bN6/yNZYvX65hw4YpMjJSY8eOVUJCgnbv3q1Fixbp7bff1rJly3TNNdc4/Pt6ymuvvaYtW7ZowoQJdtfj4+N17Ngx1alTxyPjCg4O1ksvvSRJKigo0L///W/NnDlTu3bt0tKlSz0yprOp7HMEAMDbOFvDzJgxQwkJCTp+/LjWr1+vJUuWaO3atdqyZYtCQkKqfN9nn31Wd911l84991yNHz9ecXFx2rZtm1566SW98cYb+vjjj3XxxRe741d2qXnz5ik6OlqjR4+2u96zZ08dO3ZMdevW9ci4mjVrptmzZ0uSDhw4oNdee02ZmZnav3+/HnroIY+M6Wwq+xyBgGUA8Bq//fabIclYvny50bhxY2PatGkV3ifJ6NSpkyHJeOKJJ+weW7x4sSHJ2Lhxo+3a1KlTDUnG/v37y73Wv/71LyMoKMjo3r17lePbuXOnUb9+faNNmzZGXl6e3WP79+832rRpY4SGhhq7du1y5Nd1qSNHjpi6v3///kZ8fLx7BuOkUaNGGaGhoXbXysrKjIsuusiwWCxGbm6uh0Z2yhdffGFIMr744gvbNW/8HAEAOJMzNUxFNZVhGMZ9991nSDLeeOONKt937dq1RlBQkHHJJZeUq1V27txpNGnSxIiLizPy8/Or8duZV1ZWZhw9etTUc9q3b2/06tXLPQNyUq9evYz27dvbXTt27JgRHx9vhIWFGSdPnvTQyE6x/h3Kzs62XfPGzxHwJLbvAV5k6dKlatSokfr3769rr732rCtjUlNT1adPHz366KM6duyY0+85fPhw3XTTTfr222+1atWqs9772GOP6ejRo3rxxRfVuHFju8eio6P1wgsv6MiRI3r00Udt161bB3/55RcNHTpU4eHhioqK0l133VXhlrR//etf6tKli+rVq6fIyEjdcMMN2rt3r909l156qZKTk7V582b17NlT9evX1z/+8Q9J0r///W/1799fTZs2VXBwsBITEzVz5kyVlpbaPf+jjz7Sf//7X9ty75YtW0qqPFPq888/1yWXXKLQ0FA1bNhQgwYN0rZt2+zusf6uO3fu1OjRo9WwYUNFRERozJgxOnr06Fk/28pYLBb16NFDhmHot99+s3tsxYoVtjGFhYWpf//+5bYf5ObmasyYMWrWrJmCg4MVFxenQYMG2WUbWCwWTZs2rdx7t2zZ8qyzeGf7HKVTM8Pt27dX/fr11ahRI3Xt2lWvvfaaMx8DAADV4kwNU5lLLrlEkrRr164q7505c6YsFoteeeWVcivbExMT9eijjyonJ0cvvPCC7fro0aPVoEED/fbbb0pLS1NoaKiaNm2qGTNmyDAMu9coKyvT3Llz1b59e4WEhKhJkya69dZb9ddff9nd17JlSw0YMECffPKJunbtqnr16tnec/HixerTp49iYmIUHBysdu3aaf78+eWe//PPP+urr76yfedfeumlkirPlHrrrbdsNV10dLRGjBhRbtuj9Xf9448/dPXVV6tBgwZq3Lix7r77brvazYyQkBBdeOGFKioqUl5ent1jjtSZO3bs0JAhQxQbG6uQkBA1a9ZMN9xwgwoKCiSdPX+0sprK6myfY0lJiaZPn65WrVopJCREUVFR6tGjR5X1OeDraEoBXmTp0qUaPHiw6tatq2HDhmnHjh3auHFjpfdPmzZN+/btK1c4mPV///d/kqRPP/30rPd98MEHatmypa0YO1PPnj3VsmVLffTRR+UeGzp0qI4fP67Zs2fryiuv1DPPPKNbbrnF7p6HHnpII0eOVKtWrfTkk09qwoQJWr16tXr27KlDhw7Z3Xvw4EGlp6erU6dOmjt3rnr37i3pVP5DgwYNNHHiRD399NPq0qWLpkyZovvvv9/23AceeECdOnVSdHS0Xn31Vb366qtnzUX67LPPlJaWpry8PE2bNk0TJ07UN998o9TU1AqDK4cOHaqioiLNnj1bQ4cO1ZIlSzR9+vRKX78q1vdo1KiR7dqrr76q/v37q0GDBpozZ44mT56srVu3qkePHnZjGjJkiN59912NGTNG8+bN05133qmioiKXZFic7XNcuHCh7rzzTrVr105z587V9OnT1alTJ3377bfVfl8AAMyqTg1zpoq+lyty9OhRrV69WpdccokSEhIqvOf6669XcHCwPvzwQ7vrpaWluuKKK9SkSRM9+uij6tKli6ZOnaqpU6fa3XfrrbfqnnvuUWpqqp5++mmNGTNGS5cuVVpamkpKSuzu3b59u4YNG6Z+/frp6aefVqdOnSSdineIj4/XP/7xDz3xxBNq3ry57rjjDj3//PO2586dO1fNmjVTmzZtbN/5DzzwQKW/+5IlSzR06FDVqlVLs2fP1s0336zly5erR48e5Wq60tJSpaWlKSoqSo8//rh69eqlJ554Qi+++OJZP9+zsTaOGjZsaLvmSJ154sQJpaWlaf369Ro/fryef/553XLLLfrtt9/KjdsZZ/scp02bpunTp6t379567rnn9MADD6hFixb67rvvqv2+gFfz9FItAKds2rTJkGSsWrXKMIxTy6qbNWtm3HXXXeXulWSMGzfOMAzD6N27txEbG2tbgm12+55hGMZff/1lSDKuueaaSsd36NAhQ5IxaNCgs/4eV111lSHJKCwstHvvq666yu6+O+64w5Bk/Pjjj4ZhGMbu3buNWrVqGQ899JDdfT/99JNRu3Ztu+u9evUyJBkLFiwo9/4VLUW/9dZbjfr16xvHjx+3Xats21l2drYhyVi8eLHtWqdOnYyYmBjj4MGDtms//vijERQUZIwcOdJ2zfq73njjjXavec011xhRUVHl3utM1u17+/fvN/bv32/s3LnTePzxxw2LxWIkJycbZWVlhmEYRlFRkdGwYUPj5ptvtnt+bm6uERERYbtu/ff62GOPnfV9JRlTp04tdz0+Pt4YNWqU7Wcz2/cGDRpUbjk9AACe4GwNY62pPvvsM2P//v3G3r17jbffftto3LixERwcbOzdu/esr/fDDz8Ykiqs5U7XsWNHIzIy0vbzqFGjDEnG+PHjbdfKysqM/v37G3Xr1rXVc19//bUhyVi6dKnd661cubLc9fj4eEOSsXLlynLvX1HtlJaWZpx77rl21yrbdnZmfXDixAkjJibGSE5ONo4dO2a778MPPzQkGVOmTCn3u86YMcPuNS+44AKjS5cu5d7rTL169TLatGljq51++eUX45577jEkGf3797fd52id+f333xuSjLfeeqvS96yoVrQ6s6Yys33v/PPPtxszEChYKQV4iaVLl6pJkya2FT8Wi0XXX3+9li1bdtbly9OmTVNubq4WLFjg9Hs3aNBAklRUVFTpPdbHwsLCzvpa1scLCwvtro8bN87u5/Hjx0uSPv74Y0mnwkfLyso0dOhQHThwwPYnNjZWrVq10hdffGH3/ODgYI0ZM6bc+9erV89uzAcOHNAll1yio0eP6pdffjnr2CuSk5OjH374QaNHj1ZkZKTteseOHdWvXz/b+E9322232f18ySWX6ODBg+U+k4ocOXJEjRs3VuPGjZWUlKS7775bqamp+ve//y2LxSJJWrVqlQ4dOqRhw4bZfVa1atVS9+7dbZ9VvXr1VLduXX355ZfllvG7W8OGDfX777+fdaUfAAA1obo1TN++fdW4cWM1b95c1157rUJDQ/X++++rWbNmLnvfimqEjIwM2z9bLBZlZGToxIkT+uyzzySd2h4XERGhfv362dUDXbp0UYMGDcrVTgkJCUpLSyv3PqfXTgUFBTpw4IB69eql3377zbZlzYxNmzYpLy9Pd9xxh10QfP/+/dWmTZsKV6NVVDudGVtQmV9++cVWO7Vp00aPPfaYrrrqKrvtdY7WmREREZKkTz75xOnoBWc1bNhQP//8s3bs2FGj7wt4Gk0pwAuUlpZq2bJl6t27t7Kzs7Vz507t3LlT3bt31759+7R69epKn9uzZ0/17t27WtlShw8flnT2osn62NkaV6c/fuZrtWrVyu7nxMREBQUF2ZbA79ixQ4ZhqFWrVrbCwvpn27Zt5TIBzjnnnApPefn55591zTXXKCIiQuHh4WrcuLFGjBghSU4VVv/9738lSeedd165x9q2basDBw7oyJEjdtdbtGhh97N1eb8jjaGQkBCtWrVKq1at0uLFi9W2bVvl5eXZFYzWYqVPnz7lPqtPP/3U9lkFBwdrzpw5WrFihZo0aaKePXvq0UcfVW5urolPwDn33XefGjRooG7duqlVq1YaN26csrKy3P6+AACcqbo1zPPPP69Vq1bp7bff1pVXXqkDBw4oODjYpe975nsGBQXp3HPPtbvWunVrSbKrnQoKChQTE1OuHjh8+HC52qmyLYRZWVnq27evLTezcePGtqxOV9dObdq0sT1uFRISUi7nq1GjRg5PqLVs2VKrVq3SJ598onnz5umcc87R/v377RpijtaZCQkJmjhxol566SVFR0crLS1Nzz//vFOfg1kzZszQoUOH1Lp1a3Xo0EH33HOP/vOf/7j9fQFPq+3pAQA4FaKdk5OjZcuWadmyZeUeX7p0qS6//PJKnz916lRdeumleuGFF+z2zjtqy5YtkqSkpKRK74mIiFBcXFyVX47/+c9/dM455yg8PPys91lX/ViVlZXJYrFoxYoVqlWrVrn7rau5rE5v0lgdOnRIvXr1Unh4uGbMmKHExESFhITou+++03333aeysrKzjslVKhq/pHLhpJU9t2/fvraf09LS1KZNG9166616//33Jcn2e7z66quKjY0t9xq1a//vP+0TJkzQwIED9d577+mTTz7R5MmTNXv2bH3++ee64IILzjoWZwNGpVMNu+3bt+vDDz/UypUr9c4772jevHmaMmVKtfK1AAAwq7o1TLdu3dS1a1dJ0tVXX60ePXrob3/7m7Zv316uPjldUlKSateufdb3LS4u1vbt222vb0ZZWZliYmIqPRjnzEZPRbXTrl27dNlll6lNmzZ68skn1bx5c9WtW1cff/yxnnrqqRqpnSqrmxwVGhpqVzulpqaqc+fO+sc//qFnnnlGkrk684knntDo0aP173//W59++qnuvPNOzZ49W+vXr1ezZs3K1bBW1ambpFMTzbt27bK970svvaSnnnpKCxYs0E033VSt1wa8GU0pwAssXbpUMTExdoGSVsuXL9e7776rBQsWVFhMSFKvXr106aWXas6cOZoyZYrp93/11VclqcIl3acbMGCAFi5cqLVr16pHjx7lHv/666+1e/du3XrrreUe27Fjh90M3c6dO1VWVmY7rS0xMVGGYSghIcE2E2jWl19+qYMHD2r58uXq2bOn7Xp2dna5eysrKM4UHx8v6VQ46Jl++eUXRUdHKzQ01KnxOiIuLk6ZmZmaPn261q9fr4suukiJiYmSpJiYGLsirDKJiYn6+9//rr///e/asWOHOnXqpCeeeEL/+te/JJ2ajTwzvPPEiRPKycmp8rXP9jmGhobq+uuv1/XXX68TJ05o8ODBeuihhzRp0iS72UsAANytOjXM6azB3dYw6tMPUjlTaGioevfurc8//1z//e9/bTXF6d58800VFxdrwIABdtfLysr022+/2dVEv/76qyTZ1U6fffaZUlNTK60Rq/LBBx+ouLhY77//vt1K7zO3/knO1U59+vSxe2z79u0Vfg6u1LFjR40YMUIvvPCC7r77brVo0cJ0ndmhQwd16NBBDz74oO1wmwULFmjWrFm2FfBn1k5nrgCrzNk+x8jISI0ZM0ZjxozR4cOH1bNnT02bNo2mFPwa2/cADzt27JiWL1+uAQMG6Nprry33JyMjQ0VFRbZVMpWxZkuZPanktdde00svvaSUlBRddtllZ733nnvuUb169XTrrbfq4MGDdo/l5+frtttuU/369XXPPfeUe+6ZDbdnn31WkpSeni5JGjx4sGrVqqXp06eXW1FkGEa596uIdebr9OefOHFC8+bNK3dvaGioQ0ux4+Li1KlTJ73yyit2xceWLVv06aef6sorr6zyNapr/Pjxql+/vh555BFJp5qH4eHhevjhh8udrCNJ+/fvl3Tq1J/jx4/bPZaYmKiwsDAVFxfbXVuzZo3dfS+++KJDM36VfY5n/vuqW7eu2rVrJ8MwKhwzAADuVJ0a5kyXXnqpunXrprlz55b7nj3Tgw8+KMMwNHr06HIxC9nZ2br33nsVFxdXYTPsueees/2zYRh67rnnVKdOHVu9NnToUJWWlmrmzJnlnnvy5EmHTourqHYqKCjQ4sWLy90bGhrq0Gt27dpVMTExWrBggV29sWLFCm3btk39+/ev8jWq695771VJSYmefPJJSY7XmYWFhTp58qTd4x06dFBQUJDtdwkPD1d0dHS52qmierMilX2OZ/69bNCggZKSkuw+Q8AfsVIK8LD3339fRUVFuuqqqyp8/KKLLlLjxo21dOlSXX/99ZW+Tq9evdSrVy999dVXld7z9ttvq0GDBjpx4oT++OMPffLJJ8rKytL555+vt956q8qxtmrVSq+88oqGDx+uDh06aOzYsUpISNDu3bu1aNEiHThwQK+//rptJc/psrOzddVVV+mKK67QunXr9K9//Ut/+9vfdP7550s61RiZNWuWJk2apN27d+vqq69WWFiYsrOz9e677+qWW27R3XfffdbxXXzxxWrUqJFGjRqlO++8UxaLRa+++mqF2+a6dOmiN954QxMnTtSFF16oBg0aaODAgRW+7mOPPab09HSlpKRo7NixOnbsmJ599llFRERo2rRpVX5u1RUVFaUxY8Zo3rx52rZtm9q2bav58+fr//7v/9S5c2fdcMMNaty4sfbs2aOPPvpIqampeu655/Trr7/qsssu09ChQ9WuXTvVrl1b7777rvbt26cbbrjB9vo33XSTbrvtNg0ZMkT9+vXTjz/+qE8++UTR0dFVjq2yz/Hyyy9XbGysUlNT1aRJE23btk3PPfec+vfvX2XgKwAArladGqYi99xzj6677jotWbKkXEj36Xr27KnHH39cEydOVMeOHTV69GjFxcXpl19+0cKFC1VWVqaPP/7YtvrGKiQkRCtXrtSoUaPUvXt3rVixQh999JH+8Y9/2Lbl9erVS7feeqtmz56tH374QZdffrnq1KmjHTt26K233tLTTz+ta6+99qy/x+WXX666detq4MCBuvXWW3X48GEtXLhQMTEx5VZMd+nSRfPnz9esWbOUlJSkmJiYciuhJKlOnTqaM2eOxowZo169emnYsGHat2+fnn76abVs2VKZmZkOfcbV0a5dO1155ZV66aWXNHnyZIfrzM8//1wZGRm67rrr1Lp1a508eVKvvvqqatWqpSFDhthe/6abbtIjjzyim266SV27dtWaNWtsK9mqUtnn2K5dO1166aXq0qWLIiMjtWnTJr399tt2gfeAX/LAiX8ATjNw4EAjJCTEOHLkSKX3jB492qhTp45x4MABwzBOHTc7bty4cvdZ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uHGqW7euPv30U/Xq1UstWrRQenq6PvvsM/3xxx964IEHbPe2bNlSM2fO1LBhwxQaGqpzzjlHzz//vN3rHTp0SDfddJMaN26s8PBw9enTRz/++KPt8WnTpqlTp0566aWXlJCQoJCQEEnSypUr1aNHDzVs2FBRUVEaMGCAdu3aZXteQkKCJOmCCy6QxWLRpZdeKqn89r3i4mLdeeediomJUUhIiHr06KGNGzfaHrfOIq5evVpdu3ZV/fr1dfHFF2v79u1n/XwBAEDlPFVTmaljpP/VS/Hx8RozZow6duyoVatWVfr6hmFo7Nixatu2rZYvX65u3bopPj5e1113nT744AOtW7dOTz31lO1+i8Wi+fPnKz09XfXq1dO5556rt99+2+419+7dq6FDh6phw4aKjIzUoEGDtHv3btvj1trmoYceUtOmTXXeeedJkl599VV17dpVYWFhio2N1d/+9jdbfbh792717t1bktSoUSNZLBaNHj1aUvnte3/99ZdGjhypRo0aqX79+kpPT9eOHTtsjy9ZskQNGzbUJ598orZt26pBgwa64oorlJPj/glbAIDvoSl1GsMwdPTESYf+FB0v0dT3f1ZFC7at16a9v1VFx0scej1Hln6f7s0331SbNm103nnnacSIEXr55ZcrfI1hw4YpKSlJM2bMMP15jBo1So0aNap0G19+fr4++eQT3XHHHapXr57dY7GxsRo+fLjeeOMNu3E99thjOv/88/X999/r/vvv11133WVXzF133XXKy8vTihUrtHnzZnXu3FmXXXaZ3Uzlzp079c4772j58uW27XhHjhzRxIkTtWnTJq1evVpBQUG65pprVFZWJknasGGDJOmzzz5TTk5Opb/Tvffeq3feeUevvPKKvvvuOyUlJSktLa3cTOkDDzygJ554Qps2bVLt2rV14403OvipAgDg/3yhpnKmjjn99/v666/1yy+/qG7dupW+xw8//KCtW7dq4sSJCgqyL7vPP/989e3bV6+//rrd9cmTJ2vIkCH68ccfNXz4cN1www3atm2bJKmkpERpaWkKCwvT119/raysLFvT5/QVUatXr9b27du1atUqffjhh7bnzpw5Uz/++KPee+897d6929Z4at68ud555x1J0vbt25WTk6Onn366wt9p9OjR2rRpk95//32tW7dOhmHoyiuvVElJie2eo0eP6vHHH9err76qNWvWaM+ePbr77rsr/ZwAAIGrtqcH4E2OlZSq3ZRPXPJahqTcwuPqMO1Th+7fOiNN9es6/q9j0aJFGjFihCTpiiuuUEFBgb766ivbCiAri8WiRx55RAMHDlRmZqYSExMdfo+goCC1bt3abvbtdDt27JBhGGrbtm2Fj7dt21Z//fWX9u/fr5iYGElSamqq7r//fklS69atlZWVpaeeekr9+vXT2rVrtWHDBuXl5Sk4OFiS9Pjjj+u9997T22+/bdtKeOLECf3zn/9U48aNbe81ZMgQu/d++eWX1bhxY23dulXJycm2e6OiohQbG1vheI8cOaL58+dryZIlSk9PlyQtXLhQq1at0qJFi3TPPffY7n3ooYfUq1cvSdL999+v/v376/jx47aVWwAA1ystM7QhO195RccVExaibgmRqhXEUfLeyBdqKmfqmHnz5umll17SiRMnVFJSopCQEN15552Vvsevv/5qe63K3mPt2rV216677jrddNNNkqSZM2dq1apVevbZZzVv3jy98cYbKisr00svvSSL5dTf/cWLF6thw4b68ssvdfnll0uSQkND9dJLL9k1zE6fQDv33HP1zDPP6MILL9Thw4fVoEEDRUZGSpJiYmIqjTbYsWOH3n//fWVlZeniiy+WJC1dulTNmzfXe++9p+uuu07SqQbYggULbHVnRkaGUxOkAAD38KaayqMrpdasWaOBAweqadOmslgseu+99+weNwxDU6ZMUVxcnOrVq6e+ffvaLQ8OVNu3b9eGDRs0bNgwSVLt2rV1/fXXa9GiRRXen5aWph49emjy5Mmm38swDFvRc7Z7HJWSklLuZ+vs348//qjDhw8rKipKDRo0sP3Jzs6224oXHx9v15CSThVJw4YN07nnnqvw8HC1bNlSkrRnzx6Hx7Zr1y6VlJQoNTXVdq1OnTrq1q2bbYxWHTt2tP1zXFycJFW5RRIA4DxPZjjCv5mpY4YPH64ffvhBWVlZSk9P1wMPPGBrzrjqPaqqlXbu3KmwsDBbnRQZGanjx4/b1UodOnQot4Jr8+bNGjhwoFq0aKGwsDDb5JqZWmnbtm2qXbu2unfvbrsWFRWl8847z65Wql+/vt1EaFxcHHUSAHgJb6upPLpS6siRIzr//PN14403avDgweUef/TRR/XMM8/olVdeUUJCgiZPnqy0tDRt3brVLStS6tWppa0z0hy6d0N2vkYv3ljlfUvGXKhuCZEOvbejFi1apJMnT6pp06a2a4ZhKDg4WM8995wiIiLKPeeRRx5RSkqK3WqfqpSWlmrHjh268MILK3w8KSlJFotF27Zt0zXXXFPu8W3btqlRo0blGkiVOXz4sOLi4vTll1+We+z0GbvQ0NByjw8cOFDx8fFauHChmjZtqrKyMiUnJ7stPLROnTq2f7Y27axbBQEArmXNGzrz/9Zb84bmj+isK5LjPDI2VMwXaipn6piIiAglJSVJOhWlkJSUpIsuukh9+/at8D1at25te60LLrigwvew3uOIw4cPq0uXLlq6dGm5x04f55m10pEjR5SWlqa0tDQtXbpUjRs31p49e5SWluaWWun0Okk6VSuZjaoAALieN9ZUHl0plZ6erlmzZlVYCBiGoblz5+rBBx/UoEGD1LFjR/3zn//Un3/+WW5FlatYLBbVr1vboT+XtGqsuIgQVbaGyCIpLiJEl7Rq7NDrVbUayerkyZP65z//qSeeeEI//PCD7c+PP/6opk2blsslsOrWrZsGDx5s2zrniFdeeUV//fVXua1xVlFRUerXr5/mzZunY8eO2T2Wm5urpUuX6vrrr7f73davX2933/r1621L2jt37qzc3FzVrl1bSUlJdn+io6MrHefBgwe1fft2Pfjgg7rssstsy+1PZ50tLC0trfR1EhMTVbduXWVlZdmulZSUaOPGjWrXrl2lzwMAuE9pmaHpH2w9a97Q9A+2qrSM/8PrTXyhpnKmjjldgwYNdNddd+nuu++utOHSqVMntWnTRk899VS5yasff/xRn332mW3lu1VVtdKOHTsUExNTrlaqaFLS6pdfftHBgwf1yCOP6JJLLlGbNm3KrVxypFZq27atTp48qW+//dZ2zVqHUSsBgHfz1prKa4POs7OzlZubazfzFBERoe7du2vdunWVPq+4uFiFhYV2f9yhVpBFUwee+vI9s1Sx/jx1YDuX78v88MMP9ddff2ns2LFKTk62+zNkyJBKt/BJp3KQPv/88wpPijt69Khyc3P1+++/a/369brvvvt022236fbbb7edxlKR5557TsXFxUpLS9OaNWu0d+9erVy5Uv369dM555yjhx56yO7+rKwsPfroo/r111/1/PPP66233tJdd90lSerbt69SUlJ09dVX69NPP9Xu3bv1zTff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8+fP1/jx43X99dfrr7/+cscYAcBlHP2St2I5NABn/PHHH8rIyNDbb7+tc889V2lpaXrzzTd14sQJTw8NAODlzJ60R40KX2a6KdWnTx9df/31Wr9+vdq2baubbrpJ33//vfbs2aMOHTq4Y4wA4BKlZYaydh4w9RyWQwNwRnR0tDIzM/XDDz/o22+/VevWrXXHHXeoadOmuvPOO/Xjjz96eogAAC/DSXsIRKa373366afq1auX3bXExERlZWXpoYcectnAAMCVzAabsxwagKt07txZsbGxioqK0iOPPKKXX35Z8+bNU0pKihYsWKD27dt7eogAAA8zU6sSLQF/Ynql1JkNKdsLBQVp8uTJ1R4QALiamWBz63G6mf1asxwaQLWUlJTo7bff1pVXXqn4+Hh98skneu6557Rv3z7t3LlT8fHxuu6661zyXn/88YdGjBihqKgo1atXTx06dNCmTZtsjxuGoSlTpiguLk716tVT3759tWPHDpe8NwCgeszWqhLREvAfpptSAOBLzASb8yUPwFXGjx+vuLg43XrrrWrdurW+//57rVu3TjfddJNCQ0PVsmVLPf744/rll1+q/V5//fWXUlNTVadOHa1YsUJbt27VE088oUaNGtnuefTRR/XMM89owYIF+vbbbxUaGqq0tDQdP27uFFIAgGtx0h4CnVOn7wGAtystM7QhO19ZO/c7vGUvNiJEUwe240seQLVt3bpVzz77rAYPHqzg4OAK74mOjtYXX3xR7feaM2eOmjdvrsWLF9uuJSQk2P7ZMAzNnTtXDz74oAYNGiRJ+uc//6kmTZrovffe0w033FDtMQAAnMNJewh0NKUA+B2z+VGSlNE7UZn9zuNLHoBLrF69usp7ateuXWksghnvv/++0tLSdN111+mrr77SOeecozvuuEM333yzJCk7O1u5ubnq27ev7TkRERHq3r271q1bV2lTqri4WMXFxbafCwsLqz1WAIA9syftAf6G7XsA/IqZPfmnS01qTEMKgE/67bffNH/+fLVq1UqffPKJbr/9dt1555165ZVXJEm5ubmSpCZNmtg9r0mTJrbHKjJ79mxFRETY/jRv3tx9vwQABKDSMkMHioqrvlGctAf/xUopAH7D7J58idNLAPi+srIyde3aVQ8//LAk6YILLtCWLVu0YMECjRo1yunXnTRpkiZOnGj7ubCwkMYUALiIoyv7qVXh71y6UiooKEh9+vTR5s2bXfmyAOAQR/fkWxFsDsAfxMXFqV27dnbX2rZtqz179kiSYmNjJUn79u2zu2ffvn22xyoSHBys8PBwuz8AgOpzdGU/tSoCgUubUi+//LJ69uypcePGufJlAeCsSssMrdt1UCu25Jh6HqeXAPAHqamp2r59u921X3/9VfHx8ZJOhZ7Hxsba5VwVFhbq22+/VUpKSo2OFQACnZmV/dSqCAQu3b43evRoSdK0adNc+bIAUCnnQs05vQSA/8jMzNTFF1+shx9+WEOHDtWGDRv04osv6sUXX5QkWSwWTZgwQbNmzVKrVq2UkJCgyZMnq2nTprr66qs9O3gACDCOruyf3L+tRqcmUKvC71WrKbV3715JIl8AgEdYlz47miFl3ZOf2a81X/AAPCYhIUF9+vTRzJkz1bRp02q/3oUXXqh3331XkyZN0owZM5SQkKC5c+dq+PDhtnvuvfdeHTlyRLfccosOHTqkHj16aOXKlQoJITgXAGqSo6ftRYcFU68iIJjevnfy5ElNnjxZERERatmypVq2bKmIiAg9+OCDKikpcccYAaAcs6Hm7MkH4C1GjRql0tJSpaamuuw1BwwYoJ9++knHjx/Xtm3bdPPNN9s9brFYNGPGDOXm5ur48eP67LPP1Lp1a5e9PwDg7KxxEzv2FTl0P6ftIVCYXik1fvx4LV++XI8++qgth2DdunWaNm2aDh48qPnz57t8kABwJrOh5rERIZo6sB178gF4HDEHABBYzMRNcNoeAo3pptRrr72mZcuWKT093XatY8eOat68uYYNG0ZTCoBblZYZ2pCd73Co+ciUeKUnx5EfBcBjDOPUmk6Lhf8GAUCgMRM3wcp+BCLT2/eCg4PVsmXLctcTEhJUt25dV4wJACq0ckuOesz5XMMWrtc/1/3XoeekJ8cpJTGKL3YANW7RokVKTk5WSEiIQkJClJycrJdeesnTwwIA1BCzcROctodAZHqlVEZGhmbOnKnFixcrODhYklRcXKyHHnpIGRkZLh8gAEjOh5qz9BmAJ0yZMkVPPvmkxo8fbxd3kJmZqT179mjGjBkeHiEAwN0cjZvgZGgEMtNNqe+//16rV69Ws2bNdP7550uSfvzxR504cUKXXXaZBg8ebLt3+fLlrhspgIBFqDkAXzN//nwtXLhQw4YNs1276qqr1LFjR40fP56mFAAEAEdP2mvVpIFSEqPcPBrAO5luSjVs2FBDhgyxu9a8eXOXDQgArKz5UVk79xNqDsCnlJSUqGvXruWud+nSRSdPnvTAiAAANcVaw3LSHlA1002pxYsXu2McAGDHzCklVoSaA/AW//d//6f58+frySeftLv+4osvavjw4R4aFQDA3ThpDzDHdFMKANzNbH6UlTXUHAC8waJFi/Tpp5/qoosukiR9++232rNnj0aOHKmJEyfa7juzcQUA8E2ctAeY51BT6oorrtC0adNsRVVlioqKNG/ePDVo0EDjxo1zyQABBBaz+VESs0wAvM+WLVvUuXNnSdKuXbskSdHR0YqOjtaWLVts91ks/B8RAPAHzpy0R9wE4GBT6rrrrtOQIUMUERGhgQMHqmvXrmratKlCQkL0119/aevWrVq7dq0+/vhj9e/fX4899pi7xw3ATzl6SokVs0wAvNEXX3zh6SEAAGoQJ+0BznGoKTV27FiNGDFCb731lt544w29+OKLKigokHRqhq9du3ZKS0vTxo0b1bZtW7cOGIB/sgZCrtiSY+p5zDIBAADAU8zWsJy0B9hzOFMqODhYI0aM0IgRIyRJBQUFOnbsmKKiolSnTh23DRCA/3Mm1JxZJgDe5rbbbtODDz6oZs2aVXnvG2+8oZMnTxJ6DgA+zJkalpP2AHtOB51HREQoIiLClWMBEIDMhppb86My+7WmGQXAqzRu3Fjt27dXamrqWeMOli1bpqZNm+rFF1/09JABAE5ytoYlAxWwZ7op9fnnn2v58uXavXu3LBaLEhISdO2116pnz57uGB8AP2Y2EJL8KADebObMmcrIyNBLL72kefPmaevWrXaPh4WFqW/fvnrxxRd1xRVXeGiUAIDqooYFXMdiGIbDh1zddtttevHFF9WoUSO1bt1ahmFox44dOnTokO644w49++yz7hyrUwoLCxUREaGCggKFh4d7ejgATrNu10ENW7je4fvjyI8C4GaurBv++usv7dmzR8eOHVN0dLQSExN9+rQ9aioAOIUaFqiao3WDwyul3n33XS1evFgvv/yyRo0aZSuqysrKtGTJEt1+++3q16+frrrqquqPHoDfKy0zlLXzgEP3jkyJV3pyHPlRAHxKo0aN1KhRI08PAwDgYnlFjmVIUcMCVQty9MbFixdr4sSJGj16tN0sX1BQkG68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mDAha2try2677basubk5daRCePTRR7Nbb701dYzCmj9/frZkyZJex+68885s0aJFiRIVR0RkO3fuvPC4p6cnGzNmTPbss89eOPbDDz9kVVVV2Y4dOxIkpC90qtKhU+VPp0pDp0pLp0qnFDuVK6Uuwe+//x6HDx+OuXPnXjhWXl4ec+fOjY8++ihhsmL68ccfIyJixIgRiZMUR1NTU8yfP7/X3wCX365du6KhoSHuuuuuGDVqVEybNi1eeuml1LEKY+bMmbF79+44ceJERER8+umnsW/fvrjjjjsSJyueU6dOxdmzZ3v9Dxo+fHhMnz7debif0alKi06VP50qDZ0qLZ2qdJRCp6rM5acMMN999110d3fH6NGjex0fPXp0fPnll4lSFVNPT0+0tLTErFmzYvLkyanjFMIbb7wRR44ciUOHDqWOUjhff/11bNmyJVpbW+Oxxx6LQ4cOxcMPPxyDBw+OxYsXp4434C1fvjw6Oztj4sSJUVFREd3d3bFq1apYtGhR6miFc/bs2YiIi56H/3qO/kGnKh06Vf50qnR0qrR0qtJRCp3KUop+rampKY4ePRr79u1LHaUQzpw5E83NzdHW1hZDhgxJHadwenp6oqGhIVavXh0REdOmTYujR4/G1q1bFagcvPXWW/H666/H9u3bY9KkSdHe3h4tLS1RW1tr/kC/p1PlS6dKS6dKS6fiX3n73iW48soro6KiIs6dO9fr+Llz52LMmDGJUhXP0qVL47333os9e/bEuHHjUscphMOHD0dHR0fceOONUVlZGZWVlbF3797YuHFjVFZWRnd3d+qIA9rYsWPj+uuv73Xsuuuui9OnTydKVCyPPPJILF++PO65556YMmVK3HfffbFs2bJYs2ZN6miF89e51nm4/9OpSoNOlT+dKi2dKi2dqnSUQqeylLoEgwcPjptuuil279594VhPT0/s3r07ZsyYkTBZMWRZFkuXLo2dO3fGBx98EPX19akjFcacOXPis88+i/b29gtfDQ0NsWjRomhvb4+KiorUEQe0WbNm/dtHdZ84cSKuuuqqRImK5eeff47y8t6nzYqKiujp6UmUqLjq6+tjzJgxvc7DnZ2dceDAAefhfkanSkunSkenSkunSkunKh2l0Km8fe8Stba2xuLFi6OhoSEaGxtjw4YNcf78+XjggQdSRxvwmpqaYvv27fHOO+9ETU3Nhfe6Dh8+PKqrqxOnG9hqamr+7T4TQ4cOjZEjR7r/RA6WLVsWM2fOjNWrV8fdd98dBw8ejG3btsW2bdtSRyuEBQsWxKpVq6Kuri4mTZoUn3zySaxfvz6WLFmSOtqA9NNPP8VXX3114fGpU6eivb09RowYEXV1ddHS0hJPP/10TJgwIerr62PFihVRW1sbCxcuTBeaS6JTpaNTpaNTpaVTpaVT5avkO1Uun/E3QG3atCmrq6vLBg8enDU2Nmb79+9PHakQIuKiX6+88krqaIXk44vz9e6772aTJ0/OqqqqsokTJ2bbtm1LHakwOjs7s+bm5qyuri4bMmRIds0112SPP/549ttvv6WONiDt2bPnov/rFy9enGXZnx9hvGLFimz06NFZVVVVNmfOnOz48eNpQ3PJdKo0dKrSolPlS6dKR6fKV6l3qrIsy7J81l8AAAAA8Cf3lAIAAAAgd5ZSAAAAAOTOUgoAAACA3FlKAQAAAJA7SykAAAAAcmcpBQAAAEDuLKUAAAAAyJ2lFAAAAAC5s5QCAAAAIHeWUgAAAADkzlIKAAAAgNxVpg4AkKfZs2fH5MmTIyLitddei0GDBsVDDz0UTz75ZJSVlSVOBwDQP+hUwN/BlVJA4bz66qtRWVkZBw8ejOeffz7Wr18fL7/8cupYAAD9ik4F9FVZlmVZ6hAAeZk9e3Z0dHTE559/fuFVvOXLl8euXbvi2LFjidMBAPQPOhXwd3ClFFA4t9xyS6/LymfMmBEnT56M7u7uhKkAAPoXnQroK0spAAAAAHJnKQUUzoEDB3o93r9/f0yYMCEqKioSJQIA6H90KqCvLKWAwjl9+nS0trbG8ePHY8eOHbFp06Zobm5OHQsAoF/RqYC+qkwdACBv999/f/zyyy/R2NgYFRUV0dzcHA8++GDqWAAA/YpOBfSVpRRQOIMGDYoNGzbEli1bUkcBAOi3dCqgr7x9DwAAAIDcWUoBAAAAkLuyLMuy1CEAAAAAKBZXSgEAAACQO0spAAAAAHJnKQUAAABA7iylAAAAAMidpRQAAAAAubOUAgAAACB3llIAAAAA5M5SCgAAAIDcWUoBAAAAkLt/AI25YtO+Y6ZTAAAAAElFTkSuQmCC\n"
|
| 36 |
+
},
|
| 37 |
+
"metadata": {}
|
| 38 |
+
}
|
| 39 |
+
],
|
| 40 |
+
"source": [
|
| 41 |
+
"import numpy as np\n",
|
| 42 |
+
"import matplotlib.pyplot as plt\n",
|
| 43 |
+
"\n",
|
| 44 |
+
"# Define the symbolic logic operations as per the provided description\n",
|
| 45 |
+
"class LogicOperations:\n",
|
| 46 |
+
" def __init__(self):\n",
|
| 47 |
+
" pass\n",
|
| 48 |
+
"\n",
|
| 49 |
+
" def AND(self, p, x, r, m):\n",
|
| 50 |
+
" # Simulate AND operation\n",
|
| 51 |
+
" PsiN = lambda a: a * m\n",
|
| 52 |
+
" return p * (-x) * (r) + PsiN(p)\n",
|
| 53 |
+
"\n",
|
| 54 |
+
" def OR(self, p, y, s, n):\n",
|
| 55 |
+
" # Simulate OR operation\n",
|
| 56 |
+
" PsiN = lambda a: a ** 2\n",
|
| 57 |
+
" return p * (y) * (s) + PsiN(p) + n\n",
|
| 58 |
+
"\n",
|
| 59 |
+
"# Game simulation between two simple neural networks based on the logic operatives\n",
|
| 60 |
+
"def game_simulation(p_values, x, r, m, y, s, n):\n",
|
| 61 |
+
" logic_op = LogicOperations()\n",
|
| 62 |
+
" AND_results = [logic_op.AND(p, x, r, m) for p in p_values]\n",
|
| 63 |
+
" OR_results = [logic_op.OR(p, y, s, n) for p in p_values]\n",
|
| 64 |
+
" return AND_results, OR_results\n",
|
| 65 |
+
"\n",
|
| 66 |
+
"# Define 'p' values range\n",
|
| 67 |
+
"p_values = np.linspace(0, 10, 100) # Define a range of 'p' values from 0 to 10\n",
|
| 68 |
+
"\n",
|
| 69 |
+
"x, r, m, y, s, n = 1, 1, 2, 1, 2, 1 # Example values for parameters\n",
|
| 70 |
+
"\n",
|
| 71 |
+
"# Simulate the game between neural networks A and B\n",
|
| 72 |
+
"AND_results, OR_results = game_simulation(p_values, x, r, m, y, s, n)\n",
|
| 73 |
+
"\n",
|
| 74 |
+
"# Plotting the results of the logic operations\n",
|
| 75 |
+
"plt.figure(figsize=(12, 6))\n",
|
| 76 |
+
"\n",
|
| 77 |
+
"# Corrected placement of plt.show() to display the plots after creation\n",
|
| 78 |
+
"plt.subplot(1, 2, 1)\n",
|
| 79 |
+
"plt.plot(p_values, AND_results, 'o-', label='AND Operation')\n",
|
| 80 |
+
"plt.title('AND Operation Results')\n",
|
| 81 |
+
"plt.xlabel('p')\n",
|
| 82 |
+
"plt.ylabel('AND(p, x, r, m)')\n",
|
| 83 |
+
"plt.legend()\n",
|
| 84 |
+
"\n",
|
| 85 |
+
"plt.subplot(1, 2, 2)\n",
|
| 86 |
+
"plt.plot(p_values, OR_results, 'o-', label='OR Operation')\n",
|
| 87 |
+
"plt.title('OR Operation Results')\n",
|
| 88 |
+
"plt.xlabel('p')\n",
|
| 89 |
+
"plt.ylabel('OR(p, y, s, n)')\n",
|
| 90 |
+
"plt.legend()\n",
|
| 91 |
+
"\n",
|
| 92 |
+
"plt.tight_layout()\n",
|
| 93 |
+
"plt.show() # Display the plots"
|
| 94 |
+
]
|
| 95 |
+
}
|
| 96 |
+
]
|
| 97 |
+
}
|
Commutative_Diagrams.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
DiGraph_Code.ipynb
ADDED
|
@@ -0,0 +1,1051 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"nbformat": 4,
|
| 3 |
+
"nbformat_minor": 0,
|
| 4 |
+
"metadata": {
|
| 5 |
+
"colab": {
|
| 6 |
+
"provenance": []
|
| 7 |
+
},
|
| 8 |
+
"kernelspec": {
|
| 9 |
+
"name": "python3",
|
| 10 |
+
"display_name": "Python 3"
|
| 11 |
+
},
|
| 12 |
+
"language_info": {
|
| 13 |
+
"name": "python"
|
| 14 |
+
}
|
| 15 |
+
},
|
| 16 |
+
"cells": [
|
| 17 |
+
{
|
| 18 |
+
"cell_type": "code",
|
| 19 |
+
"execution_count": 1,
|
| 20 |
+
"metadata": {
|
| 21 |
+
"colab": {
|
| 22 |
+
"base_uri": "https://localhost:8080/",
|
| 23 |
+
"height": 209
|
| 24 |
+
},
|
| 25 |
+
"id": "uPSdZM5uKxeg",
|
| 26 |
+
"outputId": "8583bf52-8ec7-44fb-f0ae-af3667b444bc"
|
| 27 |
+
},
|
| 28 |
+
"outputs": [
|
| 29 |
+
{
|
| 30 |
+
"output_type": "stream",
|
| 31 |
+
"name": "stdout",
|
| 32 |
+
"text": [
|
| 33 |
+
"digraph {\n",
|
| 34 |
+
"\tnode [shape=circle]\n",
|
| 35 |
+
"\tA [label=\"$A$\"]\n",
|
| 36 |
+
"\tB [label=\"$B$\"]\n",
|
| 37 |
+
"\tD [label=\"$\\mho$\" texlabshift=\".3in\" texmode=math]\n",
|
| 38 |
+
"\tA -> B [label=\"$l^*={\\frac{<q^*>}{q^*}<\\currentstate,1>{m_p}}$\"]\n",
|
| 39 |
+
"\tB -> C [label=\"$q^*_i=\\frac{<q^*>}{q_{j-1}m(q^{i-k})p^*\\gamma_{i-1}}$\"]\n",
|
| 40 |
+
"\tA -> D [label=\"PathOfTemporalMeasurements ByPrincipleOfLeastTime\"]\n",
|
| 41 |
+
"}\n",
|
| 42 |
+
"\n"
|
| 43 |
+
]
|
| 44 |
+
},
|
| 45 |
+
{
|
| 46 |
+
"output_type": "execute_result",
|
| 47 |
+
"data": {
|
| 48 |
+
"text/plain": [
|
| 49 |
+
"'graph.pdf'"
|
| 50 |
+
],
|
| 51 |
+
"application/vnd.google.colaboratory.intrinsic+json": {
|
| 52 |
+
"type": "string"
|
| 53 |
+
}
|
| 54 |
+
},
|
| 55 |
+
"metadata": {},
|
| 56 |
+
"execution_count": 1
|
| 57 |
+
}
|
| 58 |
+
],
|
| 59 |
+
"source": [
|
| 60 |
+
"from graphviz import Digraph\n",
|
| 61 |
+
"\n",
|
| 62 |
+
"\n",
|
| 63 |
+
"\n",
|
| 64 |
+
"# Create a new directed graph\n",
|
| 65 |
+
"\n",
|
| 66 |
+
"dot = Digraph()\n",
|
| 67 |
+
"\n",
|
| 68 |
+
"\n",
|
| 69 |
+
"\n",
|
| 70 |
+
"# Set graph attributes\n",
|
| 71 |
+
"\n",
|
| 72 |
+
"dot.attr('node', shape='circle')\n",
|
| 73 |
+
"\n",
|
| 74 |
+
"\n",
|
| 75 |
+
"\n",
|
| 76 |
+
"# Adding nodes\n",
|
| 77 |
+
"\n",
|
| 78 |
+
"dot.node('A', '$A$')\n",
|
| 79 |
+
"\n",
|
| 80 |
+
"dot.node('B', '$B$')\n",
|
| 81 |
+
"\n",
|
| 82 |
+
"# dot.node('C', '$C$') # Initially commented out\n",
|
| 83 |
+
"\n",
|
| 84 |
+
"dot.node('D', '$\\mho$', texmode='math', texlabshift='.3in') # Tex mode and lab shift attributes will be ignored here\n",
|
| 85 |
+
"\n",
|
| 86 |
+
"\n",
|
| 87 |
+
"\n",
|
| 88 |
+
"# Adding edges with labels\n",
|
| 89 |
+
"\n",
|
| 90 |
+
"dot.edge('A', 'B', label='$l^*={\\\\frac{<q^*>}{q^*}<\\\\currentstate,1>{m_p}}$')\n",
|
| 91 |
+
"\n",
|
| 92 |
+
"dot.edge('B', 'C', label='$q^*_i=\\\\frac{<q^*>}{q_{j-1}m(q^{i-k})p^*\\\\gamma_{i-1}}$')\n",
|
| 93 |
+
"\n",
|
| 94 |
+
"dot.edge('A', 'D', label='PathOfTemporalMeasurements ByPrincipleOfLeastTime')\n",
|
| 95 |
+
"\n",
|
| 96 |
+
"\n",
|
| 97 |
+
"\n",
|
| 98 |
+
"# Render the graph to a file\n",
|
| 99 |
+
"\n",
|
| 100 |
+
"dot.render('graph', format='png') # This will create 'graph.png' in your working directory\n",
|
| 101 |
+
"\n",
|
| 102 |
+
"\n",
|
| 103 |
+
"\n",
|
| 104 |
+
"# To display the graph directly in some environments, depending on your setup:\n",
|
| 105 |
+
"\n",
|
| 106 |
+
"print(dot.source) # Print out the dot source code\n",
|
| 107 |
+
"\n",
|
| 108 |
+
"dot.view() # This will open the default viewer and display the graph (if your environment supports it)"
|
| 109 |
+
]
|
| 110 |
+
},
|
| 111 |
+
{
|
| 112 |
+
"cell_type": "code",
|
| 113 |
+
"source": [
|
| 114 |
+
"\n",
|
| 115 |
+
"\n",
|
| 116 |
+
"import random\n",
|
| 117 |
+
"\n",
|
| 118 |
+
"import numpy as np\n",
|
| 119 |
+
"\n",
|
| 120 |
+
"\n",
|
| 121 |
+
"\n",
|
| 122 |
+
"# Functions to implement the mathematical operations described in the algorithm\n",
|
| 123 |
+
"\n",
|
| 124 |
+
"def P_star(u_i, t):\n",
|
| 125 |
+
"\n",
|
| 126 |
+
" return random.uniform(0, 1)\n",
|
| 127 |
+
"\n",
|
| 128 |
+
"\n",
|
| 129 |
+
"\n",
|
| 130 |
+
"def BP_star(u_i, t):\n",
|
| 131 |
+
"\n",
|
| 132 |
+
" return random.uniform(0, 1)\n",
|
| 133 |
+
"\n",
|
| 134 |
+
"\n",
|
| 135 |
+
"\n",
|
| 136 |
+
"def TGG_star(u_i, t):\n",
|
| 137 |
+
"\n",
|
| 138 |
+
" return random.uniform(0, 1)\n",
|
| 139 |
+
"\n",
|
| 140 |
+
"\n",
|
| 141 |
+
"\n",
|
| 142 |
+
"def RGG_star(u_i, t):\n",
|
| 143 |
+
"\n",
|
| 144 |
+
" return random.uniform(0, 1)\n",
|
| 145 |
+
"\n",
|
| 146 |
+
"\n",
|
| 147 |
+
"\n",
|
| 148 |
+
"def Gamma(n):\n",
|
| 149 |
+
"\n",
|
| 150 |
+
" return np.exp(-n)\n",
|
| 151 |
+
"\n",
|
| 152 |
+
"\n",
|
| 153 |
+
"\n",
|
| 154 |
+
"# Distortion models\n",
|
| 155 |
+
"\n",
|
| 156 |
+
"def distortion(u_i, eta_i):\n",
|
| 157 |
+
"\n",
|
| 158 |
+
" return min(u_i, eta_i)\n",
|
| 159 |
+
"\n",
|
| 160 |
+
"\n",
|
| 161 |
+
"\n",
|
| 162 |
+
"def U_initial():\n",
|
| 163 |
+
"\n",
|
| 164 |
+
" return np.zeros(1)\n",
|
| 165 |
+
"\n",
|
| 166 |
+
"\n",
|
| 167 |
+
"\n",
|
| 168 |
+
"def task_scheduling_SRPT_round_robin_DEADLINE_DRIVEN_INTERACTIVE_TE(rho, mu, K, delta, K_max):\n",
|
| 169 |
+
"\n",
|
| 170 |
+
" U_0 = U_initial()\n",
|
| 171 |
+
"\n",
|
| 172 |
+
"\n",
|
| 173 |
+
"\n",
|
| 174 |
+
" for m in range(1, K_max + 1):\n",
|
| 175 |
+
"\n",
|
| 176 |
+
" u_list =range(1, m + 1)\n",
|
| 177 |
+
"\n",
|
| 178 |
+
" chosen_u = [u for u in u_list if u <= eta]\n",
|
| 179 |
+
"\n",
|
| 180 |
+
"\n",
|
| 181 |
+
"\n",
|
| 182 |
+
" for i in range(1, m + 1):\n",
|
| 183 |
+
"\n",
|
| 184 |
+
" u_i = u_list[(i - 1) * len(u_list) // m]\n",
|
| 185 |
+
"\n",
|
| 186 |
+
" eta_i = eta\n",
|
| 187 |
+
"\n",
|
| 188 |
+
"\n",
|
| 189 |
+
"\n",
|
| 190 |
+
" D_min = distortion(u_i, eta_i)\n",
|
| 191 |
+
"\n",
|
| 192 |
+
" D_max = distortion(u_i, eta_i)\n",
|
| 193 |
+
"\n",
|
| 194 |
+
"\n",
|
| 195 |
+
"\n",
|
| 196 |
+
" # Solve Distortion as a function of Rate\n",
|
| 197 |
+
"\n",
|
| 198 |
+
" D_star = distortion(u_i, eta_i)\n",
|
| 199 |
+
"\n",
|
| 200 |
+
"\n",
|
| 201 |
+
"\n",
|
| 202 |
+
" # Reduce rate using Random Early Detection Algorithm\n",
|
| 203 |
+
"\n",
|
| 204 |
+
" R_star = U_0 - sum(P_star(u_i, t) * BP_star(u_i, t) * TGG_star(u_i, t)\n",
|
| 205 |
+
"\n",
|
| 206 |
+
" for t in range(t1, t_max - u_i + 1))\n",
|
| 207 |
+
"\n",
|
| 208 |
+
"\n",
|
| 209 |
+
"\n",
|
| 210 |
+
" # Given the amount of rate leftover, solve the problem using Gamma(n)\n",
|
| 211 |
+
"\n",
|
| 212 |
+
" leftover_rate = R_star\n",
|
| 213 |
+
"\n",
|
| 214 |
+
" optimal_gamma = Gamma(len(u_list))\n",
|
| 215 |
+
"\n",
|
| 216 |
+
"\n",
|
| 217 |
+
"\n",
|
| 218 |
+
" # Discard the bandwidth overhead note\n",
|
| 219 |
+
"\n",
|
| 220 |
+
" RGG_sum = sum(P_star(u_i, t) * BP_star(u_i, t) * RGG_star(u_i, t)\n",
|
| 221 |
+
"\n",
|
| 222 |
+
" for t in range(t1, t_max - u_i + 1))\n",
|
| 223 |
+
"\n",
|
| 224 |
+
"\n",
|
| 225 |
+
"\n",
|
| 226 |
+
" final_gamma = optimal_gamma\n",
|
| 227 |
+
"\n",
|
| 228 |
+
"\n",
|
| 229 |
+
"\n",
|
| 230 |
+
" print(f\"Optimal Gamma for m={m}, i={i}: {final_gamma}\")\n",
|
| 231 |
+
"\n",
|
| 232 |
+
"\n",
|
| 233 |
+
"\n",
|
| 234 |
+
"rho = 0.6\n",
|
| 235 |
+
"\n",
|
| 236 |
+
"mu = 1.0\n",
|
| 237 |
+
"\n",
|
| 238 |
+
"K = 5\n",
|
| 239 |
+
"\n",
|
| 240 |
+
"delta = 0.1\n",
|
| 241 |
+
"\n",
|
| 242 |
+
"K_max = 10\n",
|
| 243 |
+
"\n",
|
| 244 |
+
"eta = 0.5\n",
|
| 245 |
+
"\n",
|
| 246 |
+
"t1 = 0\n",
|
| 247 |
+
"\n",
|
| 248 |
+
"t_max = 100\n",
|
| 249 |
+
"\n",
|
| 250 |
+
"\n",
|
| 251 |
+
"\n",
|
| 252 |
+
"task_scheduling_SRPT_round_robin_DEADLINE_DRIVEN_INTERACTIVE_TE(rho, mu, K, delta, K_max)"
|
| 253 |
+
],
|
| 254 |
+
"metadata": {
|
| 255 |
+
"colab": {
|
| 256 |
+
"base_uri": "https://localhost:8080/"
|
| 257 |
+
},
|
| 258 |
+
"id": "e2Jb4vBRJrSb",
|
| 259 |
+
"outputId": "823e44a7-192f-4f46-f6de-646e7fbb16d6"
|
| 260 |
+
},
|
| 261 |
+
"execution_count": 4,
|
| 262 |
+
"outputs": [
|
| 263 |
+
{
|
| 264 |
+
"output_type": "stream",
|
| 265 |
+
"name": "stdout",
|
| 266 |
+
"text": [
|
| 267 |
+
"Optimal Gamma for m=1, i=1: 0.36787944117144233\n",
|
| 268 |
+
"Optimal Gamma for m=2, i=1: 0.1353352832366127\n",
|
| 269 |
+
"Optimal Gamma for m=2, i=2: 0.1353352832366127\n",
|
| 270 |
+
"Optimal Gamma for m=3, i=1: 0.049787068367863944\n",
|
| 271 |
+
"Optimal Gamma for m=3, i=2: 0.049787068367863944\n",
|
| 272 |
+
"Optimal Gamma for m=3, i=3: 0.049787068367863944\n",
|
| 273 |
+
"Optimal Gamma for m=4, i=1: 0.01831563888873418\n",
|
| 274 |
+
"Optimal Gamma for m=4, i=2: 0.01831563888873418\n",
|
| 275 |
+
"Optimal Gamma for m=4, i=3: 0.01831563888873418\n",
|
| 276 |
+
"Optimal Gamma for m=4, i=4: 0.01831563888873418\n",
|
| 277 |
+
"Optimal Gamma for m=5, i=1: 0.006737946999085467\n",
|
| 278 |
+
"Optimal Gamma for m=5, i=2: 0.006737946999085467\n",
|
| 279 |
+
"Optimal Gamma for m=5, i=3: 0.006737946999085467\n",
|
| 280 |
+
"Optimal Gamma for m=5, i=4: 0.006737946999085467\n",
|
| 281 |
+
"Optimal Gamma for m=5, i=5: 0.006737946999085467\n",
|
| 282 |
+
"Optimal Gamma for m=6, i=1: 0.0024787521766663585\n",
|
| 283 |
+
"Optimal Gamma for m=6, i=2: 0.0024787521766663585\n",
|
| 284 |
+
"Optimal Gamma for m=6, i=3: 0.0024787521766663585\n",
|
| 285 |
+
"Optimal Gamma for m=6, i=4: 0.0024787521766663585\n",
|
| 286 |
+
"Optimal Gamma for m=6, i=5: 0.0024787521766663585\n",
|
| 287 |
+
"Optimal Gamma for m=6, i=6: 0.0024787521766663585\n",
|
| 288 |
+
"Optimal Gamma for m=7, i=1: 0.0009118819655545162\n",
|
| 289 |
+
"Optimal Gamma for m=7, i=2: 0.0009118819655545162\n",
|
| 290 |
+
"Optimal Gamma for m=7, i=3: 0.0009118819655545162\n",
|
| 291 |
+
"Optimal Gamma for m=7, i=4: 0.0009118819655545162\n",
|
| 292 |
+
"Optimal Gamma for m=7, i=5: 0.0009118819655545162\n",
|
| 293 |
+
"Optimal Gamma for m=7, i=6: 0.0009118819655545162\n",
|
| 294 |
+
"Optimal Gamma for m=7, i=7: 0.0009118819655545162\n",
|
| 295 |
+
"Optimal Gamma for m=8, i=1: 0.00033546262790251185\n",
|
| 296 |
+
"Optimal Gamma for m=8, i=2: 0.00033546262790251185\n",
|
| 297 |
+
"Optimal Gamma for m=8, i=3: 0.00033546262790251185\n",
|
| 298 |
+
"Optimal Gamma for m=8, i=4: 0.00033546262790251185\n",
|
| 299 |
+
"Optimal Gamma for m=8, i=5: 0.00033546262790251185\n",
|
| 300 |
+
"Optimal Gamma for m=8, i=6: 0.00033546262790251185\n",
|
| 301 |
+
"Optimal Gamma for m=8, i=7: 0.00033546262790251185\n",
|
| 302 |
+
"Optimal Gamma for m=8, i=8: 0.00033546262790251185\n",
|
| 303 |
+
"Optimal Gamma for m=9, i=1: 0.00012340980408667956\n",
|
| 304 |
+
"Optimal Gamma for m=9, i=2: 0.00012340980408667956\n",
|
| 305 |
+
"Optimal Gamma for m=9, i=3: 0.00012340980408667956\n",
|
| 306 |
+
"Optimal Gamma for m=9, i=4: 0.00012340980408667956\n",
|
| 307 |
+
"Optimal Gamma for m=9, i=5: 0.00012340980408667956\n",
|
| 308 |
+
"Optimal Gamma for m=9, i=6: 0.00012340980408667956\n",
|
| 309 |
+
"Optimal Gamma for m=9, i=7: 0.00012340980408667956\n",
|
| 310 |
+
"Optimal Gamma for m=9, i=8: 0.00012340980408667956\n",
|
| 311 |
+
"Optimal Gamma for m=9, i=9: 0.00012340980408667956\n",
|
| 312 |
+
"Optimal Gamma for m=10, i=1: 4.5399929762484854e-05\n",
|
| 313 |
+
"Optimal Gamma for m=10, i=2: 4.5399929762484854e-05\n",
|
| 314 |
+
"Optimal Gamma for m=10, i=3: 4.5399929762484854e-05\n",
|
| 315 |
+
"Optimal Gamma for m=10, i=4: 4.5399929762484854e-05\n",
|
| 316 |
+
"Optimal Gamma for m=10, i=5: 4.5399929762484854e-05\n",
|
| 317 |
+
"Optimal Gamma for m=10, i=6: 4.5399929762484854e-05\n",
|
| 318 |
+
"Optimal Gamma for m=10, i=7: 4.5399929762484854e-05\n",
|
| 319 |
+
"Optimal Gamma for m=10, i=8: 4.5399929762484854e-05\n",
|
| 320 |
+
"Optimal Gamma for m=10, i=9: 4.5399929762484854e-05\n",
|
| 321 |
+
"Optimal Gamma for m=10, i=10: 4.5399929762484854e-05\n"
|
| 322 |
+
]
|
| 323 |
+
}
|
| 324 |
+
]
|
| 325 |
+
},
|
| 326 |
+
{
|
| 327 |
+
"cell_type": "code",
|
| 328 |
+
"source": [
|
| 329 |
+
"import numpy as np\n",
|
| 330 |
+
"\n",
|
| 331 |
+
"\n",
|
| 332 |
+
"\n",
|
| 333 |
+
"# Define Constants and Initial Values\n",
|
| 334 |
+
"\n",
|
| 335 |
+
"rho = 0.5 # Example input, adjust as necessary\n",
|
| 336 |
+
"\n",
|
| 337 |
+
"mu = 0.8 # Example input, adjust as necessary\n",
|
| 338 |
+
"\n",
|
| 339 |
+
"K = 10 # Example input, adjust as necessary\n",
|
| 340 |
+
"\n",
|
| 341 |
+
"delta = 0.2 # Example input, adjust as necessary\n",
|
| 342 |
+
"\n",
|
| 343 |
+
"K_max = 20 # Example input, adjust as necessary\n",
|
| 344 |
+
"\n",
|
| 345 |
+
"\n",
|
| 346 |
+
"\n",
|
| 347 |
+
"def task_scheduling_SRPT_roundrobin_CIR_deadline(U_0, K_max):\n",
|
| 348 |
+
"\n",
|
| 349 |
+
" def initialize_U_0():\n",
|
| 350 |
+
"\n",
|
| 351 |
+
" return np.zeros(U_0)\n",
|
| 352 |
+
"\n",
|
| 353 |
+
"\n",
|
| 354 |
+
"\n",
|
| 355 |
+
" def update_utilization(U_0, m, n):\n",
|
| 356 |
+
"\n",
|
| 357 |
+
" # Define how to update U_0 depending on m and n\n",
|
| 358 |
+
"\n",
|
| 359 |
+
" pass\n",
|
| 360 |
+
"\n",
|
| 361 |
+
"\n",
|
| 362 |
+
"\n",
|
| 363 |
+
" def compute_min_max(u, eta):\n",
|
| 364 |
+
"\n",
|
| 365 |
+
" return min(u), max(u)\n",
|
| 366 |
+
"\n",
|
| 367 |
+
"\n",
|
| 368 |
+
"\n",
|
| 369 |
+
" def distortion_models(u, eta):\n",
|
| 370 |
+
"\n",
|
| 371 |
+
" return np.sin(u), np.cos(eta) # Just placeholders\n",
|
| 372 |
+
"\n",
|
| 373 |
+
"\n",
|
| 374 |
+
"\n",
|
| 375 |
+
" def random_early_detection(m):\n",
|
| 376 |
+
"\n",
|
| 377 |
+
" return np.exp(-m) # Just placeholder\n",
|
| 378 |
+
"\n",
|
| 379 |
+
"\n",
|
| 380 |
+
"\n",
|
| 381 |
+
" def compute_spare_rate(u, t1, t_max):\n",
|
| 382 |
+
"\n",
|
| 383 |
+
" # Compute the spare rate as specified in the algorithm\n",
|
| 384 |
+
"\n",
|
| 385 |
+
" P = np.random.rand(t_max) # Random for illustration\n",
|
| 386 |
+
"\n",
|
| 387 |
+
" BP = np.random.rand(t_max) # Random for illustration\n",
|
| 388 |
+
"\n",
|
| 389 |
+
" TGG = np.random.rand(t_max) # Random for illustration\n",
|
| 390 |
+
"\n",
|
| 391 |
+
"\n",
|
| 392 |
+
"\n",
|
| 393 |
+
" return np.sum(P * BP * TGG) # Placeholder computation\n",
|
| 394 |
+
"\n",
|
| 395 |
+
"\n",
|
| 396 |
+
"\n",
|
| 397 |
+
" def solve_gamma(n):\n",
|
| 398 |
+
"\n",
|
| 399 |
+
" return np.log1p(n) # Just a placeholder for solving the problem\n",
|
| 400 |
+
"\n",
|
| 401 |
+
"\n",
|
| 402 |
+
"\n",
|
| 403 |
+
" U_0 = initialize_U_0()\n",
|
| 404 |
+
"\n",
|
| 405 |
+
"\n",
|
| 406 |
+
"\n",
|
| 407 |
+
" for m in range(0, K_max):\n",
|
| 408 |
+
"\n",
|
| 409 |
+
" # Simulate the selection step with random values\n",
|
| 410 |
+
"\n",
|
| 411 |
+
" # Adjust as per the need of your actual problem\n",
|
| 412 |
+
"\n",
|
| 413 |
+
" u = np.random.uniform(size=(m+1,))\n",
|
| 414 |
+
"\n",
|
| 415 |
+
" eta = np.random.uniform(size=(m+1,))\n",
|
| 416 |
+
"\n",
|
| 417 |
+
"\n",
|
| 418 |
+
"\n",
|
| 419 |
+
" min_val, max_val = compute_min_max(u, eta)\n",
|
| 420 |
+
"\n",
|
| 421 |
+
"\n",
|
| 422 |
+
"\n",
|
| 423 |
+
" # Solve distortion as a function of rate\n",
|
| 424 |
+
"\n",
|
| 425 |
+
" dist_min, dist_max = distortion_models(u, eta)\n",
|
| 426 |
+
"\n",
|
| 427 |
+
"\n",
|
| 428 |
+
"\n",
|
| 429 |
+
" # Reduce rate using Random Early Detection algorithm\n",
|
| 430 |
+
"\n",
|
| 431 |
+
" rate = random_early_detection(m)\n",
|
| 432 |
+
"\n",
|
| 433 |
+
"\n",
|
| 434 |
+
"\n",
|
| 435 |
+
" T_max = 100 # Example value\n",
|
| 436 |
+
"\n",
|
| 437 |
+
" T1 = 0 # Example value\n",
|
| 438 |
+
"\n",
|
| 439 |
+
" spare_rate = compute_spare_rate(u, T1, T_max)\n",
|
| 440 |
+
"\n",
|
| 441 |
+
"\n",
|
| 442 |
+
"\n",
|
| 443 |
+
" print(f\"Spare Rate: {spare_rate}\")\n",
|
| 444 |
+
"\n",
|
| 445 |
+
"\n",
|
| 446 |
+
"\n",
|
| 447 |
+
" gamma_value = solve_gamma(m)\n",
|
| 448 |
+
"\n",
|
| 449 |
+
" print(f\"Gamma Value: {gamma_value}\")\n",
|
| 450 |
+
"\n",
|
| 451 |
+
"\n",
|
| 452 |
+
"\n",
|
| 453 |
+
" return gamma_value\n",
|
| 454 |
+
"\n",
|
| 455 |
+
"\n",
|
| 456 |
+
"\n",
|
| 457 |
+
"\n",
|
| 458 |
+
"\n",
|
| 459 |
+
"U_0 = 0\n",
|
| 460 |
+
"\n",
|
| 461 |
+
"result = task_scheduling_SRPT_roundrobin_CIR_deadline(U_0, K_max)\n",
|
| 462 |
+
"\n",
|
| 463 |
+
"print(f\"Result: {result}\")"
|
| 464 |
+
],
|
| 465 |
+
"metadata": {
|
| 466 |
+
"colab": {
|
| 467 |
+
"base_uri": "https://localhost:8080/"
|
| 468 |
+
},
|
| 469 |
+
"id": "U5HlxTqoTCsy",
|
| 470 |
+
"outputId": "83bdbc28-f180-4990-c5fc-fe347a4df33a"
|
| 471 |
+
},
|
| 472 |
+
"execution_count": 6,
|
| 473 |
+
"outputs": [
|
| 474 |
+
{
|
| 475 |
+
"output_type": "stream",
|
| 476 |
+
"name": "stdout",
|
| 477 |
+
"text": [
|
| 478 |
+
"Spare Rate: 10.952847070774181\n",
|
| 479 |
+
"Gamma Value: 0.0\n",
|
| 480 |
+
"Spare Rate: 14.143943085504315\n",
|
| 481 |
+
"Gamma Value: 0.6931471805599453\n",
|
| 482 |
+
"Spare Rate: 11.554233420754159\n",
|
| 483 |
+
"Gamma Value: 1.0986122886681096\n",
|
| 484 |
+
"Spare Rate: 11.923875637815772\n",
|
| 485 |
+
"Gamma Value: 1.3862943611198906\n",
|
| 486 |
+
"Spare Rate: 10.878486826923252\n",
|
| 487 |
+
"Gamma Value: 1.6094379124341003\n",
|
| 488 |
+
"Spare Rate: 12.674016491345494\n",
|
| 489 |
+
"Gamma Value: 1.791759469228055\n",
|
| 490 |
+
"Spare Rate: 10.194814309975452\n",
|
| 491 |
+
"Gamma Value: 1.9459101490553132\n",
|
| 492 |
+
"Spare Rate: 12.769201091965332\n",
|
| 493 |
+
"Gamma Value: 2.0794415416798357\n",
|
| 494 |
+
"Spare Rate: 12.644109056625297\n",
|
| 495 |
+
"Gamma Value: 2.1972245773362196\n",
|
| 496 |
+
"Spare Rate: 12.230158300057475\n",
|
| 497 |
+
"Gamma Value: 2.302585092994046\n",
|
| 498 |
+
"Spare Rate: 13.264142884796733\n",
|
| 499 |
+
"Gamma Value: 2.3978952727983707\n",
|
| 500 |
+
"Spare Rate: 13.341878701236364\n",
|
| 501 |
+
"Gamma Value: 2.4849066497880004\n",
|
| 502 |
+
"Spare Rate: 11.994677320789002\n",
|
| 503 |
+
"Gamma Value: 2.5649493574615367\n",
|
| 504 |
+
"Spare Rate: 12.81262078122421\n",
|
| 505 |
+
"Gamma Value: 2.639057329615259\n",
|
| 506 |
+
"Spare Rate: 10.92808026027513\n",
|
| 507 |
+
"Gamma Value: 2.70805020110221\n",
|
| 508 |
+
"Spare Rate: 12.827424660734051\n",
|
| 509 |
+
"Gamma Value: 2.772588722239781\n",
|
| 510 |
+
"Spare Rate: 13.068304708633802\n",
|
| 511 |
+
"Gamma Value: 2.833213344056216\n",
|
| 512 |
+
"Spare Rate: 14.893154801554441\n",
|
| 513 |
+
"Gamma Value: 2.8903717578961645\n",
|
| 514 |
+
"Spare Rate: 13.464752646823605\n",
|
| 515 |
+
"Gamma Value: 2.9444389791664403\n",
|
| 516 |
+
"Spare Rate: 11.397478385972137\n",
|
| 517 |
+
"Gamma Value: 2.995732273553991\n",
|
| 518 |
+
"Result: 2.995732273553991\n"
|
| 519 |
+
]
|
| 520 |
+
}
|
| 521 |
+
]
|
| 522 |
+
},
|
| 523 |
+
{
|
| 524 |
+
"cell_type": "code",
|
| 525 |
+
"source": [
|
| 526 |
+
"import numpy as np\n",
|
| 527 |
+
"\n",
|
| 528 |
+
"import random\n",
|
| 529 |
+
"\n",
|
| 530 |
+
"\n",
|
| 531 |
+
"\n",
|
| 532 |
+
"# Constants and Parameters\n",
|
| 533 |
+
"\n",
|
| 534 |
+
"rho = 0.6\n",
|
| 535 |
+
"\n",
|
| 536 |
+
"mu = 1.0\n",
|
| 537 |
+
"\n",
|
| 538 |
+
"K = 5\n",
|
| 539 |
+
"\n",
|
| 540 |
+
"delta = 0.1\n",
|
| 541 |
+
"\n",
|
| 542 |
+
"K_max = 10\n",
|
| 543 |
+
"\n",
|
| 544 |
+
"eta = 0.5\n",
|
| 545 |
+
"\n",
|
| 546 |
+
"t1 = 0\n",
|
| 547 |
+
"\n",
|
| 548 |
+
"t_max = 100\n",
|
| 549 |
+
"\n",
|
| 550 |
+
"\n",
|
| 551 |
+
"\n",
|
| 552 |
+
"# Utility Functions\n",
|
| 553 |
+
"\n",
|
| 554 |
+
"\n",
|
| 555 |
+
"\n",
|
| 556 |
+
"def P_star(u_i, t):\n",
|
| 557 |
+
"\n",
|
| 558 |
+
" return random.uniform(0, 1)\n",
|
| 559 |
+
"\n",
|
| 560 |
+
"\n",
|
| 561 |
+
"\n",
|
| 562 |
+
"def BP_star(u_i, t):\n",
|
| 563 |
+
"\n",
|
| 564 |
+
" return random.uniform(0, 1)\n",
|
| 565 |
+
"\n",
|
| 566 |
+
"\n",
|
| 567 |
+
"\n",
|
| 568 |
+
"def TGG_star(u_i, t):\n",
|
| 569 |
+
"\n",
|
| 570 |
+
" return random.uniform(0, 1)\n",
|
| 571 |
+
"\n",
|
| 572 |
+
"\n",
|
| 573 |
+
"\n",
|
| 574 |
+
"def RGG_star(u_i, t):\n",
|
| 575 |
+
"\n",
|
| 576 |
+
" return random.uniform(0, 1)\n",
|
| 577 |
+
"\n",
|
| 578 |
+
"\n",
|
| 579 |
+
"\n",
|
| 580 |
+
"def Gamma(n):\n",
|
| 581 |
+
"\n",
|
| 582 |
+
" return np.exp(-n)\n",
|
| 583 |
+
"\n",
|
| 584 |
+
"\n",
|
| 585 |
+
"\n",
|
| 586 |
+
"def distortion(u_i, eta_i):\n",
|
| 587 |
+
"\n",
|
| 588 |
+
" return min(u_i, eta_i)\n",
|
| 589 |
+
"\n",
|
| 590 |
+
"\n",
|
| 591 |
+
"\n",
|
| 592 |
+
"def U_initial(size):\n",
|
| 593 |
+
"\n",
|
| 594 |
+
" return np.zeros(size)\n",
|
| 595 |
+
"\n",
|
| 596 |
+
"\n",
|
| 597 |
+
"\n",
|
| 598 |
+
"# Main Algorithm Function\n",
|
| 599 |
+
"\n",
|
| 600 |
+
"\n",
|
| 601 |
+
"\n",
|
| 602 |
+
"def task_scheduling_SRPT_round_robin_DEADLINE_DRIVEN_INTERACTIVE_TE(rho, mu, K, delta, K_max):\n",
|
| 603 |
+
"\n",
|
| 604 |
+
" U_0 = U_initial(1)\n",
|
| 605 |
+
"\n",
|
| 606 |
+
"\n",
|
| 607 |
+
"\n",
|
| 608 |
+
" for m in range(1, K_max + 1):\n",
|
| 609 |
+
"\n",
|
| 610 |
+
" u_list = range(1, m + 1) # List of task indices\n",
|
| 611 |
+
"\n",
|
| 612 |
+
" chosen_u = [u for u in u_list if u <= eta]\n",
|
| 613 |
+
"\n",
|
| 614 |
+
"\n",
|
| 615 |
+
"\n",
|
| 616 |
+
" for i in range(1, m + 1):\n",
|
| 617 |
+
"\n",
|
| 618 |
+
" u_i = u_list[(i - 1) * len(u_list) // m]\n",
|
| 619 |
+
"\n",
|
| 620 |
+
" eta_i = eta\n",
|
| 621 |
+
"\n",
|
| 622 |
+
"\n",
|
| 623 |
+
"\n",
|
| 624 |
+
" D_min = distortion(u_i, eta_i)\n",
|
| 625 |
+
"\n",
|
| 626 |
+
" D_max = distortion(u_i, eta_i)\n",
|
| 627 |
+
"\n",
|
| 628 |
+
"\n",
|
| 629 |
+
"\n",
|
| 630 |
+
" # Solve Distortion as a function of Rate\n",
|
| 631 |
+
"\n",
|
| 632 |
+
" D_star = distortion(u_i, eta_i)\n",
|
| 633 |
+
"\n",
|
| 634 |
+
"\n",
|
| 635 |
+
"\n",
|
| 636 |
+
" # Reduce rate using Random Early Detection Algorithm\n",
|
| 637 |
+
"\n",
|
| 638 |
+
" R_star = U_0 - sum(P_star(u_i, t) * BP_star(u_i, t) * TGG_star(u_i, t)\n",
|
| 639 |
+
"\n",
|
| 640 |
+
" for t in range(t1, t_max - u_i + 1))\n",
|
| 641 |
+
"\n",
|
| 642 |
+
"\n",
|
| 643 |
+
"\n",
|
| 644 |
+
" # Given the amount of rate leftover, solve the problem using Gamma(n)\n",
|
| 645 |
+
"\n",
|
| 646 |
+
" leftover_rate = R_star\n",
|
| 647 |
+
"\n",
|
| 648 |
+
" optimal_gamma = Gamma(len(u_list))\n",
|
| 649 |
+
"\n",
|
| 650 |
+
"\n",
|
| 651 |
+
"\n",
|
| 652 |
+
" # Discard the bandwidth overhead note\n",
|
| 653 |
+
"\n",
|
| 654 |
+
" RGG_sum = sum(P_star(u_i, t) * BP_star(u_i, t) * RGG_star(u_i, t)\n",
|
| 655 |
+
"\n",
|
| 656 |
+
" for t in range(t1, t_max - u_i + 1))\n",
|
| 657 |
+
"\n",
|
| 658 |
+
"\n",
|
| 659 |
+
"\n",
|
| 660 |
+
" final_gamma = optimal_gamma\n",
|
| 661 |
+
"\n",
|
| 662 |
+
"\n",
|
| 663 |
+
"\n",
|
| 664 |
+
" print(f\"Optimal Gamma for m={m}, i={i}: {final_gamma}\")\n",
|
| 665 |
+
"\n",
|
| 666 |
+
"\n",
|
| 667 |
+
"\n",
|
| 668 |
+
"# Run the Task Scheduling Algorithm\n",
|
| 669 |
+
"\n",
|
| 670 |
+
"\n",
|
| 671 |
+
"\n",
|
| 672 |
+
"task_scheduling_SRPT_round_robin_DEADLINE_DRIVEN_INTERACTIVE_TE(rho, mu, K, delta, K_max)"
|
| 673 |
+
],
|
| 674 |
+
"metadata": {
|
| 675 |
+
"colab": {
|
| 676 |
+
"base_uri": "https://localhost:8080/"
|
| 677 |
+
},
|
| 678 |
+
"id": "DoBH5lwrTrOx",
|
| 679 |
+
"outputId": "b3294102-69cf-47fd-aaf2-0a4dbb565cb1"
|
| 680 |
+
},
|
| 681 |
+
"execution_count": 7,
|
| 682 |
+
"outputs": [
|
| 683 |
+
{
|
| 684 |
+
"output_type": "stream",
|
| 685 |
+
"name": "stdout",
|
| 686 |
+
"text": [
|
| 687 |
+
"Optimal Gamma for m=1, i=1: 0.36787944117144233\n",
|
| 688 |
+
"Optimal Gamma for m=2, i=1: 0.1353352832366127\n",
|
| 689 |
+
"Optimal Gamma for m=2, i=2: 0.1353352832366127\n",
|
| 690 |
+
"Optimal Gamma for m=3, i=1: 0.049787068367863944\n",
|
| 691 |
+
"Optimal Gamma for m=3, i=2: 0.049787068367863944\n",
|
| 692 |
+
"Optimal Gamma for m=3, i=3: 0.049787068367863944\n",
|
| 693 |
+
"Optimal Gamma for m=4, i=1: 0.01831563888873418\n",
|
| 694 |
+
"Optimal Gamma for m=4, i=2: 0.01831563888873418\n",
|
| 695 |
+
"Optimal Gamma for m=4, i=3: 0.01831563888873418\n",
|
| 696 |
+
"Optimal Gamma for m=4, i=4: 0.01831563888873418\n",
|
| 697 |
+
"Optimal Gamma for m=5, i=1: 0.006737946999085467\n",
|
| 698 |
+
"Optimal Gamma for m=5, i=2: 0.006737946999085467\n",
|
| 699 |
+
"Optimal Gamma for m=5, i=3: 0.006737946999085467\n",
|
| 700 |
+
"Optimal Gamma for m=5, i=4: 0.006737946999085467\n",
|
| 701 |
+
"Optimal Gamma for m=5, i=5: 0.006737946999085467\n",
|
| 702 |
+
"Optimal Gamma for m=6, i=1: 0.0024787521766663585\n",
|
| 703 |
+
"Optimal Gamma for m=6, i=2: 0.0024787521766663585\n",
|
| 704 |
+
"Optimal Gamma for m=6, i=3: 0.0024787521766663585\n",
|
| 705 |
+
"Optimal Gamma for m=6, i=4: 0.0024787521766663585\n",
|
| 706 |
+
"Optimal Gamma for m=6, i=5: 0.0024787521766663585\n",
|
| 707 |
+
"Optimal Gamma for m=6, i=6: 0.0024787521766663585\n",
|
| 708 |
+
"Optimal Gamma for m=7, i=1: 0.0009118819655545162\n",
|
| 709 |
+
"Optimal Gamma for m=7, i=2: 0.0009118819655545162\n",
|
| 710 |
+
"Optimal Gamma for m=7, i=3: 0.0009118819655545162\n",
|
| 711 |
+
"Optimal Gamma for m=7, i=4: 0.0009118819655545162\n",
|
| 712 |
+
"Optimal Gamma for m=7, i=5: 0.0009118819655545162\n",
|
| 713 |
+
"Optimal Gamma for m=7, i=6: 0.0009118819655545162\n",
|
| 714 |
+
"Optimal Gamma for m=7, i=7: 0.0009118819655545162\n",
|
| 715 |
+
"Optimal Gamma for m=8, i=1: 0.00033546262790251185\n",
|
| 716 |
+
"Optimal Gamma for m=8, i=2: 0.00033546262790251185\n",
|
| 717 |
+
"Optimal Gamma for m=8, i=3: 0.00033546262790251185\n",
|
| 718 |
+
"Optimal Gamma for m=8, i=4: 0.00033546262790251185\n",
|
| 719 |
+
"Optimal Gamma for m=8, i=5: 0.00033546262790251185\n",
|
| 720 |
+
"Optimal Gamma for m=8, i=6: 0.00033546262790251185\n",
|
| 721 |
+
"Optimal Gamma for m=8, i=7: 0.00033546262790251185\n",
|
| 722 |
+
"Optimal Gamma for m=8, i=8: 0.00033546262790251185\n",
|
| 723 |
+
"Optimal Gamma for m=9, i=1: 0.00012340980408667956\n",
|
| 724 |
+
"Optimal Gamma for m=9, i=2: 0.00012340980408667956\n",
|
| 725 |
+
"Optimal Gamma for m=9, i=3: 0.00012340980408667956\n",
|
| 726 |
+
"Optimal Gamma for m=9, i=4: 0.00012340980408667956\n",
|
| 727 |
+
"Optimal Gamma for m=9, i=5: 0.00012340980408667956\n",
|
| 728 |
+
"Optimal Gamma for m=9, i=6: 0.00012340980408667956\n",
|
| 729 |
+
"Optimal Gamma for m=9, i=7: 0.00012340980408667956\n",
|
| 730 |
+
"Optimal Gamma for m=9, i=8: 0.00012340980408667956\n",
|
| 731 |
+
"Optimal Gamma for m=9, i=9: 0.00012340980408667956\n",
|
| 732 |
+
"Optimal Gamma for m=10, i=1: 4.5399929762484854e-05\n",
|
| 733 |
+
"Optimal Gamma for m=10, i=2: 4.5399929762484854e-05\n",
|
| 734 |
+
"Optimal Gamma for m=10, i=3: 4.5399929762484854e-05\n",
|
| 735 |
+
"Optimal Gamma for m=10, i=4: 4.5399929762484854e-05\n",
|
| 736 |
+
"Optimal Gamma for m=10, i=5: 4.5399929762484854e-05\n",
|
| 737 |
+
"Optimal Gamma for m=10, i=6: 4.5399929762484854e-05\n",
|
| 738 |
+
"Optimal Gamma for m=10, i=7: 4.5399929762484854e-05\n",
|
| 739 |
+
"Optimal Gamma for m=10, i=8: 4.5399929762484854e-05\n",
|
| 740 |
+
"Optimal Gamma for m=10, i=9: 4.5399929762484854e-05\n",
|
| 741 |
+
"Optimal Gamma for m=10, i=10: 4.5399929762484854e-05\n"
|
| 742 |
+
]
|
| 743 |
+
}
|
| 744 |
+
]
|
| 745 |
+
},
|
| 746 |
+
{
|
| 747 |
+
"cell_type": "code",
|
| 748 |
+
"source": [
|
| 749 |
+
"import numpy as np\n",
|
| 750 |
+
"\n",
|
| 751 |
+
"import random\n",
|
| 752 |
+
"\n",
|
| 753 |
+
"import matplotlib.pyplot as plt\n",
|
| 754 |
+
"\n",
|
| 755 |
+
"\n",
|
| 756 |
+
"\n",
|
| 757 |
+
"# Constants and Parameters\n",
|
| 758 |
+
"\n",
|
| 759 |
+
"rho = 0.6\n",
|
| 760 |
+
"\n",
|
| 761 |
+
"mu = 1.0\n",
|
| 762 |
+
"\n",
|
| 763 |
+
"K = 5\n",
|
| 764 |
+
"\n",
|
| 765 |
+
"delta = 0.1\n",
|
| 766 |
+
"\n",
|
| 767 |
+
"K_max = 10\n",
|
| 768 |
+
"\n",
|
| 769 |
+
"eta = 0.5\n",
|
| 770 |
+
"\n",
|
| 771 |
+
"t1 = 0\n",
|
| 772 |
+
"\n",
|
| 773 |
+
"t_max = 100\n",
|
| 774 |
+
"\n",
|
| 775 |
+
"\n",
|
| 776 |
+
"\n",
|
| 777 |
+
"# Utility Functions\n",
|
| 778 |
+
"\n",
|
| 779 |
+
"def P_star(u_i, t):\n",
|
| 780 |
+
"\n",
|
| 781 |
+
" return random.uniform(0, 1)\n",
|
| 782 |
+
"\n",
|
| 783 |
+
"\n",
|
| 784 |
+
"\n",
|
| 785 |
+
"def BP_star(u_i, t):\n",
|
| 786 |
+
"\n",
|
| 787 |
+
" return random.uniform(0, 1)\n",
|
| 788 |
+
"\n",
|
| 789 |
+
"\n",
|
| 790 |
+
"\n",
|
| 791 |
+
"def TGG_star(u_i, t):\n",
|
| 792 |
+
"\n",
|
| 793 |
+
" return random.uniform(0, 1)\n",
|
| 794 |
+
"\n",
|
| 795 |
+
"\n",
|
| 796 |
+
"\n",
|
| 797 |
+
"def RGG_star(u_i, t):\n",
|
| 798 |
+
"\n",
|
| 799 |
+
" return random.uniform(0, 1)\n",
|
| 800 |
+
"\n",
|
| 801 |
+
"\n",
|
| 802 |
+
"\n",
|
| 803 |
+
"def Gamma(n):\n",
|
| 804 |
+
"\n",
|
| 805 |
+
" return np.exp(-n)\n",
|
| 806 |
+
"\n",
|
| 807 |
+
"\n",
|
| 808 |
+
"\n",
|
| 809 |
+
"def distortion(u_i, eta_i):\n",
|
| 810 |
+
"\n",
|
| 811 |
+
" return min(u_i, eta_i)\n",
|
| 812 |
+
"\n",
|
| 813 |
+
"\n",
|
| 814 |
+
"\n",
|
| 815 |
+
"def U_initial(size):\n",
|
| 816 |
+
"\n",
|
| 817 |
+
" return np.zeros(size)\n",
|
| 818 |
+
"\n",
|
| 819 |
+
"\n",
|
| 820 |
+
"\n",
|
| 821 |
+
"# Data collection for plotting\n",
|
| 822 |
+
"\n",
|
| 823 |
+
"m_values = []\n",
|
| 824 |
+
"\n",
|
| 825 |
+
"i_values = []\n",
|
| 826 |
+
"\n",
|
| 827 |
+
"gamma_values = []\n",
|
| 828 |
+
"\n",
|
| 829 |
+
"rate_values = []\n",
|
| 830 |
+
"\n",
|
| 831 |
+
"\n",
|
| 832 |
+
"\n",
|
| 833 |
+
"# Main Algorithm Function\n",
|
| 834 |
+
"\n",
|
| 835 |
+
"def task_scheduling_SRPT_round_robin_DEADLINE_DRIVEN_INTERACTIVE_TE(rho, mu, K, delta, K_max):\n",
|
| 836 |
+
"\n",
|
| 837 |
+
" U_0 = U_initial(1)\n",
|
| 838 |
+
"\n",
|
| 839 |
+
"\n",
|
| 840 |
+
"\n",
|
| 841 |
+
" for m in range(1, K_max + 1):\n",
|
| 842 |
+
"\n",
|
| 843 |
+
" u_list = range(1, m + 1) # List of task indices\n",
|
| 844 |
+
"\n",
|
| 845 |
+
"\n",
|
| 846 |
+
"\n",
|
| 847 |
+
" for i in range(1, m + 1):\n",
|
| 848 |
+
"\n",
|
| 849 |
+
" u_i = u_list[(i - 1) * len(u_list) // m]\n",
|
| 850 |
+
"\n",
|
| 851 |
+
" eta_i = eta\n",
|
| 852 |
+
"\n",
|
| 853 |
+
"\n",
|
| 854 |
+
"\n",
|
| 855 |
+
" D_min = distortion(u_i, eta_i)\n",
|
| 856 |
+
"\n",
|
| 857 |
+
" D_max = distortion(u_i, eta_i)\n",
|
| 858 |
+
"\n",
|
| 859 |
+
"\n",
|
| 860 |
+
"\n",
|
| 861 |
+
" # Solve Distortion as a function of Rate\n",
|
| 862 |
+
"\n",
|
| 863 |
+
" D_star = distortion(u_i, eta_i)\n",
|
| 864 |
+
"\n",
|
| 865 |
+
"\n",
|
| 866 |
+
"\n",
|
| 867 |
+
" # Reduce rate using Random Early Detection Algorithm\n",
|
| 868 |
+
"\n",
|
| 869 |
+
" R_star = U_0 - sum(P_star(u_i, t) * BP_star(u_i, t) * TGG_star(u_i, t)\n",
|
| 870 |
+
"\n",
|
| 871 |
+
" for t in range(t1, t_max - u_i + 1))\n",
|
| 872 |
+
"\n",
|
| 873 |
+
"\n",
|
| 874 |
+
"\n",
|
| 875 |
+
" # Given the amount of rate leftover, solve the problem using Gamma(n)\n",
|
| 876 |
+
"\n",
|
| 877 |
+
" leftover_rate = float(R_star)\n",
|
| 878 |
+
"\n",
|
| 879 |
+
" optimal_gamma = Gamma(len(u_list))\n",
|
| 880 |
+
"\n",
|
| 881 |
+
"\n",
|
| 882 |
+
"\n",
|
| 883 |
+
" # Discard the bandwidth overhead note\n",
|
| 884 |
+
"\n",
|
| 885 |
+
" RGG_sum = sum(P_star(u_i, t) * BP_star(u_i, t) * RGG_star(u_i, t)\n",
|
| 886 |
+
"\n",
|
| 887 |
+
" for t in range(t1, t_max - u_i + 1))\n",
|
| 888 |
+
"\n",
|
| 889 |
+
"\n",
|
| 890 |
+
"\n",
|
| 891 |
+
" final_gamma = float(optimal_gamma)\n",
|
| 892 |
+
"\n",
|
| 893 |
+
"\n",
|
| 894 |
+
"\n",
|
| 895 |
+
" # Collect data for plotting\n",
|
| 896 |
+
"\n",
|
| 897 |
+
" m_values.append(m)\n",
|
| 898 |
+
"\n",
|
| 899 |
+
" i_values.append(i)\n",
|
| 900 |
+
"\n",
|
| 901 |
+
" gamma_values.append(final_gamma)\n",
|
| 902 |
+
"\n",
|
| 903 |
+
" rate_values.append(leftover_rate)\n",
|
| 904 |
+
"\n",
|
| 905 |
+
"\n",
|
| 906 |
+
"\n",
|
| 907 |
+
" print(f\"Optimal Gamma for m={m}, i={i}: {final_gamma}\")\n",
|
| 908 |
+
"\n",
|
| 909 |
+
"\n",
|
| 910 |
+
"\n",
|
| 911 |
+
"# Run the Task Scheduling Algorithm\n",
|
| 912 |
+
"\n",
|
| 913 |
+
"task_scheduling_SRPT_round_robin_DEADLINE_DRIVEN_INTERACTIVE_TE(rho, mu, K, delta, K_max)\n",
|
| 914 |
+
"\n",
|
| 915 |
+
"\n",
|
| 916 |
+
"\n",
|
| 917 |
+
"# Plotting the Results\n",
|
| 918 |
+
"\n",
|
| 919 |
+
"plt.figure(figsize=(12, 6))\n",
|
| 920 |
+
"\n",
|
| 921 |
+
"\n",
|
| 922 |
+
"\n",
|
| 923 |
+
"# Subplot 1: Gamma values\n",
|
| 924 |
+
"\n",
|
| 925 |
+
"plt.subplot(1, 2, 1)\n",
|
| 926 |
+
"\n",
|
| 927 |
+
"plt.scatter(m_values, gamma_values, c='blue', label='Gamma Values')\n",
|
| 928 |
+
"\n",
|
| 929 |
+
"plt.xlabel('m (Iterations)')\n",
|
| 930 |
+
"\n",
|
| 931 |
+
"plt.ylabel('Optimal Gamma')\n",
|
| 932 |
+
"\n",
|
| 933 |
+
"plt.title('Optimal Gamma Values vs Iterations')\n",
|
| 934 |
+
"\n",
|
| 935 |
+
"plt.legend()\n",
|
| 936 |
+
"\n",
|
| 937 |
+
"\n",
|
| 938 |
+
"\n",
|
| 939 |
+
"# Subplot 2: Rate values\n",
|
| 940 |
+
"\n",
|
| 941 |
+
"plt.subplot(1, 2, 2)\n",
|
| 942 |
+
"\n",
|
| 943 |
+
"plt.scatter(m_values, rate_values, c='green', label='Leftover Rate Values')\n",
|
| 944 |
+
"\n",
|
| 945 |
+
"plt.xlabel('m (Iterations)')\n",
|
| 946 |
+
"\n",
|
| 947 |
+
"plt.ylabel('Leftover Rate')\n",
|
| 948 |
+
"\n",
|
| 949 |
+
"plt.title('Leftover Rate Values vs Iterations')\n",
|
| 950 |
+
"\n",
|
| 951 |
+
"plt.legend()\n",
|
| 952 |
+
"\n",
|
| 953 |
+
"\n",
|
| 954 |
+
"\n",
|
| 955 |
+
"plt.tight_layout()\n",
|
| 956 |
+
"\n",
|
| 957 |
+
"plt.show()"
|
| 958 |
+
],
|
| 959 |
+
"metadata": {
|
| 960 |
+
"colab": {
|
| 961 |
+
"base_uri": "https://localhost:8080/",
|
| 962 |
+
"height": 1000
|
| 963 |
+
},
|
| 964 |
+
"id": "t6ZXGtAhT9oo",
|
| 965 |
+
"outputId": "0b687d20-b446-4336-e5ac-e356c2080a7c"
|
| 966 |
+
},
|
| 967 |
+
"execution_count": 8,
|
| 968 |
+
"outputs": [
|
| 969 |
+
{
|
| 970 |
+
"output_type": "stream",
|
| 971 |
+
"name": "stderr",
|
| 972 |
+
"text": [
|
| 973 |
+
"<ipython-input-8-33d2a876657d>:129: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n",
|
| 974 |
+
" leftover_rate = float(R_star)\n"
|
| 975 |
+
]
|
| 976 |
+
},
|
| 977 |
+
{
|
| 978 |
+
"output_type": "stream",
|
| 979 |
+
"name": "stdout",
|
| 980 |
+
"text": [
|
| 981 |
+
"Optimal Gamma for m=1, i=1: 0.36787944117144233\n",
|
| 982 |
+
"Optimal Gamma for m=2, i=1: 0.1353352832366127\n",
|
| 983 |
+
"Optimal Gamma for m=2, i=2: 0.1353352832366127\n",
|
| 984 |
+
"Optimal Gamma for m=3, i=1: 0.049787068367863944\n",
|
| 985 |
+
"Optimal Gamma for m=3, i=2: 0.049787068367863944\n",
|
| 986 |
+
"Optimal Gamma for m=3, i=3: 0.049787068367863944\n",
|
| 987 |
+
"Optimal Gamma for m=4, i=1: 0.01831563888873418\n",
|
| 988 |
+
"Optimal Gamma for m=4, i=2: 0.01831563888873418\n",
|
| 989 |
+
"Optimal Gamma for m=4, i=3: 0.01831563888873418\n",
|
| 990 |
+
"Optimal Gamma for m=4, i=4: 0.01831563888873418\n",
|
| 991 |
+
"Optimal Gamma for m=5, i=1: 0.006737946999085467\n",
|
| 992 |
+
"Optimal Gamma for m=5, i=2: 0.006737946999085467\n",
|
| 993 |
+
"Optimal Gamma for m=5, i=3: 0.006737946999085467\n",
|
| 994 |
+
"Optimal Gamma for m=5, i=4: 0.006737946999085467\n",
|
| 995 |
+
"Optimal Gamma for m=5, i=5: 0.006737946999085467\n",
|
| 996 |
+
"Optimal Gamma for m=6, i=1: 0.0024787521766663585\n",
|
| 997 |
+
"Optimal Gamma for m=6, i=2: 0.0024787521766663585\n",
|
| 998 |
+
"Optimal Gamma for m=6, i=3: 0.0024787521766663585\n",
|
| 999 |
+
"Optimal Gamma for m=6, i=4: 0.0024787521766663585\n",
|
| 1000 |
+
"Optimal Gamma for m=6, i=5: 0.0024787521766663585\n",
|
| 1001 |
+
"Optimal Gamma for m=6, i=6: 0.0024787521766663585\n",
|
| 1002 |
+
"Optimal Gamma for m=7, i=1: 0.0009118819655545162\n",
|
| 1003 |
+
"Optimal Gamma for m=7, i=2: 0.0009118819655545162\n",
|
| 1004 |
+
"Optimal Gamma for m=7, i=3: 0.0009118819655545162\n",
|
| 1005 |
+
"Optimal Gamma for m=7, i=4: 0.0009118819655545162\n",
|
| 1006 |
+
"Optimal Gamma for m=7, i=5: 0.0009118819655545162\n",
|
| 1007 |
+
"Optimal Gamma for m=7, i=6: 0.0009118819655545162\n",
|
| 1008 |
+
"Optimal Gamma for m=7, i=7: 0.0009118819655545162\n",
|
| 1009 |
+
"Optimal Gamma for m=8, i=1: 0.00033546262790251185\n",
|
| 1010 |
+
"Optimal Gamma for m=8, i=2: 0.00033546262790251185\n",
|
| 1011 |
+
"Optimal Gamma for m=8, i=3: 0.00033546262790251185\n",
|
| 1012 |
+
"Optimal Gamma for m=8, i=4: 0.00033546262790251185\n",
|
| 1013 |
+
"Optimal Gamma for m=8, i=5: 0.00033546262790251185\n",
|
| 1014 |
+
"Optimal Gamma for m=8, i=6: 0.00033546262790251185\n",
|
| 1015 |
+
"Optimal Gamma for m=8, i=7: 0.00033546262790251185\n",
|
| 1016 |
+
"Optimal Gamma for m=8, i=8: 0.00033546262790251185\n",
|
| 1017 |
+
"Optimal Gamma for m=9, i=1: 0.00012340980408667956\n",
|
| 1018 |
+
"Optimal Gamma for m=9, i=2: 0.00012340980408667956\n",
|
| 1019 |
+
"Optimal Gamma for m=9, i=3: 0.00012340980408667956\n",
|
| 1020 |
+
"Optimal Gamma for m=9, i=4: 0.00012340980408667956\n",
|
| 1021 |
+
"Optimal Gamma for m=9, i=5: 0.00012340980408667956\n",
|
| 1022 |
+
"Optimal Gamma for m=9, i=6: 0.00012340980408667956\n",
|
| 1023 |
+
"Optimal Gamma for m=9, i=7: 0.00012340980408667956\n",
|
| 1024 |
+
"Optimal Gamma for m=9, i=8: 0.00012340980408667956\n",
|
| 1025 |
+
"Optimal Gamma for m=9, i=9: 0.00012340980408667956\n",
|
| 1026 |
+
"Optimal Gamma for m=10, i=1: 4.5399929762484854e-05\n",
|
| 1027 |
+
"Optimal Gamma for m=10, i=2: 4.5399929762484854e-05\n",
|
| 1028 |
+
"Optimal Gamma for m=10, i=3: 4.5399929762484854e-05\n",
|
| 1029 |
+
"Optimal Gamma for m=10, i=4: 4.5399929762484854e-05\n",
|
| 1030 |
+
"Optimal Gamma for m=10, i=5: 4.5399929762484854e-05\n",
|
| 1031 |
+
"Optimal Gamma for m=10, i=6: 4.5399929762484854e-05\n",
|
| 1032 |
+
"Optimal Gamma for m=10, i=7: 4.5399929762484854e-05\n",
|
| 1033 |
+
"Optimal Gamma for m=10, i=8: 4.5399929762484854e-05\n",
|
| 1034 |
+
"Optimal Gamma for m=10, i=9: 4.5399929762484854e-05\n",
|
| 1035 |
+
"Optimal Gamma for m=10, i=10: 4.5399929762484854e-05\n"
|
| 1036 |
+
]
|
| 1037 |
+
},
|
| 1038 |
+
{
|
| 1039 |
+
"output_type": "display_data",
|
| 1040 |
+
"data": {
|
| 1041 |
+
"text/plain": [
|
| 1042 |
+
"<Figure size 1200x600 with 2 Axes>"
|
| 1043 |
+
],
|
| 1044 |
+
"image/png": "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uHEDjRo10mvPzc2Fn58fmjVrhrFjx+LSpUvV7qOiogIqlUrvRkRERERERERENcemSamLFy9CrVbD399fr93f3x9nz541aR8vv/wygoKC9BJbcXFx+Oyzz5CTk4N58+bhP//5D5588kmo1Wqj+0hPT4enp6fuFhIScu8HRUREREREREREd9XA1gHcj7feegtr165Fbm4unJ2dde2DBg3S/b9Vq1Zo3bo1IiMjkZubi8cff9xgP9OmTUNaWpruvkqlYmKKiIiIiIiIiKgG2bRSysfHB1KpFOfOndNrP3fuHAICAu742AULFuCtt97C999/j9atW9+xb0REBHx8fHD06FGj252cnCCTyfRuRERERERERERUc2yalHJ0dET79u31FinXLlreqVOnah83f/58zJ49G9nZ2ejQocNdn+f06dO4dOkSAgMDLRI3ERERERERERHdH5tffS8tLQ3Lli3DypUrkZ+fj7Fjx+LatWsYNWoUAGDEiBGYNm2arv+8efMwffp0fPrppwgLC8PZs2dx9uxZXL16FQBw9epVvPTSS/jpp59QUFCAnJwcxMfHIyoqCrGxsTY5RiIiIiIiIiIi0mfzNaUGDhyICxcuYMaMGTh79izatGmD7Oxs3eLnhYWFcHD4J3f24YcforKyEomJiXr7ef311zFz5kxIpVLs378fK1euRElJCYKCgtCrVy/Mnj0bTk5OVj02IiIiIiIiIqrb1Bo18grzUFxWjECPQChCFZA6SG0dll2QCCGErYOobVQqFTw9PVFaWsr1pYiIiOo5jgtMw9eJiIjskTJfiZTsFJxWnda1yWVyZMZlIiE6wYaR1W6mjgtsPn2PiIiIiIiIiKi2UeYrkbg+US8hBQBFqiIkrk+EMl9po8jsB5NSRERERERERES3UGvUSMlOgYDh5DJtW2p2KtQatbVDsytMShERERERERER3SKvMM+gQupWAgKnVKeQV5hnxajsj80XOiciIiIiIqotuKAxEQFAcVmxRfuRcUxKERERERERgQsaE9E//Nz8LNqPjOP0PSIiIiIiqve4oDERkfUxKUVERERERPUaFzQmotudv3beov3IOCaliIiIiIioXuOCxkR0u0CPQIv2I+OYlCIiIiIionqNCxoT0e0UoQrIZXJIIDG6XQIJQmQhUIQqrByZfWFSioiIiIiI6jVWRBDR7aQOUmTGZQKAQWJKez8jLoNX57xPTEoREREREVG9xooIIjImIToBWUlZCJYF67XLZXJkJWXxqpwW0MDWARAREREREdmStiIicX0iJJDoLXjOigii+i0hOgHxzeKRV5iH4rJiBHoEQhGq4O8DC2FSioiIiIiI6j1tRURKdoreoudymRwZcRmsiCCqx6QOUsSExdg6DLvEpBQRERERERFYEUFEZG1MShEREREREf0/VkQQEVkPk1JERERERERERNVQa9SsoKwhTEoRERERERERERmhzFcaXWsuMy6zzq41V5uSbExKERERERERERHdRpmvROL6RL0rcgJAkaoIiesTkZWUVecSU7UtyeZg9WckIiIiIiIiIqrF1Bo1UrJTDBJSAHRtqdmpUGvU1g7tnmmTbLcmpIB/kmzKfKXVY2JSioiIiIiIiIjoFnmFeQbJm1sJCJxSnUJeYZ4Vo7p3tTXJds/T98rLy1FYWIjKykq99tatW993UEREREREREREtlJcVmzRfrZmTpLNmlcgNTspdeHCBYwaNQpbtmwxul2trjula0REREREREREtwv0CLRoP1urrUk2s6fvpaamoqSkBP/973/h4uKC7OxsrFy5Ek2bNsU333xTEzESEREREREREVmNIlQBuUwOCSRGt0sgQYgsBIpQhZUjuze1NclmdlLqhx9+wMKFC9GhQwc4ODigSZMmGDZsGObPn4/09PSaiJGIiIiIiIiIyGqkDlJkxmUCgEFiSns/Iy4DUgep1WO7F7U1yWZ2UuratWvw8/MDAHh7e+PChQsAgFatWuG3336zbHREREREREREVKeoNWrkFuRizZ9rkFuQW6euUHerhOgEZCVlIVgWrNcul8mRlZSFhOgEG0VmvtqaZDN7TalmzZrh8OHDCAsLw0MPPYSlS5ciLCwMS5YsQWBg3ZhLSURERERERESWp8xXIiU7RW9RbblMjsy4zDqVxNFKiE5AfLN45BXmobisGIEegVCEKupMhdSttEm2iVsmoqisSNce7BGMzCdt8/6YnZRKSUlBcXHVwlevv/464uLi8MUXX8DR0RErVqywdHxEREREREREVAco85VIXJ8IAaHXXqQqQuL6xDpXXaQldZBa9Yp0Na26KXy2IBFCiLt3q155eTkOHTqE0NBQ+Pj4WCoum1KpVPD09ERpaSlkMpmtwyEiIiIb4rjANHydiIjq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\n"
|
| 1045 |
+
},
|
| 1046 |
+
"metadata": {}
|
| 1047 |
+
}
|
| 1048 |
+
]
|
| 1049 |
+
}
|
| 1050 |
+
]
|
| 1051 |
+
}
|
Direction_Fields_of_Numeric_Energy_Integral_Mapped_to_Reals.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
E_Approximata.ipynb
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"nbformat": 4,
|
| 3 |
+
"nbformat_minor": 0,
|
| 4 |
+
"metadata": {
|
| 5 |
+
"colab": {
|
| 6 |
+
"provenance": []
|
| 7 |
+
},
|
| 8 |
+
"kernelspec": {
|
| 9 |
+
"name": "python3",
|
| 10 |
+
"display_name": "Python 3"
|
| 11 |
+
},
|
| 12 |
+
"language_info": {
|
| 13 |
+
"name": "python"
|
| 14 |
+
}
|
| 15 |
+
},
|
| 16 |
+
"cells": [
|
| 17 |
+
{
|
| 18 |
+
"cell_type": "code",
|
| 19 |
+
"source": [
|
| 20 |
+
"import math\n",
|
| 21 |
+
"import random\n",
|
| 22 |
+
"from sympy import symbols, Sum, factorial, exp, pi, diff, oo, Function, simplify\n",
|
| 23 |
+
"\n",
|
| 24 |
+
"# Unique Symbols Generation\n",
|
| 25 |
+
"def generate_unique_symbols(count):\n",
|
| 26 |
+
" base_symbol = 'σ'\n",
|
| 27 |
+
" return [symbols(f\"{base_symbol}{i+1}\") for i in range(count)]\n",
|
| 28 |
+
"\n",
|
| 29 |
+
"# Function to Apply Randomness Factor R\n",
|
| 30 |
+
"def randomness_factor():\n",
|
| 31 |
+
" return random.uniform(0.5, 1.5) # Random factor in the range [0.5, 1.5]\n",
|
| 32 |
+
"\n",
|
| 33 |
+
"# Define the Symbolic Function for e\n",
|
| 34 |
+
"def approximate_e_symbolic(symbols_list, num_terms=10):\n",
|
| 35 |
+
" k = symbols('k', integer=True)\n",
|
| 36 |
+
" e_sum = sum(randomness_factor() / factorial(symbols_list[i]) for i in range(num_terms))\n",
|
| 37 |
+
" return e_sum\n",
|
| 38 |
+
"\n",
|
| 39 |
+
"# Generate Unique Symbols\n",
|
| 40 |
+
"num_terms = 10\n",
|
| 41 |
+
"unique_symbols = generate_unique_symbols(num_terms)\n",
|
| 42 |
+
"\n",
|
| 43 |
+
"# Approximate e using symbolic computation\n",
|
| 44 |
+
"approximated_e = approximate_e_symbolic(unique_symbols, num_terms=num_terms)\n",
|
| 45 |
+
"print(f\"\\nApproximated e using symbolic computation: {approximated_e}\")\n",
|
| 46 |
+
"\n",
|
| 47 |
+
"# Extended Part - Derivatives, Summations, and Complex Functions\n",
|
| 48 |
+
"\n",
|
| 49 |
+
"# Define Symbols and Functions for Advanced Computations\n",
|
| 50 |
+
"x, y, z = symbols('x y z')\n",
|
| 51 |
+
"# Use the sympy Function class for symbolic functions g and f\n",
|
| 52 |
+
"f = Function('f')(x, y, z)\n",
|
| 53 |
+
"g = Function('g')(x, y, z)\n",
|
| 54 |
+
"\n",
|
| 55 |
+
"# Example Symbolic Function\n",
|
| 56 |
+
"f_def = exp(x*y) + pi*z + sum([factorial(unique_symbols[i])*x**i for i in range(num_terms)])\n",
|
| 57 |
+
"print(f\"\\nSymbolic function f: {f_def}\")\n",
|
| 58 |
+
"\n",
|
| 59 |
+
"# Compute Partial Derivative of f with respect to x\n",
|
| 60 |
+
"partial_derivative_fx = diff(f_def, x)\n",
|
| 61 |
+
"print(f\"\\nPartial derivative of f with respect to x: {partial_derivative_fx}\")\n",
|
| 62 |
+
"\n",
|
| 63 |
+
"# Compute a double sum of a more complex function\n",
|
| 64 |
+
"double_sum_f = Sum(Sum(f_def, (x, 1, 3)), (y, 1, 3)).doit()\n",
|
| 65 |
+
"print(f\"\\nDouble sum of f over x and y from 1 to 3: {double_sum_f}\")\n",
|
| 66 |
+
"\n",
|
| 67 |
+
"# Example involving factorial and randomness\n",
|
| 68 |
+
"symbolic_sum_random = Sum((1 / factorial(x)) * randomness_factor(), (x, 1, 10)).doit()\n",
|
| 69 |
+
"print(f\"\\nSymbolic sum involving factorial and randomness: {symbolic_sum_random}\")\n",
|
| 70 |
+
"\n",
|
| 71 |
+
"# Define a complex expression combining all elements\n",
|
| 72 |
+
"complex_expression = f_def + double_sum_f + symbolic_sum_random + approximated_e\n",
|
| 73 |
+
"print(f\"\\nComplex expression combining all elements: {complex_expression}\")\n",
|
| 74 |
+
"\n",
|
| 75 |
+
"# Simplify the complex expression\n",
|
| 76 |
+
"simplified_expression = simplify(complex_expression)\n",
|
| 77 |
+
"print(f\"\\nSimplified complex expression: {simplified_expression}\")"
|
| 78 |
+
],
|
| 79 |
+
"metadata": {
|
| 80 |
+
"colab": {
|
| 81 |
+
"base_uri": "https://localhost:8080/"
|
| 82 |
+
},
|
| 83 |
+
"id": "Qqlypt4XQhkK",
|
| 84 |
+
"outputId": "2b34e384-222b-4ee2-f323-b7d4e2ac05aa"
|
| 85 |
+
},
|
| 86 |
+
"execution_count": 1,
|
| 87 |
+
"outputs": [
|
| 88 |
+
{
|
| 89 |
+
"output_type": "stream",
|
| 90 |
+
"name": "stdout",
|
| 91 |
+
"text": [
|
| 92 |
+
"\n",
|
| 93 |
+
"Approximated e using symbolic computation: 0.612011478948013/factorial(σ9) + 1.36240410803996/factorial(σ8) + 1.15103270680351/factorial(σ7) + 1.15928828392631/factorial(σ6) + 0.921848005229626/factorial(σ5) + 0.900612375567381/factorial(σ4) + 1.44681519176582/factorial(σ3) + 0.625164630584859/factorial(σ2) + 0.975393778456455/factorial(σ10) + 1.13126986486757/factorial(σ1)\n",
|
| 94 |
+
"\n",
|
| 95 |
+
"Symbolic function f: x**9*factorial(σ10) + x**8*factorial(σ9) + x**7*factorial(σ8) + x**6*factorial(σ7) + x**5*factorial(σ6) + x**4*factorial(σ5) + x**3*factorial(σ4) + x**2*factorial(σ3) + x*factorial(σ2) + pi*z + exp(x*y) + factorial(σ1)\n",
|
| 96 |
+
"\n",
|
| 97 |
+
"Partial derivative of f with respect to x: 9*x**8*factorial(σ10) + 8*x**7*factorial(σ9) + 7*x**6*factorial(σ8) + 6*x**5*factorial(σ7) + 5*x**4*factorial(σ6) + 4*x**3*factorial(σ5) + 3*x**2*factorial(σ4) + 2*x*factorial(σ3) + y*exp(x*y) + factorial(σ2)\n",
|
| 98 |
+
"\n",
|
| 99 |
+
"Double sum of f over x and y from 1 to 3: 9*pi*z + 9*factorial(σ1) + 60588*factorial(σ10) + 18*factorial(σ2) + 42*factorial(σ3) + 108*factorial(σ4) + 294*factorial(σ5) + 828*factorial(σ6) + 2382*factorial(σ7) + 6948*factorial(σ8) + 20454*factorial(σ9) + E + 2*exp(2) + 2*exp(3) + exp(4) + 2*exp(6) + exp(9)\n",
|
| 100 |
+
"\n",
|
| 101 |
+
"Symbolic sum involving factorial and randomness: 0.966395643884192\n",
|
| 102 |
+
"\n",
|
| 103 |
+
"Complex expression combining all elements: x**9*factorial(σ10) + x**8*factorial(σ9) + x**7*factorial(σ8) + x**6*factorial(σ7) + x**5*factorial(σ6) + x**4*factorial(σ5) + x**3*factorial(σ4) + x**2*factorial(σ3) + x*factorial(σ2) + 10*pi*z + exp(x*y) + 10*factorial(σ1) + 60588*factorial(σ10) + 18*factorial(σ2) + 42*factorial(σ3) + 108*factorial(σ4) + 294*factorial(σ5) + 828*factorial(σ6) + 2382*factorial(σ7) + 6948*factorial(σ8) + 20454*factorial(σ9) + 0.966395643884192 + E + 2*exp(2) + 2*exp(3) + exp(4) + 2*exp(6) + exp(9) + 0.612011478948013/factorial(σ9) + 1.36240410803996/factorial(σ8) + 1.15103270680351/factorial(σ7) + 1.15928828392631/factorial(σ6) + 0.921848005229626/factorial(σ5) + 0.900612375567381/factorial(σ4) + 1.44681519176582/factorial(σ3) + 0.625164630584859/factorial(σ2) + 0.975393778456455/factorial(σ10) + 1.13126986486757/factorial(σ1)\n",
|
| 104 |
+
"\n",
|
| 105 |
+
"Simplified complex expression: 1.0*x**9*gamma(σ10 + 1) + 1.0*x**8*gamma(σ9 + 1) + 1.0*x**7*gamma(σ8 + 1) + 1.0*x**6*gamma(σ7 + 1) + 1.0*x**5*gamma(σ6 + 1) + 1.0*x**4*gamma(σ5 + 1) + 1.0*x**3*gamma(σ4 + 1) + 1.0*x**2*gamma(σ3 + 1) + 1.0*x*gamma(σ2 + 1) + 10.0*pi*z + 1.0*exp(x*y) + 10.0*gamma(σ1 + 1) + 60588.0*gamma(σ10 + 1) + 18.0*gamma(σ2 + 1) + 42.0*gamma(σ3 + 1) + 108.0*gamma(σ4 + 1) + 294.0*gamma(σ5 + 1) + 828.0*gamma(σ6 + 1) + 2382.0*gamma(σ7 + 1) + 6948.0*gamma(σ8 + 1) + 20454.0*gamma(σ9 + 1) + 0.966395643884192 + 1.0*E + 2.0*exp(2) + 2.0*exp(3) + 1.0*exp(4) + 2.0*exp(6) + 1.0*exp(9) + 0.612011478948013/gamma(σ9 + 1) + 1.36240410803996/gamma(σ8 + 1) + 1.15103270680351/gamma(σ7 + 1) + 1.15928828392631/gamma(σ6 + 1) + 0.921848005229626/gamma(σ5 + 1) + 0.900612375567381/gamma(σ4 + 1) + 1.44681519176582/gamma(σ3 + 1) + 0.625164630584859/gamma(σ2 + 1) + 0.975393778456455/gamma(σ10 + 1) + 1.13126986486757/gamma(σ1 + 1)\n"
|
| 106 |
+
]
|
| 107 |
+
}
|
| 108 |
+
]
|
| 109 |
+
},
|
| 110 |
+
{
|
| 111 |
+
"cell_type": "code",
|
| 112 |
+
"execution_count": null,
|
| 113 |
+
"metadata": {
|
| 114 |
+
"id": "3xoD9vyaQaWK"
|
| 115 |
+
},
|
| 116 |
+
"outputs": [],
|
| 117 |
+
"source": [
|
| 118 |
+
"import math\n",
|
| 119 |
+
"import random\n",
|
| 120 |
+
"from sympy import symbols, Sum, factorial, exp, pi, diff, oo, Function, simplify\n",
|
| 121 |
+
"\n",
|
| 122 |
+
"# Unique Symbols Generation\n",
|
| 123 |
+
"def generate_unique_symbols(count):\n",
|
| 124 |
+
" base_symbol = 'α'\n",
|
| 125 |
+
" return [symbols(f\"{base_symbol}{i+1}\") for i in range(count)]\n",
|
| 126 |
+
"\n",
|
| 127 |
+
"# Function to Apply Randomness Factor R\n",
|
| 128 |
+
"def randomness_factor():\n",
|
| 129 |
+
" return random.uniform(0.5, 1.5) # Random factor in the range [0.5, 1.5]\n",
|
| 130 |
+
"\n",
|
| 131 |
+
"# Define the Symbolic Function for sin\n",
|
| 132 |
+
"def approximate_sin_symbolic(symbols_list, num_terms=10):\n",
|
| 133 |
+
" k = symbols('k', integer=True)\n",
|
| 134 |
+
" sin_sum = sum(randomness_factor() * (1/factorial(2*k + 1)) * (symbols_list[i]**(2*k + 1)) * (-1)**k for i in range(num_terms))\n",
|
| 135 |
+
" return sin_sum\n",
|
| 136 |
+
"\n",
|
| 137 |
+
"# Generate Unique Symbols\n",
|
| 138 |
+
"num_terms = 10\n",
|
| 139 |
+
"unique_symbols = generate_unique_symbols(num_terms)\n",
|
| 140 |
+
"\n",
|
| 141 |
+
"# Approximate sin using symbolic computation\n",
|
| 142 |
+
"approximated_sin = approximate_sin_symbolic(unique_symbols, num_terms=num_terms)\n",
|
| 143 |
+
"print(f\"Approximated sin using symbolic computation: {approximated_sin}\")\n",
|
| 144 |
+
"\n",
|
| 145 |
+
"# Extended Part - Derivatives, Summations, and Complex Functions\n",
|
| 146 |
+
"\n",
|
| 147 |
+
"# Define Symbols and Functions for Advanced Computations\n",
|
| 148 |
+
"x, y, z = symbols('x y z')\n",
|
| 149 |
+
"# Use the sympy Function class for symbolic functions g and f\n",
|
| 150 |
+
"f = Function('f')(x, y, z)\n",
|
| 151 |
+
"g = Function('g')(x, y, z)\n",
|
| 152 |
+
"\n",
|
| 153 |
+
"# Example Symbolic Function\n",
|
| 154 |
+
"f_def = exp(x*y) + pi*z + sum([(1/unique_symbols[i]) * (x+z)**i for i in range(num_terms)])\n",
|
| 155 |
+
"print(f\"\\nSymbolic function f: {f_def}\")\n",
|
| 156 |
+
"\n",
|
| 157 |
+
"# Compute Partial Derivative of f with respect to y\n",
|
| 158 |
+
"partial_derivative_fy = diff(f_def, y)\n",
|
| 159 |
+
"print(f\"\\nPartial derivative of f with respect to y: {partial_derivative_fy}\")\n",
|
| 160 |
+
"\n",
|
| 161 |
+
"# Compute a double sum of a more complex function\n",
|
| 162 |
+
"double_sum_f = Sum(Sum(f_def, (x, 1, 3)), (y, 1, 3)).doit()\n",
|
| 163 |
+
"print(f\"\\nDouble sum of f over x and y from 1 to 3: {double_sum_f}\")\n",
|
| 164 |
+
"\n",
|
| 165 |
+
"# Example involving factorial and randomness\n",
|
| 166 |
+
"symbolic_sum_random = Sum(randomness_factor() * factorial(x), (x, 1, 10)).doit()\n",
|
| 167 |
+
"print(f\"\\nSymbolic sum involving factorial and randomness: {symbolic_sum_random}\")\n",
|
| 168 |
+
"\n",
|
| 169 |
+
"# Define a complex expression combining all elements\n",
|
| 170 |
+
"complex_expression = f_def + double_sum_f + symbolic_sum_random + approximated_sin\n",
|
| 171 |
+
"print(f\"\\nComplex expression combining all elements: {complex_expression}\")\n",
|
| 172 |
+
"\n",
|
| 173 |
+
"# Simplify the complex expression\n",
|
| 174 |
+
"simplified_expression = simplify(complex_expression)\n",
|
| 175 |
+
"print(f\"\\nSimplified complex expression: {simplified_expression}\")"
|
| 176 |
+
]
|
| 177 |
+
}
|
| 178 |
+
]
|
| 179 |
+
}
|
Folding_Circle_into_Cone_Code.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Fractal_Partitioning_with_Zeta_Function.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Genetic Fragment.ipynb
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"nbformat": 4,
|
| 3 |
+
"nbformat_minor": 0,
|
| 4 |
+
"metadata": {
|
| 5 |
+
"colab": {
|
| 6 |
+
"provenance": []
|
| 7 |
+
},
|
| 8 |
+
"kernelspec": {
|
| 9 |
+
"name": "python3",
|
| 10 |
+
"display_name": "Python 3"
|
| 11 |
+
},
|
| 12 |
+
"language_info": {
|
| 13 |
+
"name": "python"
|
| 14 |
+
}
|
| 15 |
+
},
|
| 16 |
+
"cells": [
|
| 17 |
+
{
|
| 18 |
+
"cell_type": "code",
|
| 19 |
+
"execution_count": null,
|
| 20 |
+
"metadata": {
|
| 21 |
+
"id": "WMYGesN_u0od"
|
| 22 |
+
},
|
| 23 |
+
"outputs": [],
|
| 24 |
+
"source": [
|
| 25 |
+
"import numpy as np\n",
|
| 26 |
+
"import matplotlib.pyplot as plt\n",
|
| 27 |
+
"from mpl_toolkits.mplot3d import Axes3D\n",
|
| 28 |
+
"\n",
|
| 29 |
+
"# Constants and functions\n",
|
| 30 |
+
"r = 0.5 # Radius of the circle\n",
|
| 31 |
+
"x0 = np.array([1, 1]) # Initial point\n",
|
| 32 |
+
"\n",
|
| 33 |
+
"def Y(l):\n",
|
| 34 |
+
" return np.array([np.cos(l), np.sin(l)])\n",
|
| 35 |
+
"\n",
|
| 36 |
+
"# Curves x(s,l)\n",
|
| 37 |
+
"def x(s, l):\n",
|
| 38 |
+
" return x0 + r * np.sin(s) * Y(l)\n",
|
| 39 |
+
"\n",
|
| 40 |
+
"# Cone function\n",
|
| 41 |
+
"# This function correctly now calculates a point on the cone based on s, l and t.\n",
|
| 42 |
+
"def cone(s, l, t):\n",
|
| 43 |
+
" x_sl = x(s, l)\n",
|
| 44 |
+
" return np.array([np.cos(t) * x_sl[0], np.sin(t) * x_sl[1], t])\n",
|
| 45 |
+
"\n",
|
| 46 |
+
"# Parametric plot of the folded cone (corrected version)\n",
|
| 47 |
+
"fig = plt.figure()\n",
|
| 48 |
+
"ax = fig.add_subplot(111, projection='3d')\n",
|
| 49 |
+
"\n",
|
| 50 |
+
"# Creating the meshgrid properly using numpy\n",
|
| 51 |
+
"s = np.linspace(0, np.pi/2, 50) # s (parameter along the arc)\n",
|
| 52 |
+
"l = np.linspace(0, 2*np.pi, 50) # l (parameter around the circle)\n",
|
| 53 |
+
"t = np.linspace(0, 1, 50) # t (parameter along the cone height)\n",
|
| 54 |
+
"\n",
|
| 55 |
+
"# Using NumPy's broadcasting to compute the cone points - This avoids loops and is efficient.\n",
|
| 56 |
+
"S, T = np.meshgrid(s, t)\n",
|
| 57 |
+
"L = np.tile(l, (len(t), 1)).T # This creates a repeated array of l for each t value.\n",
|
| 58 |
+
"\n",
|
| 59 |
+
"# Now we evaluate the cone function on the grid points.\n",
|
| 60 |
+
"# We need to 'vectorize' our cone function for it to work on arrays.\n",
|
| 61 |
+
"cone_pts = np.vectorize(cone, signature='(),(),()->(n)')(S, L, T)\n",
|
| 62 |
+
"\n",
|
| 63 |
+
"# We extract X, Y, Z coordinates for plotting\n",
|
| 64 |
+
"X = cone_pts[..., 0]\n",
|
| 65 |
+
"Y = cone_pts[..., 1]\n",
|
| 66 |
+
"Z = cone_pts[..., 2]\n",
|
| 67 |
+
"\n",
|
| 68 |
+
"# Plot the surface. The surface is defined by the X, Y, Z arrays.\n",
|
| 69 |
+
"ax.plot_surface(X, Y, Z, alpha=0.8, cmap='viridis')\n",
|
| 70 |
+
"\n",
|
| 71 |
+
"# Combining the plot with a base circle at the bottom.\n",
|
| 72 |
+
"# We use the first row of X, Y since it corresponds to the base circle (t=0).\n",
|
| 73 |
+
"ax.plot(X[0], Y[0], np.zeros_like(X[0]), color='red', linewidth=2)\n",
|
| 74 |
+
"\n",
|
| 75 |
+
"# Hide axes for better visibility\n",
|
| 76 |
+
"plt.axis('off')\n",
|
| 77 |
+
"\n",
|
| 78 |
+
"# Show the plot\n",
|
| 79 |
+
"plt.show()"
|
| 80 |
+
]
|
| 81 |
+
}
|
| 82 |
+
]
|
| 83 |
+
}
|
Limbertwig_V_4_Ultra.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Logic_Kernel_3.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Logic_Vector_9.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Phenomenological_Velocity_Strings.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Programs_Tesselogical.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Spiraling_Vortex_Shell_Graph_(Phenomenological_Velocity).ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Tessellogical_Game.ipynb
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"nbformat": 4,
|
| 3 |
+
"nbformat_minor": 0,
|
| 4 |
+
"metadata": {
|
| 5 |
+
"colab": {
|
| 6 |
+
"provenance": []
|
| 7 |
+
},
|
| 8 |
+
"kernelspec": {
|
| 9 |
+
"name": "python3",
|
| 10 |
+
"display_name": "Python 3"
|
| 11 |
+
},
|
| 12 |
+
"language_info": {
|
| 13 |
+
"name": "python"
|
| 14 |
+
}
|
| 15 |
+
},
|
| 16 |
+
"cells": [
|
| 17 |
+
{
|
| 18 |
+
"cell_type": "markdown",
|
| 19 |
+
"source": [
|
| 20 |
+
"psi_1 & ~psi_2\n",
|
| 21 |
+
"\n",
|
| 22 |
+
"Logical AND of psi_1 with the negation of psi_2. ~psi_1 | omega\n",
|
| 23 |
+
"\n",
|
| 24 |
+
"Logical OR between the negation of psi_1 and omega. (psi_1 & omega) | (~psi_1 & ~omega)\n",
|
| 25 |
+
"\n",
|
| 26 |
+
"A logical expression equivalent to an XOR between psi_1 and omega. (psi_1 | psi_2) & ~omega\n",
|
| 27 |
+
"\n",
|
| 28 |
+
"Logical AND between the result of the OR operation on psi_1 and psi_2, and the negation of omega. psi_1 ^ psi_2 ^ omega\n",
|
| 29 |
+
"\n",
|
| 30 |
+
"The logical XOR operation applied pairwise among psi_1, psi_2, and omega."
|
| 31 |
+
],
|
| 32 |
+
"metadata": {
|
| 33 |
+
"id": "lHCO_Mf4xQif"
|
| 34 |
+
}
|
| 35 |
+
},
|
| 36 |
+
{
|
| 37 |
+
"cell_type": "code",
|
| 38 |
+
"execution_count": null,
|
| 39 |
+
"metadata": {
|
| 40 |
+
"id": "vfsPDkPhxJNr"
|
| 41 |
+
},
|
| 42 |
+
"outputs": [],
|
| 43 |
+
"source": [
|
| 44 |
+
"import numpy as np\n",
|
| 45 |
+
"import matplotlib.pyplot as plt\n",
|
| 46 |
+
"import matplotlib.patches as patches\n",
|
| 47 |
+
"import networkx as nx\n",
|
| 48 |
+
"import sympy as sp\n",
|
| 49 |
+
"\n",
|
| 50 |
+
"# Define symbols for sympy expressions\n",
|
| 51 |
+
"psi_1, psi_2 = sp.symbols('psi_1 psi_2')\n",
|
| 52 |
+
"phi, omega = sp.symbols('phi omega')\n",
|
| 53 |
+
"\n",
|
| 54 |
+
"# Functions f1 and f2\n",
|
| 55 |
+
"def f1(theta):\n",
|
| 56 |
+
" if theta == 0:\n",
|
| 57 |
+
" return np.pi / 2\n",
|
| 58 |
+
" return np.arcsin(np.sin(theta)) + (np.pi / 2) * (1 - np.pi / (2 * theta))\n",
|
| 59 |
+
"\n",
|
| 60 |
+
"def f2(theta):\n",
|
| 61 |
+
" if theta == 0:\n",
|
| 62 |
+
" return np.pi / 2\n",
|
| 63 |
+
" return np.arcsin(np.cos(theta)) + (np.pi / 2) * (1 - np.pi / (2 * theta))\n",
|
| 64 |
+
"\n",
|
| 65 |
+
"# Define decision graph for logic modulation\n",
|
| 66 |
+
"def create_decision_graph():\n",
|
| 67 |
+
" G = nx.DiGraph()\n",
|
| 68 |
+
" logical_nodes = ['psi_1', 'psi_2', 'omega', 'phi']\n",
|
| 69 |
+
" for node in logical_nodes:\n",
|
| 70 |
+
" # Initialize logical nodes with a value in the range [0, 1]\n",
|
| 71 |
+
" G.add_node(node, value=np.random.rand())\n",
|
| 72 |
+
" return G\n",
|
| 73 |
+
"\n",
|
| 74 |
+
"# Function to update the logic values with user-entered formula\n",
|
| 75 |
+
"def update_with_user_input(G, user_input):\n",
|
| 76 |
+
" # Convert the entered user formula to a sympy expression\n",
|
| 77 |
+
" try:\n",
|
| 78 |
+
" formula = sp.sympify(user_input, locals=globals())\n",
|
| 79 |
+
"\n",
|
| 80 |
+
" # Now, evaluate the formula using the current values in the graph\n",
|
| 81 |
+
" substitutions = {str(var): G.nodes[str(var)]['value'] for var in formula.free_symbols}\n",
|
| 82 |
+
" result = formula.subs(substitutions).evalf()\n",
|
| 83 |
+
"\n",
|
| 84 |
+
" # Update the 'phi' value in the graph\n",
|
| 85 |
+
" G.nodes['phi']['value'] = float(result)\n",
|
| 86 |
+
" print(f\"Graph updated with logic formula: {user_input}\")\n",
|
| 87 |
+
" except Exception as e:\n",
|
| 88 |
+
" print(f\"An error occurred: {e}\")\n",
|
| 89 |
+
"\n",
|
| 90 |
+
"# Function to visualize the decision graph as a tessellation pattern\n",
|
| 91 |
+
"def visualize_tessellation(G, domain, hex_centers, hex_size):\n",
|
| 92 |
+
" fig, ax = plt.subplots()\n",
|
| 93 |
+
" for center in hex_centers:\n",
|
| 94 |
+
" x, y = center\n",
|
| 95 |
+
" theta = np.arctan2(y, x) if x != 0 else np.pi / 2\n",
|
| 96 |
+
" efficiency_value = f1(theta) * f2(theta) * (1 - f1(theta)) * (1 - f2(theta))\n",
|
| 97 |
+
" logic_value = G.nodes['phi']['value']\n",
|
| 98 |
+
" color_value = np.clip(efficiency_value * logic_value, 0, 1)\n",
|
| 99 |
+
" hexagon = patches.RegularPolygon(center, numVertices=6, radius=hex_size, orientation=np.pi/6)\n",
|
| 100 |
+
" hexagon.set_facecolor(plt.cm.viridis(color_value))\n",
|
| 101 |
+
" ax.add_patch(hexagon)\n",
|
| 102 |
+
" ax.set_xlim(domain[0], domain[1])\n",
|
| 103 |
+
" ax.set_ylim(domain[2], domain[3])\n",
|
| 104 |
+
" ax.set_aspect('equal')\n",
|
| 105 |
+
" plt.axis('off')\n",
|
| 106 |
+
" plt.show()\n",
|
| 107 |
+
"\n",
|
| 108 |
+
"# Initialize domain and hex centers for the tessellation\n",
|
| 109 |
+
"domain = (-5, 5, -5, 5)\n",
|
| 110 |
+
"hex_size = 0.5\n",
|
| 111 |
+
"hex_centers = [(i, j) for i in np.arange(domain[0], domain[1], hex_size)\n",
|
| 112 |
+
" for j in np.arange(domain[2], domain[3], hex_size)]\n",
|
| 113 |
+
"\n",
|
| 114 |
+
"# Main interaction loop for the game with user input\n",
|
| 115 |
+
"def run_game_loop():\n",
|
| 116 |
+
" G = create_decision_graph()\n",
|
| 117 |
+
" while True:\n",
|
| 118 |
+
" user_input = input(\"Enter your logic formula (e.g., 'psi_1 & ~psi_2') or 'quit' to exit: \")\n",
|
| 119 |
+
" if user_input.lower() == 'quit':\n",
|
| 120 |
+
" print(\"Exiting game.\")\n",
|
| 121 |
+
" break\n",
|
| 122 |
+
" update_with_user_input(G, user_input)\n",
|
| 123 |
+
" visualize_tessellation(G, domain, hex_centers, hex_size)\n",
|
| 124 |
+
"\n",
|
| 125 |
+
"run_game_loop()"
|
| 126 |
+
]
|
| 127 |
+
}
|
| 128 |
+
]
|
| 129 |
+
}
|
Time_Compass.ipynb
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"nbformat": 4,
|
| 3 |
+
"nbformat_minor": 0,
|
| 4 |
+
"metadata": {
|
| 5 |
+
"colab": {
|
| 6 |
+
"provenance": []
|
| 7 |
+
},
|
| 8 |
+
"kernelspec": {
|
| 9 |
+
"name": "python3",
|
| 10 |
+
"display_name": "Python 3"
|
| 11 |
+
},
|
| 12 |
+
"language_info": {
|
| 13 |
+
"name": "python"
|
| 14 |
+
},
|
| 15 |
+
"widgets": {
|
| 16 |
+
"application/vnd.jupyter.widget-state+json": {
|
| 17 |
+
"9e44858dff7346a59d239e6277e9ada2": {
|
| 18 |
+
"model_module": "@jupyter-widgets/controls",
|
| 19 |
+
"model_name": "VBoxModel",
|
| 20 |
+
"model_module_version": "1.5.0",
|
| 21 |
+
"state": {
|
| 22 |
+
"_dom_classes": [
|
| 23 |
+
"widget-interact"
|
| 24 |
+
],
|
| 25 |
+
"_model_module": "@jupyter-widgets/controls",
|
| 26 |
+
"_model_module_version": "1.5.0",
|
| 27 |
+
"_model_name": "VBoxModel",
|
| 28 |
+
"_view_count": null,
|
| 29 |
+
"_view_module": "@jupyter-widgets/controls",
|
| 30 |
+
"_view_module_version": "1.5.0",
|
| 31 |
+
"_view_name": "VBoxView",
|
| 32 |
+
"box_style": "",
|
| 33 |
+
"children": [
|
| 34 |
+
"IPY_MODEL_7d143e02b44742e98e9d90dce6e73e07",
|
| 35 |
+
"IPY_MODEL_dde7c5211c8e4887b9742d0bfb787b95",
|
| 36 |
+
"IPY_MODEL_11db4dd121b64d9e887377922e9a0801",
|
| 37 |
+
"IPY_MODEL_bba906d60fd14072becd3d16d2061007"
|
| 38 |
+
],
|
| 39 |
+
"layout": "IPY_MODEL_04945aff331f4235a04a9ff2a7cd9db3"
|
| 40 |
+
}
|
| 41 |
+
},
|
| 42 |
+
"7d143e02b44742e98e9d90dce6e73e07": {
|
| 43 |
+
"model_module": "@jupyter-widgets/controls",
|
| 44 |
+
"model_name": "FloatSliderModel",
|
| 45 |
+
"model_module_version": "1.5.0",
|
| 46 |
+
"state": {
|
| 47 |
+
"_dom_classes": [],
|
| 48 |
+
"_model_module": "@jupyter-widgets/controls",
|
| 49 |
+
"_model_module_version": "1.5.0",
|
| 50 |
+
"_model_name": "FloatSliderModel",
|
| 51 |
+
"_view_count": null,
|
| 52 |
+
"_view_module": "@jupyter-widgets/controls",
|
| 53 |
+
"_view_module_version": "1.5.0",
|
| 54 |
+
"_view_name": "FloatSliderView",
|
| 55 |
+
"continuous_update": true,
|
| 56 |
+
"description": "Time (s)",
|
| 57 |
+
"description_tooltip": null,
|
| 58 |
+
"disabled": false,
|
| 59 |
+
"layout": "IPY_MODEL_b14c7219dc3241b08d671dc8264a4de8",
|
| 60 |
+
"max": 10,
|
| 61 |
+
"min": 0,
|
| 62 |
+
"orientation": "horizontal",
|
| 63 |
+
"readout": true,
|
| 64 |
+
"readout_format": ".2f",
|
| 65 |
+
"step": 0.1,
|
| 66 |
+
"style": "IPY_MODEL_4df1f6b3e3cd457fb4983653a69ad538",
|
| 67 |
+
"value": 0
|
| 68 |
+
}
|
| 69 |
+
},
|
| 70 |
+
"dde7c5211c8e4887b9742d0bfb787b95": {
|
| 71 |
+
"model_module": "@jupyter-widgets/controls",
|
| 72 |
+
"model_name": "FloatSliderModel",
|
| 73 |
+
"model_module_version": "1.5.0",
|
| 74 |
+
"state": {
|
| 75 |
+
"_dom_classes": [],
|
| 76 |
+
"_model_module": "@jupyter-widgets/controls",
|
| 77 |
+
"_model_module_version": "1.5.0",
|
| 78 |
+
"_model_name": "FloatSliderModel",
|
| 79 |
+
"_view_count": null,
|
| 80 |
+
"_view_module": "@jupyter-widgets/controls",
|
| 81 |
+
"_view_module_version": "1.5.0",
|
| 82 |
+
"_view_name": "FloatSliderView",
|
| 83 |
+
"continuous_update": true,
|
| 84 |
+
"description": "Radius (m)",
|
| 85 |
+
"description_tooltip": null,
|
| 86 |
+
"disabled": false,
|
| 87 |
+
"layout": "IPY_MODEL_202bfe4b85504be6b0f0aec2c0077240",
|
| 88 |
+
"max": 10,
|
| 89 |
+
"min": 1,
|
| 90 |
+
"orientation": "horizontal",
|
| 91 |
+
"readout": true,
|
| 92 |
+
"readout_format": ".2f",
|
| 93 |
+
"step": 0.5,
|
| 94 |
+
"style": "IPY_MODEL_9b1058f0d6db4849bfc79839fd3a4afb",
|
| 95 |
+
"value": 5
|
| 96 |
+
}
|
| 97 |
+
},
|
| 98 |
+
"11db4dd121b64d9e887377922e9a0801": {
|
| 99 |
+
"model_module": "@jupyter-widgets/controls",
|
| 100 |
+
"model_name": "FloatSliderModel",
|
| 101 |
+
"model_module_version": "1.5.0",
|
| 102 |
+
"state": {
|
| 103 |
+
"_dom_classes": [],
|
| 104 |
+
"_model_module": "@jupyter-widgets/controls",
|
| 105 |
+
"_model_module_version": "1.5.0",
|
| 106 |
+
"_model_name": "FloatSliderModel",
|
| 107 |
+
"_view_count": null,
|
| 108 |
+
"_view_module": "@jupyter-widgets/controls",
|
| 109 |
+
"_view_module_version": "1.5.0",
|
| 110 |
+
"_view_name": "FloatSliderView",
|
| 111 |
+
"continuous_update": true,
|
| 112 |
+
"description": "Ang. Vel. (rad/s)",
|
| 113 |
+
"description_tooltip": null,
|
| 114 |
+
"disabled": false,
|
| 115 |
+
"layout": "IPY_MODEL_15c464f4c74547dda0e97d451c3cb0fc",
|
| 116 |
+
"max": 12.566370614359172,
|
| 117 |
+
"min": 0,
|
| 118 |
+
"orientation": "horizontal",
|
| 119 |
+
"readout": true,
|
| 120 |
+
"readout_format": ".2f",
|
| 121 |
+
"step": 0.3141592653589793,
|
| 122 |
+
"style": "IPY_MODEL_c1a877c8c0a0406ba87d40688d8eafe4",
|
| 123 |
+
"value": 6.283185307179586
|
| 124 |
+
}
|
| 125 |
+
},
|
| 126 |
+
"bba906d60fd14072becd3d16d2061007": {
|
| 127 |
+
"model_module": "@jupyter-widgets/output",
|
| 128 |
+
"model_name": "OutputModel",
|
| 129 |
+
"model_module_version": "1.0.0",
|
| 130 |
+
"state": {
|
| 131 |
+
"_dom_classes": [],
|
| 132 |
+
"_model_module": "@jupyter-widgets/output",
|
| 133 |
+
"_model_module_version": "1.0.0",
|
| 134 |
+
"_model_name": "OutputModel",
|
| 135 |
+
"_view_count": null,
|
| 136 |
+
"_view_module": "@jupyter-widgets/output",
|
| 137 |
+
"_view_module_version": "1.0.0",
|
| 138 |
+
"_view_name": "OutputView",
|
| 139 |
+
"layout": "IPY_MODEL_3e2705861f7f4e35bf9ec42e9cc1b27a",
|
| 140 |
+
"msg_id": "",
|
| 141 |
+
"outputs": [
|
| 142 |
+
{
|
| 143 |
+
"output_type": "display_data",
|
| 144 |
+
"data": {
|
| 145 |
+
"text/plain": "<Figure size 640x480 with 1 Axes>",
|
| 146 |
+
"image/png": "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\n"
|
| 147 |
+
},
|
| 148 |
+
"metadata": {}
|
| 149 |
+
}
|
| 150 |
+
]
|
| 151 |
+
}
|
| 152 |
+
},
|
| 153 |
+
"04945aff331f4235a04a9ff2a7cd9db3": {
|
| 154 |
+
"model_module": "@jupyter-widgets/base",
|
| 155 |
+
"model_name": "LayoutModel",
|
| 156 |
+
"model_module_version": "1.2.0",
|
| 157 |
+
"state": {
|
| 158 |
+
"_model_module": "@jupyter-widgets/base",
|
| 159 |
+
"_model_module_version": "1.2.0",
|
| 160 |
+
"_model_name": "LayoutModel",
|
| 161 |
+
"_view_count": null,
|
| 162 |
+
"_view_module": "@jupyter-widgets/base",
|
| 163 |
+
"_view_module_version": "1.2.0",
|
| 164 |
+
"_view_name": "LayoutView",
|
| 165 |
+
"align_content": null,
|
| 166 |
+
"align_items": null,
|
| 167 |
+
"align_self": null,
|
| 168 |
+
"border": null,
|
| 169 |
+
"bottom": null,
|
| 170 |
+
"display": null,
|
| 171 |
+
"flex": null,
|
| 172 |
+
"flex_flow": null,
|
| 173 |
+
"grid_area": null,
|
| 174 |
+
"grid_auto_columns": null,
|
| 175 |
+
"grid_auto_flow": null,
|
| 176 |
+
"grid_auto_rows": null,
|
| 177 |
+
"grid_column": null,
|
| 178 |
+
"grid_gap": null,
|
| 179 |
+
"grid_row": null,
|
| 180 |
+
"grid_template_areas": null,
|
| 181 |
+
"grid_template_columns": null,
|
| 182 |
+
"grid_template_rows": null,
|
| 183 |
+
"height": null,
|
| 184 |
+
"justify_content": null,
|
| 185 |
+
"justify_items": null,
|
| 186 |
+
"left": null,
|
| 187 |
+
"margin": null,
|
| 188 |
+
"max_height": null,
|
| 189 |
+
"max_width": null,
|
| 190 |
+
"min_height": null,
|
| 191 |
+
"min_width": null,
|
| 192 |
+
"object_fit": null,
|
| 193 |
+
"object_position": null,
|
| 194 |
+
"order": null,
|
| 195 |
+
"overflow": null,
|
| 196 |
+
"overflow_x": null,
|
| 197 |
+
"overflow_y": null,
|
| 198 |
+
"padding": null,
|
| 199 |
+
"right": null,
|
| 200 |
+
"top": null,
|
| 201 |
+
"visibility": null,
|
| 202 |
+
"width": null
|
| 203 |
+
}
|
| 204 |
+
},
|
| 205 |
+
"b14c7219dc3241b08d671dc8264a4de8": {
|
| 206 |
+
"model_module": "@jupyter-widgets/base",
|
| 207 |
+
"model_name": "LayoutModel",
|
| 208 |
+
"model_module_version": "1.2.0",
|
| 209 |
+
"state": {
|
| 210 |
+
"_model_module": "@jupyter-widgets/base",
|
| 211 |
+
"_model_module_version": "1.2.0",
|
| 212 |
+
"_model_name": "LayoutModel",
|
| 213 |
+
"_view_count": null,
|
| 214 |
+
"_view_module": "@jupyter-widgets/base",
|
| 215 |
+
"_view_module_version": "1.2.0",
|
| 216 |
+
"_view_name": "LayoutView",
|
| 217 |
+
"align_content": null,
|
| 218 |
+
"align_items": null,
|
| 219 |
+
"align_self": null,
|
| 220 |
+
"border": null,
|
| 221 |
+
"bottom": null,
|
| 222 |
+
"display": null,
|
| 223 |
+
"flex": null,
|
| 224 |
+
"flex_flow": null,
|
| 225 |
+
"grid_area": null,
|
| 226 |
+
"grid_auto_columns": null,
|
| 227 |
+
"grid_auto_flow": null,
|
| 228 |
+
"grid_auto_rows": null,
|
| 229 |
+
"grid_column": null,
|
| 230 |
+
"grid_gap": null,
|
| 231 |
+
"grid_row": null,
|
| 232 |
+
"grid_template_areas": null,
|
| 233 |
+
"grid_template_columns": null,
|
| 234 |
+
"grid_template_rows": null,
|
| 235 |
+
"height": null,
|
| 236 |
+
"justify_content": null,
|
| 237 |
+
"justify_items": null,
|
| 238 |
+
"left": null,
|
| 239 |
+
"margin": null,
|
| 240 |
+
"max_height": null,
|
| 241 |
+
"max_width": null,
|
| 242 |
+
"min_height": null,
|
| 243 |
+
"min_width": null,
|
| 244 |
+
"object_fit": null,
|
| 245 |
+
"object_position": null,
|
| 246 |
+
"order": null,
|
| 247 |
+
"overflow": null,
|
| 248 |
+
"overflow_x": null,
|
| 249 |
+
"overflow_y": null,
|
| 250 |
+
"padding": null,
|
| 251 |
+
"right": null,
|
| 252 |
+
"top": null,
|
| 253 |
+
"visibility": null,
|
| 254 |
+
"width": null
|
| 255 |
+
}
|
| 256 |
+
},
|
| 257 |
+
"4df1f6b3e3cd457fb4983653a69ad538": {
|
| 258 |
+
"model_module": "@jupyter-widgets/controls",
|
| 259 |
+
"model_name": "SliderStyleModel",
|
| 260 |
+
"model_module_version": "1.5.0",
|
| 261 |
+
"state": {
|
| 262 |
+
"_model_module": "@jupyter-widgets/controls",
|
| 263 |
+
"_model_module_version": "1.5.0",
|
| 264 |
+
"_model_name": "SliderStyleModel",
|
| 265 |
+
"_view_count": null,
|
| 266 |
+
"_view_module": "@jupyter-widgets/base",
|
| 267 |
+
"_view_module_version": "1.2.0",
|
| 268 |
+
"_view_name": "StyleView",
|
| 269 |
+
"description_width": "",
|
| 270 |
+
"handle_color": null
|
| 271 |
+
}
|
| 272 |
+
},
|
| 273 |
+
"202bfe4b85504be6b0f0aec2c0077240": {
|
| 274 |
+
"model_module": "@jupyter-widgets/base",
|
| 275 |
+
"model_name": "LayoutModel",
|
| 276 |
+
"model_module_version": "1.2.0",
|
| 277 |
+
"state": {
|
| 278 |
+
"_model_module": "@jupyter-widgets/base",
|
| 279 |
+
"_model_module_version": "1.2.0",
|
| 280 |
+
"_model_name": "LayoutModel",
|
| 281 |
+
"_view_count": null,
|
| 282 |
+
"_view_module": "@jupyter-widgets/base",
|
| 283 |
+
"_view_module_version": "1.2.0",
|
| 284 |
+
"_view_name": "LayoutView",
|
| 285 |
+
"align_content": null,
|
| 286 |
+
"align_items": null,
|
| 287 |
+
"align_self": null,
|
| 288 |
+
"border": null,
|
| 289 |
+
"bottom": null,
|
| 290 |
+
"display": null,
|
| 291 |
+
"flex": null,
|
| 292 |
+
"flex_flow": null,
|
| 293 |
+
"grid_area": null,
|
| 294 |
+
"grid_auto_columns": null,
|
| 295 |
+
"grid_auto_flow": null,
|
| 296 |
+
"grid_auto_rows": null,
|
| 297 |
+
"grid_column": null,
|
| 298 |
+
"grid_gap": null,
|
| 299 |
+
"grid_row": null,
|
| 300 |
+
"grid_template_areas": null,
|
| 301 |
+
"grid_template_columns": null,
|
| 302 |
+
"grid_template_rows": null,
|
| 303 |
+
"height": null,
|
| 304 |
+
"justify_content": null,
|
| 305 |
+
"justify_items": null,
|
| 306 |
+
"left": null,
|
| 307 |
+
"margin": null,
|
| 308 |
+
"max_height": null,
|
| 309 |
+
"max_width": null,
|
| 310 |
+
"min_height": null,
|
| 311 |
+
"min_width": null,
|
| 312 |
+
"object_fit": null,
|
| 313 |
+
"object_position": null,
|
| 314 |
+
"order": null,
|
| 315 |
+
"overflow": null,
|
| 316 |
+
"overflow_x": null,
|
| 317 |
+
"overflow_y": null,
|
| 318 |
+
"padding": null,
|
| 319 |
+
"right": null,
|
| 320 |
+
"top": null,
|
| 321 |
+
"visibility": null,
|
| 322 |
+
"width": null
|
| 323 |
+
}
|
| 324 |
+
},
|
| 325 |
+
"9b1058f0d6db4849bfc79839fd3a4afb": {
|
| 326 |
+
"model_module": "@jupyter-widgets/controls",
|
| 327 |
+
"model_name": "SliderStyleModel",
|
| 328 |
+
"model_module_version": "1.5.0",
|
| 329 |
+
"state": {
|
| 330 |
+
"_model_module": "@jupyter-widgets/controls",
|
| 331 |
+
"_model_module_version": "1.5.0",
|
| 332 |
+
"_model_name": "SliderStyleModel",
|
| 333 |
+
"_view_count": null,
|
| 334 |
+
"_view_module": "@jupyter-widgets/base",
|
| 335 |
+
"_view_module_version": "1.2.0",
|
| 336 |
+
"_view_name": "StyleView",
|
| 337 |
+
"description_width": "",
|
| 338 |
+
"handle_color": null
|
| 339 |
+
}
|
| 340 |
+
},
|
| 341 |
+
"15c464f4c74547dda0e97d451c3cb0fc": {
|
| 342 |
+
"model_module": "@jupyter-widgets/base",
|
| 343 |
+
"model_name": "LayoutModel",
|
| 344 |
+
"model_module_version": "1.2.0",
|
| 345 |
+
"state": {
|
| 346 |
+
"_model_module": "@jupyter-widgets/base",
|
| 347 |
+
"_model_module_version": "1.2.0",
|
| 348 |
+
"_model_name": "LayoutModel",
|
| 349 |
+
"_view_count": null,
|
| 350 |
+
"_view_module": "@jupyter-widgets/base",
|
| 351 |
+
"_view_module_version": "1.2.0",
|
| 352 |
+
"_view_name": "LayoutView",
|
| 353 |
+
"align_content": null,
|
| 354 |
+
"align_items": null,
|
| 355 |
+
"align_self": null,
|
| 356 |
+
"border": null,
|
| 357 |
+
"bottom": null,
|
| 358 |
+
"display": null,
|
| 359 |
+
"flex": null,
|
| 360 |
+
"flex_flow": null,
|
| 361 |
+
"grid_area": null,
|
| 362 |
+
"grid_auto_columns": null,
|
| 363 |
+
"grid_auto_flow": null,
|
| 364 |
+
"grid_auto_rows": null,
|
| 365 |
+
"grid_column": null,
|
| 366 |
+
"grid_gap": null,
|
| 367 |
+
"grid_row": null,
|
| 368 |
+
"grid_template_areas": null,
|
| 369 |
+
"grid_template_columns": null,
|
| 370 |
+
"grid_template_rows": null,
|
| 371 |
+
"height": null,
|
| 372 |
+
"justify_content": null,
|
| 373 |
+
"justify_items": null,
|
| 374 |
+
"left": null,
|
| 375 |
+
"margin": null,
|
| 376 |
+
"max_height": null,
|
| 377 |
+
"max_width": null,
|
| 378 |
+
"min_height": null,
|
| 379 |
+
"min_width": null,
|
| 380 |
+
"object_fit": null,
|
| 381 |
+
"object_position": null,
|
| 382 |
+
"order": null,
|
| 383 |
+
"overflow": null,
|
| 384 |
+
"overflow_x": null,
|
| 385 |
+
"overflow_y": null,
|
| 386 |
+
"padding": null,
|
| 387 |
+
"right": null,
|
| 388 |
+
"top": null,
|
| 389 |
+
"visibility": null,
|
| 390 |
+
"width": null
|
| 391 |
+
}
|
| 392 |
+
},
|
| 393 |
+
"c1a877c8c0a0406ba87d40688d8eafe4": {
|
| 394 |
+
"model_module": "@jupyter-widgets/controls",
|
| 395 |
+
"model_name": "SliderStyleModel",
|
| 396 |
+
"model_module_version": "1.5.0",
|
| 397 |
+
"state": {
|
| 398 |
+
"_model_module": "@jupyter-widgets/controls",
|
| 399 |
+
"_model_module_version": "1.5.0",
|
| 400 |
+
"_model_name": "SliderStyleModel",
|
| 401 |
+
"_view_count": null,
|
| 402 |
+
"_view_module": "@jupyter-widgets/base",
|
| 403 |
+
"_view_module_version": "1.2.0",
|
| 404 |
+
"_view_name": "StyleView",
|
| 405 |
+
"description_width": "",
|
| 406 |
+
"handle_color": null
|
| 407 |
+
}
|
| 408 |
+
},
|
| 409 |
+
"3e2705861f7f4e35bf9ec42e9cc1b27a": {
|
| 410 |
+
"model_module": "@jupyter-widgets/base",
|
| 411 |
+
"model_name": "LayoutModel",
|
| 412 |
+
"model_module_version": "1.2.0",
|
| 413 |
+
"state": {
|
| 414 |
+
"_model_module": "@jupyter-widgets/base",
|
| 415 |
+
"_model_module_version": "1.2.0",
|
| 416 |
+
"_model_name": "LayoutModel",
|
| 417 |
+
"_view_count": null,
|
| 418 |
+
"_view_module": "@jupyter-widgets/base",
|
| 419 |
+
"_view_module_version": "1.2.0",
|
| 420 |
+
"_view_name": "LayoutView",
|
| 421 |
+
"align_content": null,
|
| 422 |
+
"align_items": null,
|
| 423 |
+
"align_self": null,
|
| 424 |
+
"border": null,
|
| 425 |
+
"bottom": null,
|
| 426 |
+
"display": null,
|
| 427 |
+
"flex": null,
|
| 428 |
+
"flex_flow": null,
|
| 429 |
+
"grid_area": null,
|
| 430 |
+
"grid_auto_columns": null,
|
| 431 |
+
"grid_auto_flow": null,
|
| 432 |
+
"grid_auto_rows": null,
|
| 433 |
+
"grid_column": null,
|
| 434 |
+
"grid_gap": null,
|
| 435 |
+
"grid_row": null,
|
| 436 |
+
"grid_template_areas": null,
|
| 437 |
+
"grid_template_columns": null,
|
| 438 |
+
"grid_template_rows": null,
|
| 439 |
+
"height": null,
|
| 440 |
+
"justify_content": null,
|
| 441 |
+
"justify_items": null,
|
| 442 |
+
"left": null,
|
| 443 |
+
"margin": null,
|
| 444 |
+
"max_height": null,
|
| 445 |
+
"max_width": null,
|
| 446 |
+
"min_height": null,
|
| 447 |
+
"min_width": null,
|
| 448 |
+
"object_fit": null,
|
| 449 |
+
"object_position": null,
|
| 450 |
+
"order": null,
|
| 451 |
+
"overflow": null,
|
| 452 |
+
"overflow_x": null,
|
| 453 |
+
"overflow_y": null,
|
| 454 |
+
"padding": null,
|
| 455 |
+
"right": null,
|
| 456 |
+
"top": null,
|
| 457 |
+
"visibility": null,
|
| 458 |
+
"width": null
|
| 459 |
+
}
|
| 460 |
+
}
|
| 461 |
+
}
|
| 462 |
+
}
|
| 463 |
+
},
|
| 464 |
+
"cells": [
|
| 465 |
+
{
|
| 466 |
+
"cell_type": "code",
|
| 467 |
+
"execution_count": 1,
|
| 468 |
+
"metadata": {
|
| 469 |
+
"id": "DI0ijo6JuMkJ",
|
| 470 |
+
"outputId": "0f8880db-f2d2-4684-e15f-aebe248d2fc7",
|
| 471 |
+
"colab": {
|
| 472 |
+
"base_uri": "https://localhost:8080/",
|
| 473 |
+
"height": 562,
|
| 474 |
+
"referenced_widgets": [
|
| 475 |
+
"9e44858dff7346a59d239e6277e9ada2",
|
| 476 |
+
"7d143e02b44742e98e9d90dce6e73e07",
|
| 477 |
+
"dde7c5211c8e4887b9742d0bfb787b95",
|
| 478 |
+
"11db4dd121b64d9e887377922e9a0801",
|
| 479 |
+
"bba906d60fd14072becd3d16d2061007",
|
| 480 |
+
"04945aff331f4235a04a9ff2a7cd9db3",
|
| 481 |
+
"b14c7219dc3241b08d671dc8264a4de8",
|
| 482 |
+
"4df1f6b3e3cd457fb4983653a69ad538",
|
| 483 |
+
"202bfe4b85504be6b0f0aec2c0077240",
|
| 484 |
+
"9b1058f0d6db4849bfc79839fd3a4afb",
|
| 485 |
+
"15c464f4c74547dda0e97d451c3cb0fc",
|
| 486 |
+
"c1a877c8c0a0406ba87d40688d8eafe4",
|
| 487 |
+
"3e2705861f7f4e35bf9ec42e9cc1b27a"
|
| 488 |
+
]
|
| 489 |
+
}
|
| 490 |
+
},
|
| 491 |
+
"outputs": [
|
| 492 |
+
{
|
| 493 |
+
"output_type": "display_data",
|
| 494 |
+
"data": {
|
| 495 |
+
"text/plain": [
|
| 496 |
+
"interactive(children=(FloatSlider(value=0.0, description='Time (s)', max=10.0), FloatSlider(value=5.0, descrip…"
|
| 497 |
+
],
|
| 498 |
+
"application/vnd.jupyter.widget-view+json": {
|
| 499 |
+
"version_major": 2,
|
| 500 |
+
"version_minor": 0,
|
| 501 |
+
"model_id": "9e44858dff7346a59d239e6277e9ada2"
|
| 502 |
+
}
|
| 503 |
+
},
|
| 504 |
+
"metadata": {}
|
| 505 |
+
},
|
| 506 |
+
{
|
| 507 |
+
"output_type": "execute_result",
|
| 508 |
+
"data": {
|
| 509 |
+
"text/plain": [
|
| 510 |
+
"<function __main__.visualize_circular_motion(t, R, omega)>"
|
| 511 |
+
]
|
| 512 |
+
},
|
| 513 |
+
"metadata": {},
|
| 514 |
+
"execution_count": 1
|
| 515 |
+
}
|
| 516 |
+
],
|
| 517 |
+
"source": [
|
| 518 |
+
"import ipywidgets as widgets\n",
|
| 519 |
+
"from IPython.display import display\n",
|
| 520 |
+
"import numpy as np\n",
|
| 521 |
+
"import matplotlib.pyplot as plt\n",
|
| 522 |
+
"\n",
|
| 523 |
+
"# Constants\n",
|
| 524 |
+
"R = 5 # Radius of the circle\n",
|
| 525 |
+
"omega = 2 * np.pi # Angular velocity (in radians per second)\n",
|
| 526 |
+
"t_max = 10 # Maximum time\n",
|
| 527 |
+
"\n",
|
| 528 |
+
"# Create sliders for time, radius and angular velocity\n",
|
| 529 |
+
"t_slider = widgets.FloatSlider(value=0, min=0, max=t_max, step=0.1, description=\"Time (s)\")\n",
|
| 530 |
+
"R_slider = widgets.FloatSlider(value=R, min=1, max=10, step=0.5, description=\"Radius (m)\")\n",
|
| 531 |
+
"omega_slider = widgets.FloatSlider(value=omega, min=0, max=4*np.pi, step=0.1*np.pi, description=\"Ang. Vel. (rad/s)\")\n",
|
| 532 |
+
"\n",
|
| 533 |
+
"# Define function to create the visualization\n",
|
| 534 |
+
"def visualize_circular_motion(t, R, omega):\n",
|
| 535 |
+
" # Calculate position\n",
|
| 536 |
+
" x = R * np.cos(omega * t)\n",
|
| 537 |
+
" y = R * np.sin(omega * t)\n",
|
| 538 |
+
"\n",
|
| 539 |
+
" # Create figure and axes\n",
|
| 540 |
+
" fig, ax = plt.subplots()\n",
|
| 541 |
+
"\n",
|
| 542 |
+
" # Draw circle\n",
|
| 543 |
+
" circle = plt.Circle((0, 0), R, color='blue', fill=False)\n",
|
| 544 |
+
" ax.add_artist(circle)\n",
|
| 545 |
+
"\n",
|
| 546 |
+
" # Draw path up to current time\n",
|
| 547 |
+
" t_points = np.linspace(0, t, 100)\n",
|
| 548 |
+
" x_path = R * np.cos(omega * t_points)\n",
|
| 549 |
+
" y_path = R * np.sin(omega * t_points)\n",
|
| 550 |
+
" ax.plot(x_path, y_path, color='gray', linestyle='--')\n",
|
| 551 |
+
"\n",
|
| 552 |
+
" # Draw arrow representing the particle\n",
|
| 553 |
+
" ax.arrow(0, 0, x, y, head_width=R/20, head_length=R/15, fc='red', ec='red')\n",
|
| 554 |
+
"\n",
|
| 555 |
+
" # Scatter for the particle\n",
|
| 556 |
+
" ax.scatter(x, y, color='red')\n",
|
| 557 |
+
"\n",
|
| 558 |
+
" # Labels and limits\n",
|
| 559 |
+
" ax.set_xlabel(\"x (m)\")\n",
|
| 560 |
+
" ax.set_ylabel(\"y (m)\")\n",
|
| 561 |
+
" ax.set_xlim(-R * 1.5, R * 1.5)\n",
|
| 562 |
+
" ax.set_ylim(-R * 1.5, R * 1.5)\n",
|
| 563 |
+
" ax.set_aspect('equal')\n",
|
| 564 |
+
"\n",
|
| 565 |
+
" # Display the plot\n",
|
| 566 |
+
" plt.show()\n",
|
| 567 |
+
"\n",
|
| 568 |
+
"# Link sliders to visualization function\n",
|
| 569 |
+
"widgets.interact(visualize_circular_motion, t=t_slider, R=R_slider, omega=omega_slider)"
|
| 570 |
+
]
|
| 571 |
+
}
|
| 572 |
+
]
|
| 573 |
+
}
|
factorial_digit_occurences.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
hexagon_tessellation_games_of_quasi_quanta_topology.py
ADDED
|
@@ -0,0 +1,524 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""Hexagon Tessellation Games of Quasi-Quanta Topology.ipynb
|
| 3 |
+
|
| 4 |
+
Automatically generated by Colaboratory.
|
| 5 |
+
|
| 6 |
+
Original file is located at
|
| 7 |
+
https://colab.research.google.com/drive/1n7F2MMnnidIpOPBGPLi8tyL9OiffAqjU
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
import numpy as np
|
| 11 |
+
import matplotlib.pyplot as plt
|
| 12 |
+
import matplotlib.patches as patches
|
| 13 |
+
import networkx as nx
|
| 14 |
+
|
| 15 |
+
# Define a safe division function to avoid division by zero
|
| 16 |
+
def safe_divide(num, den):
|
| 17 |
+
if np.abs(den) < 1e-10:
|
| 18 |
+
return 0
|
| 19 |
+
return num / den
|
| 20 |
+
|
| 21 |
+
# Functions f1 and f2 corrected for divide by zero
|
| 22 |
+
def f1(theta):
|
| 23 |
+
if np.abs(theta) < 1e-10: # Close to zero
|
| 24 |
+
return 0
|
| 25 |
+
return np.arcsin(np.sin(theta)) + (np.pi / 2) * (1 - safe_divide(np.pi, (2 * theta)))
|
| 26 |
+
|
| 27 |
+
def f2(theta):
|
| 28 |
+
if np.abs(theta) < 1e-10: # Close to zero
|
| 29 |
+
return 0
|
| 30 |
+
return np.arcsin(np.cos(theta)) + (np.pi / 2) * (1 - safe_divide(np.pi, (2 * theta)))
|
| 31 |
+
|
| 32 |
+
# Define decision graph for logic modulation
|
| 33 |
+
def create_decision_graph():
|
| 34 |
+
G = nx.DiGraph()
|
| 35 |
+
# Define logical nodes for quantifiers and logic operations
|
| 36 |
+
logical_nodes = ['phi_eq_psi', 'some_other_node'] # Adjust as needed
|
| 37 |
+
for node in logical_nodes:
|
| 38 |
+
G.add_node(node, value=np.random.rand()) # Assign random values for demonstration
|
| 39 |
+
return G
|
| 40 |
+
|
| 41 |
+
G = create_decision_graph()
|
| 42 |
+
|
| 43 |
+
# Define a logic vector calculation
|
| 44 |
+
def logic_vector(G, node_name):
|
| 45 |
+
# Placeholder function, retrieves the assigned 'value' attribute from the node
|
| 46 |
+
return G.nodes[node_name]['value']
|
| 47 |
+
|
| 48 |
+
# Tessellation visualization (corrected)
|
| 49 |
+
def visualize_tessellation(G, domain, hex_centers, hex_size):
|
| 50 |
+
fig, ax = plt.subplots()
|
| 51 |
+
|
| 52 |
+
# Loop through each hexagon center
|
| 53 |
+
for center in hex_centers:
|
| 54 |
+
x, y = center
|
| 55 |
+
theta = np.arctan2(y, x)
|
| 56 |
+
efficiency_value = f1(theta) * f2(theta) # Combine f1 and f2
|
| 57 |
+
|
| 58 |
+
# Fetch value from decision graph
|
| 59 |
+
decision_value = logic_vector(G, 'phi_eq_psi')
|
| 60 |
+
|
| 61 |
+
# Adjust efficiency based on decision value
|
| 62 |
+
adjusted_efficiency = efficiency_value * decision_value
|
| 63 |
+
|
| 64 |
+
# Create and draw hexagon
|
| 65 |
+
hexagon = patches.RegularPolygon(center, numVertices=6, radius=hex_size, orientation=np.pi/6)
|
| 66 |
+
color_value = adjusted_efficiency # Map this to a valid color range if necessary
|
| 67 |
+
|
| 68 |
+
# Set color and add hexagon patch to the plot
|
| 69 |
+
hexagon.set_facecolor(plt.cm.viridis(color_value))
|
| 70 |
+
ax.add_patch(hexagon)
|
| 71 |
+
|
| 72 |
+
ax.set_xlim(domain[0], domain[1])
|
| 73 |
+
ax.set_ylim(domain[2], domain[3])
|
| 74 |
+
ax.set_aspect('equal') # Equal aspect ratio for x and y dimensions
|
| 75 |
+
plt.axis('off') # Turn off axis lines and labels
|
| 76 |
+
plt.show()
|
| 77 |
+
|
| 78 |
+
# Define the domain and hexagon center grid
|
| 79 |
+
domain = (-5, 5, -5, 5) # Domain for plotting
|
| 80 |
+
hex_size = 0.5 # Size of hexagons
|
| 81 |
+
|
| 82 |
+
# Construct hexagon centers
|
| 83 |
+
hex_centers = [(i, j) for i in np.arange(domain[0] + hex_size, domain[1], 3*hex_size * np.sqrt(3)/2)
|
| 84 |
+
for j in np.arange(domain[2] + hex_size, domain[3], 3*hex_size)]
|
| 85 |
+
|
| 86 |
+
# Check if we're on an even row to create the staggered hexagonal lattice
|
| 87 |
+
for i, center in enumerate(hex_centers):
|
| 88 |
+
if int((center[1] - domain[2]) / (3 * hex_size)) % 2 == 0:
|
| 89 |
+
hex_centers[i] = (center[0] + (1.5 * hex_size * (3/2)), center[1])
|
| 90 |
+
|
| 91 |
+
# Visualize the tessellated surface
|
| 92 |
+
visualize_tessellation(G, domain, hex_centers, hex_size)
|
| 93 |
+
|
| 94 |
+
import numpy as np
|
| 95 |
+
import matplotlib.pyplot as plt
|
| 96 |
+
import matplotlib.patches as patches
|
| 97 |
+
import sympy as sp
|
| 98 |
+
import networkx as nx
|
| 99 |
+
|
| 100 |
+
# Constants
|
| 101 |
+
theta_inf = 2 * np.pi
|
| 102 |
+
r = 0.5
|
| 103 |
+
|
| 104 |
+
# Functions f1 and f2
|
| 105 |
+
def f1(theta):
|
| 106 |
+
if theta == 0:
|
| 107 |
+
return np.pi / 2
|
| 108 |
+
return np.arcsin(np.sin(theta)) + (np.pi / 2) * (1 - np.pi / (2 * theta))
|
| 109 |
+
|
| 110 |
+
def f2(theta):
|
| 111 |
+
if theta == 0:
|
| 112 |
+
return np.pi / 2
|
| 113 |
+
return np.arcsin(np.cos(theta)) + (np.pi / 2) * (1 - np.pi / (2 * theta))
|
| 114 |
+
|
| 115 |
+
# Define decision graph for logic modulation
|
| 116 |
+
def create_decision_graph():
|
| 117 |
+
G = nx.DiGraph()
|
| 118 |
+
logical_nodes = ['psi_1', 'psi_2', 'omega', 'phi']
|
| 119 |
+
for node in logical_nodes:
|
| 120 |
+
G.add_node(node, value=np.random.rand())
|
| 121 |
+
return G
|
| 122 |
+
|
| 123 |
+
# Logic vector and logic operations
|
| 124 |
+
def update_logic_vector(G, logic_expr):
|
| 125 |
+
G.nodes['phi']['value'] = logic_expr # Update the logic value based on user input
|
| 126 |
+
|
| 127 |
+
# Function to randomly update the logic values for demonstration purposes
|
| 128 |
+
def random_logic_update(G):
|
| 129 |
+
for node in G:
|
| 130 |
+
G.nodes[node]['value'] = np.random.rand()
|
| 131 |
+
|
| 132 |
+
# Tessellation visualization
|
| 133 |
+
def visualize_tessellation(G, domain, hex_centers, hex_size):
|
| 134 |
+
plt.ion()
|
| 135 |
+
fig, ax = plt.subplots()
|
| 136 |
+
for center in hex_centers:
|
| 137 |
+
x, y = center
|
| 138 |
+
theta = np.arctan2(y, x) if x != 0 else np.pi / 2
|
| 139 |
+
efficiency_value = f1(theta) * f2(theta)
|
| 140 |
+
logic_values = [G.nodes[node]['value'] for node in G]
|
| 141 |
+
decision_value = np.mean(logic_values)
|
| 142 |
+
adjusted_efficiency = efficiency_value * decision_value
|
| 143 |
+
hexagon = patches.RegularPolygon(center, numVertices=6, radius=hex_size, orientation=np.pi/6)
|
| 144 |
+
color_value = np.clip(adjusted_efficiency, 0, 1)
|
| 145 |
+
hexagon.set_facecolor(plt.cm.viridis(color_value))
|
| 146 |
+
ax.add_patch(hexagon)
|
| 147 |
+
ax.set_xlim(domain[0], domain[1])
|
| 148 |
+
ax.set_ylim(domain[2], domain[3])
|
| 149 |
+
ax.set_aspect('equal')
|
| 150 |
+
plt.axis('off')
|
| 151 |
+
plt.show()
|
| 152 |
+
|
| 153 |
+
# Domain and hexagon size for tessellation
|
| 154 |
+
domain = (-5, 5, -5, 5)
|
| 155 |
+
hex_size = 0.5
|
| 156 |
+
|
| 157 |
+
# Construct hexagon centers
|
| 158 |
+
hex_centers = [(i, j) for i in np.arange(domain[0], domain[1], hex_size)
|
| 159 |
+
for j in np.arange(domain[2], domain[3], hex_size)]
|
| 160 |
+
|
| 161 |
+
# Create decision graph with random node values
|
| 162 |
+
G = create_decision_graph()
|
| 163 |
+
|
| 164 |
+
# Simulation loop
|
| 165 |
+
for _ in range(16): # Simulate user input and updating the graph 3 times
|
| 166 |
+
# Randomly update the logic values
|
| 167 |
+
random_logic_update(G)
|
| 168 |
+
# Re-visualize the updated tessellation
|
| 169 |
+
visualize_tessellation(G, domain, hex_centers, hex_size)
|
| 170 |
+
plt.pause(1) # Pause for visual effect
|
| 171 |
+
|
| 172 |
+
plt.ioff() # Turn off interactive mode
|
| 173 |
+
plt.show()
|
| 174 |
+
|
| 175 |
+
import ipywidgets as widgets
|
| 176 |
+
import numpy as np
|
| 177 |
+
import matplotlib.pyplot as plt
|
| 178 |
+
import matplotlib.patches as patches
|
| 179 |
+
from IPython.display import clear_output
|
| 180 |
+
|
| 181 |
+
# Define the function influenced by the symbolic formula
|
| 182 |
+
Omega = 2.0 # Just an example global scaling factor
|
| 183 |
+
epsilon = 1e-8 # Small constant to avoid division by zero
|
| 184 |
+
|
| 185 |
+
def symbolic_function(x, y, t):
|
| 186 |
+
# Avoid division by zero at the origin
|
| 187 |
+
nabla = np.sqrt(x**2 + y**2) if x**2 + y**2 > 0 else epsilon
|
| 188 |
+
|
| 189 |
+
# Interpreting Delta as differences/deltas in x and y
|
| 190 |
+
Delta_x = np.cos(x + t)
|
| 191 |
+
Delta_y = np.sin(y + t)
|
| 192 |
+
|
| 193 |
+
# Combining the symbolic operations using creative interpretations
|
| 194 |
+
result = Omega * (Delta_x * complex(0, 1) + Delta_y / nabla) * \
|
| 195 |
+
((np.sin(x * y * Omega * t) * nabla) + Delta_x / (complex(0, 1) + 1 / nabla))
|
| 196 |
+
return result.real # Take real part to get a value we can map to colors
|
| 197 |
+
|
| 198 |
+
# Tessellation parameters
|
| 199 |
+
domain = (-5, 5, -5, 5)
|
| 200 |
+
hex_size = 0.5
|
| 201 |
+
hex_centers = [(i, j) for i in np.arange(domain[0], domain[1], hex_size)
|
| 202 |
+
for j in np.arange(domain[2], domain[3], hex_size)]
|
| 203 |
+
|
| 204 |
+
# Widget for time control
|
| 205 |
+
t_slider = widgets.FloatSlider(value=0, min=0, max=50, step=0.1, description="Time", continuous_update=False)
|
| 206 |
+
|
| 207 |
+
@widgets.interact(t=t_slider)
|
| 208 |
+
def update_visualizations(t):
|
| 209 |
+
clear_output(wait=True)
|
| 210 |
+
fig, ax = plt.subplots(figsize=(10, 10))
|
| 211 |
+
|
| 212 |
+
# Map color scale from -1 to 1 to [0, 1] for colormap compatibility
|
| 213 |
+
color_min, color_max = -1, 1
|
| 214 |
+
|
| 215 |
+
# Create tessellation pattern with colors based on the 'symbolic_function'
|
| 216 |
+
for center in hex_centers:
|
| 217 |
+
x, y = center
|
| 218 |
+
color_value = symbolic_function(x, y, t)
|
| 219 |
+
# Scale color_value to the 0-1 range for colormap
|
| 220 |
+
color_value_normalized = (color_value - color_min) / (color_max - color_min)
|
| 221 |
+
hexagon = patches.RegularPolygon(center, numVertices=6, radius=hex_size, orientation=np.pi/6)
|
| 222 |
+
hexagon.set_facecolor(plt.cm.viridis(color_value_normalized))
|
| 223 |
+
ax.add_patch(hexagon)
|
| 224 |
+
|
| 225 |
+
ax.set_xlim(domain[0], domain[1])
|
| 226 |
+
ax.set_ylim(domain[2], domain[3])
|
| 227 |
+
ax.set_aspect('equal')
|
| 228 |
+
plt.axis('off')
|
| 229 |
+
plt.show()
|
| 230 |
+
|
| 231 |
+
# Display the widget
|
| 232 |
+
display(t_slider)
|
| 233 |
+
|
| 234 |
+
import ipywidgets as widgets
|
| 235 |
+
import numpy as np
|
| 236 |
+
import matplotlib.pyplot as plt
|
| 237 |
+
import matplotlib.patches as patches
|
| 238 |
+
from IPython.display import clear_output
|
| 239 |
+
|
| 240 |
+
# Define the function influenced by the symbolic formula
|
| 241 |
+
Omega = 2.0 # Just an example of a scaling factor
|
| 242 |
+
epsilon = 1e-10 # Small number to prevent division by zero
|
| 243 |
+
|
| 244 |
+
def symbolic_function(x, y, t):
|
| 245 |
+
# Calculate 'nabla' with a safety for division by zero at the origin (0,0)
|
| 246 |
+
nabla = np.sqrt(x**2 + y**2) if x**2 + y**2 > 0 else epsilon
|
| 247 |
+
|
| 248 |
+
# Calculate Delta_x and Delta_y with time variation
|
| 249 |
+
Delta_x = np.cos(x + t)
|
| 250 |
+
Delta_y = np.sin(y + t)
|
| 251 |
+
|
| 252 |
+
# Symbolic expression interpretation with complex numbers
|
| 253 |
+
# The operations have been creatively interpreted for demonstration purposes
|
| 254 |
+
result = Omega * (Delta_x * complex(0, 1) + Delta_y / nabla) *\
|
| 255 |
+
((np.sin(x * y * Omega * t) * nabla) + Delta_x / (complex(0, 1) + 1 / nabla))
|
| 256 |
+
# Return the absolute value to get a positive value for color mapping
|
| 257 |
+
return abs(result.real)
|
| 258 |
+
|
| 259 |
+
# Tessellation parameters
|
| 260 |
+
domain = (-5, 5, -5, 5)
|
| 261 |
+
hex_size = 0.5
|
| 262 |
+
hex_centers = [(i, j) for i in np.arange(domain[0], domain[1], hex_size)
|
| 263 |
+
for j in np.arange(domain[2], domain[3], hex_size)]
|
| 264 |
+
|
| 265 |
+
# Widget for time control
|
| 266 |
+
t_slider = widgets.FloatSlider(value=0, min=0, max=50, step=0.1, description="Time", continuous_update=False)
|
| 267 |
+
|
| 268 |
+
# Main update function for the visualization
|
| 269 |
+
@widgets.interact(t=t_slider)
|
| 270 |
+
def update_visualizations(t):
|
| 271 |
+
clear_output(wait=True)
|
| 272 |
+
fig, ax = plt.subplots(figsize=(10, 10))
|
| 273 |
+
|
| 274 |
+
# Create tessellation pattern with colors based on the symbolic_function
|
| 275 |
+
color_values = np.array([symbolic_function(x, y, t) for x, y in hex_centers])
|
| 276 |
+
# Normalize color values to [0, 1] range
|
| 277 |
+
color_min, color_max = np.min(color_values), np.max(color_values)
|
| 278 |
+
color_values_normalized = (color_values - color_min) / (color_max - color_min)
|
| 279 |
+
|
| 280 |
+
for i, center in enumerate(hex_centers):
|
| 281 |
+
hexagon = patches.RegularPolygon(center, numVertices=6, radius=hex_size, orientation=np.pi/6)
|
| 282 |
+
hexagon.set_facecolor(plt.cm.viridis(color_values_normalized[i]))
|
| 283 |
+
ax.add_patch(hexagon)
|
| 284 |
+
|
| 285 |
+
# Set properties for the plot
|
| 286 |
+
ax.set_xlim(domain[0], domain[1])
|
| 287 |
+
ax.set_ylim(domain[2], domain[3])
|
| 288 |
+
ax.set_aspect('equal')
|
| 289 |
+
plt.axis('off')
|
| 290 |
+
plt.show()
|
| 291 |
+
|
| 292 |
+
# Display the widget
|
| 293 |
+
display(t_slider)
|
| 294 |
+
|
| 295 |
+
import numpy as np
|
| 296 |
+
import matplotlib.pyplot as plt
|
| 297 |
+
import matplotlib.patches as patches
|
| 298 |
+
import ipywidgets as widgets
|
| 299 |
+
from IPython.display import clear_output
|
| 300 |
+
|
| 301 |
+
# Imaginatively define some of the custom symbols with parameters and functions
|
| 302 |
+
Omega = 2.0
|
| 303 |
+
gamma = 0.9
|
| 304 |
+
A_circle = 1.0
|
| 305 |
+
i_const = 1.0
|
| 306 |
+
heart_factor = np.random.rand()
|
| 307 |
+
|
| 308 |
+
# Custom function that interprets the expression for a given (x, y)
|
| 309 |
+
def interpret_quasi_quanta(x, y, t):
|
| 310 |
+
# Add some randomness to the color variation
|
| 311 |
+
random_effect = heart_factor * np.random.uniform(0.8, 1.2)
|
| 312 |
+
|
| 313 |
+
# Calculate a difference representing Delta and Nabla as a distance from center
|
| 314 |
+
distance = np.sqrt(x**2 + y**2)
|
| 315 |
+
delta = np.abs(x - y)
|
| 316 |
+
|
| 317 |
+
# Harmonic operations as a combination of sines and cosines
|
| 318 |
+
harmonic = np.sin(Omega * distance * t) + np.cos(gamma * t)
|
| 319 |
+
|
| 320 |
+
# Simulate the complex formula by combining terms in a creative way
|
| 321 |
+
result = harmonic * delta * A_circle / (i_const + random_effect) * random_effect
|
| 322 |
+
return result
|
| 323 |
+
|
| 324 |
+
# Tessellation parameters
|
| 325 |
+
domain = (-5, 5, -5, 5)
|
| 326 |
+
hex_size = 0.5
|
| 327 |
+
hex_centers = [(i, j) for i in np.arange(domain[0], domain[1], hex_size)
|
| 328 |
+
for j in np.arange(domain[2], domain[3], hex_size)]
|
| 329 |
+
|
| 330 |
+
# Widget for time control
|
| 331 |
+
t_slider = widgets.FloatSlider(value=0, min=0, max=50, step=0.1, description="Time", continuous_update=False)
|
| 332 |
+
|
| 333 |
+
# Visualization function that applies the interpretive quasi-quanta function
|
| 334 |
+
@widgets.interact(t=t_slider)
|
| 335 |
+
def update_visualizations(t):
|
| 336 |
+
clear_output(wait=True)
|
| 337 |
+
fig, ax = plt.subplots(figsize=(10, 10))
|
| 338 |
+
|
| 339 |
+
# Calculate color values based on quasi-quanta function interpretation
|
| 340 |
+
color_values = np.array([interpret_quasi_quanta(x, y, t) for x, y in hex_centers])
|
| 341 |
+
# Normalize color values to [0, 1] range
|
| 342 |
+
color_min, color_max = color_values.min(), color_values.max()
|
| 343 |
+
color_values_normalized = (color_values - color_min) / (color_max - color_min)
|
| 344 |
+
|
| 345 |
+
# Plot the tessellation and fill hexagons based on the color values
|
| 346 |
+
for idx, center in enumerate(hex_centers):
|
| 347 |
+
hexagon = patches.RegularPolygon(center, numVertices=6, radius=hex_size, orientation=np.pi/6)
|
| 348 |
+
hexagon.set_facecolor(plt.cm.viridis(color_values_normalized[idx]))
|
| 349 |
+
ax.add_patch(hexagon)
|
| 350 |
+
|
| 351 |
+
# Finalize plot settings
|
| 352 |
+
ax.set_xlim(domain[0], domain[1])
|
| 353 |
+
ax.set_ylim(domain[2], domain[3])
|
| 354 |
+
ax.set_aspect('equal')
|
| 355 |
+
plt.axis('off')
|
| 356 |
+
plt.show()
|
| 357 |
+
|
| 358 |
+
# Display the widget
|
| 359 |
+
display(t_slider)
|
| 360 |
+
|
| 361 |
+
import ipywidgets as widgets
|
| 362 |
+
from IPython.display import display
|
| 363 |
+
import numpy as np
|
| 364 |
+
import matplotlib.pyplot as plt
|
| 365 |
+
import matplotlib.patches as patches
|
| 366 |
+
import sympy as sp
|
| 367 |
+
import networkx as nx
|
| 368 |
+
|
| 369 |
+
# Initialize domain and hex centers for the tessellation
|
| 370 |
+
domain = (-5, 5, -5, 5)
|
| 371 |
+
hex_size = 0.5
|
| 372 |
+
hex_centers = [(i, j) for i in np.arange(domain[0], domain[1], hex_size) for j in np.arange(domain[2], domain[3], hex_size)]
|
| 373 |
+
|
| 374 |
+
# Define sliders for radius and number of hexagons
|
| 375 |
+
R_slider = widgets.FloatSlider(value=5, min=1, max=10, step=0.5, description="Radius (m)")
|
| 376 |
+
num_hex_slider = widgets.IntSlider(value=10, min=1, max=100, step=1, description="Number of Hexagons")
|
| 377 |
+
|
| 378 |
+
# Function to create the tessellation visualization
|
| 379 |
+
def visualize_tessellation(R, num_hex):
|
| 380 |
+
fig, ax = plt.subplots()
|
| 381 |
+
# Calculate the position and radius of the central hexagon
|
| 382 |
+
central_hexagon_position = (0, 0)
|
| 383 |
+
central_hexagon_radius = R
|
| 384 |
+
# Draw the central hexagon
|
| 385 |
+
central_hexagon = patches.RegularPolygon(central_hexagon_position, numVertices=6,
|
| 386 |
+
radius=central_hexagon_radius,
|
| 387 |
+
orientation=np.pi / 6)
|
| 388 |
+
central_hexagon.set_facecolor('red')
|
| 389 |
+
ax.add_patch(central_hexagon)
|
| 390 |
+
|
| 391 |
+
# Calculate the positions and radii of the surrounding hexagons
|
| 392 |
+
hex_positions = [(central_hexagon_position[0] + R * np.cos(2 * np.pi / num_hex * k),
|
| 393 |
+
central_hexagon_position[1] + R * np.sin(2 * np.pi / num_hex * k))
|
| 394 |
+
for k in range(1, num_hex + 1)]
|
| 395 |
+
hex_radii = [R / np.sqrt(3) for _ in range(num_hex)]
|
| 396 |
+
|
| 397 |
+
# Add the surrounding hexagons to the plot
|
| 398 |
+
for pos, radius in zip(hex_positions, hex_radii):
|
| 399 |
+
hexagon = patches.RegularPolygon(pos, numVertices=6, radius=radius, orientation=np.pi / 6)
|
| 400 |
+
ax.add_patch(hexagon)
|
| 401 |
+
|
| 402 |
+
# Adjust the layout or structure of the graph based on the current x and y positions
|
| 403 |
+
# of the particle on the time compass
|
| 404 |
+
# The layout can be influenced by current_x_pos and current_y_pos
|
| 405 |
+
# For example, we can use these values to determine the size or layout of the hexagons
|
| 406 |
+
|
| 407 |
+
ax.set_xlim(domain[0], domain[1])
|
| 408 |
+
ax.set_ylim(domain[2], domain[3])
|
| 409 |
+
ax.set_aspect('equal')
|
| 410 |
+
plt.axis('off')
|
| 411 |
+
|
| 412 |
+
# Display the plot
|
| 413 |
+
plt.show()
|
| 414 |
+
|
| 415 |
+
# Function to create the time compass visualization
|
| 416 |
+
def visualize_circle(R, num_hex):
|
| 417 |
+
fig, ax = plt.subplots()
|
| 418 |
+
|
| 419 |
+
# Draw circle and plot the current position of the particle
|
| 420 |
+
circle = plt.Circle((0, 0), R, color='blue', fill=False)
|
| 421 |
+
ax.add_artist(circle)
|
| 422 |
+
|
| 423 |
+
# Update tessellation based on current values
|
| 424 |
+
visualize_tessellation(R, num_hex)
|
| 425 |
+
|
| 426 |
+
ax.set_xlabel("x (m)")
|
| 427 |
+
ax.set_ylabel("y (m)")
|
| 428 |
+
ax.set_xlim(-R * 1.5, R * 1.5)
|
| 429 |
+
ax.set_ylim(-R * 1.5, R * 1.5)
|
| 430 |
+
ax.set_aspect('equal')
|
| 431 |
+
|
| 432 |
+
# Display the plot
|
| 433 |
+
plt.show()
|
| 434 |
+
|
| 435 |
+
# Link sliders to visualization function
|
| 436 |
+
widgets.interactive(visualize_circle, R=R_slider, num_hex=num_hex_slider)
|
| 437 |
+
|
| 438 |
+
import ipywidgets as widgets
|
| 439 |
+
from IPython.display import display
|
| 440 |
+
import numpy as np
|
| 441 |
+
import matplotlib.pyplot as plt
|
| 442 |
+
import matplotlib.patches as patches
|
| 443 |
+
import sympy as sp
|
| 444 |
+
import networkx as nx
|
| 445 |
+
|
| 446 |
+
# Define the functions required for the tessellation pattern
|
| 447 |
+
def f1(theta):
|
| 448 |
+
if theta == 0:
|
| 449 |
+
return np.pi / 2
|
| 450 |
+
return np.arcsin(np.sin(theta)) + (np.pi / 2) * (1 - np.pi / (2 * theta))
|
| 451 |
+
|
| 452 |
+
def f2(theta):
|
| 453 |
+
if theta == 0:
|
| 454 |
+
return np.pi / 2
|
| 455 |
+
return np.arcsin(np.cos(theta)) + (np.pi / 2) * (1 - np.pi / (2 * theta))
|
| 456 |
+
|
| 457 |
+
# Initialize domain and hex centers for the tessellation
|
| 458 |
+
domain = (-5, 5, -5, 5)
|
| 459 |
+
hex_size = 0.5
|
| 460 |
+
hex_centers = [(i, j) for i in np.arange(domain[0], domain[1], hex_size) for j in np.arange(domain[2], domain[3], hex_size)]
|
| 461 |
+
|
| 462 |
+
# Define sliders for time, radius and angular velocity
|
| 463 |
+
t_slider = widgets.FloatSlider(value=0, min=0, max=100, step=0.1, description="Time (s)")
|
| 464 |
+
R_slider = widgets.FloatSlider(value=5, min=1, max=10, step=0.5, description="Radius (m)")
|
| 465 |
+
omega_slider = widgets.FloatSlider(value=2 * np.pi, min=0, max=4 * np.pi, step=0.1 * np.pi, description="Ang. Vel. (rad/s)")
|
| 466 |
+
|
| 467 |
+
# Function to create the tessellation visualization
|
| 468 |
+
def visualize_tessellation(t, R, omega):
|
| 469 |
+
fig, ax = plt.subplots()
|
| 470 |
+
for center in hex_centers:
|
| 471 |
+
x, y = center
|
| 472 |
+
theta = np.arctan2(y, x) if x != 0 else np.pi / 2
|
| 473 |
+
efficiency_value = f1(theta) * f2(theta) * (1 - f1(theta)) * (1 - f2(theta))
|
| 474 |
+
color_value = np.clip(efficiency_value * np.sin(omega * t), 0, 1)
|
| 475 |
+
hexagon = patches.RegularPolygon((x, y), numVertices=6, radius=hex_size, orientation=np.pi/6)
|
| 476 |
+
hexagon.set_facecolor(plt.cm.viridis(color_value))
|
| 477 |
+
ax.add_patch(hexagon)
|
| 478 |
+
|
| 479 |
+
# Adjust the layout or structure of the graph based on the current x and y positions
|
| 480 |
+
# of the particle on the time compass
|
| 481 |
+
current_x_pos = R * np.cos(omega * t)
|
| 482 |
+
current_y_pos = R * np.sin(omega * t)
|
| 483 |
+
# The layout can be influenced by current_x_pos and current_y_pos
|
| 484 |
+
# For example, we can use these values to determine the size or layout of the hexagons
|
| 485 |
+
|
| 486 |
+
ax.set_xlim(domain[0], domain[1])
|
| 487 |
+
ax.set_ylim(domain[2], domain[3])
|
| 488 |
+
ax.set_aspect('equal')
|
| 489 |
+
plt.axis('off')
|
| 490 |
+
|
| 491 |
+
# Display the plot
|
| 492 |
+
plt.show()
|
| 493 |
+
|
| 494 |
+
# Function to create the time compass visualization
|
| 495 |
+
def visualize_circular_motion(t, R, omega):
|
| 496 |
+
fig, ax = plt.subplots()
|
| 497 |
+
|
| 498 |
+
# Draw circle and plot the current position of the particle
|
| 499 |
+
circle = plt.Circle((0, 0), R, color='blue', fill=False)
|
| 500 |
+
ax.add_artist(circle)
|
| 501 |
+
|
| 502 |
+
x_path = R * np.cos(omega * np.linspace(0, t, 100))
|
| 503 |
+
y_path = R * np.sin(omega * np.linspace(0, t, 100))
|
| 504 |
+
ax.plot(x_path, y_path, color='gray', linestyle='--')
|
| 505 |
+
|
| 506 |
+
current_x_pos = R * np.cos(omega * t)
|
| 507 |
+
current_y_pos = R * np.sin(omega * t)
|
| 508 |
+
ax.arrow(0, 0, current_x_pos, current_y_pos, head_width=R/20, head_length=R/15, fc='red', ec='red')
|
| 509 |
+
ax.scatter(current_x_pos, current_y_pos, color='red')
|
| 510 |
+
|
| 511 |
+
ax.set_xlabel("x (m)")
|
| 512 |
+
ax.set_ylabel("y (m)")
|
| 513 |
+
ax.set_xlim(-R * 1.5, R * 1.5)
|
| 514 |
+
ax.set_ylim(-R * 1.5, R * 1.5)
|
| 515 |
+
ax.set_aspect('equal')
|
| 516 |
+
|
| 517 |
+
# Update tessellation based on current values
|
| 518 |
+
visualize_tessellation(t, R, omega)
|
| 519 |
+
|
| 520 |
+
# Display the plot
|
| 521 |
+
plt.show()
|
| 522 |
+
|
| 523 |
+
# Link sliders to visualization function
|
| 524 |
+
widgets.interactive(visualize_circular_motion, t=t_slider, R=R_slider, omega=omega_slider)
|
quasi_quanta_hyperbolic_distance.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|