PlanetCrash commited on
Commit
00b6663
·
verified ·
1 Parent(s): 62f4f6d

Upload 19 files

Browse files
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