diff --git a/.github/workflows/python-testing.yml b/.github/workflows/python-testing.yml index 005821a..e581543 100644 --- a/.github/workflows/python-testing.yml +++ b/.github/workflows/python-testing.yml @@ -13,8 +13,8 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.10', '3.11'] - os: [ubuntu-latest, macOS-latest] #,windows-latest] + python-version: ['3.10'] #3.11 + os: [ubuntu-latest] #, macOS-latest] #,windows-latest] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} @@ -24,12 +24,12 @@ jobs: - name: Setup PDM uses: pdm-project/setup-pdm@v3.3 with: - version: 2.10.4 + version: 2.15.4 cache: true - name: Install dependencies run: | - pdm install -d -G tensorflow -G rebound + pdm install -G all - name: Analysing the code with pylint run: | pdm run pylint $(git ls-files '*.py') diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2e31926..b06e634 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -39,7 +39,7 @@ pyenv shell 3.10.14 #use the newly installed version ``` - Check your installation by running `which python` which should output something along the lines of: + Check your installation by running `which python`. Output should be along the lines of: - for mise: `/Users/[user]/.local/share/mise/installs/python/3.10.14/bin/python` - for pyenv: `/Users/[user]/.pyenv/shims/python` diff --git a/demos/systems/hot_dino.ipynb b/demos/systems/hot_dino.ipynb index ff66b5e..9c377bc 100644 --- a/demos/systems/hot_dino.ipynb +++ b/demos/systems/hot_dino.ipynb @@ -5,11 +5,11 @@ "execution_count": 18, "id": "initial_id", "metadata": { - "collapsed": true, "ExecuteTime": { "end_time": "2023-08-31T08:47:31.587533Z", "start_time": "2023-08-31T08:47:31.362724Z" - } + }, + "collapsed": true }, "outputs": [ { @@ -29,24 +29,32 @@ { "cell_type": "code", "execution_count": 2, - "outputs": [], - "source": [ - "import numpy as np\n", - "from PIL import Image\n", - "import matplotlib.pyplot as plt" - ], + "id": "cf263d38fc4af083", "metadata": { - "collapsed": false, "ExecuteTime": { "end_time": "2024-01-03T22:18:33.764627Z", "start_time": "2024-01-03T22:18:33.105220Z" - } + }, + "collapsed": false }, - "id": "cf263d38fc4af083" + "outputs": [], + "source": [ + "import numpy as np\n", + "from PIL import Image\n", + "import matplotlib.pyplot as plt" + ] }, { "cell_type": "code", "execution_count": 3, + "id": "51cb8b16f448f930", + "metadata": { + "ExecuteTime": { + "end_time": "2024-01-03T22:18:35.232008Z", + "start_time": "2024-01-03T22:18:35.143704Z" + }, + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -57,8 +65,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "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" + "image/png": "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", + "text/plain": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -74,24 +84,25 @@ " grey = np.array(grayscale_image)\n", " return grey\n", "\n", - "dino = grayscale(\"../graphics/dino.png\")\n", + "dino = grayscale(\"../../graphics/dino.png\")\n", "print(dino.shape)\n", "latent_dim = dino.shape[0] ** 2\n", "plt.imshow(dino, cmap='gray')\n", "plt.axis('off') # Turn off axis labels and ticks\n", "plt.show()" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-01-03T22:18:35.232008Z", - "start_time": "2024-01-03T22:18:35.143704Z" - } - }, - "id": "51cb8b16f448f930" + ] }, { "cell_type": "code", + "execution_count": 5, + "id": "cbcbb4ae05e1619", + "metadata": { + "ExecuteTime": { + "end_time": "2024-01-03T22:18:47.374291Z", + "start_time": "2024-01-03T22:18:47.357550Z" + }, + "collapsed": false + }, "outputs": [ { "name": "stdout", @@ -105,24 +116,25 @@ "x0 = np.expand_dims(dino.flatten()[::-1], axis=0)\n", "x0 *= 2\n", "print(x0.shape)" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-01-03T22:18:47.374291Z", - "start_time": "2024-01-03T22:18:47.357550Z" - } - }, - "id": "cbcbb4ae05e1619", - "execution_count": 5 + ] }, { "cell_type": "code", "execution_count": 9, + "id": "e7b0bc624662e492", + "metadata": { + "ExecuteTime": { + "end_time": "2024-01-03T22:19:47.203262Z", + "start_time": "2024-01-03T22:19:35.292559Z" + }, + "collapsed": false + }, "outputs": [ { "data": { - "text/plain": "" + "text/plain": [ + "" + ] }, "execution_count": 9, "metadata": {}, @@ -130,8 +142,10 @@ }, { "data": { - "text/plain": "
", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAHHCAYAAAAf2DoOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDi0lEQVR4nO3deXwV9b3/8fdJyCbZCJBNCARUkL0ixgiCSCRQi1C4Ktb2BssV1EALuXXBhRC0otgCtSLUtkLrFW3xCopX8QfIUjWgIFSwioChICShYpNAMOv5/v6gnHpIApwlMzk5r+fjMQ89M/Od+ZzJhPnku8zXYYwxAgAAsEiI3QEAAIDgQvIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBABaZM2eOHA5Hsxx70qRJ6tq1a7McG/A3ko8A5XA4LmjZtGmT3aHa5tlnn9Xy5cvtDsMnK1as0KJFiy54/8cff1yrV69utnjO5/XXX9cVV1yhyMhIpaWlKT8/X3V1dRdU1ul0av78+UpPT1dkZKT69eunl156qdF9P/30U40aNUrR0dFKSEjQj370I/3jH//w6Zh28eRndvToUc2ZM0e7du1q1piAZmcQkF544QW35YYbbjCSGqwvKSmxO1Tb9O7d2wwbNszuMHxy4403mi5dulzw/m3btjU5OTnNFs+5vPnmm8bhcJjhw4eb5557zkyfPt2EhISYu+6664LKP/DAA0aSufPOO81zzz1nbrzxRiPJvPTSS277HT582HTo0MF0797d/OpXvzI///nPTbt27Uz//v1NdXW1V8e0Sm1trfnmm2/c1nnyM/vwww+NJLNs2bIG22pqakxVVZUfogSaH8lHK5Gbm2tacy7pdDrNqVOnPCrTHMmHN3H4IpCSj169epn+/fub2tpa17qHHnrIOBwO8+mnn56z7JdffmnCwsJMbm6ua53T6TTXXnut6dSpk6mrq3Otv/vuu01UVJT5+9//7lq3bt06I8n85je/8eqYdvJX8gEEktb7tAoyjSUf9fX1ZuHChaZXr14mIiLCJCYmmilTppivv/7abb8uXbqYG2+80WzcuNEMHDjQREZGmj59+piNGzcaY4z53//9X9OnTx8TERFhrrjiCvPRRx+5lc/JyTFt27Y1Bw4cMCNHjjQXXXSRSUlJMQUFBcbpdPoU09q1a83AgQNNRESEWbhwoTHGmOeff94MHz7cdOzY0YSHh5vLL7/cPPvssw3KS3JbziQi+fn5jSZqy5YtM5JMUVHRBcXxz3/+0/z0pz81nTp1MuHh4aZ79+7miSeeMPX19U3+nM5YvXq1+e53v2tSUlJMeHi46datm5k7d67bA3HYsGENvsO5EpGz95VkWSLyySefGElm8eLFbuuPHDliJJlHH330nOUXL15sJJlPPvnEbf2KFSuMJPOXv/zFtS4xMdHcfPPNDY5x2WWXmREjRnh1zMYMGzas0eQ1JyfH7edQVFRkJJmnnnrK/OY3vzHdunUz4eHh5sorrzQffPCBW9mz7z1PfmYbN25sdP8zici54nrmmWdMenq6iYqKMjfccIM5dOiQcTqdZu7cuebiiy82kZGR5qabbjLHjx9vcN4333zTDBkyxFx00UUmOjrafPe73zV79uw557UDzqdN8zTmoCWYOnWqli9frjvuuEM/+clPVFRUpGeeeUY7d+7Ue++9p7CwMNe++/fv1w9+8ANNnTpVP/zhD/WLX/xCY8aM0dKlS/Xggw/qnnvukSTNmzdPt9xyi/bu3auQkH93Gaqvr9eoUaN09dVXa/78+Vq7dq2rvX/u3LlexbR3717ddtttmjp1qu6880716NFDkrRkyRL17t1bN910k9q0aaM1a9bonnvukdPpVG5uriRp0aJFmj59uqKjo/XQQw9JkpKSkry6jo3FcerUKQ0bNkxHjhzR1KlTlZaWpvfff1+zZs1ScXHxeftpLF++XNHR0crLy1N0dLTeeecdzZ49WxUVFXrqqackSQ899JDKy8v15ZdfauHChZKk6OjoJo/5wgsv6L/+67901VVXacqUKZKk7t27nzOOr7766oKuQUxMjCIiIprcvnPnTknSlVde6bY+NTVVnTp1cm0/V/m2bdvq8ssvd1t/1VVXubYPGTJER44c0bFjxxqc58y+b775psfH9JcVK1boxIkTmjp1qhwOh+bPn6/x48friy++cLuvv82Tn9nll1+uuXPnavbs2ZoyZYquvfZaSdI111xzzrhefPFF1dTUaPr06fr66681f/583XLLLbr++uu1adMm3X///dq/f79+/etf62c/+5mef/55t/hycnKUnZ2tJ598UqdOndKSJUs0ZMgQ7dy5kw6u8J7d2Q/84+yaj7/85S9GknnxxRfd9lu7dm2D9WdqCd5//33XurfffttIalC9/Zvf/MZIctWKGHP6Ly5JZvr06a51TqfT3HjjjSY8PNz84x//8DqmtWvXNviujTV7ZGdnm27durmta6rZxdOaj8biePTRR03btm3N559/7rb+gQceMKGhoebQoUMNjn++7zB16lRz0UUXubXbN3ezixr5S7qx5XzV/E899ZSR1Oj3HjRokLn66qvPWf7GG29s8PMzxpjKykojyTzwwAPGmH83O/zxj39ssO+9995rJLmu34Uesyme1ny0b9/erQbvtddeM5LMmjVrXOsau/f81ezSVFwdO3Y0ZWVlrvWzZs0ykho0kd12220mPDzcdf1OnDhh4uPjzZ133ul2npKSEhMXF9dgPeAJRru0UitXrlRcXJxuuOEGffXVV65l4MCBio6O1saNG93279WrlzIzM12fMzIyJEnXX3+90tLSGqz/4osvGpxz2rRprv93OByaNm2aampqtH79eq9iSk9PV3Z2doPzREVFuf6/vLxcX331lYYNG6YvvvhC5eXlF3yNLlRjcaxcuVLXXnut2rVr5/ZdsrKyVF9fry1btpzzmN/+DidOnNBXX32la6+9VqdOndJnn33m9+/QlHXr1l3Q0tjP4du++eYbSWq0diQyMtK1/Vzlmyr77eOf7zxn73sh+/nLrbfeqnbt2rk+n6mZaOx3xUo333yz4uLiXJ/P/A7/8Ic/VJs2bdzW19TU6MiRI5JO3xtlZWW67bbb3O7x0NBQZWRkNPh9BTxBs0srtW/fPpWXlysxMbHR7ceOHXP7/O0EQ5LrH6vOnTs3uv6f//yn2/qQkBB169bNbd1ll10mSTp48KBXMaWnpze633vvvaf8/HwVFhbq1KlTbtvKy8vd/qH1h8bi2Ldvnz7++GN17Nix0TJnf5ezffLJJ3r44Yf1zjvvqKKiwm1bcyRQTcnKyvLLcc4kU9XV1Q22VVVVuSVbTZVvquy3j3++85y974Xs5y9n/w6dSUTO/l2xmre/2/v27ZN0+g+QxsTGxvo1TgQXko9Wyul0KjExUS+++GKj289+aIaGhja6X1PrjTHNHlNjD4cDBw5oxIgR6tmzpxYsWKDOnTsrPDxcb775phYuXCin03neOJp6yVN9fX2j6xuLw+l06oYbbtB9993XaJkziVdjysrKNGzYMMXGxmru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Ud2/Rrv4sgQqj5OPnJwcbdmyxS8nr6ysVP/+/bV48eIm9xk1apSKi4tdy0svveSXcwMAYKczo118WQKVx5GXl5crKytLXbp00R133KGcnBxdfPHFXp189OjRGj169Dn3iYiIUHJyslfHBwCgpXL62OHUGUw1H6tXr9aRI0d09913609/+pO6du2q0aNH65VXXlFtba3fA9y0aZMSExPVo0cP3X333Tp+/Pg596+urlZFRYXbAgAAWg6v6mw6duyovLw85eXl6aOPPtKyZcv0ox/9SNHR0frhD3+oe+65R5deeqnPwY0aNUrjx49Xenq6Dhw4oAcffFCjR49WYWGhQkMbz/jmzZungoICn8+N08oU73GZ674u9Opcc70qBfxb/i89L1OUl+LVudLfK/a4zE6vzoTWKpiH2vrU4bS4uFjr1q3TunXrFBoaqu9+97vavXu3evXqpYULF/oc3MSJE3XTTTepb9++GjdunN544w19+OGH2rRpU5NlZs2apfLyctdy+PBhn+MAAMDfzgy19X4J3AGrHkdeW1ur//3f/9X3vvc9denSRStXrtSMGTN09OhR/eEPf9D69ev15z//WXPn+v/v2G7duqlDhw7av39/k/tEREQoNjbWbQEAAC2Hx80uKSkpcjqduu222/TBBx9owIABDfYZPny44uPj/RCeuy+//FLHjx9XSop31aQAALQUdQpVqA9NJ4E81Nbj5GPhwoW6+eabFRkZ2eQ+8fHxKioqOu+xTp486VaLUVRUpF27dikhIUEJCQkqKCjQhAkTlJycrAMHDui+++7TJZdcouzsbE/DBgCgRfF9YrkgGmr7ox/9yG8n3759u4YPH+76nJeXJ+n0u0SWLFmijz/+WH/4wx9UVlam1NRUjRw5Uo8++qgiIiL8FgMAALCWrWnTddddJ2NMk9vffvttC6MBAMA6wfyej8CtswEAIIAx1BYAAMAi1HwAAGCDOoUqhNEuAADAKqebXXwZ7ULyAQAAPBDMfT5IPuB3jofsjgDBypt5Wg6qq1fnOjjY83LxKvPqXEBrQ/IBAIANqPkAAACWCub3fDDUFgAAWIqaDwAAbFCnUDkYagsAAKxSr1CFBOlQW5pdAACApaj5AADABvU+vuE0kGs+SD4AALBBMCcfNLsAAABLUfMBAIANGO0CAAAs5VQbnyaWcwbwIzxwIwcAIIDV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u3apvLxcr7zyinJycrR582a7wwoarbLZpUOHDgoNDW3QO7m0tFTJyck2RdUyxMfH67LLLtP+/fvtDsU2Z+4B7o+GunXrpg4dOrTa+2PatGl64403tHHjRnXq1Mm1Pjk5WTU1NSorK3Pbv7XeE01dh8ZkZGRIUqu7J8LDw3XJJZdo4MCBmjdvnvr3769f/epXQXcv2KVVJh/h4eEaOHCgNmzY4FrndDq1YcMGZWZm2hiZ/U6ePKkDBw4oJSXF7lBsk56eruTkZLf7o6KiQtu2bQv6++PLL7/U8ePHW939YYzRtGnTtGrVKr3zzjtKT0932z5w4ECFhYW53RN79+7VoUOHWtU9cb7r0Jhdu3ZJUqu7J87mdDpVXV0dNPeC7ezu8dpcXn75ZRMREWGWL19u/va3v5kpU6aY+Ph4U1JSYndolvrv//5vs2nTJlNUVGTee+89k5WVZTp06GCOHTtmd2jN6sSJE2bnzp1m586dRpJZsGCB2blzp/n73/9ujDHmiSeeMPHx8ea1114zH3/8sRk7dqxJT08333zzjc2R+9e5rsOJEyfMz372M1NYWGiKiorM+vXrzRVXXGEuvfRSU1VVZXfofnX33XebuLg4s2nTJlNcXOxaTp065drnrrvuMmlpaeadd94x27dvN5mZmSYzM9PGqP3vfNdh//79Zu7cuWb79u2mqKjIvPbaa6Zbt25m6NChNkfuXw888IDZvHmzKSoqMh9//LF54IEHjMPhMP/v//0/Y0xw3At2a7XJhzHG/PrXvzZpaWkmPDzcXHXVVWbr1q12h2S5W2+91aSkpJjw8HBz8cUXm1tvvdXs37/f7rCa3caNG42kBktOTo4x5vRw20ceecQkJSWZiIgIM2LECLN37157g24G57oOp06dMiNHjjQdO3Y0YWFhpkuXLubOO+9slQl6Y9dAklm2bJlrn2+++cbcc889pl27duaiiy4y3//+901xcbF9QTeD812HQ4cOmaFDh5qEhAQTERFhLrnkEnPvvfea8vJyewP3sx//+MemS5cuJjw83HTs2NGMGDHClXgYExz3gt0cxhhjXT0LAAAIdq2yzwcAAGi5SD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD6AIPKPf/xDycnJevzxx13r3n//fYWHh7vN4gkAzYm5XYAg8+abb2rcuHF6//331aNHDw0YMEBjx47VggUL7A4NQJAg+QCCUG5urtavX68rr7xSu3fv1ocffqiIiAi7wwIQJEg+gCD0zTffqE+fPjp8+LB27Nihvn372h0SgCBCnw8gCB04cEBHjx6V0+nUwYMH7Q4HQJCh5gMIMjU1Nbrqqqs0YMAA9ejRQ4sWLdLu3buVmJhod2gAggTJBxBk7r33Xr3yyiv661//qujoaA0bNkxxcXF644037A4NQJCg2QUIIps2bdKiRYv0wgsvKDY2ViEhIXrhhRf0l7/8RUuWLLE7PABBgpoPAABgKWo+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApf4/HxJgWILJGCwAAAAASUVORK5CYII=" + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAHHCAYAAAAf2DoOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABDi0lEQVR4nO3deXwV9b3/8fdJyCbZCJBNCARUkL0ixgiCSCRQi1C4Ktb2BssV1EALuXXBhRC0otgCtSLUtkLrFW3xCopX8QfIUjWgIFSwioChICShYpNAMOv5/v6gnHpIApwlMzk5r+fjMQ89M/Od+ZzJhPnku8zXYYwxAgAAsEiI3QEAAIDgQvIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBAAAsRfIBABaZM2eOHA5Hsxx70qRJ6tq1a7McG/A3ko8A5XA4LmjZtGmT3aHa5tlnn9Xy5cvtDsMnK1as0KJFiy54/8cff1yrV69utnjO5/XXX9cVV1yhyMhIpaWlKT8/X3V1dRdU1ul0av78+UpPT1dkZKT69eunl156qdF9P/30U40aNUrR0dFKSEjQj370I/3jH//w6Zh28eRndvToUc2ZM0e7du1q1piAZmcQkF544QW35YYbbjCSGqwvKSmxO1Tb9O7d2wwbNszuMHxy4403mi5dulzw/m3btjU5OTnNFs+5vPnmm8bhcJjhw4eb5557zkyfPt2EhISYu+6664LKP/DAA0aSufPOO81zzz1nbrzxRiPJvPTSS277HT582HTo0MF0797d/OpXvzI///nPTbt27Uz//v1NdXW1V8e0Sm1trfnmm2/c1nnyM/vwww+NJLNs2bIG22pqakxVVZUfogSaH8lHK5Gbm2tacy7pdDrNqVOnPCrTHMmHN3H4IpCSj169epn+/fub2tpa17qHHnrIOBwO8+mnn56z7JdffmnCwsJMbm6ua53T6TTXXnut6dSpk6mrq3Otv/vuu01UVJT5+9//7lq3bt06I8n85je/8eqYdvJX8gEEktb7tAoyjSUf9fX1ZuHChaZXr14mIiLCJCYmmilTppivv/7abb8uXbqYG2+80WzcuNEMHDjQREZGmj59+piNGzcaY4z53//9X9OnTx8TERFhrrjiCvPRRx+5lc/JyTFt27Y1Bw4cMCNHjjQXXXSRSUlJMQUFBcbpdPoU09q1a83AgQNNRESEWbhwoTHGmOeff94MHz7cdOzY0YSHh5vLL7/cPPvssw3KS3JbziQi+fn5jSZqy5YtM5JMUVHRBcXxz3/+0/z0pz81nTp1MuHh4aZ79+7miSeeMPX19U3+nM5YvXq1+e53v2tSUlJMeHi46datm5k7d67bA3HYsGENvsO5EpGz95VkWSLyySefGElm8eLFbuuPHDliJJlHH330nOUXL15sJJlPPvnEbf2KFSuMJPOXv/zFtS4xMdHcfPPNDY5x2WWXmREjRnh1zMYMGzas0eQ1JyfH7edQVFRkJJmnnnrK/OY3vzHdunUz4eHh5sorrzQffPCBW9mz7z1PfmYbN25sdP8zici54nrmmWdMenq6iYqKMjfccIM5dOiQcTqdZu7cuebiiy82kZGR5qabbjLHjx9vcN4333zTDBkyxFx00UUmOjrafPe73zV79uw557UDzqdN8zTmoCWYOnWqli9frjvuuEM/+clPVFRUpGeeeUY7d+7Ue++9p7CwMNe++/fv1w9+8ANNnTpVP/zhD/WLX/xCY8aM0dKlS/Xggw/qnnvukSTNmzdPt9xyi/bu3auQkH93Gaqvr9eoUaN09dVXa/78+Vq7dq2rvX/u3LlexbR3717ddtttmjp1qu6880716NFDkrRkyRL17t1bN910k9q0aaM1a9bonnvukdPpVG5uriRp0aJFmj59uqKjo/XQQw9JkpKSkry6jo3FcerUKQ0bNkxHjhzR1KlTlZaWpvfff1+zZs1ScXHxeftpLF++XNHR0crLy1N0dLTeeecdzZ49WxUVFXrqqackSQ899JDKy8v15ZdfauHChZKk6OjoJo/5wgsv6L/+67901VVXacqUKZKk7t27nzOOr7766oKuQUxMjCIiIprcvnPnTknSlVde6bY+NTVVnTp1cm0/V/m2bdvq8ssvd1t/1VVXubYPGTJER44c0bFjxxqc58y+b775psfH9JcVK1boxIkTmjp1qhwOh+bPn6/x48friy++cLuvv82Tn9nll1+uuXPnavbs2ZoyZYquvfZaSdI111xzzrhefPFF1dTUaPr06fr66681f/583XLLLbr++uu1adMm3X///dq/f79+/etf62c/+5mef/55t/hycnKUnZ2tJ598UqdOndKSJUs0ZMgQ7dy5kw6u8J7d2Q/84+yaj7/85S9GknnxxRfd9lu7dm2D9WdqCd5//33XurfffttIalC9/Zvf/MZIctWKGHP6Ly5JZvr06a51TqfT3HjjjSY8PNz84x//8DqmtWvXNviujTV7ZGdnm27durmta6rZxdOaj8biePTRR03btm3N559/7rb+gQceMKGhoebQoUMNjn++7zB16lRz0UUXubXbN3ezixr5S7qx5XzV/E899ZSR1Oj3HjRokLn66qvPWf7GG29s8PMzxpjKykojyTzwwAPGmH83O/zxj39ssO+9995rJLmu34Uesyme1ny0b9/erQbvtddeM5LMmjVrXOsau/f81ezSVFwdO3Y0ZWVlrvWzZs0ykho0kd12220mPDzcdf1OnDhh4uPjzZ133ul2npKSEhMXF9dgPeAJRru0UitXrlRcXJxuuOEGffXVV65l4MCBio6O1saNG93279WrlzIzM12fMzIyJEnXX3+90tLSGqz/4osvGpxz2rRprv93OByaNm2aampqtH79eq9iSk9PV3Z2doPzREVFuf6/vLxcX331lYYNG6YvvvhC5eXlF3yNLlRjcaxcuVLXXnut2rVr5/ZdsrKyVF9fry1btpzzmN/+DidOnNBXX32la6+9VqdOndJnn33m9+/QlHXr1l3Q0tjP4du++eYbSWq0diQyMtK1/Vzlmyr77eOf7zxn73sh+/nLrbfeqnbt2rk+n6mZaOx3xUo333yz4uLiXJ/P/A7/8Ic/VJs2bdzW19TU6MiRI5JO3xtlZWW67bbb3O7x0NBQZWRkNPh9BTxBs0srtW/fPpWXlysxMbHR7ceOHXP7/O0EQ5LrH6vOnTs3uv6f//yn2/qQkBB169bNbd1ll10mSTp48KBXMaWnpze633vvvaf8/HwVFhbq1KlTbtvKy8vd/qH1h8bi2Ldvnz7++GN17Nix0TJnf5ezffLJJ3r44Yf1zjvvqKKiwm1bcyRQTcnKyvLLcc4kU9XV1Q22VVVVuSVbTZVvquy3j3++85y974Xs5y9n/w6dSUTO/l2xmre/2/v27ZN0+g+QxsTGxvo1TgQXko9Wyul0KjExUS+++GKj289+aIaGhja6X1PrjTHNHlNjD4cDBw5oxIgR6tmzpxYsWKDOnTsrPDxcb775phYuXCin03neOJp6yVN9fX2j6xuLw+l06oYbbtB9993XaJkziVdjysrKNGzYMMXGxmru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Ud2/Rrv4sgQqj5OPnJwcbdmyxS8nr6ysVP/+/bV48eIm9xk1apSKi4tdy0svveSXcwMAYKczo118WQKVx5GXl5crKytLXbp00R133KGcnBxdfPHFXp189OjRGj169Dn3iYiIUHJyslfHBwCgpXL62OHUGUw1H6tXr9aRI0d09913609/+pO6du2q0aNH65VXXlFtba3fA9y0aZMSExPVo0cP3X333Tp+/Pg596+urlZFRYXbAgAAWg6v6mw6duyovLw85eXl6aOPPtKyZcv0ox/9SNHR0frhD3+oe+65R5deeqnPwY0aNUrjx49Xenq6Dhw4oAcffFCjR49WYWGhQkMbz/jmzZungoICn8+N08oU73GZ674u9Opcc70qBfxb/i89L1OUl+LVudLfK/a4zE6vzoTWKpiH2vrU4bS4uFjr1q3TunXrFBoaqu9+97vavXu3evXqpYULF/oc3MSJE3XTTTepb9++GjdunN544w19+OGH2rRpU5NlZs2apfLyctdy+PBhn+MAAMDfzgy19X4J3AGrHkdeW1ur//3f/9X3vvc9denSRStXrtSMGTN09OhR/eEPf9D69ev15z//WXPn+v/v2G7duqlDhw7av39/k/tEREQoNjbWbQEAAC2Hx80uKSkpcjqduu222/TBBx9owIABDfYZPny44uPj/RCeuy+//FLHjx9XSop31aQAALQUdQpVqA9NJ4E81Nbj5GPhwoW6+eabFRkZ2eQ+8fHxKioqOu+xTp486VaLUVRUpF27dikhIUEJCQkqKCjQhAkTlJycrAMHDui+++7TJZdcouzsbE/DBgCgRfF9YrkgGmr7ox/9yG8n3759u4YPH+76nJeXJ+n0u0SWLFmijz/+WH/4wx9UVlam1NRUjRw5Uo8++qgiIiL8FgMAALCWrWnTddddJ2NMk9vffvttC6MBAMA6wfyej8CtswEAIIAx1BYAAMAi1HwAAGCDOoUqhNEuAADAKqebXXwZ7ULyAQAAPBDMfT5IPuB3jofsjgDBypt5Wg6qq1fnOjjY83LxKvPqXEBrQ/IBAIANqPkAAACWCub3fDDUFgAAWIqaDwAAbFCnUDkYagsAAKxSr1CFBOlQW5pdAACApaj5AADABvU+vuE0kGs+SD4AALBBMCcfNLsAAABLUfMBAIANGO0CAAAs5VQbnyaWcwbwIzxwIwcAIIDV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u3apvLxcr7zyinJycrR582a7wwoarbLZpUOHDgoNDW3QO7m0tFTJyck2RdUyxMfH67LLLtP+/fvtDsU2Z+4B7o+GunXrpg4dOrTa+2PatGl64403tHHjRnXq1Mm1Pjk5WTU1NSorK3Pbv7XeE01dh8ZkZGRIUqu7J8LDw3XJJZdo4MCBmjdvnvr3769f/epXQXcv2KVVJh/h4eEaOHCgNmzY4FrndDq1YcMGZWZm2hiZ/U6ePKkDBw4oJSXF7lBsk56eruTkZLf7o6KiQtu2bQv6++PLL7/U8ePHW939YYzRtGnTtGrVKr3zzjtKT0932z5w4ECFhYW53RN79+7VoUOHWtU9cb7r0Jhdu3ZJUqu7J87mdDpVXV0dNPeC7ezu8dpcXn75ZRMREWGWL19u/va3v5kpU6aY+Ph4U1JSYndolvrv//5vs2nTJlNUVGTee+89k5WVZTp06GCOHTtmd2jN6sSJE2bnzp1m586dRpJZsGCB2blzp/n73/9ujDHmiSeeMPHx8ea1114zH3/8sRk7dqxJT08333zzjc2R+9e5rsOJEyfMz372M1NYWGiKiorM+vXrzRVXXGEuvfRSU1VVZXfofnX33XebuLg4s2nTJlNcXOxaTp065drnrrvuMmlpaeadd94x27dvN5mZmSYzM9PGqP3vfNdh//79Zu7cuWb79u2mqKjIvPbaa6Zbt25m6NChNkfuXw888IDZvHmzKSoqMh9//LF54IEHjMPhMP/v//0/Y0xw3At2a7XJhzHG/PrXvzZpaWkmPDzcXHXVVWbr1q12h2S5W2+91aSkpJjw8HBz8cUXm1tvvdXs37/f7rCa3caNG42kBktOTo4x5vRw20ceecQkJSWZiIgIM2LECLN37157g24G57oOp06dMiNHjjQdO3Y0YWFhpkuXLubOO+9slQl6Y9dAklm2bJlrn2+++cbcc889pl27duaiiy4y3//+901xcbF9QTeD812HQ4cOmaFDh5qEhAQTERFhLrnkEnPvvfea8vJyewP3sx//+MemS5cuJjw83HTs2NGMGDHClXgYExz3gt0cxhhjXT0LAAAIdq2yzwcAAGi5SD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD4AAIClSD6AIPKPf/xDycnJevzxx13r3n//fYWHh7vN4gkAzYm5XYAg8+abb2rcuHF6//331aNHDw0YMEBjx47VggUL7A4NQJAg+QCCUG5urtavX68rr7xSu3fv1ocffqiIiAi7wwIQJEg+gCD0zTffqE+fPjp8+LB27Nihvn372h0SgCBCnw8gCB04cEBHjx6V0+nUwYMH7Q4HQJCh5gMIMjU1Nbrqqqs0YMAA9ejRQ4sWLdLu3buVmJhod2gAggTJBxBk7r33Xr3yyiv661//qujoaA0bNkxxcXF644037A4NQJCg2QUIIps2bdKiRYv0wgsvKDY2ViEhIXrhhRf0l7/8RUuWLLE7PABBgpoPAABgKWo+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApUg+AACApf4/HxJgWILJGCwAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -147,16 +161,8 @@ "embed_dim = latent_dim\n", "system = SystemChecker(HeatEquation(latent_dim, embed_dim, noise_scale=0))\n", "x = system.make_data(x0, timesteps=timesteps)\n", - "plot(x[0], timesteps, system._system.dt, savefile=\"../graphics/hot_dino.gif\")" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2024-01-03T22:19:47.203262Z", - "start_time": "2024-01-03T22:19:35.292559Z" - } - }, - "id": "e7b0bc624662e492" + "plot(x[0], timesteps, system._system.dt, savefile=\"../../graphics/hot_dino.gif\")" + ] } ], "metadata": { @@ -175,7 +181,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "3.10.14" } }, "nbformat": 4, diff --git a/demos/systems/kuramoto_demo.ipynb b/demos/systems/kuramoto_demo.ipynb index 8f5e468..cb42200 100644 --- a/demos/systems/kuramoto_demo.ipynb +++ b/demos/systems/kuramoto_demo.ipynb @@ -96,9 +96,9 @@ } ], "source": [ - "plot([x], legend_labels=[\"IND\"], max_oscillators=3, title=\"InD\", max_lines=2, phase_dynamics=True)\n", + "plot([x], labels=[\"IND\"], max_oscillators=3, title=\"InD\", max_lines=2, phase_dynamics=True)\n", "\n", - "plot([x], legend_labels=[\"IND\"], max_oscillators=3, title=\"InD\", max_lines=2, phase_dynamics=False)\n", + "plot([x], labels=[\"IND\"], max_oscillators=3, title=\"InD\", max_lines=2, phase_dynamics=False)\n", "# plot([y], max_oscillators=3, title=\"OOD\")" ] }, @@ -126,7 +126,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.14" + "version": "3.10.11" } }, "nbformat": 4, diff --git a/src/dynadojo/baselines/dnn.py b/src/dynadojo/baselines/dnn.py index e620bae..50ab172 100644 --- a/src/dynadojo/baselines/dnn.py +++ b/src/dynadojo/baselines/dnn.py @@ -10,7 +10,7 @@ import time from ..abstractions import AbstractAlgorithm - +import logging class TorchBaseClass(AbstractAlgorithm, torch.nn.Module): @@ -33,7 +33,8 @@ def __init__( torch.manual_seed(seed) self.device = device or "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu" - print(f"Using device: {self.device}") + logging.info(f"Using device: {self.device}") + # print(f"Using device: {self.device}") # self.model = self.create_model() self.criterion = torch.nn.MSELoss() @@ -90,7 +91,7 @@ def fit(self, x: np.ndarray, losses = [] self.train() training_start_time = time.time() - print(f'Dataloader length: {len(dataloader)}') + # print(f'Dataloader length: {len(dataloader)}') for epoch in range(epochs): self.train() epoch_loss = 0 @@ -170,8 +171,9 @@ class DNN(TorchBaseClass): def __init__(self, embed_dim, timesteps, + max_control_cost, **kwargs): - super().__init__(embed_dim, timesteps, **kwargs) + super().__init__(embed_dim, timesteps, max_control_cost, **kwargs) self.model = torch.nn.Sequential( torch.nn.Linear(self.embed_dim, embed_dim*10), torch.nn.ReLU(), diff --git a/src/dynadojo/systems/ctln.py b/src/dynadojo/systems/ctln.py index 662b7c3..881f793 100644 --- a/src/dynadojo/systems/ctln.py +++ b/src/dynadojo/systems/ctln.py @@ -69,7 +69,7 @@ def dynamics(t, state): def calc_error(self, x, y) -> float: error = x - y - return np.mean(error ** 2) / self.embed_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: return np.linalg.norm(control, axis=(1, 2), ord=2) diff --git a/src/dynadojo/systems/kuramoto.py b/src/dynadojo/systems/kuramoto.py index e4b0ddc..1e9412c 100644 --- a/src/dynadojo/systems/kuramoto.py +++ b/src/dynadojo/systems/kuramoto.py @@ -180,7 +180,7 @@ def solve(t, x0, U): def calc_error(self, x, y) -> float: error = x - y - return np.mean(error ** 2) / self.latent_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: return np.linalg.norm(control, axis=(1, 2), ord=2) diff --git a/src/dynadojo/systems/lv/competitive.py b/src/dynadojo/systems/lv/competitive.py index 583aceb..8a93726 100644 --- a/src/dynadojo/systems/lv/competitive.py +++ b/src/dynadojo/systems/lv/competitive.py @@ -168,7 +168,7 @@ def dynamics(t, X, u): def calc_error(self, x, y) -> float: error = x - y - return np.mean(error ** 2) / self.latent_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: return np.linalg.norm(control, axis=(1, 2), ord=2) diff --git a/src/dynadojo/systems/lv/prey_predator.py b/src/dynadojo/systems/lv/prey_predator.py index 0e5b156..f920bce 100644 --- a/src/dynadojo/systems/lv/prey_predator.py +++ b/src/dynadojo/systems/lv/prey_predator.py @@ -237,7 +237,7 @@ def dynamics(t, X, u): def calc_error(self, x, y) -> float: error = x - y - return np.mean(error ** 2) / self.latent_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: return np.linalg.norm(control, axis=(1, 2), ord=2) diff --git a/src/dynadojo/systems/opinion/media_bias.py b/src/dynadojo/systems/opinion/media_bias.py index 2d5483a..6a6b523 100644 --- a/src/dynadojo/systems/opinion/media_bias.py +++ b/src/dynadojo/systems/opinion/media_bias.py @@ -93,7 +93,7 @@ def __init__(self, latent_dim=31, embed_dim=31, self.config.add_model_parameter("gamma_media", bias_media) def create_model(self, x0): - self.model = op.AlgorithmicBiasMediaModel(self.g) + self.model = op.AlgorithmicBiasModel(self.g) self.model.set_initial_status(self.config) self.model.status = x0 self.model.initial_status = x0 \ No newline at end of file diff --git a/src/dynadojo/systems/utils/epidemic.py b/src/dynadojo/systems/utils/epidemic.py index 259117f..c24d2da 100644 --- a/src/dynadojo/systems/utils/epidemic.py +++ b/src/dynadojo/systems/utils/epidemic.py @@ -165,7 +165,7 @@ def dynamics(x0): def calc_error(self, x, y) -> float: error = x - y - return np.mean(error ** 2) / self.latent_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: return np.linalg.norm(control, axis=(1, 2), ord=2) diff --git a/src/dynadojo/systems/utils/fbsnn.py b/src/dynadojo/systems/utils/fbsnn.py index 145ecdc..42c26c4 100644 --- a/src/dynadojo/systems/utils/fbsnn.py +++ b/src/dynadojo/systems/utils/fbsnn.py @@ -209,7 +209,7 @@ def make_data(self, init_conds: np.ndarray, control: np.ndarray, timesteps: int, def calc_error(self, x, y) -> float: error = x - y - return np.mean(error ** 2) / self.latent_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: return np.linalg.norm(control, axis=(1, 2), ord=2) diff --git a/src/dynadojo/systems/utils/opinion.py b/src/dynadojo/systems/utils/opinion.py index 2ffe6a8..668c429 100644 --- a/src/dynadojo/systems/utils/opinion.py +++ b/src/dynadojo/systems/utils/opinion.py @@ -79,7 +79,7 @@ def dynamics(x0): def calc_error(self, x, y) -> float: error = x - y - return np.mean(error ** 2) / self.latent_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: return np.linalg.norm(control, axis=(1, 2), ord=2) diff --git a/src/dynadojo/systems/utils/simple.py b/src/dynadojo/systems/utils/simple.py index 7423921..ff6c73b 100644 --- a/src/dynadojo/systems/utils/simple.py +++ b/src/dynadojo/systems/utils/simple.py @@ -122,7 +122,7 @@ def make_init_conds(self, n: int, in_dist=True) -> np.ndarray: def calc_error(self, x, y) -> float: """Returns the MSE error normalized by the embedded dimension.""" error = x - y - return np.mean(error ** 2) / self.embed_dim + return np.mean(error ** 2) def calc_control_cost(self, control: np.ndarray) -> float: """Calculates the L2 norm / dimension of every vector in the control""" diff --git a/tests/test_deterministic.py b/tests/test_deterministic.py index c4be2c2..b74cc28 100644 --- a/tests/test_deterministic.py +++ b/tests/test_deterministic.py @@ -15,7 +15,7 @@ # baselines from dynadojo.baselines.aug_ode import AugODE from dynadojo.baselines.cnn import CNN -from dynadojo.baselines.dmd import DMD +# from dynadojo.baselines.dmd import DMD from dynadojo.baselines.dnn import DNN from dynadojo.baselines.ode import ODE # from dynadojo.baselines.sindy import SINDy @@ -23,7 +23,7 @@ ALL_BASELINES = [ # AugODE, # CNN, - DMD, + # DMD, DNN, # ODE, # SINDy @@ -157,7 +157,7 @@ def test_with_trials(self, algo): algo_kwargs=None) cols = ['trial', 'latent_dim', 'embed_dim', 'timesteps', 'n', 'error', 'ood_error', 'total_cost', 'system_seed', 'algo_seed'] - df1 = df1[cols] + df1 = df1[cols].loc[df2['trial'] == 1] df2 = df2[cols].loc[df2['trial'] == 1] self.assertEqual(df1, df2)