From 79e85f61da530666e84ffd4398fb95616ceeea32 Mon Sep 17 00:00:00 2001 From: Ewout ter Hoeven Date: Wed, 16 Oct 2024 14:23:18 +0200 Subject: [PATCH] examples: Clean-up Epstein Civil Violence --- .../Epstein Civil Violence.ipynb | 186 ++++++++++++++---- .../advanced/epstein_civil_violence/Readme.md | 5 +- .../agent.py => agents.py} | 0 .../advanced/epstein_civil_violence/app.py | 70 +++++++ .../epstein_civil_violence/__init__.py | 0 .../epstein_civil_violence/portrayal.py | 33 ---- .../epstein_civil_violence/server.py | 81 -------- .../{epstein_civil_violence => }/model.py | 2 +- .../epstein_civil_violence/requirements.txt | 3 - .../advanced/epstein_civil_violence/run.py | 3 - 10 files changed, 219 insertions(+), 164 deletions(-) rename examples/advanced/epstein_civil_violence/{epstein_civil_violence/agent.py => agents.py} (100%) create mode 100644 examples/advanced/epstein_civil_violence/app.py delete mode 100644 examples/advanced/epstein_civil_violence/epstein_civil_violence/__init__.py delete mode 100644 examples/advanced/epstein_civil_violence/epstein_civil_violence/portrayal.py delete mode 100644 examples/advanced/epstein_civil_violence/epstein_civil_violence/server.py rename examples/advanced/epstein_civil_violence/{epstein_civil_violence => }/model.py (99%) delete mode 100644 examples/advanced/epstein_civil_violence/requirements.txt delete mode 100644 examples/advanced/epstein_civil_violence/run.py diff --git a/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb b/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb index e5d4d9a2af3..359c0b9c4d6 100644 --- a/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb +++ b/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb @@ -13,34 +13,130 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-16T08:29:53.853532Z", + "start_time": "2024-10-16T08:29:51.015398Z" + } + }, "source": [ "%matplotlib inline\n", "\n", - "from epstein_civil_violence.model import EpsteinCivilViolence" - ] + "from model import EpsteinCivilViolence" + ], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ], + "application/javascript": "\n window.jupyter_python_executable = '\\r\\r';\n window.jupyter_widget_checks_silent = true;\n window.jupyter_widget_checks_libraries = [{\"python\": \"ipyvuetify\", \"classic\": \"jupyter-vuetify/extension\", \"lab\": \"jupyter-vuetify\"}, {\"python\": \"ipyvue\", \"classic\": \"jupyter-vue/extension\", \"lab\": \"jupyter-vue\"}];\n " + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "
\n", + " \n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 1 }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-16T08:32:17.393104Z", + "start_time": "2024-10-16T08:32:12.659183Z" + } + }, "source": [ "model = EpsteinCivilViolence(\n", - " height=40,\n", - " width=40,\n", - " citizen_density=0.7,\n", - " cop_density=0.074,\n", - " citizen_vision=7,\n", - " cop_vision=7,\n", - " legitimacy=0.8,\n", - " max_jail_term=1000,\n", - " max_iters=1000,\n", + " max_iters=100,\n", ") # cap the number of steps the model takes\n", - "model.run_model()" - ] + "while model.running:\n", + " model.step()" + ], + "outputs": [], + "execution_count": 8 }, { "cell_type": "markdown", @@ -51,45 +147,53 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-16T08:32:17.404310Z", + "start_time": "2024-10-16T08:32:17.394119Z" + } + }, "source": [ "model_out = model.datacollector.get_model_vars_dataframe()" - ] + ], + "outputs": [], + "execution_count": 9 }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-16T08:32:17.546891Z", + "start_time": "2024-10-16T08:32:17.413616Z" + } + }, + "source": [ + "ax = model_out.plot()\n", + "ax.set_title(\"Citizen Condition Over Time\")\n", + "ax.set_xlabel(\"Step\")\n", + "ax.set_ylabel(\"Number of Citizens\")\n", + "_ = ax.legend(bbox_to_anchor=(1.35, 1.025))" + ], "outputs": [ { "data": { - "image/png": "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\n", "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAusAAAHHCAYAAAAGfxbtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZwklEQVR4nO3dd3hU1dr38d+kh1RqioYkFIHQi0IERSESQDgiIKJRaYIHg4CgCEdpClJsSBdfFHwERSwIHGlSVUKAIL1jKAohSEhCQknb7x88zMMQkAxMmEny/VzXXDprrb33vdeQ7Dtr1l7bZBiGIQAAAAAOx8neAQAAAAC4MZJ1AAAAwEGRrAMAAAAOimQdAAAAcFAk6wAAAICDIlkHAAAAHBTJOgAAAOCgSNYBAAAAB0WyDgAAADgoknXgLgkLC1P37t0L1PaRRx7RI488UqjxFDdz5syRyWTS0aNHzWXW9GP37t0VFhZWKLGVVEePHpXJZNKcOXPsHQoAFFkk68AdOnLkiF566SVVqlRJHh4e8vX1VdOmTfXxxx/r4sWLN91u7969GjVqlEVyWZTc7nnb08mTJzVq1Cht377d3qHkc/bsWb3++uuqVq2aPDw8VKZMGUVHR2vp0qX2Ds3CqFGjZDKZbvnij00AsA0XewcAFGX//e9/9dRTT8nd3V0vvPCCatWqpaysLP366696/fXXtWfPHs2aNUuSdODAATk5/d/fx3v37tXo0aP1yCOP5BvRXbly5d08DatZc972dH0/njx5UqNHj1ZYWJjq1atnUffpp58qLy/vLkb3fw4cOKCWLVvqzJkz6tGjhxo1aqTU1FTNmzdP7du312uvvab33nvPLrFdr2PHjqpSpYr5fUZGhvr27asnn3xSHTt2NJcHBAQoNDRUFy9elKurqz1CBYBigWQduE2JiYnq2rWrQkNDtWbNGgUFBZnrYmNjdfjwYf33v/81l7m7uxd4325ubjaN1ZasPW97sqYf7ZVQZmdnq3Pnzjp37pw2bNigxo0bm+teffVVxcTE6P3331ejRo309NNP37W4cnJylJeXl68P69Spozp16pjf//333+rbt6/q1Kmj5557Lt9+PDw8Cj1WACjOmAYD3KaJEycqIyNDs2fPtkhYr6pSpYoGDBhgfn/tnPU5c+boqaeekiQ9+uij5qkD69atk5R/rnVYWNhNpxtc3UaS/vrrL/Xs2VMBAQFyd3dXzZo19dlnn1nEtW7dOplMJn3zzTcaO3as7r33Xnl4eKhly5Y6fPiwzc87JydH77zzjipXrix3d3eFhYXpP//5jy5fvmyxXVhYmNq1a6dff/1VDzzwgDw8PFSpUiV98cUX+Y6xZ88etWjRQp6enrr33ns1ZsyYG46KX9uP69at0/333y9J6tGjh7n/rs6nvtGc9czMTA0ePFghISFyd3dXtWrV9P7778swDIt2JpNJ/fr106JFi1SrVi1z3y9fvvyW/fndd99p9+7dGjp0qEWiLknOzs765JNP5O/vr1GjRkmSTp8+LRcXF40ePTrfvg4cOCCTyaSpU6eay1JTUzVw4EDzOVSpUkUTJkyw6K+rc8vff/99TZo0yfxZ7d2795bx/5MbzVnv3r27vL29dfz4cbVr107e3t665557NG3aNEnSrl271KJFC3l5eSk0NFTz58/Pt9+CnBMAFBeMrAO3acmSJapUqZIefPBBq7d9+OGH1b9/f02ePFn/+c9/VKNGDUky//d6kyZNUkZGhkXZRx99pO3bt6ts2bKSriRxTZo0MSeO5cuX17Jly9SrVy+lp6dr4MCBFtuPHz9eTk5Oeu2115SWlqaJEycqJiZG8fHxNj3vF198UXPnzlXnzp01ePBgxcfHa9y4cdq3b59++OEHi7aHDx9W586d1atXL3Xr1k2fffaZunfvroYNG6pmzZqSpKSkJD366KPKycnR0KFD5eXlpVmzZsnT0/Mf46hRo4befvttjRgxQn369NFDDz0kSTc9D8Mw9K9//Utr165Vr169VK9ePa1YsUKvv/66/vrrL3300UcW7X/99Vd9//33evnll+Xj46PJkyerU6dOOn78uPkzupElS5ZIkl544YUb1vv5+emJJ57Q3LlzdfjwYVWpUkXNmzfXN998o5EjR1q0XbBggZydnc1/CF64cEHNmzfXX3/9pZdeekkVK1bUxo0bNWzYMJ06dUqTJk2y2P7zzz/XpUuX1KdPH7m7u6tMmTI379A7kJubqzZt2ujhhx/WxIkTNW/ePPXr109eXl568803FRMTo44dO2rmzJl64YUXFBkZqfDw8Ns6JwAo8gwAVktLSzMkGU888USBtwkNDTW6detmfr9w4UJDkrF27dp8bZs3b240b978pvv65ptvDEnG22+/bS7r1auXERQUZPz9998Wbbt27Wr4+fkZFy5cMAzDMNauXWtIMmrUqGFcvnzZ3O7jjz82JBm7du266XGtPe/t27cbkowXX3zRovy1114zJBlr1qwxl4WGhhqSjA0bNpjLkpOTDXd3d2Pw4MHmsoEDBxqSjPj4eIt2fn5+hiQjMTHRXH59P27ZssWQZHz++ef5Yu3WrZsRGhpqfr9o0SJDkjFmzBiLdp07dzZMJpNx+PBhc5kkw83NzaJsx44dhiRjypQpN+8gwzDq1atn+Pn5/WObDz/80JBkLF682DAMw/jkk09u+FlFREQYLVq0ML9/5513DC8vL+PgwYMW7YYOHWo4Ozsbx48fNwzDMBITEw1Jhq+vr5GcnPyPsVzvzJkzhiRj5MiR+equ7vfa/u7WrZshyXj33XfNZefOnTM8PT0Nk8lkfP311+by/fv359t3Qc8JAIoLpsEAtyE9PV2S5OPjc9ePvXfvXvXs2VNPPPGE3nrrLUlXRoG/++47tW/fXoZh6O+//za/oqOjlZaWpm3btlnsp0ePHhbzka+ONP/xxx83Pba15/3TTz9JkgYNGmRRPnjwYEnKN7c9IiLCHIcklS9fXtWqVbOI6aefflKTJk30wAMPWLSLiYkpUEwF9dNPP8nZ2Vn9+/fPF7thGFq2bJlFeVRUlCpXrmx+X6dOHfn6+v5jf0rS+fPnb9mfV+uv9n/Hjh3l4uKiBQsWmNvs3r1be/futZjXvnDhQj300EMqXbq0xb+JqKgo5ebmasOGDRbH6dSpk8qXL/+PsdjKiy++aP5/f39/VatWTV5eXurSpYu5vFq1avL397foQ2vPCQCKOqbBALfB19dX0pVE625KT09Xx44ddc899+iLL76QyWSSJJ05c0apqamaNWvWTVdhSU5OtnhfsWJFi/elS5eWJJ07d+6mx7f2vI8dOyYnJyeL1UMkKTAwUP7+/jp27Ng/xnQ1rmtjOnbsWL653dKVxM6Wjh07puDg4HyJ9NWpSrcT+434+Pjo77///sc2V/v7aizlypVTy5Yt9c033+idd96RdGUKjIuLi8WKLIcOHdLOnTtvmoBf/2/i6lSTwubh4ZEvJj8/P917773mf9PXll/bh9aeEwAUdSTrwG3w9fVVcHCwdu/efVeP2717d508eVKbN282J86SzDfWPffcc+rWrdsNt712BQ/pys2LN2Jcd/PktW73vK9PwG7mdmJyFLcbe40aNbR9+3YdP378hgm/JO3cuVPSlW8eruratat69Oih7du3q169evrmm2/UsmVLlStXztwmLy9Pjz32mIYMGXLD/d53330W7281799WbtZXBelDa88JAIo6knXgNrVr106zZs1SXFycIiMjrd6+oAnsVePHj9eiRYv0/fffq3r16hZ15cuXl4+Pj3JzcxUVFWV1LNaw5rxDQ0OVl5enQ4cOWdw8e/r0aaWmpio0NNTq44eGhurQoUP5yg8cOHDLba3p89DQUP3888/5pqns37/fXG8L7dq101dffaUvvvjCPK3pWunp6frxxx9VvXp1i28oOnTooJdeesk8FebgwYMaNmyYxbaVK1dWRkZGof+buJuK4zkBwD9hzjpwm4YMGSIvLy+9+OKLOn36dL76I0eO6OOPP77p9l5eXpKuLEN3Kz///LPeeustvfnmm+rQoUO+emdnZ3Xq1Mm8DOD1zpw5c8tjFJQ15922bVtJyrdCx4cffihJevzxx60+ftu2bbVp0yZt3rzZXHbmzBnNmzfvltta0+dt27ZVbm6uxTKI0pVVeEwmk9q0aWNd4DfRuXNnRUREaPz48dq6datFXV5envr27atz587lW/nF399f0dHR+uabb/T111/Lzc0t37+NLl26KC4uTitWrMh33NTUVOXk5NjkHO6m4nhOAPBPGFkHblPlypU1f/58Pf3006pRo4bFkzw3btyohQsXmtdVv5F69erJ2dlZEyZMUFpamtzd3dWiRQtVqFAhX9tnnnlG5cuXV9WqVfXll19a1D322GMKCAjQ+PHjtXbtWjVu3Fi9e/dWRESEUlJStG3bNv38889KSUm56+ddt25ddevWTbNmzVJqaqqaN2+uzZs3a+7cuerQoYMeffRRq48/ZMgQ/c///I9at26tAQMGmJduDA0NNU8X+afY/f39NXPmTPn4+MjLy0uNGze+4Vzt9u3b69FHH9Wbb76po0ePqm7dulq5cqV+/PFHDRw40OJm0jvh5uamb7/9Vi1btlSzZs0snmA6f/58bdu2TYMHD1bXrl3zbfv000/rueee0/Tp0xUdHS1/f3+L+tdff12LFy9Wu3btzEtgZmZmateuXfr222919OhRi2kzRUFxPCcA+Ed2XIkGKBYOHjxo9O7d2wgLCzPc3NwMHx8fo2nTpsaUKVOMS5cumdtdv3SjYRjGp59+alSqVMlwdna2WMbx+iUHJd30de3Sj6dPnzZiY2ONkJAQw9XV1QgMDDRatmxpzJo1y9zm6tKNCxcutIjlRsvs2eK8s7OzjdGjRxvh4eGGq6urERISYgwbNsyizdX+efzxx/Md50bLWO7cudNo3ry54eHhYdxzzz3GO++8Y8yePfuWSzcahmH8+OOPRkREhOHi4mJxvtcv3WgYhnH+/Hnj1VdfNYKDgw1XV1ejatWqxnvvvWfk5eVZtJNkxMbG5ov9Rp/5zSQnJxuDBg0yqlSpYri7uxv+/v5GVFSUebnGG0lPTzc8PT0NScaXX355wzbnz583hg0bZlSpUsVwc3MzypUrZzz44IPG+++/b2RlZRmG8X+f/XvvvVegWK91O0s3enl55WvbvHlzo2bNmvnKb/TvoiDnBADFhckwisCdWwAAAEAJxJx1AAAAwEGRrAMAAAAOimQdAAAAcFAk6wAAAICDYulGAAAAB5aXl6esrCx7hwEbcXV1vekTm2+EZB0AAMBBZWVlKTExUXl5efYOBTbk7++vwMDAAj1Zm2S9APLy8nTy5En5+PhY/Yh4AABgH4Zh6Pz58woODpaTU9Gb+WsYhk6dOiVnZ2eFhIQUyXOAJcMwdOHCBSUnJ0uSgoKCbrkNyXoBnDx5UiEhIfYOAwAA3IYTJ07o3nvvtXcYVsvJydGFCxcUHBysUqVK2Tsc2Iinp6ckKTk5WRUqVLjllBi7JusbNmzQe++9p4SEBJ06dUo//PCDOnToIEnKzs7WW2+9pZ9++kl//PGH/Pz8FBUVpfHjxys4ONi8j5SUFL3yyitasmSJnJyc1KlTJ3388cfy9vY2t9m5c6diY2O1ZcsWlS9fXq+88oqGDBlS4Dh9fHwkXflh9/X1tc3JAwCAQpWenq6QkBDzdbyoyc3NlSS5ubnZORLY2tU/vrKzsx07Wc/MzFTdunXVs2dPdezY0aLuwoUL2rZtm4YPH666devq3LlzGjBggP71r39p69at5nYxMTE6deqUVq1apezsbPXo0UN9+vTR/PnzJV35QW3VqpWioqI0c+ZM7dq1Sz179pS/v7/69OlToDivTn3x9fUlWQcAoIgp6lNYi3r8yM+az9RkGIZRiLEUmMlkshhZv5EtW7bogQce0LFjx1SxYkXt27dPERER2rJlixo1aiRJWr58udq2bas///xTwcHBmjFjht58800lJSWZ/zIdOnSoFi1apP379xcotvT0dPn5+SktLY1kHQCAIqKoX78vXbqkxMREhYeHy8PDw97hwIas+WyL1J0KaWlpMplM8vf3lyTFxcXJ39/fnKhLUlRUlJycnBQfH29u8/DDD1t8hRQdHa0DBw7o3LlzNzzO5cuXlZ6ebvECAADA3XX06FGZTCZt377d3qHYTZFJ1i9duqQ33nhDzzzzjPmv46SkJFWoUMGinYuLi8qUKaOkpCRzm4CAAIs2V99fbXO9cePGyc/Pz/zi5lIAAADrnDhxQj179lRwcLDc3NwUGhqqAQMG6OzZswXeR0hIiE6dOqVatWoVYqS29cgjj2jgwIE221+RSNazs7PVpUsXGYahGTNmFPrxhg0bprS0NPPrxIkThX5MAACA4uKPP/5Qo0aNdOjQIX311Vc6fPiwZs6cqdWrVysyMlIpKSkF2o+zs7MCAwPl4lJyFzB0+GT9aqJ+7NgxrVq1ymLOWWBgoHmdyqtycnKUkpKiwMBAc5vTp09btLn6/mqb67m7u5tvJuWmUgAAAOvExsbKzc1NK1euVPPmzVWxYkW1adNGP//8s/766y+9+eabkq7cs7ho0SKLbf39/TVnzhxJN54Gs3v3brVp00be3t4KCAjQ888/r7///ttc/+2336p27dry9PRU2bJlFRUVpczMTHP9Z599ppo1a8rd3V1BQUHq16+fuS41NVUvvviiypcvL19fX7Vo0UI7duww148aNUr16tXT//zP/ygsLEx+fn7q2rWrzp8/L0nq3r271q9fr48//lgmk0kmk0lHjx69o7506GT9aqJ+6NAh/fzzzypbtqxFfWRkpFJTU5WQkGAuW7NmjfLy8tS4cWNzmw0bNig7O9vcZtWqVapWrZpKly59d04EAADgDhmGoQtZOXZ5WbMeSUpKilasWKGXX37ZvKb4VYGBgYqJidGCBQus2udVqampatGiherXr6+tW7dq+fLlOn36tLp06SJJOnXqlJ555hn17NlT+/bt07p169SxY0fzsWbMmKHY2Fj16dNHu3bt0uLFi1WlShXz/p966iklJydr2bJlSkhIUIMGDdSyZUuLbwKOHDmiRYsWaenSpVq6dKnWr1+v8ePHS5I+/vhjRUZGqnfv3jp16pROnTp1x9Op7fqdQkZGhg4fPmx+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vd1JSYqbuLg4NWvWTK1bt9Z///vfAm8XFhamgQMHauDAgeayp59+Wm3bti2EKB0fPxkOpmODe9Wxwb32DgMAAOCOzJ49W6+88opmz56tkydPKjg4+Lb35enpKU9PTxtGV3QwaRcAAKAoMAwpK9M+L8O6r0syMjK0YMEC9e3bV48//rjmzJljUb9kyRLdf//98vDwULly5fTkk09Kkh555BEdO3ZMr776qkwmk0z/e//DnDlz5O/vL0k6ePCgTCaT9u/fb7HPjz76SJUrVza/3717t9q0aSNvb28FBATo+eef199//21lp9sfI+sAAABFQfYF6d3bH52+I/85Kbl5Fbj5N998o+rVq6tatWp67rnnNHDgQA0bNkwmk0n//e9/9eSTT+rNN9/UF198oaysLP3000+SpO+//15169ZVnz591Lt37xvu+7777lOjRo00b948vfPOO+byefPm6dlnn5UkpaamqkWLFnrxxRf10Ucf6eLFi3rjjTfUpUsXrVmz5g464u4jWQcAAIBNzZ49W88995wkqXXr1kpLS9P69ev1yCOPaOzYseratatGjx5tbl+3bl1JUpkyZeTs7CwfHx8FBgbedP8xMTGaOnWqOVk/ePCgEhIS9OWXX0qSpk6dqvr16+vdd981b/PZZ58pJCREBw8e1H333Wfzcy4sJOsAAABFgWupKyPc9jp2AR04cECbN2/WDz/8IElycXHR008/rdmzZ+uRRx7R9u3bbzpqXlBdu3bVa6+9pk2bNqlJkyaaN2+eGjRooOrVq0uSduzYobVr18rb2zvftkeOHCFZBwAAgI2ZTFZNRbGX2bNnKycnx+KGUsMw5O7urqlTp9rkRtHAwEC1aNFC8+fPV5MmTTR//nz17dvXXJ+RkaH27dtrwoQJ+bYNCgq64+PfTSTrAAAAsImcnBx98cUX+uCDD9SqVSuLug4dOuirr75SnTp1tHr1avXo0eOG+3Bzc1Nubu4tjxUTE6MhQ4bomWee0R9//KGuXbua6xo0aKDvvvtOYWFhcnEp2ukuq8EAAADAJpYuXapz586pV69eqlWrlsWrU6dOmj17tkaOHKmvvvpKI0eO1L59+7Rr1y6LEfCwsDBt2LBBf/311z+u3tKxY0edP39effv21aOPPmoxkh8bG6uUlBQ988wz2rJli44cOaIVK1aoR48eBfpDwJGQrAMAAMAmZs+eraioKPn5+eWr69Spk7Zu3aoyZcpo4cKFWrx4serVq6cWLVpo8+bN5nZvv/22jh49qsqVK6t8+fI3PZaPj4/at2+vHTt2KCYmxqIuODhYv/32m3Jzc9WqVSvVrl1bAwcOlL+/v5ycilb6azIMKxfOLIHS09Pl5+entLQ0+fr62jscAABQAEX9+n3p0iUlJiYqPDxcHh4e9g4HNmTNZ1u0/rQAAAAAShCSdQAAAMBBkawDAAAADopkHQAAAHBQJOsAAACAgyJZBwAAABwUyToAAADgoEjWAQAAAAdFsg4AAAC7OHr0qEwmk7Zv3y5JWrdunUwmk1JTU+9ov2FhYZo0adIdx+cIXOwdAAAAAIqP7t27KzU1VYsWLbpl25CQEJ06dUrlypUr/MCKKJJ1AAAA2IWzs7MCAwPtHYZDYxoMAAAACsXy5cvVrFkz+fv7q2zZsmrXrp2OHDlirr9+GsyN/Prrr3rooYfk6empkJAQ9e/fX5mZmeb65ORktW/fXp6engoPD9e8efMK85TuOkbWAQAAigDDMHQx56Jdju3p4imTyWT1dpmZmRo0aJDq1KmjjIwMjRgxQk8++aS2b98uJ6dbjxkfOXJErVu31pgxY/TZZ5/pzJkz6tevn/r166fPP/9c0pVpNydPntTatWvl6uqq/v37Kzk52epYHRXJOgAAQBFwMeeiGs9vbJdjxz8br1KupazerlOnThbvP/vsM5UvX1579+5VrVq1brn9uHHjFBMTo4EDB0qSqlatqsmTJ6t58+aaMWOGjh8/rmXLlmnz5s26//77JUmzZ89WjRo1rI7VUTENBgAAAIXi0KFDeuaZZ1SpUiX5+voqLCxMknT8+PECbb9jxw7NmTNH3t7e5ld0dLTy8vKUmJioffv2ycXFRQ0bNjRvU716dfn7+xfC2dgHI+sAAABFgKeLp+KfjbfbsW9H+/btFRoaqk8//VTBwcHKy8tTrVq1lJWVVaDtMzIy9NJLL6l///756ipWrKiDBw/eVlxFCck6AABAEWAymW5rKoq9nD17VgcOHNCnn36qhx56SNKVm0Wt0aBBA+3du1dVqlS5YX316tWVk5OjhIQE8zSYAwcO3PE67Y6EaTAAAACwudKlS6ts2bKaNWuWDh8+rDVr1mjQoEFW7eONN97Qxo0b1a9fP23fvl2HDh3Sjz/+qH79+kmSqlWrptatW+ull15SfHy8EhIS9OKLL8rT8/a+CXBEJOsAAACwmby8PLm4uMjJyUlff/21EhISVKtWLb366qt67733rNpXnTp1tH79eh08eFAPPfSQ6tevrxEjRig4ONjc5vPPP1dwcLCaN2+ujh07qk+fPqpQoYKtT8tuTIZhGPYOwtGlp6fLz89PaWlp8vX1tXc4AACgAIr69fvSpUtKTExUeHi4PDw87B1OgbVu3VpVqlTR1KlT7R2Kw7Lms2VkHQAAAHfs3LlzWrp0qdatW6eoqCh7h1NscIMpAAAA7ljPnj21ZcsWDR48WE888YS9wyk27DqyvmHDBrVv317BwcEymUxatGiRRb1hGBoxYoSCgoLk6empqKgoHTp0yKJNSkqKYmJi5OvrK39/f/Xq1UsZGRkWbXbu3KmHHnpIHh4eCgkJ0cSJEwv71AAAAEqUH374QX/++afGjh17W087xY3ZNVnPzMxU3bp1NW3atBvWT5w4UZMnT9bMmTMVHx8vLy8vRUdH69KlS+Y2MTEx2rNnj1atWqWlS5dqw4YN6tOnj7k+PT1drVq1UmhoqBISEvTee+9p1KhRmjVrVqGfHwAAAHAn7DoNpk2bNmrTps0N6wzD0KRJk/TWW2+Zv0r54osvFBAQoEWLFqlr167at2+fli9fri1btqhRo0aSpClTpqht27Z6//33FRwcrHnz5ikrK0ufffaZ3NzcVLNmTW3fvl0ffvihRVIPAAAAOBqHvcE0MTFRSUlJFjco+Pn5qXHjxoqLi5MkxcXFyd/f35yoS1JUVJScnJwUHx9vbvPwww/Lzc3N3CY6OloHDhzQuXPnbnjsy5cvKz093eIFAAAA3G0Om6wnJSVJkgICAizKAwICzHVJSUn51tF0cXFRmTJlLNrcaB/XHuN648aNk5+fn/kVEhJy5ycEAAAAWMlhk3V7GjZsmNLS0syvEydO2DskAAAAlEAOm6wHBgZKkk6fPm1Rfvr0aXNdYGCgkpOTLepzcnKUkpJi0eZG+7j2GNdzd3eXr6+vxQsAAAC42xw2WQ8PD1dgYKBWr15tLktPT1d8fLwiIyMlSZGRkUpNTVVCQoK5zZo1a5SXl6fGjRub22zYsEHZ2dnmNqtWrVK1atVUunTpu3Q2AAAAgPXsmqxnZGRo+/bt2r59u6QrN5Vu375dx48fl8lk0sCBAzVmzBgtXrxYu3bt0gsvvKDg4GB16NBBklSjRg21bt1avXv31ubNm/Xbb7+pX79+6tq1q4KDgyVJzz77rNzc3NSrVy/t2bNHCxYs0Mcff6xBgwbZ6awBAACKv6SkJL3yyiuqVKmS3N3dFRISovbt21sMxOLW7Lp049atW/Xoo4+a319NoLt166Y5c+ZoyJAhyszMVJ8+fZSamqpmzZpp+fLl8vDwMG8zb9489evXTy1btpSTk5M6deqkyZMnm+v9/Py0cuVKxcbGqmHDhipXrpxGjBjBso0AAACF5OjRo2ratKn8/f313nvvqXbt2srOztaKFSsUGxur/fv32zvEIsNkGIZh7yAcXXp6uvz8/JSWlsb8dQAAioiifv2+dOmSEhMTFR4ebjFQWRS0bdtWO3fu1IEDB+Tl5WVRl5qaKn9/fx0/flyvvPKKVq9eLScnJ7Vu3VpTpkwxr9o3atQoLVq0SH379tWYMWN09uxZtWvXTp9++qn8/PwkSevWrdOQIUO0Z88eubq6qmbNmpo/f75CQ0Pv+jlbw5rP1q4j6wAAACgYwzBkXLxol2ObPD1lMpkK1DYlJUXLly/X2LFj8yXqkuTv76+8vDw98cQT8vb21vr165WTk6PY2Fg9/fTTWrdunbnt4cOH9c0332jJkiVKT09Xr1699PLLL2vevHnKyclRhw4d1Lt3b3311VfKysrS5s2bCxxnUUGyDgAAUAQYFy/qQIOGdjl2tW0JMpUqVaC2hw8flmEYql69+k3brF69Wrt27VJiYqL5eTZffPGFatasqS1btuj++++XdGUE+osvvtA999wj6cqT6h9//HF98MEHcnNzU1pamtq1a6fKlStLunI/Y3HjsKvBAAAAoOgpyAzrffv2KSQkxOLBkxEREfL399e+ffvMZRUrVjQn6tKVVf7y8vJ04MABlSlTRt27d1d0dLTat2+vjz/+WKdOnbLtyTgARtYBAACKAJOnp6ptS7h1w0I6dkFVrVpVJpPprtxE+vnnn6t///5avny5FixYoLfeekurVq1SkyZNCv3Ydwsj6wAAAEWAyWSSU6lSdnlZMw+8TJkyio6O1rRp05SZmZmvPjU1VTVq1NCJEycsnhK/d+9epaamKiIiwlx2/PhxnTx50vx+06ZNcnJyUrVq1cxl9evX17Bhw7Rx40bVqlVL8+fPt7ZrHRrJOgAAAGxq2rRpys3N1QMPPKDvvvtOhw4d0r59+zR58mRFRkYqKipKtWvXVkxMjLZt26bNmzfrhRdeUPPmzdWoUSPzfjw8PNStWzft2LFDv/zyi/r3768uXbooMDBQiYmJGjZsmOLi4nTs2DGtXLlShw4dKnbz1pkGAwAAAJuqVKmStm3bprFjx2rw4ME6deqUypcvr4YNG2rGjBkymUz68ccf9corr+jhhx+2WLrxWlWqVFHHjh3Vtm1bpaSkqF27dpo+fbokqVSpUtq/f7/mzp2rs2fPKigoSLGxsXrppZfsccqFhnXWC6Cor9MKAEBJVNSv30V5nXVbuLrO+tUn3Rcn1ny2TIMBAAAAHBTJOgAAAOCgSNYBAADgcEaNGlUsp8BYi2QdAAAAcFAk6wAAAICDIlkHAABwYCzcV/xY85mSrAMAADggZ2dnSVJWVpadI4GtXbhwQZLk6up6y7Y8FAkAAMABubi4qFSpUjpz5oxcXV3l5MQYa1FnGIYuXLig5ORk+fv7m/8g+yck6wAAAA7IZDIpKChIiYmJOnbsmL3DgQ35+/srMDCwQG1J1gEAAByUm5ubqlatylSYYsTV1bVAI+pXkawDAAA4MCcnp1s+kh7FF5OfAAAAAAdFsg4AAAA4KJJ1AAAAwEGRrAMAAAAOimQdAAAAcFAk6wAAAICDIlkHAAAAHBTJOgAAAOCgSNYBAAAAB0WyDgAAADgoknUAAADAQZGsAwAAAA6KZB0AAABwUCTrAAAAgIMiWQcAAAAcFMk6AAAA4KBI1gEAAAAHRbIOAAAAOCiSdQAAAMBBkawDAAAADopkHQAAAHBQJOsAAACAgyJZBwAAABwUyToAAADgoEjWAQAAAAdFsg4AAAA4KJJ1AAAAwEGRrAMAAAAOyqGT9dzcXA0fPlzh4eHy9PRU5cqV9c4778gwDHMbwzA0YsQIBQUFydPTU1FRUTp06JDFflJSUhQTEyNfX1/5+/urV69eysjIuNunAwAAAFjFoZP1CRMmaMaMGZo6dar27dunCRMmaOLEiZoyZYq5zcSJEzV58mTNnDlT8fHx8vLyUnR0tC5dumRuExMToz179mjVqlVaunSpNmzYoD59+tjjlAAAAIACMxnXDlM7mHbt2ikgIECzZ882l3Xq1Emenp768ssvZRiGgoODNXjwYL322muSpLS0NAUEBGjOnDnq2rWr9u3bp4iICG3ZskWNGjWSJC1fvlxt27bVn3/+qeDg4FvGkZ6eLj8/P6WlpcnX17dwThYAANgU128UBzYZWU9NTbXFbvJ58MEHtXr1ah08eFCStGPHDv36669q06aNJCkxMVFJSUmKiooyb+Pn56fGjRsrLi5OkhQXFyd/f39zoi5JUVFRcnJyUnx8/A2Pe/nyZaWnp1u8AAAAgLvN6mR9woQJWrBggfl9ly5dVLZsWd1zzz3asWOHTYMbOnSounbtqurVq8vV1VX169fXwIEDFRMTI0lKSkqSJAUEBFhsFxAQYK5LSkpShQoVLOpdXFxUpkwZc5vrjRs3Tn5+fuZXSEiITc8LAAAAKAirk/WZM2eak9dVq1Zp1apVWrZsmdq0aaPXX3/dpsF98803mjdvnubPn69t27Zp7ty5ev/99zV37lybHud6w4YNU1pamvl14sSJQj0eAAAAcCMu1m6QlJRkTtaXLl2qLl26qFWrVgoLC1Pjxo1tGtzrr79uHl2XpNq1a+vYsWMaN26cunXrpsDAQEnS6dOnFRQUZN7u9OnTqlevniQpMDBQycnJFvvNyclRSkqKefvrubu7y93d3abnAgAAAFjL6pH10qVLm0ealy9fbp4vbhiGcnNzbRrchQsX5ORkGaKzs7Py8vIkSeHh4QoMDNTq1avN9enp6YqPj1dkZKQkKTIyUqmpqUpISDC3WbNmjfLy8mz+xwUAAABgS1aPrHfs2FHPPvusqlatqrNnz5pv9vz9999VpUoVmwbXvn17jR07VhUrVlTNmjX1+++/68MPP1TPnj0lSSaTSQMHDtSYMWNUtWpVhYeHa/jw4QoODlaHDh0kSTVq1FDr1q3Vu3dvzZw5U9nZ2erXr5+6du1aoJVgAAAAAHuxOln/6KOPFBYWphMnTmjixIny9vaWJJ06dUovv/yyTYObMmWKhg8frpdfflnJyckKDg7WSy+9pBEjRpjbDBkyRJmZmerTp49SU1PVrFkzLV++XB4eHuY28+bNU79+/dSyZUs5OTmpU6dOmjx5sk1jBQAAAGzNoddZdxSs0woAQNHD9RvFgdUj65J06NAhrV27VsnJyeb541ddO+oNAAAA4PZZnax/+umn6tu3r8qVK6fAwECZTCZznclkIlkHAAAAbMTqZH3MmDEaO3as3njjjcKIBwAAAMD/snrpxnPnzumpp54qjFgAAAAAXMPqZP2pp57SypUrCyMWAAAAANewehpMlSpVNHz4cG3atEm1a9eWq6urRX3//v1tFhwAAABQklm9dGN4ePjNd2Yy6Y8//rjjoBwNSz8BAFD0cP1GcWD1yHpiYmJhxAEAAADgOlbPWb8qKytLBw4cUE5Oji3jAQAAAPC/rE7WL1y4oF69eqlUqVKqWbOmjh8/Lkl65ZVXNH78eJsHCAAAAJRUVifrw4YN044dO7Ru3Tp5eHiYy6OiorRgwQKbBgcAAACUZFbPWV+0aJEWLFigJk2aWDy9tGbNmjpy5IhNgwMAAABKMqtH1s+cOaMKFSrkK8/MzLRI3gEAAADcGauT9UaNGum///2v+f3VBP3//b//p8jISNtFBgAAAJRwVk+Deffdd9WmTRvt3btXOTk5+vjjj7V3715t3LhR69evL4wYAQAAgBLJ6pH1Zs2aafv27crJyVHt2rW1cuVKVahQQXFxcWrYsGFhxAgAAACUSFY/wbQk4gloAAAUPVy/URxYPbLeokULjR49Ol/5uXPn1KJFC5sEBQAAAOA25qyvW7dOu3bt0u+//6558+bJy8tL0pUnmjJnHQAAALAdq0fWJennn39WUlKSmjRpoqNHj9o4JAAAAADSbSbrQUFBWr9+vWrXrq37779f69ats3FYAAAAAKxO1q+uq+7u7q758+drwIABat26taZPn27z4AAAAICSzOo569cvHvPWW2+pRo0a6tatm82CAgAAAHAbyXpiYqLKlStnUdapUydVq1ZNCQkJNgsMAAAAKOlYZ70AWKcVAICih+s3ioMCjax37NhRc+bMka+vrzp27PiPbb///nubBAYAAACUdAVK1v38/Mw3lvr6+pr/HwAAAEDhYRpMAfA1GgAARQ/XbxQHVi/d2KJFC6WmpuYrT09PV4sWLWwREwAAAADdRrK+bt06ZWVl5Su/dOmSfvnlF5sEBQAAAMCKpRt37txp/v+9e/cqKSnJ/D43N1fLly/XPffcY9voAAAAgBKswMl6vXr1ZDKZZDKZbjjdxdPTU1OmTLFpcAAAAEBJVuBkPTExUYZhqFKlStq8ebPKly9vrnNzc1OFChXk7OxcKEECAAAAJVGBk/XQ0FBJUl5eXqEFAwAAAOD/FChZX7x4sdq0aSNXV1ctXrz4H9v+61//sklgAAAAQElXoHXWnZyclJSUpAoVKsjJ6eYLyJhMJuXm5to0QEfAOq0AABQ9XL9RHBRoZP3aqS9MgwEAAADuDqvXWQcAAABwdxQ4WV+zZo0iIiKUnp6ery4tLU01a9bUhg0bbBocAAAAUJIVOFmfNGmSevfufcM5X35+fnrppZf00Ucf2TQ4AAAAoCQrcLK+Y8cOtW7d+qb1rVq1UkJCgk2CAgAAAGBFsn769Gm5urretN7FxUVnzpyxSVAAAAAArEjW77nnHu3evfum9Tt37lRQUJBNggIAAABgRbLetm1bDR8+XJcuXcpXd/HiRY0cOVLt2rWzaXAAAABASVaghyJJV6bBNGjQQM7OzurXr5+qVasmSdq/f7+mTZum3Nxcbdu2TQEBAYUasD3wUAUAAIoert8oDgr0UCRJCggI0MaNG9W3b18NGzZMV3N8k8mk6OhoTZs2rVgm6gAAAIC9FDhZl6TQ0FD99NNPOnfunA4fPizDMFS1alWVLl26sOIDAAAASqzbeoJp6dKldf/99+uBBx4o9ET9r7/+0nPPPaeyZcvK09NTtWvX1tatW831hmFoxIgRCgoKkqenp6KionTo0CGLfaSkpCgmJka+vr7y9/dXr169lJGRUahxAwAAAHfqtpL1u+XcuXNq2rSpXF1dtWzZMu3du1cffPCBxR8IEydO1OTJkzVz5kzFx8fLy8tL0dHRFjfCxsTEaM+ePVq1apWWLl2qDRs2qE+fPvY4JQAAAKDACnyDqT0MHTpUv/32m3755Zcb1huGoeDgYA0ePFivvfaaJCktLU0BAQGaM2eOunbtqn379ikiIkJbtmxRo0aNJEnLly9X27Zt9eeffyo4OPiWcXCDCgAARQ/XbxQHDj2yvnjxYjVq1EhPPfWUKlSooPr16+vTTz811ycmJiopKUlRUVHmMj8/PzVu3FhxcXGSpLi4OPn7+5sTdUmKioqSk5OT4uPjb3jcy5cvKz093eIFAAAA3G0FStYbNGigc+fOSZLefvttXbhwoVCDuuqPP/7QjBkzVLVqVa1YsUJ9+/ZV//79NXfuXElSUlKSJOVbhSYgIMBcl5SUpAoVKljUu7i4qEyZMuY21xs3bpz8/PzMr5CQEFufGgAAAHBLBUrW9+3bp8zMTEnS6NGj79rNmXl5eWrQoIHeffdd1a9fX3369FHv3r01c+bMQj3usGHDlJaWZn6dOHGiUI8HAAAA3EiBlm6sV6+eevTooWbNmskwDL3//vvy9va+YdsRI0bYLLigoCBFRERYlNWoUUPfffedJCkwMFDSlQc2BQUFmducPn1a9erVM7dJTk622EdOTo5SUlLM21/P3d1d7u7utjoNAAAA4LYUKFmfM2eORo4cqaVLl8pkMmnZsmVyccm/qclksmmy3rRpUx04cMCi7ODBgwoNDZUkhYeHKzAwUKtXrzYn5+np6YqPj1ffvn0lSZGRkUpNTVVCQoIaNmwoSVqzZo3y8vLUuHFjm8UKAAAA2JrVq8E4OTndcB54YdiyZYsefPBBjR49Wl26dNHmzZvVu3dvzZo1SzExMZKkCRMmaPz48Zo7d67Cw8M1fPhw7dy5U3v37pWHh4ckqU2bNjp9+rRmzpyp7Oxs9ejRQ40aNdL8+fMLFAd3kwMAUPRw/UZx4NBLN0rS0qVLNWzYMB06dEjh4eEaNGiQevfuba43DEMjR47UrFmzlJqaqmbNmmn69Om67777zG1SUlLUr18/LVmyRE5OTurUqZMmT55806k81+OHHQCAoofrN4qD20rWjxw5okmTJmnfvn2SpIiICA0YMECVK1e2eYCOgB92AACKHq7fKA6sXmd9xYoVioiI0ObNm1WnTh3VqVNH8fHxqlmzplatWlUYMQIAAAAlktUj6/Xr11d0dLTGjx9vUT506FCtXLlS27Zts2mAjoC/zAEAKHq4fqM4sHpkfd++ferVq1e+8p49e2rv3r02CQoAAADAbSTr5cuX1/bt2/OVb9++/a6sEAMAAACUFAVaZ/1avXv3Vp8+ffTHH3/owQcflCT99ttvmjBhggYNGmTzAAEAAICSyuo564ZhaNKkSfrggw908uRJSVJwcLBef/119e/fXyaTqVACtSfmvAEAUPRw/UZxcEfrrJ8/f16S5OPjY7OAHBE/7AAAFD1cv1EcWD0N5lrFPUkHAAAA7MnqG0wBAAAA3B0k6wAAAICDIlkHAAAAHJRVyXp2drZatmypQ4cOFVY8AAAAAP6XVcm6q6urdu7cWVixAAAAALiG1dNgnnvuOc2ePbswYgEAAABwDauXbszJydFnn32mn3/+WQ0bNpSXl5dF/Ycffmiz4AAAAICSzOpkfffu3WrQoIEk6eDBgxZ1xfHppQAAAIC9WJ2sr127tjDiAAAAAHCd21668fDhw1qxYoUuXrwoSTIMw2ZBAQAAALiNZP3s2bNq2bKl7rvvPrVt21anTp2SJPXq1UuDBw+2eYAAAABASWV1sv7qq6/K1dVVx48fV6lSpczlTz/9tJYvX27T4AAAAICSzOo56ytXrtSKFSt07733WpRXrVpVx44ds1lgAAAAQEln9ch6ZmamxYj6VSkpKXJ3d7dJUAAAAABuI1l/6KGH9MUXX5jfm0wm5eXlaeLEiXr00UdtGhwAAABQklk9DWbixIlq2bKltm7dqqysLA0ZMkR79uxRSkqKfvvtt8KIEQAAACiRrB5Zr1Wrlg4ePKhmzZrpiSeeUGZmpjp27Kjff/9dlStXLowYAQAAgBLJZLBA+i2lp6fLz89PaWlp8vX1tXc4AACgALh+oziwehqMJJ07d06zZ8/Wvn37JEkRERHq0aOHypQpY9PgAAAAgJLM6mkwGzZsUFhYmCZPnqxz587p3Llzmjx5ssLDw7Vhw4bCiBEAAAAokayeBlO7dm1FRkZqxowZcnZ2liTl5ubq5Zdf1saNG7Vr165CCdSe+BoNAICih+s3igOrR9YPHz6swYMHmxN1SXJ2dtagQYN0+PBhmwYHAAAAlGRWJ+sNGjQwz1W/1r59+1S3bl2bBAUAAACggDeY7ty50/z//fv314ABA3T48GE1adJEkrRp0yZNmzZN48ePL5woAQAAgBKoQHPWnZycZDKZdKumJpNJubm5NgvOUTDnDQCAoofrN4qDAo2sJyYmFnYcAAAAAK5ToGQ9NDS0sOMAAAAAcJ3beijSyZMn9euvvyo5OVl5eXkWdf3797dJYAAAAEBJZ3WyPmfOHL300ktyc3NT2bJlZTKZzHUmk4lkHQAAALARqx+KFBISon//+98aNmyYnJysXvmxSOIGFQAAih6u3ygOrM62L1y4oK5du5aYRB0AAACwF6sz7l69emnhwoWFEQsAAACAa1g9DSY3N1ft2rXTxYsXVbt2bbm6ulrUf/jhhzYN0BHwNRoAAEUP128UB1bfYDpu3DitWLFC1apVk6R8N5gCAAAAsA2rk/UPPvhAn332mbp3714I4QAAAAC4yuo56+7u7mratGlhxAIAAADgGlYn6wMGDNCUKVMKIxYAAAAA17B6GszmzZu1Zs0aLV26VDVr1sx3g+n3339vs+AAAACAkszqZN3f318dO3YsjFgAAAAAXMPqZP3zzz8vjDgKZPz48Ro2bJgGDBigSZMmSZIuXbqkwYMH6+uvv9bly5cVHR2t6dOnKyAgwLzd8ePH1bdvX61du1be3t7q1q2bxo0bJxcXq08fAAAAuGuKzGNIt2zZok8++UR16tSxKH/11Ve1ZMkSLVy4UOvXr9fJkyctRv5zc3P1+OOPKysrSxs3btTcuXM1Z84cjRgx4m6fAgAAAGAVqx+KFB4e/o/rqf/xxx93HNT1MjIy1KBBA02fPl1jxoxRvXr1NGnSJKWlpal8+fKaP3++OnfuLEnav3+/atSoobi4ODVp0kTLli1Tu3btdPLkSfNo+8yZM/XGG2/ozJkzcnNzu+XxeagCAABFD9dvFAdWzwMZOHCgxfvs7Gz9/vvvWr58uV5//XVbxWUhNjZWjz/+uKKiojRmzBhzeUJCgrKzsxUVFWUuq169uipWrGhO1uPi4lS7dm2LaTHR0dHq27ev9uzZo/r16+c73uXLl3X58mXz+/T09EI5LwAAAOCfWJ2sDxgw4Ibl06ZN09atW+84oOt9/fXX2rZtm7Zs2ZKvLikpSW5ubvL397coDwgIUFJSkrnNtYn61fqrdTcybtw4jR492gbRAwAAALfPZnPW27Rpo++++85Wu5MknThxQgMGDNC8efPk4eFh033/k2HDhiktLc38OnHixF07NgAAAHCVzZL1b7/9VmXKlLHV7iRdmeaSnJysBg0ayMXFRS4uLlq/fr0mT54sFxcXBQQEKCsrS6mpqRbbnT59WoGBgZKkwMBAnT59Ol/91bobcXd3l6+vr8ULAAAAuNusngZTv359ixtMDcNQUlKSzpw5o+nTp9s0uJYtW2rXrl0WZT169FD16tX1xhtvKCQkRK6urlq9erU6deokSTpw4ICOHz+uyMhISVJkZKTGjh2r5ORkVahQQZK0atUq+fr6KiIiwqbxAgAAALZkdbLeoUMHi/dOTk4qX768HnnkEVWvXt1WcUmSfHx8VKtWLYsyLy8vlS1b1lzeq1cvDRo0SGXKlJGvr69eeeUVRUZGqkmTJpKkVq1aKSIiQs8//7wmTpyopKQkvfXWW4qNjZW7u7tN4wUAAABsyepkfeTIkYURx2376KOP5OTkpE6dOlk8FOkqZ2dnLV26VH379lVkZKS8vLzUrVs3vf3223aMGgAAALg1q9dZL4lYpxUAgKKH6zeKgwKPrDs5Of3jw5AkyWQyKScn546DAgAAAGBFsv7DDz/ctC4uLk6TJ09WXl6eTYICAAAAYEWy/sQTT+QrO3DggIYOHaolS5YoJiaGeeAAAACADd3WOusnT55U7969Vbt2beXk5Gj79u2aO3euQkNDbR0fAAAAUGJZlaynpaXpjTfeUJUqVbRnzx6tXr1aS5Ysybe8IgAAAIA7V+BpMBMnTtSECRMUGBior7766obTYgAAAADYToGXbnRycpKnp6eioqLk7Ox803bff/+9zYJzFCz9BABA0cP1G8VBgUfWX3jhhVsu3QgAAADAdgqcrM+ZM6cQwwAAAABwvdtaDQYAAABA4SNZBwAAABwUyToAAADgoEjWAQAAAAdFsg4AAAA4KJJ1AAAAwEGRrAMAAAAOimQdAAAAcFAk6wAAAICDIlkHAAAAHBTJOgAAAOCgSNYBAAAAB0WyDgAAADgoknUAAADAQZGsAwAAAA6KZB0AAABwUCTrAAAAgIMiWQcAAAAcFMk6AAAA4KBI1gEAAAAHRbIOAAAAOCiSdQAAAMBBkawDAAAADopkHQAAAHBQJOsAAACAgyJZBwAAABwUyToAAADgoEjWAQAAAAdFsg4AAAA4KJJ1AAAAwEGRrAMAAAAOimQdAAAAcFAk6wAAAICDIlkHAAAAHBTJOgAAAOCgSNYBAAAAB0WyDgAAADgoknUAAADAQTl0sj5u3Djdf//98vHxUYUKFdShQwcdOHDAos2lS5cUGxursmXLytvbW506ddLp06ct2hw/flyPP/64SpUqpQoVKuj1119XTk7O3TwVAAAAwGoOnayvX79esbGx2rRpk1atWqXs7Gy1atVKmZmZ5javvvqqlixZooULF2r9+vU6efKkOnbsaK7Pzc3V448/rqysLG3cuFFz587VnDlzNGLECHucEgAAAFBgJsMwDHsHUVBnzpxRhQoVtH79ej388MNKS0tT+fLlNX/+fHXu3FmStH//ftWoUUNxcXFq0qSJli1bpnbt2unkyZMKCAiQJM2cOVNvvPGGzpw5Izc3t1seNz09XX5+fkpLS5Ovr2+hniMAALANrt8oDhx6ZP16aWlpkqQyZcpIkhISEpSdna2oqChzm+rVq6tixYqKi4uTJMXFxal27drmRF2SoqOjlZ6erj179tzwOJcvX1Z6errFCwAAALjbikyynpeXp4EDB6pp06aqVauWJCkpKUlubm7y9/e3aBsQEKCkpCRzm2sT9av1V+tuZNy4cfLz8zO/QkJCbHw2AAAAwK0VmWQ9NjZWu3fv1tdff13oxxo2bJjS0tLMrxMnThT6MQEAAIDrudg7gILo16+fli5dqg0bNujee+81lwcGBiorK0upqakWo+unT59WYGCguc3mzZst9nd1tZirba7n7u4ud3d3G58FAAAAYB2HHlk3DEP9+vXTDz/8oDVr1ig8PNyivmHDhnJ1ddXq1avNZQcOHNDx48cVGRkpSYqMjNSuXbuUnJxsbrNq1Sr5+voqIiLi7pwIAAAAcBscemQ9NjZW8+fP148//igfHx/zHHM/Pz95enrKz89PvXr10qBBg1SmTBn5+vrqlVdeUWRkpJo0aSJJatWqlSIiIvT8889r4sSJSkpK0ltvvaXY2FhGzwEAAODQHHrpRpPJdMPyzz//XN27d5d05aFIgwcP1ldffaXLly8rOjpa06dPt5jicuzYMfXt21fr1q2Tl5eXunXrpvHjx8vFpWB/q7D0EwAARQ/XbxQHDp2sOwp+2AEAKHq4fqM4cOg56wAAAEBJRrIOAAAAOCiSdQAAAMBBkawDAAAADopkHQAAAHBQJOsAAACAgyJZBwAAABwUyToAAADgoEjWAQAAAAdFsg4AAAA4KJJ1AAAAwEGRrAMAAAAOimQdAAAAcFAk6wAAAICDIlkHAAAAHBTJOgAAAOCgXOwdQElmGIaMixftHQYAAA7B5Okpk8lk7zAAh0KybkfGxYs60KChvcMAAMAhVNuWIFOpUvYOA3AoTIMBAAAAHBQj63Zk8vRUtW0J9g4DAACHYPL0tHcIgMMhWbcjk8nE130AAAC4KabBAAAAAA6KZB0AAABwUCTrAAAAgIMiWQcAAAAcFMk6AAAA4KBI1gEAAAAHRbIOAAAAOCiSdQAAAMBBkawDAAAADopkHQAAAHBQJOsAAACAgyJZBwAAABwUyToAAADgoEjWAQAAAAdFsg4AAAA4KJJ1AAAAwEGRrAMAAAAOimQdAAAAcFAk6wAAAICDcrF3ALCOYRi6mHNRmdmZ9g7FoXm6eMrL1UsmkylfXVZuls5nnVeekWeHyICSxWQyydvVW+7O7vl+Hvl9VvSYTCZ5uXrJw9njhp/npdxLyszOlGEYt7Xvcp7lbBUqUGyQrDuYUxmn9O2hb3Xu0jmlZ6Ur/XK60rPSdT7rvPm/uUauvcMsEpxMTvJx85GPq4/cnN10Puu8zmed16XcS/YODShxXJ1c5evmKx83HxkylH75yu+zHCPH3qHhNrg4ucjXzVe+br6SdOV6lZWunLzb/zzLe5bXmi5rbBUiUGyQrDsQwzA09Jeh2pa87ZZtTTLJycQsphsxZCjPyFOekae0y2lKu5x2w3bOJue7HBlQ8uQZeTJkKDsvW2cvndXZS2fzteH3WdFx9fPMyctRyqUUpVxKydfmdj9P/g0AN0ay7kB++esXbUveJndnd/Ws1VN+7n7mkWFfd1/zKIavu+8Nv4LE/7mUc8n8bUR6VrqycrPk4+Zj7j9vV28uDMBdYBiGMrMzLb4hvPqt19XfaZ4unvw+KyIMw9CFnAs6n3VeaZfTlJ6VLknydfOVn7sfnydQCEjWHUSekaePt30sSXq2+rN6ud7Ldo6oaPNw8ZCHi4fKlypv71CAEs1kMsnbzVvebt72DgU2cHXOuperlwK9Au0dDlAiMLToIJYlLtPBcwfl4+qjXrV72TscAAAAOACSdQeQnZutqb9PlST1qNVDfu5+do4IAAAAjqBEJevTpk1TWFiYPDw81LhxY23evNneIUmSvjv0nf7M+FNlPcoqpkaMvcMBAACAgygxyfqCBQs0aNAgjRw5Utu2bVPdunUVHR2t5ORku8Z1IfuCZu6YKUn6d91/q5RrKbvGAwAAAMdhMm7nyQVFUOPGjXX//fdr6tQr003y8vIUEhKiV155RUOHDv3HbdPT0+Xn56e0tDT5+vraLijD0KxtkzVl9//Tve6ltfief8k19U/pwt+ST7BUOlTyD73yXw+mxgAAijGTs+R3j013WWjXb+AuKhGrwWRlZSkhIUHDhg0zlzk5OSkqKkpxcXH52l++fFmXL182v09PTy+UuFJPbtPnO2dJTk7qd+KQXPe/UyjHAQDA4XkHSq8dsHcUgMMpEcn633//rdzcXAUEBFiUBwQEaP/+/fnajxs3TqNHjy70uJJcXVQuJ1fBTlKb0jWlSuFXRtFLlZPOn5TOHZPOHZVSj0nZFws9HgAA7MbF3d4RAA6pRCTr1ho2bJgGDRpkfp+enq6QkBCbH6d6hbr6/oUt+js7Q07eQTbfPwAAAIq2EpGslytXTs7Ozjp9+rRF+enTpxUYmP+hDu7u7nJ3vzt/4bu6+yjI3eeuHAsAAABFS4lYDcbNzU0NGzbU6tWrzWV5eXlavXq1IiMj7RgZAAAAcHMlYmRdkgYNGqRu3bqpUaNGeuCBBzRp0iRlZmaqR48e9g4NAAAAuKESk6w//fTTOnPmjEaMGKGkpCTVq1dPy5cvz3fTKQAAAOAoSsw663eCdVoBACh6uH6jOCgRc9YBAACAoohkHQAAAHBQJOsAAACAgyJZBwAAABwUyToAAADgoEjWAQAAAAdFsg4AAAA4KJJ1AAAAwEGRrAMAAAAOysXeARQFVx/ymp6ebudIAABAQV29bvOwdhRlJOsFcP78eUlSSEiInSMBAADWOn/+vPz8/OwdBnBbTAZ/bt5SXl6eTp48KR8fH5lMJpvuOz09XSEhITpx4oR8fX1tum9cQR/fHfRz4aOPCx99XPjuZh8bhqHz588rODhYTk7M/EXRxMh6ATg5Oenee+8t1GP4+vpyYShk9PHdQT8XPvq48NHHhe9u9TEj6ijq+DMTAAAAcFAk6wAAAICDIlm3M3d3d40cOVLu7u72DqXYoo/vDvq58NHHhY8+Lnz0MWAdbjAFAAAAHBQj6wAAAICDIlkHAAAAHBTJOgAAAOCgSNYBAAAAB0WybkfTpk1TWFiYPDw81LhxY23evNneIRVZ48aN0/333y8fHx9VqFBBHTp00IEDByzaXLp0SbGxsSpbtqy8vb3VqVMnnT592k4RF33jx4+XyWTSwIEDzWX0sW389ddfeu6551S2bFl5enqqdu3a2rp1q7neMAyNGDFCQUFB8vT0VFRUlA4dOmTHiIuW3NxcDR8+XOHh4fL09FTlypX1zjvv6Nr1Fuhj623YsEHt27dXcHCwTCaTFi1aZFFfkD5NSUlRTEyMfH195e/vr169eikjI+MungXgeEjW7WTBggUaNGiQRo4cqW3btqlu3bqKjo5WcnKyvUMrktavX6/Y2Fht2rRJq1atUnZ2tlq1aqXMzExzm1dffVVLlizRwoULtX79ep08eVIdO3a0Y9RF15YtW/TJJ5+oTp06FuX08Z07d+6cmjZtKldXVy1btkx79+7VBx98oNKlS5vbTJw4UZMnT9bMmTMVHx8vLy8vRUdH69KlS3aMvOiYMGGCZsyYoalTp2rfvn2aMGGCJk6cqClTppjb0MfWy8zMVN26dTVt2rQb1hekT2NiYrRnzx6tWrVKS5cu1YYNG9SnT5+7dQqAYzJgFw888IARGxtrfp+bm2sEBwcb48aNs2NUxUdycrIhyVi/fr1hGIaRmppquLq6GgsXLjS32bdvnyHJiIuLs1eYRdL58+eNqlWrGqtWrTKaN29uDBgwwDAM+thW3njjDaNZs2Y3rc/LyzMCAwON9957z1yWmppquLu7G1999dXdCLHIe/zxx42ePXtalHXs2NGIiYkxDIM+tgVJxg8//GB+X5A+3bt3ryHJ2LJli7nNsmXLDJPJZPz11193LXbA0TCybgdZWVlKSEhQVFSUuczJyUlRUVGKi4uzY2TFR1pamiSpTJkykqSEhARlZ2db9Hn16tVVsWJF+txKsbGxevzxxy36UqKPbWXx4sVq1KiRnnrqKVWoUEH169fXp59+aq5PTExUUlKSRT/7+fmpcePG9HMBPfjgg1q9erUOHjwoSdqxY4d+/fVXtWnTRhJ9XBgK0qdxcXHy9/dXo0aNzG2ioqLk5OSk+Pj4ux4z4Chc7B1ASfT3338rNzdXAQEBFuUBAQHav3+/naIqPvLy8jRw4EA1bdpUtWrVkiQlJSXJzc1N/v7+Fm0DAgKUlJRkhyiLpq+//lrbtm3Tli1b8tXRx7bxxx9/aMaMGRo0aJD+85//aMuWLerfv7/c3NzUrVs3c1/e6PcH/VwwQ4cOVXp6uqpXry5nZ2fl5uZq7NixiomJkST6uBAUpE+TkpJUoUIFi3oXFxeVKVOGfkeJRrKOYic2Nla7d+/Wr7/+au9QipUTJ05owIABWrVqlTw8POwdTrGVl5enRo0a6d1335Uk1a9fX7t379bMmTPVrVs3O0dXPHzzzTeaN2+e5s+fr5o1a2r79u0aOHCggoOD6WMADodpMHZQrlw5OTs751sl4/Tp0woMDLRTVMVDv379tHTpUq1du1b33nuvuTwwMFBZWVlKTU21aE+fF1xCQoKSk5PVoEEDubi4yMXFRevXr9fkyZPl4uKigIAA+tgGgoKCFBERYVFWo0YNHT9+XJLMfcnvj9v3+uuva+jQoeratatq166t559/Xq+++qrGjRsniT4uDAXp08DAwHyLLOTk5CglJYV+R4lGsm4Hbm5uatiwoVavXm0uy8vL0+rVqxUZGWnHyIouwzDUr18//fDDD1qzZo3Cw8Mt6hs2bChXV1eLPj9w4ICOHz9OnxdQy5YttWvXLm3fvt38atSokWJiYsz/Tx/fuaZNm+ZbdvTgwYMKDQ2VJIWHhyswMNCin9PT0xUfH08/F9CFCxfk5GR5+XN2dlZeXp4k+rgwFKRPIyMjlZqaqoSEBHObNWvWKC8vT40bN77rMQMOw953uJZUX3/9teHu7m7MmTPH2Lt3r9GnTx/D39/fSEpKsndoRVLfvn0NPz8/Y926dcapU6fMrwsXLpjb/Pvf/zYqVqxorFmzxti6dasRGRlpREZG2jHqou/a1WAMgz62hc2bNxsuLi7G2LFjjUOHDhnz5s0zSpUqZXz55ZfmNuPHjzf8/f2NH3/80di5c6fxxBNPGOHh4cbFixftGHnR0a1bN+Oee+4xli5daiQmJhrff/+9Ua5cOWPIkCHmNvSx9c6fP2/8/vvvxu+//25IMj788EPj999/N44dO2YYRsH6tHXr1kb9+vWN+Ph449dffzWqVq1qPPPMM/Y6JcAhkKzb0ZQpU4yKFSsabm5uxgMPPGBs2rTJ3iEVWZJu+Pr888/NbS5evGi8/PLLRunSpY1SpUoZTz75pHHq1Cn7BV0MXJ+s08e2sWTJEqNWrVqGu7u7Ub16dWPWrFkW9Xl5ecbw4cONgIAAw93d3WjZsqVx4MABO0Vb9KSnpxsDBgwwKlasaHh4eBiVKlUy3nzzTePy5cvmNvSx9dauXXvD38PdunUzDKNgfXr27FnjmWeeMby9vQ1fX1+jR48exvnz5+1wNoDjMBnGNY9sAwAAAOAwmLMOAAAAOCiSdQAAAMBBkawDAAAADopkHQAAAHBQJOsAAACAgyJZBwAAABwUyToAAADgoEjWAQAAAAdFsg6g2Dhz5oz69u2rihUryt3dXYGBgYqOjtZvv/0mSTKZTFq0aJF9gwQAwAou9g4AAGylU6dOysrK0ty5c1WpUiWdPn1aq1ev1tmzZ+0dGgAAt8VkGIZh7yAA4E6lpqaqdOnSWrdunZo3b56vPiwsTMeOHTO/Dw0N1dGjRyVJP/74o0aPHq29e/cqODhY3bp105tvvikXlyvjGSaTSdOnT9fixYu1bt06BQUFaeLEiercufNdOTcAQMnFNBgAxYK3t7e8vb21aNEiXb58OV/9li1bJEmff/65Tp06ZX7/yy+/6IUXXtCAAQO0d+9effLJJ5ozZ47Gjh1rsf3w4cPVqVMn7dixQzExMeratav27dtX+CcGACjRGFkHUGx899136t27ty5evKgGDRqoefPm6tq1q+rUqSPpygj5Dz/8oA4dOpi3iYqKUsuWLTVs2DBz2ZdffqkhQ4bo5MmT5u3+/e9/a8aMGeY2TZo0UYMGDTR9+vS7c3IAgBKJkXUAxUanTp108uRJLV68WK1bt9a6devUoEEDzZkz56bb7NixQ2+//bZ5ZN7b21u9e/fWqVOndOHCBXO7yMhIi+0iIyMZWQcAFDpuMAVQrHh4eOixxx7TY489puHDh+vFF1/UyJEj1b179xu2z8jI0OjRo9WxY8cb7gsAAHtiZB1AsRYREaHMzExJkqurq3Jzcy3qGzRooAMHDqhKlSr5Xk5O//crctOmTRbbbdq0STVq1Cj8EwAAlGiMrAMoFs6ePaunnnpKPXv2VJ06deTj46OtW7dq4sSJeuKJJyRdWRFm9erVatq0qdzd3VW6dGmNGDFC7dq1U8WKFdW5c2c5OTlpx44d2r17t8aMGWPe/8KFC9WoUSM1a9ZM8+bN0+bNmzV79mx7nS4AoITgBlMAxcLly5c1atQorVy5UkeOHFF2drZCQkL01FNP6T//+Y88PT21ZMkSDRo0SEePHtU999xjXrpxxYoVevvtt/X777/L1dVV1atX14svvqjevXtLunKD6bRp07Ro0SJt2LBBQUFBmjBhgrp06WLHMwYAlAQk6wBwCzdaRQYAgLuBOesAAACAgyJZBwAAABwUN5gCwC0wWxAAYC+MrAMAAAAOimQdAAAAcFAk6wAAAICDIlkHAAAAHBTJOgAAAOCgSNYBAAAAB0WyDgAAADgoknUAAADAQZGsAwAAAA7q/wOMzG5+Jfl6RQAAAABJRU5ErkJggg==" }, + "metadata": {}, "output_type": "display_data" } ], - "source": [ - "ax = model_out.plot()\n", - "ax.set_title(\"Citizen Condition Over Time\")\n", - "ax.set_xlabel(\"Step\")\n", - "ax.set_ylabel(\"Number of Citizens\")\n", - "_ = ax.legend(bbox_to_anchor=(1.35, 1.025))" - ] + "execution_count": 10 }, { - "cell_type": "code", - "execution_count": null, "metadata": {}, + "cell_type": "code", "outputs": [], - "source": [] + "execution_count": null, + "source": "" } ], "metadata": { diff --git a/examples/advanced/epstein_civil_violence/Readme.md b/examples/advanced/epstein_civil_violence/Readme.md index 2e715b33b99..84ac40ac6aa 100644 --- a/examples/advanced/epstein_civil_violence/Readme.md +++ b/examples/advanced/epstein_civil_violence/Readme.md @@ -18,8 +18,9 @@ Then open your browser to [http://127.0.0.1:8521/](http://127.0.0.1:8521/) and p ## Files -* ``EpsteinCivilViolence.py``: Core model and agent code. -* ``EpsteinCivilViolenceServer.py``: Sets up the interactive visualization. +* ``model.py``: Core model code. +* ``agent.py``: Agent classes. +* ``app.py``: Sets up the interactive visualization. * ``Epstein Civil Violence.ipynb``: Jupyter notebook conducting some preliminary analysis of the model. ## Further Reading diff --git a/examples/advanced/epstein_civil_violence/epstein_civil_violence/agent.py b/examples/advanced/epstein_civil_violence/agents.py similarity index 100% rename from examples/advanced/epstein_civil_violence/epstein_civil_violence/agent.py rename to examples/advanced/epstein_civil_violence/agents.py diff --git a/examples/advanced/epstein_civil_violence/app.py b/examples/advanced/epstein_civil_violence/app.py new file mode 100644 index 00000000000..f182570770d --- /dev/null +++ b/examples/advanced/epstein_civil_violence/app.py @@ -0,0 +1,70 @@ +from mesa.visualization import SolaraViz, Slider, make_space_matplotlib, make_plot_measure + +from agents import Citizen, Cop +from model import EpsteinCivilViolence + +COP_COLOR = "#000000" +AGENT_QUIET_COLOR = "#648FFF" +AGENT_REBEL_COLOR = "#FE6100" +JAIL_COLOR = "#808080" +JAIL_SHAPE = "rect" + + +def citizen_cop_portrayal(agent): + if agent is None: + return + + portrayal = { + "shape": "circle", + "x": agent.pos[0], + "y": agent.pos[1], + "filled": True, + } + + if isinstance(agent, Citizen): + color = AGENT_QUIET_COLOR if agent.condition == "Quiescent" else AGENT_REBEL_COLOR + color = JAIL_COLOR if agent.jail_sentence else color + shape = JAIL_SHAPE if agent.jail_sentence else "circle" + portrayal["color"] = color + portrayal["shape"] = shape + if shape == "rect": + portrayal["w"] = 0.9 + portrayal["h"] = 0.9 + else: + portrayal["r"] = 0.5 + portrayal["filled"] = False + portrayal["layer"] = 0 + + elif isinstance(agent, Cop): + portrayal["color"] = COP_COLOR + portrayal["r"] = 0.9 + portrayal["layer"] = 1 + + return portrayal + + +model_params = { + "height": 40, + "width": 40, + "citizen_density": Slider("Initial Agent Density", 0.7, 0.0, 0.9, 0.1), + "cop_density": Slider("Initial Cop Density", 0.04, 0.0, 0.1, 0.01), + "citizen_vision": Slider("Citizen Vision", 7, 1, 10, 1), + "cop_vision": Slider("Cop Vision", 7, 1, 10, 1), + "legitimacy": Slider("Government Legitimacy", 0.82, 0.0, 1, 0.01), + "max_jail_term": Slider("Max Jail Term", 30, 0, 50, 1), +} + +# space_component = make_space_matplotlib(citizen_cop_portrayal) +chart_component = make_plot_measure(["Quiescent", "Active", "Jailed"]) + +epstein_model = EpsteinCivilViolence() + +page = SolaraViz( + epstein_model, + components=[ + # space_component, + chart_component], + model_params=model_params, + name="Epstein Civil Violence", +) +page # noqa diff --git a/examples/advanced/epstein_civil_violence/epstein_civil_violence/__init__.py b/examples/advanced/epstein_civil_violence/epstein_civil_violence/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/examples/advanced/epstein_civil_violence/epstein_civil_violence/portrayal.py b/examples/advanced/epstein_civil_violence/epstein_civil_violence/portrayal.py deleted file mode 100644 index 80134adcc79..00000000000 --- a/examples/advanced/epstein_civil_violence/epstein_civil_violence/portrayal.py +++ /dev/null @@ -1,33 +0,0 @@ -from .agent import Citizen, Cop - -COP_COLOR = "#000000" -AGENT_QUIET_COLOR = "#0066CC" -AGENT_REBEL_COLOR = "#CC0000" -JAIL_COLOR = "#757575" - - -def citizen_cop_portrayal(agent): - if agent is None: - return - - portrayal = { - "Shape": "circle", - "x": agent.pos[0], - "y": agent.pos[1], - "Filled": "true", - } - - if isinstance(agent, Citizen): - color = ( - AGENT_QUIET_COLOR if agent.condition == "Quiescent" else AGENT_REBEL_COLOR - ) - color = JAIL_COLOR if agent.jail_sentence else color - portrayal["Color"] = color - portrayal["r"] = 0.8 - portrayal["Layer"] = 0 - - elif isinstance(agent, Cop): - portrayal["Color"] = COP_COLOR - portrayal["r"] = 0.5 - portrayal["Layer"] = 1 - return portrayal diff --git a/examples/advanced/epstein_civil_violence/epstein_civil_violence/server.py b/examples/advanced/epstein_civil_violence/epstein_civil_violence/server.py deleted file mode 100644 index 560b94e5468..00000000000 --- a/examples/advanced/epstein_civil_violence/epstein_civil_violence/server.py +++ /dev/null @@ -1,81 +0,0 @@ -import mesa - -from .agent import Citizen, Cop -from .model import EpsteinCivilViolence - -COP_COLOR = "#000000" -AGENT_QUIET_COLOR = "#648FFF" -AGENT_REBEL_COLOR = "#FE6100" -JAIL_COLOR = "#808080" -JAIL_SHAPE = "rect" - - -def citizen_cop_portrayal(agent): - if agent is None: - return - - portrayal = { - "Shape": "circle", - "x": agent.pos[0], - "y": agent.pos[1], - "Filled": "true", - } - - if type(agent) is Citizen: - color = ( - AGENT_QUIET_COLOR if agent.condition == "Quiescent" else AGENT_REBEL_COLOR - ) - color = JAIL_COLOR if agent.jail_sentence else color - shape = JAIL_SHAPE if agent.jail_sentence else "circle" - portrayal["Color"] = color - portrayal["Shape"] = shape - if shape == "rect": - portrayal["w"] = 0.9 - portrayal["h"] = 0.9 - else: - portrayal["r"] = 0.5 - portrayal["Filled"] = "false" - portrayal["Layer"] = 0 - - elif type(agent) is Cop: - portrayal["Color"] = COP_COLOR - portrayal["r"] = 0.9 - portrayal["Layer"] = 1 - - return portrayal - - -model_params = { - "height": 40, - "width": 40, - "citizen_density": mesa.visualization.Slider( - "Initial Agent Density", 0.7, 0.0, 0.9, 0.1 - ), - "cop_density": mesa.visualization.Slider( - "Initial Cop Density", 0.04, 0.0, 0.1, 0.01 - ), - "citizen_vision": mesa.visualization.Slider("Citizen Vision", 7, 1, 10, 1), - "cop_vision": mesa.visualization.Slider("Cop Vision", 7, 1, 10, 1), - "legitimacy": mesa.visualization.Slider( - "Government Legitimacy", 0.82, 0.0, 1, 0.01 - ), - "max_jail_term": mesa.visualization.Slider("Max Jail Term", 30, 0, 50, 1), -} -canvas_element = mesa.visualization.CanvasGrid(citizen_cop_portrayal, 40, 40, 480, 480) -chart = mesa.visualization.ChartModule( - [ - {"Label": "Quiescent", "Color": "#648FFF"}, - {"Label": "Active", "Color": "#FE6100"}, - {"Label": "Jailed", "Color": "#808080"}, - ], - data_collector_name="datacollector", -) -server = mesa.visualization.ModularServer( - EpsteinCivilViolence, - [ - canvas_element, - chart, - ], - "Epstein Civil Violence", - model_params, -) diff --git a/examples/advanced/epstein_civil_violence/epstein_civil_violence/model.py b/examples/advanced/epstein_civil_violence/model.py similarity index 99% rename from examples/advanced/epstein_civil_violence/epstein_civil_violence/model.py rename to examples/advanced/epstein_civil_violence/model.py index 8bf06bf1540..c51d9beeb34 100644 --- a/examples/advanced/epstein_civil_violence/epstein_civil_violence/model.py +++ b/examples/advanced/epstein_civil_violence/model.py @@ -1,6 +1,6 @@ import mesa -from .agent import Citizen, Cop +from agents import Citizen, Cop class EpsteinCivilViolence(mesa.Model): diff --git a/examples/advanced/epstein_civil_violence/requirements.txt b/examples/advanced/epstein_civil_violence/requirements.txt deleted file mode 100644 index da2b9972efd..00000000000 --- a/examples/advanced/epstein_civil_violence/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -jupyter -matplotlib -mesa~=2.0 diff --git a/examples/advanced/epstein_civil_violence/run.py b/examples/advanced/epstein_civil_violence/run.py deleted file mode 100644 index a4b62c855d8..00000000000 --- a/examples/advanced/epstein_civil_violence/run.py +++ /dev/null @@ -1,3 +0,0 @@ -from epstein_civil_violence.server import server - -server.launch(open_browser=True)