From e49c34f347fb7efb2b1b99327311135d668370f0 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 10 Mar 2022 17:12:00 -0500 Subject: [PATCH 1/7] remove .id where possible and add __eq__ and __hash__ methods instead --- .../expression_tree/expression-tree.ipynb | 2 +- .../spatial_methods/finite-volumes.ipynb | 20 +- pybamm/discretisations/discretisation.py | 63 +++--- pybamm/expression_tree/binary_operators.py | 31 +-- pybamm/expression_tree/concatenations.py | 23 +- pybamm/expression_tree/functions.py | 24 +- .../operations/convert_to_casadi.py | 18 +- .../operations/evaluate_python.py | 7 +- pybamm/expression_tree/operations/jacobian.py | 4 +- .../operations/replace_symbols.py | 14 +- .../operations/unpack_symbols.py | 18 +- pybamm/expression_tree/state_vector.py | 8 +- pybamm/expression_tree/symbol.py | 40 ++-- pybamm/expression_tree/unary_operators.py | 14 +- pybamm/expression_tree/variable.py | 12 +- pybamm/geometry/geometry.py | 2 +- pybamm/models/base_model.py | 102 ++++----- pybamm/models/event.py | 4 +- pybamm/models/submodels/base_submodel.py | 6 +- pybamm/parameters/parameter_values.py | 6 +- pybamm/solvers/base_solver.py | 44 ++-- pybamm/spatial_methods/finite_volume.py | 26 +-- .../spatial_methods/scikit_finite_element.py | 28 +-- pybamm/spatial_methods/spatial_method.py | 10 +- pybamm/spatial_methods/spectral_volume.py | 8 +- .../test_models/standard_model_tests.py | 6 +- .../test_lead_acid/test_composite.py | 2 - .../test_lead_acid/test_foqs.py | 2 - .../test_lead_acid/test_full.py | 11 - .../test_lead_acid/test_loqs.py | 2 - .../test_lead_acid/test_loqs_surface_form.py | 2 - .../test_composite_side_reactions.py | 9 - .../test_full_side_reactions.py | 9 - .../base_lithium_ion_tests.py | 2 - .../test_lithium_ion/test_mpm.py | 2 - .../test_finite_volume.py | 2 +- .../test_spectral_volume.py | 2 +- .../test_discretisation.py | 91 ++++---- .../test_expression_tree/test_averages.py | 26 +-- .../test_binary_operators.py | 209 ++++++++---------- .../test_expression_tree/test_broadcasts.py | 20 +- .../test_concatenations.py | 14 +- tests/unit/test_expression_tree/test_d_dt.py | 2 +- .../test_expression_tree/test_functions.py | 23 +- .../test_expression_tree/test_interpolant.py | 2 +- .../test_operations/test_copy.py | 4 +- .../test_operations/test_jac.py | 2 +- .../test_operations/test_replace_symbols.py | 8 +- .../test_operations/test_unpack_symbols.py | 19 +- .../test_expression_tree/test_parameter.py | 2 +- .../unit/test_expression_tree/test_scalar.py | 11 +- .../unit/test_expression_tree/test_symbol.py | 16 +- .../test_symbolic_diff.py | 8 +- .../test_unary_operators.py | 39 ++-- .../test_expression_tree/test_variable.py | 14 +- .../test_geometry/test_battery_geometry.py | 8 +- tests/unit/test_models/test_base_model.py | 14 +- .../test_base_battery_model.py | 2 +- .../test_lithium_ion/test_spm.py | 6 +- .../test_lithium_ion/test_spme.py | 8 +- .../test_parameters/test_parameter_values.py | 32 ++- tests/unit/test_solvers/test_scipy_solver.py | 2 +- .../test_finite_volume/test_finite_volume.py | 34 +-- .../test_ghost_nodes_and_neumann.py | 6 +- .../test_grad_div_shapes.py | 48 ++-- .../test_finite_volume/test_integration.py | 8 +- .../test_scikit_finite_element.py | 22 +- .../test_spectral_volume.py | 40 ++-- .../test_zero_dimensional_method.py | 4 +- 69 files changed, 576 insertions(+), 753 deletions(-) diff --git a/examples/notebooks/expression_tree/expression-tree.ipynb b/examples/notebooks/expression_tree/expression-tree.ipynb index c5b3a9d336..7a69b92d86 100644 --- a/examples/notebooks/expression_tree/expression-tree.ipynb +++ b/examples/notebooks/expression_tree/expression-tree.ipynb @@ -210,7 +210,7 @@ "source": [ "from tests import get_discretisation_for_testing\n", "disc = get_discretisation_for_testing()\n", - "disc.y_slices = {c.id: [slice(0, 40)]}\n", + "disc.y_slices = {c: [slice(0, 40)]}\n", "dcdt = disc.process_symbol(dcdt)\n", "dcdt.visualise('expression_tree5.png')" ] diff --git a/examples/notebooks/spatial_methods/finite-volumes.ipynb b/examples/notebooks/spatial_methods/finite-volumes.ipynb index 39b7f34e97..607c0d9aa0 100644 --- a/examples/notebooks/spatial_methods/finite-volumes.ipynb +++ b/examples/notebooks/spatial_methods/finite-volumes.ipynb @@ -182,7 +182,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -353,7 +353,7 @@ "outputs": [ { "data": { - "image/png": "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Q0mZ0DmwbOj8WDZ03iwbOqcGgXI3Bdc5l2tmo4Av8HWymuycW2xm44Ak59w0YBK+y+Ur8TWfGOZd4uDh57F7HKgOvFvQt2mdc26QZ6GDhJ/HTkrg5/H7AuhnZkuAPOBO51yln7ng57G7HXjJzG7F1zzhSr3o5mNmb+P7Ay224H6eB4BwAOfcC/ju7zkLWAnsBUZ4k1TKms6BZUPnx7Kh82bZ0Dk1OJiOp4iIiIiIiARCeZyCKyIiIiIiIuWQClAREREREREJCBWgIiIiIiIiEhAqQEVERERERCQgVICKiIiIiIhIQKgAFRERERERkYBQASoiIiIiUsB89DeySBnRL5dIBWVm3c0s2cwizayamS02sw5e5xIREQk2ZtbMzJab2RRgEdDY60wiFZU557zOICJlxMweBCKBKCDVOfewx5FERESCjpk1A1YDvZxzcz2OI1KhqQAVqcDMrAowH8jEd1LN8ziSiIhI0CkoQL9xzjX3OotIRacpuCIVWwxQHaiB70qoiIiIFG+P1wFEKgMVoCIV24vA34E3gUc9ziIiIiIilVyY1wFEpGyY2RVAjnPuLTMLBWab2WnOua+9ziYiIiIilZPuARUREREREZGA0BRcERERERERCQgVoCIiIiIiIhIQKkBFREREREQkIFSAioiIiIiISECoABUREREREZGAUAEqIiIiIiIiAaECVERERERERALi/wFLJhCJmaU8agAAAABJRU5ErkJggg==\n", + "image/png": "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Q0mZ0DmwbOj8WDZ03iwbOqcGgXI3Bdc5l2tmo4Av8HWymuycW2xm44Ak59w0YBK+y+Ur8TWfGOZd4uDh57F7HKgOvFvQt2mdc26QZ6GDhJ/HTkrg5/H7AuhnZkuAPOBO51yln7ng57G7HXjJzG7F1zzhSr3o5mNmb+P7Ay224H6eB4BwAOfcC/ju7zkLWAnsBUZ4k1TKms6BZUPnx7Kh82bZ0Dk1OJiOp4iIiIiIiARCeZyCKyIiIiIiIuWQClAREREREREJCBWgIiIiIiIiEhAqQEVERERERCQgVICKiIiIiIhIQKgAFRERERERkYBQASoiIiIiUsB89DeySBnRL5dIBWVm3c0s2cwizayamS02sw5e5xIREQk2ZtbMzJab2RRgEdDY60wiFZU557zOICJlxMweBCKBKCDVOfewx5FERESCjpk1A1YDvZxzcz2OI1KhqQAVqcDMrAowH8jEd1LN8ziSiIhI0CkoQL9xzjX3OotIRacpuCIVWwxQHaiB70qoiIiIFG+P1wFEKgMVoCIV24vA34E3gUc9ziIiIiIilVyY1wFEpGyY2RVAjnPuLTMLBWab2WnOua+9ziYiIiIilZPuARUREREREZGA0BRcERERERERCQgVoCIiIiIiIhIQKkBFREREREQkIFSAioiIiIiISECoABUREREREZGAUAEqIiIiIiIiAaECVERERERERALi/wFLJhCJmaU8agAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -490,7 +490,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEGCAYAAAB1iW6ZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAqHElEQVR4nO3deXhV1dXH8e9KCAljmCICQaEWJ8IchgooKigOgAMCiqJWRFHAgm21yqso9q1FCxX1dUCoEw60WgXHOiuKkqCCEgcQVAKIDBJIyJz9/nGT9Ca5SS7kJnf6fZ6Hx+Sck3vXSeJis87ae5tzDhERCX8xwQ5AREQCQwldRCRCKKGLiEQIJXQRkQihhC4iEiEaBeuN27Vr57p06RKstxcRCUtr1qzZ5ZxL8nUuaAm9S5cupKenB+vtRUTCkpn9UN25WksuZrbEzH42sy+rOW9mttDMNprZOjPrW5dgRUTk0PhTQ38UGFnD+TOAbqV/pgAP1D0sERE5WLUmdOfc+8CeGi4ZAzzuPD4GWplZh0AFKCIi/glEDb0TsMXr88zSY9srX2hmU/CM4jniiCOqvFBhYSGZmZnk5eUFICyR+peQkEBycjJxcXHBDkWkYR+KOuceBh4GSE1NrbKITGZmJi1atKBLly6YWUOGJnLQnHPs3r2bzMxMunbtGuxwRALSh74V6Oz1eXLpsYOWl5dH27ZtlcwlLJgZbdu21b8oJWQEIqEvByaVdrsMArKcc1XKLf5SMpdwot9XCSX+tC0+DawCjjGzTDO7wsyuNrOrSy95BdgEbAQWAdfUW7QiImGspMTx55cz2LLnQL28fq01dOfchbWcd8C1AYsoRGVnZzNs2DD27NnDypUr6dixY/m5iRMnkp6eTlxcHAMGDOChhx7SQzIRqeKetzaw6IPN/CqpORcOqNoYUlday8UPRUVFjBs3jksuuYS77rqLMWPGsG/fvvLzEydO5Ouvv+aLL74gNzeXRx55JIjRikgoejNjB/e8tYHz+yYzoX/n2r/gEARt6n8oSktL44orrmD16tUUFxczYMAAnn32WRYsWMAZZ5zB9OnTAYiNjWXChAm8+OKLxMXFceaZZ5a/xoABA8jMzAzWLYhIKFm3DN66HZeVyfGuLde2vZTp546st2cvFqwt6FJTU13ltVy++uorjjvuOABuW7GejG37fH3pITu+Y0tuHdW9xmtmz55NXl4eubm5JCcn86c//cnv1y8sLGTgwIHcc889DB06tK7hSpjw/r0VKbduGayYAYW55YdKGjUhZvRC6DnukF/WzNY451J9ndMIvZJbbrmF/v37k5CQwMKFCw/qa6+55hpOPPFEJXMRgbdur5DMAWKKcj3H65DQaxKyCb22kXR92b17N9nZ2RQWFpKXl0ezZs38+rrbbruNnTt38tBDD9VzhCISFrKqKb1WdzwA9FC0kquuuoq5c+cyceJEbrjhBr++5pFHHuH111/n6aefJiZG31IRgbym1SxplZhcb++p7OPl8ccfJy4ujosuuogbb7yRtLQ03n777Vq/7uqrr2bHjh385je/oXfv3tx+++0NEK2IhKotew5w24Gx5BFf8URcEzj1lnp735AtuQTDpEmTmDRpEuDpZPnkk0/8+rqioqL6DEtEwkheYTFXP7mGHxnCrBFHk7D6r54yS2KyJ5nXU/0clNBFRALGOcdN//6C9dv2seSyVJKObQ+DL2mw91fJRUQkQB5f9QPPf7qV3w3vxinHtm/w91dCFxEJgNWb9zD3pQyGH3cYM07pFpQYVHIRETlUXjNBk2nLZS0mMX3cTcTEBGcVTo3QRUQORdlM0KwtGI6O7OKm4gdI3PDvoIWkhC4icihqmgkaJEro9axLly7s2rULgNzcXE466SSKi4tr/JoJEyawYcOGeo1rzpw53H333Yf0td9//z1PPfWUX9du376ds88++5DepzZl6xDNmTOn/HNfx3744Qf69u1L79696d69Ow8++GCF17nzzjtZunQpDz74ID169KB3794MGTKEjIwMAL744gsuu+yyerkHCWNBmAlam/CuoZfWrxqqx7NMUVERjRod/LduyZIlnHfeecTGxtZ43dSpU5k3bx6LFi061BDrVVlCv+iii2q9dv78+Vx55ZX1Esff//53WrZsSU5ODjfffDMnnXQS69evr3Js2LBhrFq1ivj4eLKzs0lJSWH06NHla9q//vrrLFu2jPj4eK6+2rNvy/Lly5k1axavvfYaPXr0IDMzkx9//NHn5uYSnXKbdqDJgW1VT9TjTNDahO8I3at+Bc7z3xUzPMfraO7cuRxzzDEMGTKECy+8kLvvvpthw4bxu9/9jtTUVO655x5WrFjBwIED6dOnD8OHD2fHjh2AZy2Y0047je7duzN58mS8V7NcunQpY8aMAeDdd9+tMHKdNm0ajz76KABDhw7lzTff9Dlh6bvvvmPkyJH069ePoUOH8vXXX5OVlcWRRx5JSUkJADk5OXTu3JnCwkIWLVpE//796dWrF+effz4HDlTdKWXYsGGUrXy5a9cuunTpAngS99ChQ+nbty99+/blo48+AuDGG2/kgw8+oHfv3ixYsIDi4mL+8Ic/0L9/f3r27FlhPZvnnnuOkSNHAnDiiSfy+eefl58bMmQIa9eurfXnkZaWRs+ePcnLyyMnJ4fu3bvz5ZdfMnPmTHbu3MnChQsZOXIkp512ms9jjRs3Jj7eM2MvPz+//PsEsG/fPgoKCkhKSqJly5blx3NycioscTpq1CieeeaZWmOV6LBhx35uzTm/wWeC1iZ8E7qP+hWFda9fpaWl8dxzz7F27VpeffVVvJf4LSgoID09neuvv54hQ4bw8ccf89lnnzFhwgTmzZsHeBbpGjJkCOvXr+fcc8/lxx9/LP/aTZs2lSfLmsTExPDrX//aZ7KbMmUK9957L2vWrOHuu+/mmmuuITExkd69e/Pee+8B8NJLL3H66acTFxfHeeedR1paGmvXruW4445j8eLFfn8vDjvsMN544w0+/fRTnn32WWbMmAF4ShRDhw7l888/Z+bMmSxevJjExETS0tJIS0tj0aJFbN68mc2bN9O6devyZHrFFVeU/6X17bffkpeXR69evXjnnXfo3bt3lT8nnHACAP3792f06NHMnj2bP/7xj1x88cWkpKRwzz33kJSUxIwZM3jttdd44403fB4D2LJlCz179qRz587ccMMN5aPzN998k1NPPbX8nu+//36OOuoo/vjHP1ZYbTM1NZUPPvjA7++dRK69BwqY/Hg6b8cNI3fkfEjsDJjnv6PqtjRuXYVvyaWe6lcffvghY8aMISEhgYSEBEaNGlV+bvz48eUfZ2ZmMn78eLZv305BQQFdu3YF4P333+f5558H4KyzzqJ169aAZ+TbqlUrv+M47LDD2LZtG/369Ss/lp2dzUcffcQFF1xQfiw/P788tmeffZaTTz6ZZ555hmuu8Wzt+uWXXzJ79mz27t1LdnY2p59+ut8xFBYWMm3aND7//HNiY2P59ttvfV73n//8h3Xr1vGvf/0LgKysLDZs2EDz5s1JSkoqv+6CCy5g7ty53HXXXSxZsqS8Ln3yySdXGLn74mtZ4xkzZmBmzJkzhzlz5uCcY/jw4VWOAXTu3Jl169axbds2zjnnHMaOHUv79u157bXXuPzyy8vf59prr+Xaa6/lqaee4o477uCxxx4D/vvzkOhWVFzCtKc+Y/vePJ6eMojWR7aGQRcHO6xy4ZvQE5NLyy0+jtcT76V0p0+fzqxZsxg9ejTvvvtu+UO46jRp0oS8vLzyzxs1alThn/7e58o+b9KkSYVjJSUltGrVymfyGz16NDfddBN79uxhzZo1nHLKKQBcdtllvPDCC/Tq1YtHH32Ud999t8rXesfiHceCBQto3749a9eupaSkhISEBJ/35pzj3nvvrfKXxWeffVbh9Zo2bcqIESN48cUXWbZsGWvWrAHgnXfeYebMmVVet2nTpuVlHl/LGpeVRMq+994lEl/HADp27EhKSgoffPABY8eOZfXq1TzwwANV3nvChAlMnTq1/HNfPw+JPn9+5StWbtzFvLE96Xdk62CHU0X4llxOvcVTr/IWgPrV4MGDWbFiBXl5eWRnZ/PSSy/5vC4rK4tOnToBlI/iwFMnLusAefXVV/nll18AaN26NcXFxeUJ7sgjjyQjI4P8/Hz27t3LW2+9VeH1v/32W1JSUioca9myJV27duWf//wn4EmkZWWZ5s2b079/f6677jrOPvvs8gev+/fvp0OHDhQWFrJ06VKf99KlS5fy5Fo2yi67xw4dOhATE8MTTzxR3p3TokUL9u/fX37d6aefzgMPPEBhYWF57Dk5ORx99NF8//33Fd5r8uTJzJgxg/79+5f/66VshF75T1kyh0Nb1rhMZmYmubme8twvv/zCypUrOeaYY1i/fj3HHnts+ffKu7Po5Zdfplu3/8728/XzkCiwbhksSIE5rcj567HsXvUklw/uwrjU+tkTtK7CN6H3HOepVwW4flVWr+3ZsydnnHEGPXr0IDExscp1c+bM4YILLqBfv360a9eu/Pitt97K+++/T/fu3Xn++ecrdEWcdtpprFy5EvCUAMaNG0dKSgrjxo2jT58+5dft2LGDJk2acPjhhwOeJFhWy1+6dCmLFy+mV69edO/enRdffLH868aPH8+TTz5ZoTQ0d+5cBg4cyODBgzn22GN93vPvf/97HnjgAfr06VPeYgmeHZgee+wxevXqxddff13+L5SePXsSGxtLr169WLBgAZMnT+b444+nb9++pKSk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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEGCAYAAAB1iW6ZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAqHElEQVR4nO3deXhV1dXH8e9KCAljmCICQaEWJ8IchgooKigOgAMCiqJWRFHAgm21yqso9q1FCxX1dUCoEw60WgXHOiuKkqCCEgcQVAKIDBJIyJz9/nGT9Ca5SS7kJnf6fZ6Hx+Sck3vXSeJis87ae5tzDhERCX8xwQ5AREQCQwldRCRCKKGLiEQIJXQRkQihhC4iEiEaBeuN27Vr57p06RKstxcRCUtr1qzZ5ZxL8nUuaAm9S5cupKenB+vtRUTCkpn9UN25WksuZrbEzH42sy+rOW9mttDMNprZOjPrW5dgRUTk0PhTQ38UGFnD+TOAbqV/pgAP1D0sERE5WLUmdOfc+8CeGi4ZAzzuPD4GWplZh0AFKCIi/glEDb0TsMXr88zSY9srX2hmU/CM4jniiCOqvFBhYSGZmZnk5eUFICyR+peQkEBycjJxcXHBDkWkYR+KOuceBh4GSE1NrbKITGZmJi1atKBLly6YWUOGJnLQnHPs3r2bzMxMunbtGuxwRALSh74V6Oz1eXLpsYOWl5dH27ZtlcwlLJgZbdu21b8oJWQEIqEvByaVdrsMArKcc1XKLf5SMpdwot9XCSX+tC0+DawCjjGzTDO7wsyuNrOrSy95BdgEbAQWAdfUW7QiImGspMTx55cz2LLnQL28fq01dOfchbWcd8C1AYsoRGVnZzNs2DD27NnDypUr6dixY/m5iRMnkp6eTlxcHAMGDOChhx7SQzIRqeKetzaw6IPN/CqpORcOqNoYUlday8UPRUVFjBs3jksuuYS77rqLMWPGsG/fvvLzEydO5Ouvv+aLL74gNzeXRx55JIjRikgoejNjB/e8tYHz+yYzoX/n2r/gEARt6n8oSktL44orrmD16tUUFxczYMAAnn32WRYsWMAZZ5zB9OnTAYiNjWXChAm8+OKLxMXFceaZZ5a/xoABA8jMzAzWLYhIKFm3DN66HZeVyfGuLde2vZTp546st2cvFqwt6FJTU13ltVy++uorjjvuOABuW7GejG37fH3pITu+Y0tuHdW9xmtmz55NXl4eubm5JCcn86c//cnv1y8sLGTgwIHcc889DB06tK7hSpjw/r0VKbduGayYAYW55YdKGjUhZvRC6DnukF/WzNY451J9ndMIvZJbbrmF/v37k5CQwMKFCw/qa6+55hpOPPFEJXMRgbdur5DMAWKKcj3H65DQaxKyCb22kXR92b17N9nZ2RQWFpKXl0ezZs38+rrbbruNnTt38tBDD9VzhCISFrKqKb1WdzwA9FC0kquuuoq5c+cyceJEbrjhBr++5pFHHuH111/n6aefJiZG31IRgbym1SxplZhcb++p7OPl8ccfJy4ujosuuogbb7yRtLQ03n777Vq/7uqrr2bHjh385je/oXfv3tx+++0NEK2IhKotew5w24Gx5BFf8URcEzj1lnp735AtuQTDpEmTmDRpEuDpZPnkk0/8+rqioqL6DEtEwkheYTFXP7mGHxnCrBFHk7D6r54yS2KyJ5nXU/0clNBFRALGOcdN//6C9dv2seSyVJKObQ+DL2mw91fJRUQkQB5f9QPPf7qV3w3vxinHtm/w91dCFxEJgNWb9zD3pQyGH3cYM07pFpQYVHIRETlUXjNBk2nLZS0mMX3cTcTEBGcVTo3QRUQORdlM0KwtGI6O7OKm4gdI3PDvoIWkhC4icihqmgkaJEro9axLly7s2rULgNzcXE466SSKi4tr/JoJEyawYcOGeo1rzpw53H333Yf0td9//z1PPfWUX9du376ds88++5DepzZl6xDNmTOn/HNfx3744Qf69u1L79696d69Ow8++GCF17nzzjtZunQpDz74ID169KB3794MGTKEjIwMAL744gsuu+yyerkHCWNBmAlam/CuoZfWrxqqx7NMUVERjRod/LduyZIlnHfeecTGxtZ43dSpU5k3bx6LFi061BDrVVlCv+iii2q9dv78+Vx55ZX1Esff//53WrZsSU5ODjfffDMnnXQS69evr3Js2LBhrFq1ivj4eLKzs0lJSWH06NHla9q//vrrLFu2jPj4eK6+2rNvy/Lly5k1axavvfYaPXr0IDMzkx9//NHn5uYSnXKbdqDJgW1VT9TjTNDahO8I3at+Bc7z3xUzPMfraO7cuRxzzDEMGTKECy+8kLvvvpthw4bxu9/9jtTUVO655x5WrFjBwIED6dOnD8OHD2fHjh2AZy2Y0047je7duzN58mS8V7NcunQpY8aMAeDdd9+tMHKdNm0ajz76KABDhw7lzTff9Dlh6bvvvmPkyJH069ePoUOH8vXXX5OVlcWRRx5JSUkJADk5OXTu3JnCwkIWLVpE//796dWrF+effz4HDlTdKWXYsGGUrXy5a9cuunTpAngS99ChQ+nbty99+/blo48+AuDGG2/kgw8+oHfv3ixYsIDi4mL+8Ic/0L9/f3r27FlhPZvnnnuOkSNHAnDiiSfy+eefl58bMmQIa9eurfXnkZaWRs+ePcnLyyMnJ4fu3bvz5ZdfMnPmTHbu3MnChQsZOXIkp512ms9jjRs3Jj7eM2MvPz+//PsEsG/fPgoKCkhKSqJly5blx3NycioscTpq1CieeeaZWmOV6LBhx35uzTm/wWeC1iZ8E7qP+hWFda9fpaWl8dxzz7F27VpeffVVvJf4LSgoID09neuvv54hQ4bw8ccf89lnnzFhwgTmzZsHeBbpGjJkCOvXr+fcc8/lxx9/LP/aTZs2lSfLmsTExPDrX//aZ7KbMmUK9957L2vWrOHuu+/mmmuuITExkd69e/Pee+8B8NJLL3H66acTFxfHeeedR1paGmvXruW4445j8eLFfn8vDjvsMN544w0+/fRTnn32WWbMmAF4ShRDhw7l888/Z+bMmSxevJjExETS0tJIS0tj0aJFbN68mc2bN9O6devyZHrFFVeU/6X17bffkpeXR69evXjnnXfo3bt3lT8nnHACAP3792f06NHMnj2bP/7xj1x88cWkpKRwzz33kJSUxIwZM3jttdd44403fB4D2LJlCz179qRz587ccMMN5aPzN998k1NPPbX8nu+//36OOuoo/vjHP1ZYbTM1NZUPPvjA7++dRK69BwqY/Hg6b8cNI3fkfEjsDJjnv6PqtjRuXYVvyaWe6lcffvghY8aMISEhgYSEBEaNGlV+bvz48eUfZ2ZmMn78eLZv305BQQFdu3YF4P333+f5558H4KyzzqJ169aAZ+TbqlUrv+M47LDD2LZtG/369Ss/lp2dzUcffcQFF1xQfiw/P788tmeffZaTTz6ZZ555hmuu8Wzt+uWXXzJ79mz27t1LdnY2p59+ut8xFBYWMm3aND7//HNiY2P59ttvfV73n//8h3Xr1vGvf/0LgKysLDZs2EDz5s1JSkoqv+6CCy5g7ty53HXXXSxZsqS8Ln3yySdXGLn74mtZ4xkzZmBmzJkzhzlz5uCcY/jw4VWOAXTu3Jl169axbds2zjnnHMaOHUv79u157bXXuPzyy8vf59prr+Xaa6/lqaee4o477uCxxx4D/vvzkOhWVFzCtKc+Y/vePJ6eMojWR7aGQRcHO6xy4ZvQE5NLyy0+jtcT76V0p0+fzqxZsxg9ejTvvvtu+UO46jRp0oS8vLzyzxs1alThn/7e58o+b9KkSYVjJSUltGrVymfyGz16NDfddBN79uxhzZo1nHLKKQBcdtllvPDCC/Tq1YtHH32Ud999t8rXesfiHceCBQto3749a9eupaSkhISEBJ/35pzj3nvvrfKXxWeffVbh9Zo2bcqIESN48cUXWbZsGWvWrAHgnXfeYebMmVVet2nTpuVlHl/LGpeVRMq+994lEl/HADp27EhKSgoffPABY8eOZfXq1TzwwANV3nvChAlMnTq1/HNfPw+JPn9+5StWbtzFvLE96Xdk62CHU0X4llxOvcVTr/IWgPrV4MGDWbFiBXl5eWRnZ/PSSy/5vC4rK4tOnToBlI/iwFMnLusAefXVV/nll18AaN26NcXFxeUJ7sgjjyQjI4P8/Hz27t3LW2+9VeH1v/32W1JSUioca9myJV27duWf//wn4EmkZWWZ5s2b079/f6677jrOPvvs8gev+/fvp0OHDhQWFrJ06VKf99KlS5fy5Fo2yi67xw4dOhATE8MTTzxR3p3TokUL9u/fX37d6aefzgMPPEBhYWF57Dk5ORx99NF8//33Fd5r8uTJzJgxg/79+5f/66VshF75T1kyh0Nb1rhMZmYmubme8twvv/zCypUrOeaYY1i/fj3HHnts+ffKu7Po5Zdfplu3/8728/XzkCiwbhksSIE5rcj567HsXvUklw/uwrjU+tkTtK7CN6H3HOepVwW4flVWr+3ZsydnnHEGPXr0IDExscp1c+bM4YILLqBfv360a9eu/Pitt97K+++/T/fu3Xn++ecrdEWcdtpprFy5EvCUAMaNG0dKSgrjxo2jT58+5dft2LGDJk2acPjhhwOeJFhWy1+6dCmLFy+mV69edO/enRdffLH868aPH8+TTz5ZoTQ0d+5cBg4cyODBgzn22GN93vPvf/97HnjgAfr06VPeYgmeHZgee+wxevXqxddff13+L5SePXsSGxtLr169WLBgAZMnT+b444+nb9++pKSk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", "text/plain": [ "
" ] @@ -572,7 +572,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEGCAYAAABmXi5tAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAwfUlEQVR4nO3deXxNd/rA8c+TCIl9VyS2ag2CEGuJpbS09iK01DJFF0u36dRMO60u8xtT1NJt2ppaZtpijBaltROUVqjaWmIXawSpLUTy/P7IlbHcEG6Sc5P7vF+v+7pn+d5znpymj5Pv/Z7nK6qKMcaY3M/P6QCMMcZkD0v4xhjjIyzhG2OMj7CEb4wxPsISvjHG+Ig8TgeQnpIlS2qlSpWcDsMYY3KUDRs2nFDVUu72eW3Cr1SpEtHR0U6HYYwxOYqI7E9vn3XpGGOMj7CEb4wxPsISvjHG+Aiv7cM3xklJSUnExsaSmJjodCjGuBUYGEhwcDABAQEZ/owlfGPciI2NpVChQlSqVAkRcTocY66hqsTHxxMbG0vlypUz/Dnr0jHGjcTEREqUKGHJ3nglEaFEiRK3/ReoJXxj0mHJ3nizO/n9zHUJPyVF+b8Fv3Ag/rzToRhjjFfJdQl/X/w5pv94gPbvrWLhtqNOh2OMMV4j1yX8KqUKMn94BJVKFODJf23gr/O3k5Sc4nRYxmS6w4cP071791u2U1Xuv/9+fvvtN7f727Rpw6lTpzI7POOFcl3CBwgpnp9ZTzfh8cYV+XTVXnp9so4jCRecDsuYTFWuXDlmzZp1y3YLFiygTp06FC5c+JrtqkpKSgqPP/44H374YVaFabxIrh2WmS+PP291CaVB5eKM+O9m2k9czfieYTS/121NIWPS9ca8bWw/7P7u+E7VKFeY1zvWzHD7lStX8uyzzwKpX9ZFRUURHx9Phw4d2Lp1K1OmTGHu3LmcP3+e3bt307VrV9555x0APv/8cwYPHgzAvn37aNu2LY0aNWLDhg0sWLCATp06ERERwSuvvJKpP6PxPrnyDv9qneqUY+7QZpQqmI9+k3/k3cU7SU6xeXxNzjJmzBg++OADNm3axKpVqwgKCrqhzaZNm5gxYwZbtmxhxowZHDx4EIA1a9YQHh6e1i4mJoZnnnmGbdu2UbFiRYoVK8bFixeJj4/Ptp/HOCPX3uFfrWrpgnw9pCmvfr2ViUtj2Lj/FON7hVGyYD6nQzM5wO3ciWeVpk2b8sILL9C7d28eeeQRgoODb2jTunVrihQpAkCNGjXYv38/ISEhnDx5kkKFCqW1q1ixIo0bN77ms6VLl+bw4cOUKFEia38Q46hcf4d/RVBef8b0qM3fu9Vi/b6TPDxhFT/uPel0WMak64MPPiAsLIywsDD69u3LpEmTuHDhAk2bNuXXX3+9oX2+fP+7gfH39+fy5csA5MmTh5SU/w1cKFCgwA2fTUxMdPtXg8ldfCbhQ2rfZ88GFfjqmabkz+vPo5+u4x8rd6NqXTzG+wwZMoRNmzaxadMmLly4QK1atXj55Zdp0KCB24SfnmrVqrFnz55096sqR48exSYcyv18KuFfUaNcYeYNa0bbmmUY9e2vDJoWTcL5JKfDMiZd48ePJzQ0lNq1axMQEMBDDz2U4c+2b9+eFStWpLt/w4YNNG7cmDx5fKKH16eJt97d1q9fX7N6xitVZcr3+/i/Bb9QpnAgH/auR+3goll6TpMz/PLLL1SvXt3pMDLFkSNH6Nu3L4sXL3a7/9lnn6VTp060bt06myMznnL3eyoiG1S1vrv2Ht3hi0hxEVksIjGu92LptPtORE6LyDeenC+ziQgDmlZm5pNNSElRun+0ln+t3YdungnjQmFk0dT3zTOdDtWYO1a2bFkGDRqU7oNXoaGhlux9hKddOiOApap6D7DUte7OaOBxD8+VZepWKMb84RHcV7UE6+d9zKWvhkLCQUBT3+cNt6RvcrTIyMgbHry6YtCgQdkcjXGKpwm/MzDVtTwV6OKukaouBc54eK4sVaxAXj7r14C3C80mn168dmfSBVj6pjOBGWNMJvE04ZdR1SOu5aNAGU8OJiKDRSRaRKLj4uI8DO32+fkJhS8ec78zITZ7gzHGmEx2y6/lRWQJcJebXdc8h62qKiIefQOsqp8An0Dql7aeHOuOFQl2dedcK6Vwed8c0mSMyTVumcNUtY2qhrp5zQGOiUhZANf78awOOMu1fg0Crn0A5bzmZfTlnuw9cc6hoIzxXKVKlThx4gQAFy5coEWLFiQnJ6fbfsuWLfTv3z/L4ypYsOAdf3bKlCkcPnw4Q22fe+45oqKi7vhcmal79+7pPhvRq1cvYmJi0tYzs5qppzetc4F+ruV+wBwPj+e82pHQcSIUCQEEioSw976/8WViYzq+t5pvtxy55SGMD3JoZNeVp2lv12effcYjjzyCv79/um1q1apFbGwsBw4cuNPwslxGE358fDzr1q2jefPm2RDVzW3bto3k5GSqVKlyw77k5GSefvrptMJ3QKZWM/U04Y8CHhCRGKCNax0RqS8ik640EpFVwH+A1iISKyJtPTxv1qodCc9vhZGn4fmt1Gw7kPnDI6hauiBPf76RN+Zt49Jlq7FvXDbPTB3JlQUju9566y2qVatGs2bNePTRRxkzZgwtW7bkueeeo379+kyYMIF58+bRqFEj6tatS5s2bTh2LPV7qPj4eB588EFq1qzJwIEDr3mi/PPPP6dz585A6h3l/Pnz0/b1798/rexyx44dmT59utvYRo8eTYMGDahduzavv/46ACNGjOCDDz5IazNy5EjGjBnD2bNnad26NfXq1aNWrVrMmXPjveGKFSvo0KFD2vrQoUOZMmUKAG+++SYNGjQgNDSUwYMHo6rMmjWL6OhoevfuTVhYGBcuXGDDhg20aNGC8PBw2rZty5EjqTdo//3vf2nXrh0Ay5Yto0uXLmnnWbx4MV27ds3Qf49jx47RtWtX6tSpQ506dfj+++8BePfddwkNDSU0NJTx48cDcO7cOdq3b0+dOnUIDQ1lxowZN1x7SP0L58UXX6ROnTqsXbuWiIgIlixZkvaPeadOnfjyyy8zFN8tqapXvsLDw9XbXExK1pFzt2rFl7/Rzu+v1thT550OyWSR7du3Z7zxuzVVXy984+vdmh7F8OOPP2qdOnX0woUL+ttvv2nVqlV19OjR2qJFC3366afT2p08eVJTUlJUVfXTTz/VF154QVVVhw0bpm+88Yaqqn7zzTcKaFxcnF68eFHLlCmT9vnZs2dr3759VVX14sWLGhwcrOfPp/5ur169Wjt06HBDbAsXLtRBgwZpSkqKJicna/v27XXlypW6ceNGbd68eVq76tWr64EDBzQpKUkTEhJUVTUuLk7vvvvutJgLFCigqqrLly/X9u3bp312yJAhOnnyZFVVjY+PT9vep08fnTt3rqqqtmjRQtevX6+qqpcuXdImTZro8ePHVVV1+vTpOmDAAFVV7du3b9pnUlJStFq1amntHn300bR9kZGRWqdOnRteU6dOTds/btw4VVW9fPmynj59WqOjozU0NFTPnj2rZ86c0Ro1aujGjRt11qxZOnDgwLS4T58+raqq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\n", + "image/png": "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txy55SGMD3JoZNeVp2lv12effcYjjzyCv79/um1q1apFbGwsBw4cuNPwslxGE358fDzr1q2jefPm2RDVzW3bto3k5GSqVKlyw77k5GSefvrptMJ3QKZWM/U04Y8CHhCRGKCNax0RqS8ik640EpFVwH+A1iISKyJtPTxv1qodCc9vhZGn4fmt1Gw7kPnDI6hauiBPf76RN+Zt49Jlq7FvXDbPTB3JlQUju9566y2qVatGs2bNePTRRxkzZgwtW7bkueeeo379+kyYMIF58+bRqFEj6tatS5s2bTh2LPV7qPj4eB588EFq1qzJwIEDr3mi/PPPP6dz585A6h3l/Pnz0/b1798/rexyx44dmT59utvYRo8eTYMGDahduzavv/46ACNGjOCDDz5IazNy5EjGjBnD2bNnad26NfXq1aNWrVrMmXPjveGKFSvo0KFD2vrQoUOZMmUKAG+++SYNGjQgNDSUwYMHo6rMmjWL6OhoevfuTVhYGBcuXGDDhg20aNGC8PBw2rZty5EjqTdo//3vf2nXrh0Ay5Yto0uXLmnnWbx4MV27ds3Qf49jx47RtWtX6tSpQ506dfj+++8BePfddwkNDSU0NJTx48cDcO7cOdq3b0+dOnUIDQ1lxowZN1x7SP0L58UXX6ROnTqsXbuWiIgIlixZkvaPeadOnfjyyy8zFN8tqapXvsLDw9XbXExK1pFzt2rFl7/Rzu+v1thT550OyWSR7du3Z7zxuzVVXy984+vdmh7F8OOPP2qdOnX0woUL+ttvv2nVqlV19OjR2qJFC3366afT2p08eVJTUlJUVfXTTz/VF154QVVVhw0bpm+88Yaqqn7zzTcKaFxcnF68eFHLlCmT9vnZs2dr3759VVX14sWLGhwcrOfPp/5ur169Wjt06HBDbAsXLtRBgwZpSkqKJicna/v27XXlypW6ceNGbd68eVq76tWr64EDBzQpKUkTEhJUVTUuLk7vvvvutJgLFCigqqrLly/X9u3bp312yJAhOnnyZFVVjY+PT9vep08fnTt3rqqqtmjRQtevX6+qqpcuXdImTZro8ePHVVV1+vTpOmDAAFVV7du3b9pnUlJStFq1amntHn300bR9kZGRWqdOnRteU6dOTds/btw4VVW9fPmynj59WqOjozU0NFTPnj2rZ86c0Ro1aujGjRt11qxZOnDgwLS4T58+raqq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", "text/plain": [ "
" ] @@ -645,7 +645,7 @@ } ], "source": [ - "disc.bcs = {u.id: {\"left\": (pybamm.Scalar(1), \"Dirichlet\"), \"right\": (pybamm.Scalar(2), \"Dirichlet\")}}\n", + "disc.bcs = {u: {\"left\": (pybamm.Scalar(1), \"Dirichlet\"), \"right\": (pybamm.Scalar(2), \"Dirichlet\")}}\n", "grad_u_disc = disc.process_symbol(grad_u)\n", "print(\"The gradient object is:\")\n", "(grad_u_disc.render())\n", @@ -687,7 +687,7 @@ } ], "source": [ - "disc.bcs = {u.id: {\"left\": (pybamm.Scalar(3), \"Neumann\"), \"right\": (pybamm.Scalar(4), \"Neumann\")}}\n", + "disc.bcs = {u: {\"left\": (pybamm.Scalar(3), \"Neumann\"), \"right\": (pybamm.Scalar(4), \"Neumann\")}}\n", "grad_u_disc = disc.process_symbol(grad_u)\n", "print(\"The gradient object is:\")\n", "(grad_u_disc.render())\n", @@ -728,7 +728,7 @@ } ], "source": [ - "disc.bcs = {u.id: {\"left\": (pybamm.Scalar(5), \"Dirichlet\"), \"right\": (pybamm.Scalar(6), \"Neumann\")}}\n", + "disc.bcs = {u: {\"left\": (pybamm.Scalar(5), \"Dirichlet\"), \"right\": (pybamm.Scalar(6), \"Neumann\")}}\n", "grad_u_disc = disc.process_symbol(grad_u)\n", "print(\"The gradient object is:\")\n", "(grad_u_disc.render())\n", @@ -765,7 +765,7 @@ "metadata": {}, "outputs": [], "source": [ - "disc.bcs = {u.id: {\"left\": (pybamm.Scalar(-1), \"Neumann\"), \"right\": (pybamm.Scalar(1), \"Neumann\")}}" + "disc.bcs = {u: {\"left\": (pybamm.Scalar(-1), \"Neumann\"), \"right\": (pybamm.Scalar(1), \"Neumann\")}}" ] }, { @@ -1018,7 +1018,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1065,7 +1065,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] diff --git a/pybamm/discretisations/discretisation.py b/pybamm/discretisations/discretisation.py index 81ba49d55b..e84d9e25b5 100644 --- a/pybamm/discretisations/discretisation.py +++ b/pybamm/discretisations/discretisation.py @@ -10,8 +10,8 @@ def has_bc_of_form(symbol, side, bcs, form): - if symbol.id in bcs: - if bcs[symbol.id][side][1] == form: + if symbol in bcs: + if bcs[symbol][side][1] == form: return True else: return False @@ -292,7 +292,7 @@ def set_variable_slices(self, variables): for domain_mesh in mesh: end += domain_mesh.npts_for_broadcast_to_nodes # Add to slices - y_slices[child.id].append(slice(start_, end)) + y_slices[child].append(slice(start_, end)) y_slices_explicit[child].append(slice(start_, end)) # Increment start_ start_ = end @@ -300,7 +300,7 @@ def set_variable_slices(self, variables): end += self._get_variable_size(variable) # Add to slices - y_slices[variable.id].append(slice(start, end)) + y_slices[variable].append(slice(start, end)) y_slices_explicit[variable].append(slice(start, end)) # Add to bounds lower_bounds.extend([variable.bounds[0]] * (end - start)) @@ -363,7 +363,7 @@ def set_external_variables(self, model): # Find the name in the model variables # Look up dictionary key based on value try: - idx = [x.id for x in model.variables.values()].index(var.id) + idx = list(model.variables.values()).index(var) except ValueError: raise ValueError( """ @@ -423,8 +423,7 @@ def boundary_gradient(left_symbol, right_symbol): left_symbol_disc, right_symbol_disc, left_mesh, right_mesh ) - # bc_key_ids = [key.id for key in list(model.boundary_conditions.keys())] - bc_key_ids = list(self.bcs.keys()) + bc_keys = list(self.bcs.keys()) internal_bcs = {} for var in model.boundary_conditions.keys(): @@ -434,24 +433,24 @@ def boundary_gradient(left_symbol, right_symbol): first_child = children[0] next_child = children[1] - lbc = self.bcs[var.id]["left"] + lbc = self.bcs[var]["left"] rbc = (boundary_gradient(first_child, next_child), "Neumann") - if first_child.id not in bc_key_ids: - internal_bcs.update({first_child.id: {"left": lbc, "right": rbc}}) + if first_child not in bc_keys: + internal_bcs.update({first_child: {"left": lbc, "right": rbc}}) for current_child, next_child in zip(children[1:-1], children[2:]): lbc = rbc rbc = (boundary_gradient(current_child, next_child), "Neumann") - if current_child.id not in bc_key_ids: + if current_child not in bc_keys: internal_bcs.update( - {current_child.id: {"left": lbc, "right": rbc}} + {current_child: {"left": lbc, "right": rbc}} ) lbc = rbc - rbc = self.bcs[var.id]["right"] - if children[-1].id not in bc_key_ids: - internal_bcs.update({children[-1].id: {"left": lbc, "right": rbc}}) + rbc = self.bcs[var]["right"] + if children[-1] not in bc_keys: + internal_bcs.update({children[-1]: {"left": lbc, "right": rbc}}) self.bcs.update(internal_bcs) @@ -504,7 +503,7 @@ def process_boundary_conditions(self, model): # process and set pybamm.variables first incase required # in discrisation of other boundary conditions for key, bcs in model.boundary_conditions.items(): - processed_bcs[key.id] = {} + processed_bcs[key] = {} # check if the boundary condition at the origin for sphere domains is other # than no flux @@ -528,7 +527,7 @@ def process_boundary_conditions(self, model): eqn, typ = bc pybamm.logger.debug("Discretise {} ({} bc)".format(key, side)) processed_eqn = self.process_symbol(eqn) - processed_bcs[key.id][side] = (processed_eqn, typ) + processed_bcs[key][side] = (processed_eqn, typ) return processed_bcs @@ -661,7 +660,7 @@ def create_mass_matrix(self, model): model_variables = model.rhs.keys() model_slices = [] for v in model_variables: - model_slices.append(self.y_slices[v.id][0]) + model_slices.append(self.y_slices[v][0]) sorted_model_variables = [ v for _, v in sorted(zip(model_slices, model_variables)) ] @@ -792,8 +791,6 @@ def process_dict(self, var_eqn_dict): if np.prod(eqn.shape_for_testing) == 1 and not isinstance(eqn_key, str): eqn = pybamm.FullBroadcast(eqn, broadcast_domains=eqn_key.domains) - # note we are sending in the key.id here so we don't have to - # keep calling .id pybamm.logger.debug("Discretise {!r}".format(eqn_key)) processed_eqn = self.process_symbol(eqn) @@ -818,10 +815,10 @@ def process_symbol(self, symbol): """ try: - return self._discretised_symbols[symbol.id] + return self._discretised_symbols[symbol] except KeyError: discretised_symbol = self._process_symbol(symbol) - self._discretised_symbols[symbol.id] = discretised_symbol + self._discretised_symbols[symbol] = discretised_symbol discretised_symbol.test_shape() # Assign mesh as an attribute to the processed variable @@ -978,15 +975,15 @@ def _process_symbol(self, symbol): elif isinstance(symbol, pybamm.VariableDot): return pybamm.StateVectorDot( - *self.y_slices[symbol.get_variable().id], + *self.y_slices[symbol.get_variable()], domains=symbol.domains, ) elif isinstance(symbol, pybamm.Variable): # Check if variable is a standard variable or an external variable - if any(symbol.id == var.id for var in self.external_variables.values()): + if any(symbol == var for var in self.external_variables.values()): # Look up dictionary key based on value - idx = [x.id for x in self.external_variables.values()].index(symbol.id) + idx = list(self.external_variables.values()).index(symbol) name, parent_and_slice = list(self.external_variables.keys())[idx] if parent_and_slice is None: # Variable didn't come from a concatenation so we can just create a @@ -1014,7 +1011,7 @@ def _process_symbol(self, symbol): # can't be found. This should usually be caught earlier by # model.check_well_posedness, but won't be if debug_mode is False try: - y_slices = self.y_slices[symbol.id] + y_slices = self.y_slices[symbol] except KeyError: raise pybamm.ModelError( """ @@ -1089,19 +1086,19 @@ def _concatenate_in_order(self, var_eqn_dict, check_complete=False, sparse=False unpacked_variables.extend([symbol] + [var for var in symbol.children]) else: unpacked_variables.append(symbol) - slices.append(self.y_slices[symbol.id][0]) + slices.append(self.y_slices[symbol][0]) if check_complete: # Check keys from the given var_eqn_dict against self.y_slices - ids = {v.id for v in unpacked_variables} - external_id = {v.id for v in self.external_variables.values()} + unpacked_variables_set = set(unpacked_variables) + external_vars = set(self.external_variables.values()) for var in self.external_variables.values(): - child_ids = {child.id for child in var.children} - external_id = external_id.union(child_ids) + child_vars = set(var.children) + external_vars = external_vars.union(child_vars) y_slices_with_external_removed = set(self.y_slices.keys()).difference( - external_id + external_vars ) - if ids != y_slices_with_external_removed: + if unpacked_variables_set != y_slices_with_external_removed: given_variable_names = [v.name for v in var_eqn_dict.keys()] raise pybamm.ModelError( "Initial conditions are insufficient. Only " diff --git a/pybamm/expression_tree/binary_operators.py b/pybamm/expression_tree/binary_operators.py index c08d1e2012..b8e3dedc7a 100644 --- a/pybamm/expression_tree/binary_operators.py +++ b/pybamm/expression_tree/binary_operators.py @@ -102,24 +102,11 @@ def _binary_new_copy(self, left, right): """ return self._binary_evaluate(left, right) - def evaluate(self, t=None, y=None, y_dot=None, inputs=None, known_evals=None): + def evaluate(self, t=None, y=None, y_dot=None, inputs=None): """See :meth:`pybamm.Symbol.evaluate()`.""" - if known_evals is not None: - id = self.id - try: - return known_evals[id], known_evals - except KeyError: - left, known_evals = self.left.evaluate(t, y, y_dot, inputs, known_evals) - right, known_evals = self.right.evaluate( - t, y, y_dot, inputs, known_evals - ) - value = self._binary_evaluate(left, right) - known_evals[id] = value - return value, known_evals - else: - left = self.left.evaluate(t, y, y_dot, inputs) - right = self.right.evaluate(t, y, y_dot, inputs) - return self._binary_evaluate(left, right) + left = self.left.evaluate(t, y, y_dot, inputs) + right = self.right.evaluate(t, y, y_dot, inputs) + return self._binary_evaluate(left, right) def _evaluate_for_shape(self): """See :meth:`pybamm.Symbol.evaluate_for_shape()`.""" @@ -181,7 +168,7 @@ def _diff(self, variable): diff = exponent * (base ** (exponent - 1)) * base.diff(variable) # derivative if variable is in the exponent (rare, check separately to avoid # unecessarily big tree) - if any(variable.id == x.id for x in exponent.pre_order()): + if any(variable == x for x in exponent.pre_order()): diff += (base ** exponent) * pybamm.log(base) * exponent.diff(variable) return diff @@ -581,7 +568,7 @@ def _diff(self, variable): diff = left.diff(variable) # derivative if variable is in the right term (rare, check separately to avoid # unecessarily big tree) - if any(variable.id == x.id for x in right.pre_order()): + if any(variable == x for x in right.pre_order()): diff += -pybamm.Floor(left / right) * right.diff(variable) return diff @@ -850,7 +837,7 @@ def simplified_addition(left, right): elif ( isinstance(left, MatrixMultiplication) and isinstance(right, MatrixMultiplication) - and left.right.id == right.right.id + and left.right == right.right ): l_left, l_right = left.orphans r_left = right.orphans[0] @@ -955,7 +942,7 @@ def simplified_subtraction(left, right): return pybamm.simplify_if_constant(Subtraction(left, right)) # a symbol minus itself is 0s of the same shape - if left.id == right.id: + if left == right: return pybamm.zeros_like(left) if isinstance(right, pybamm.Addition) and left.is_constant(): @@ -1185,7 +1172,7 @@ def simplified_division(left, right): return left # a symbol divided by itself is 1s of the same shape - if left.id == right.id: + if left == right: return pybamm.ones_like(left) # anything multiplied by a matrix one returns itself if diff --git a/pybamm/expression_tree/concatenations.py b/pybamm/expression_tree/concatenations.py index 2cc0d36868..a2db3aa02c 100644 --- a/pybamm/expression_tree/concatenations.py +++ b/pybamm/expression_tree/concatenations.py @@ -98,23 +98,13 @@ def _concatenation_evaluate(self, children_eval): else: return self.concatenation_function(children_eval) - def evaluate(self, t=None, y=None, y_dot=None, inputs=None, known_evals=None): + def evaluate(self, t=None, y=None, y_dot=None, inputs=None): """See :meth:`pybamm.Symbol.evaluate()`.""" children = self.children - if known_evals is not None: - if self.id not in known_evals: - children_eval = [None] * len(children) - for idx, child in enumerate(children): - children_eval[idx], known_evals = child.evaluate( - t, y, y_dot, inputs, known_evals - ) - known_evals[self.id] = self._concatenation_evaluate(children_eval) - return known_evals[self.id], known_evals - else: - children_eval = [None] * len(children) - for idx, child in enumerate(children): - children_eval[idx] = child.evaluate(t, y, y_dot, inputs) - return self._concatenation_evaluate(children_eval) + children_eval = [None] * len(children) + for idx, child in enumerate(children): + children_eval[idx] = child.evaluate(t, y, y_dot, inputs) + return self._concatenation_evaluate(children_eval) def create_copy(self): """See :meth:`pybamm.Symbol.new_copy()`.""" @@ -428,8 +418,7 @@ def simplified_concatenation(*children): # Create Concatenation to easily read domains concat = Concatenation(*children) if all( - isinstance(child, pybamm.Broadcast) - and child.child.id == children[0].child.id + isinstance(child, pybamm.Broadcast) and child.child == children[0].child for child in children ): unique_child = children[0].orphans[0] diff --git a/pybamm/expression_tree/functions.py b/pybamm/expression_tree/functions.py index ecb78ba4d1..c11035e9d6 100644 --- a/pybamm/expression_tree/functions.py +++ b/pybamm/expression_tree/functions.py @@ -70,7 +70,7 @@ def __str__(self): def diff(self, variable): """See :meth:`pybamm.Symbol.diff()`.""" - if variable.id == self.id: + if variable == self: return pybamm.Scalar(1) else: children = self.orphans @@ -78,7 +78,7 @@ def diff(self, variable): for i, child in enumerate(self.children): # if variable appears in the function, differentiate # function, and apply chain rule - if variable.id in [symbol.id for symbol in child.pre_order()]: + if variable in child.pre_order(): partial_derivatives[i] = self._function_diff( children, i ) * child.diff(variable) @@ -142,22 +142,12 @@ def _function_jac(self, children_jacs): return jacobian - def evaluate(self, t=None, y=None, y_dot=None, inputs=None, known_evals=None): + def evaluate(self, t=None, y=None, y_dot=None, inputs=None): """See :meth:`pybamm.Symbol.evaluate()`.""" - if known_evals is not None: - if self.id not in known_evals: - evaluated_children = [None] * len(self.children) - for i, child in enumerate(self.children): - evaluated_children[i], known_evals = child.evaluate( - t, y, y_dot, inputs, known_evals=known_evals - ) - known_evals[self.id] = self._function_evaluate(evaluated_children) - return known_evals[self.id], known_evals - else: - evaluated_children = [ - child.evaluate(t, y, y_dot, inputs) for child in self.children - ] - return self._function_evaluate(evaluated_children) + evaluated_children = [ + child.evaluate(t, y, y_dot, inputs) for child in self.children + ] + return self._function_evaluate(evaluated_children) def _evaluates_on_edges(self, dimension): """See :meth:`pybamm.Symbol._evaluates_on_edges()`.""" diff --git a/pybamm/expression_tree/operations/convert_to_casadi.py b/pybamm/expression_tree/operations/convert_to_casadi.py index 797250432f..7405d7f327 100644 --- a/pybamm/expression_tree/operations/convert_to_casadi.py +++ b/pybamm/expression_tree/operations/convert_to_casadi.py @@ -37,12 +37,12 @@ def convert(self, symbol, t, y, y_dot, inputs): The converted symbol """ try: - return self._casadi_symbols[symbol.id] + return self._casadi_symbols[symbol] except KeyError: # Change inputs to empty dictionary if it's None inputs = inputs or {} casadi_symbol = self._convert(symbol, t, y, y_dot, inputs) - self._casadi_symbols[symbol.id] = casadi_symbol + self._casadi_symbols[symbol] = casadi_symbol return casadi_symbol @@ -144,8 +144,9 @@ def _convert(self, symbol, t, y, y_dot, inputs): "and use a non-CasADi solver. " ) else: # pragma: no cover - raise NotImplementedError("Unknown interpolator: {0}" - .format(symbol.interpolator)) + raise NotImplementedError( + "Unknown interpolator: {0}".format(symbol.interpolator) + ) if len(converted_children) == 1: return casadi.interpolant( @@ -153,13 +154,16 @@ def _convert(self, symbol, t, y, y_dot, inputs): )(*converted_children) elif len(converted_children) == 2: LUT = casadi.interpolant( - "LUT", solver, symbol.x, symbol.y.ravel(order='F') + "LUT", solver, symbol.x, symbol.y.ravel(order="F") ) res = LUT(casadi.hcat(converted_children).T).T return res else: # pragma: no cover - raise ValueError("Invalid converted_children count: {0}" - .format(len(converted_children))) + raise ValueError( + "Invalid converted_children count: {0}".format( + len(converted_children) + ) + ) elif symbol.function.__name__.startswith("elementwise_grad_of_"): differentiating_child_idx = int(symbol.function.__name__[-1]) diff --git a/pybamm/expression_tree/operations/evaluate_python.py b/pybamm/expression_tree/operations/evaluate_python.py index d0fb7ccd93..bece509873 100644 --- a/pybamm/expression_tree/operations/evaluate_python.py +++ b/pybamm/expression_tree/operations/evaluate_python.py @@ -464,8 +464,7 @@ def __init__(self, symbol): # add function def to first line python_str = ( - "def evaluate(constants, t=None, y=None, " - "inputs=None):\n" + python_str + "def evaluate(constants, t=None, y=None, " "inputs=None):\n" + python_str ) # calculate the final variable that will output the result of calling `evaluate` @@ -639,9 +638,7 @@ def debug(self, t=None, y=None, inputs=None): y = y.reshape(-1, 1) # execute code - jaxpr = jax.make_jaxpr(self._evaluate_jax)( - *self._constants, t, y, inputs - ).jaxpr + jaxpr = jax.make_jaxpr(self._evaluate_jax)(*self._constants, t, y, inputs).jaxpr print("invars:", jaxpr.invars) print("outvars:", jaxpr.outvars) print("constvars:", jaxpr.constvars) diff --git a/pybamm/expression_tree/operations/jacobian.py b/pybamm/expression_tree/operations/jacobian.py index a62364c5dc..b766e3a29b 100644 --- a/pybamm/expression_tree/operations/jacobian.py +++ b/pybamm/expression_tree/operations/jacobian.py @@ -46,10 +46,10 @@ def jac(self, symbol, variable): """ try: - return self._known_jacs[symbol.id] + return self._known_jacs[symbol] except KeyError: jac = self._jac(symbol, variable) - self._known_jacs[symbol.id] = jac + self._known_jacs[symbol] = jac return jac def _jac(self, symbol, variable): diff --git a/pybamm/expression_tree/operations/replace_symbols.py b/pybamm/expression_tree/operations/replace_symbols.py index f8a2e91928..4c0e446480 100644 --- a/pybamm/expression_tree/operations/replace_symbols.py +++ b/pybamm/expression_tree/operations/replace_symbols.py @@ -13,7 +13,7 @@ class SymbolReplacer(object): ---------- symbol_replacement_map : dict {:class:`pybamm.Symbol` -> :class:`pybamm.Symbol`} Map of which symbols should be replaced by which. - processed_symbols: dict {variable ids -> :class:`pybamm.Symbol`}, optional + processed_symbols: dict {:class:`pybamm.Symbol` -> :class:`pybamm.Symbol`}, optional cached replaced symbols process_initial_conditions: bool, optional Whether to process initial conditions, default is True @@ -26,10 +26,6 @@ def __init__( process_initial_conditions=True, ): self._symbol_replacement_map = symbol_replacement_map - self._symbol_replacement_map_ids = { - symbol_in.id: symbol_out - for symbol_in, symbol_out in symbol_replacement_map.items() - } self._processed_symbols = processed_symbols or {} self.process_initial_conditions = process_initial_conditions @@ -171,18 +167,18 @@ def process_symbol(self, symbol): """ try: - return self._processed_symbols[symbol.id] + return self._processed_symbols[symbol] except KeyError: replaced_symbol = self._process_symbol(symbol) - self._processed_symbols[symbol.id] = replaced_symbol + self._processed_symbols[symbol] = replaced_symbol return replaced_symbol def _process_symbol(self, symbol): """See :meth:`Simplification.process_symbol()`.""" - if symbol.id in self._symbol_replacement_map_ids.keys(): - return self._symbol_replacement_map_ids[symbol.id] + if symbol in self._symbol_replacement_map.keys(): + return self._symbol_replacement_map[symbol] elif isinstance(symbol, pybamm.BinaryOperator): left, right = symbol.children diff --git a/pybamm/expression_tree/operations/unpack_symbols.py b/pybamm/expression_tree/operations/unpack_symbols.py index c8cc24cb1b..96cbca39fd 100644 --- a/pybamm/expression_tree/operations/unpack_symbols.py +++ b/pybamm/expression_tree/operations/unpack_symbols.py @@ -12,7 +12,7 @@ class SymbolUnpacker(object): ---------- classes_to_find : list of pybamm classes Classes to identify in the equations - unpacked_symbols: dict {variable ids -> :class:`pybamm.Symbol`}, optional + unpacked_symbols: set, optional cached unpacked equations """ @@ -32,9 +32,9 @@ def unpack_list_of_symbols(self, list_of_symbols): Returns ------- list of :class:`pybamm.Symbol` - List of unpacked symbols with class in `self.classes_to_find` + Set of unpacked symbols with class in `self.classes_to_find` """ - all_instances = {} + all_instances = set() for symbol in list_of_symbols: new_instances = self.unpack_symbol(symbol) all_instances.update(new_instances) @@ -58,26 +58,26 @@ def unpack_symbol(self, symbol): """ try: - return self._unpacked_symbols[symbol.id] + return self._unpacked_symbols[symbol] except KeyError: unpacked = self._unpack(symbol) - self._unpacked_symbols[symbol.id] = unpacked + self._unpacked_symbols[symbol] = unpacked return unpacked def _unpack(self, symbol): - """ See :meth:`SymbolUnpacker.unpack()`. """ + """See :meth:`SymbolUnpacker.unpack()`.""" # found a symbol of the right class -> return it if isinstance(symbol, self.classes_to_find): - return {symbol.id: symbol} + return set([symbol]) children = symbol.children if len(children) == 0: # not the right class and no children so the class to find doesn't appear - return {} + return set() else: # iterate over all children - found_vars = {} + found_vars = set() for child in children: # call back unpack_symbol to cache values child_vars = self.unpack_symbol(child) diff --git a/pybamm/expression_tree/state_vector.py b/pybamm/expression_tree/state_vector.py index 908de7acb8..920f553e8c 100644 --- a/pybamm/expression_tree/state_vector.py +++ b/pybamm/expression_tree/state_vector.py @@ -258,9 +258,9 @@ def _base_evaluate(self, t=None, y=None, y_dot=None, inputs=None): return out def diff(self, variable): - if variable.id == self.id: + if variable == self: return pybamm.Scalar(1) - if variable.id == pybamm.t.id: + if variable == pybamm.t: return StateVectorDot( *self._y_slices, name=self.name + "'", @@ -338,9 +338,9 @@ def _base_evaluate(self, t=None, y=None, y_dot=None, inputs=None): return out def diff(self, variable): - if variable.id == self.id: + if variable == self: return pybamm.Scalar(1) - elif variable.id == pybamm.t.id: + elif variable == pybamm.t: raise pybamm.ModelError( "cannot take second time derivative of a state vector" ) diff --git a/pybamm/expression_tree/symbol.py b/pybamm/expression_tree/symbol.py index 3753a639a0..c20f1e3eea 100644 --- a/pybamm/expression_tree/symbol.py +++ b/pybamm/expression_tree/symbol.py @@ -395,10 +395,6 @@ def set_id(self): """ Set the immutable "identity" of a variable (e.g. for identifying y_slices). - This is identical to what we'd put in a __hash__ function - However, implementing __hash__ requires also implementing __eq__, - which would then mess with loop-checking in the anytree module. - Hashing can be slow, so we set the id when we create the node, and hence only need to hash once. """ @@ -408,6 +404,18 @@ def set_id(self): + tuple([(k, tuple(v)) for k, v in self.domains.items() if v != []]) ) + def __eq__(self, other): + try: + return self._id == other._id + except AttributeError: + if isinstance(other, numbers.Number): + return self._id == pybamm.Scalar(other)._id + else: + return False + + def __hash__(self): + return self._id + @property def orphans(self): """ @@ -660,11 +668,11 @@ def diff(self, variable): variable : :class:`pybamm.Symbol` The variable with respect to which to differentiate """ - if variable.id == self.id: + if variable == self: return pybamm.Scalar(1) - elif any(variable.id == x.id for x in self.pre_order()): + elif any(variable == x for x in self.pre_order()): return self._diff(variable) - elif variable.id == pybamm.t.id and self.has_symbol_of_classes( + elif variable == pybamm.t and self.has_symbol_of_classes( (pybamm.VariableBase, pybamm.StateVectorBase) ): return self._diff(variable) @@ -724,11 +732,8 @@ def _base_evaluate(self, t=None, y=None, y_dot=None, inputs=None): "{!s} of type {}".format(self, type(self)) ) - def evaluate(self, t=None, y=None, y_dot=None, inputs=None, known_evals=None): + def evaluate(self, t=None, y=None, y_dot=None, inputs=None): """Evaluate expression tree (wrapper to allow using dict of known values). - If the dict 'known_evals' is provided, the dict is searched for self.id; if - self.id is in the keys, return that value; otherwise, evaluate using - :meth:`_base_evaluate()` and add that value to known_evals Parameters ---------- @@ -741,22 +746,13 @@ def evaluate(self, t=None, y=None, y_dot=None, inputs=None, known_evals=None): (default None) inputs : dict, optional dictionary of inputs to use when solving (default None) - known_evals : dict, optional - dictionary containing known values (default None) Returns ------- number or array the node evaluated at (t,y) - known_evals (if known_evals input is not None) : dict - the dictionary of known values """ - if known_evals is not None: - if self.id not in known_evals: - known_evals[self.id] = self._base_evaluate(t, y, y_dot, inputs) - return known_evals[self.id], known_evals - else: - return self._base_evaluate(t, y, y_dot, inputs) + return self._base_evaluate(t, y, y_dot, inputs) def evaluate_for_shape(self): """ @@ -936,7 +932,7 @@ def shape(self): # If that fails, fall back to calculating how big y should really be except ValueError: unpacker = pybamm.SymbolUnpacker(pybamm.StateVector) - state_vectors_in_node = unpacker.unpack_symbol(self).values() + state_vectors_in_node = unpacker.unpack_symbol(self) min_y_size = max( max(len(x._evaluation_array) for x in state_vectors_in_node), 1 ) diff --git a/pybamm/expression_tree/unary_operators.py b/pybamm/expression_tree/unary_operators.py index 28e691b78b..e8e77f467a 100644 --- a/pybamm/expression_tree/unary_operators.py +++ b/pybamm/expression_tree/unary_operators.py @@ -60,18 +60,10 @@ def _unary_evaluate(self, child): f"{self.__class__} does not implement _unary_evaluate." ) - def evaluate(self, t=None, y=None, y_dot=None, inputs=None, known_evals=None): + def evaluate(self, t=None, y=None, y_dot=None, inputs=None): """See :meth:`pybamm.Symbol.evaluate()`.""" - if known_evals is not None: - if self.id not in known_evals: - child, known_evals = self.child.evaluate( - t, y, y_dot, inputs, known_evals - ) - known_evals[self.id] = self._unary_evaluate(child) - return known_evals[self.id], known_evals - else: - child = self.child.evaluate(t, y, y_dot, inputs) - return self._unary_evaluate(child) + child = self.child.evaluate(t, y, y_dot, inputs) + return self._unary_evaluate(child) def _evaluate_for_shape(self): """ diff --git a/pybamm/expression_tree/variable.py b/pybamm/expression_tree/variable.py index 739f9b6dc3..fb58479fe5 100644 --- a/pybamm/expression_tree/variable.py +++ b/pybamm/expression_tree/variable.py @@ -120,9 +120,9 @@ def __init__( ) def diff(self, variable): - if variable.id == self.id: + if variable == self: return pybamm.Scalar(1) - elif variable.id == pybamm.t.id: + elif variable == pybamm.t: return pybamm.VariableDot(self.name + "'", domains=self.domains) else: return pybamm.Scalar(0) @@ -179,9 +179,9 @@ def get_variable(self): return Variable(self.name[:-1], domains=self.domains) def diff(self, variable): - if variable.id == self.id: + if variable == self: return pybamm.Scalar(1) - elif variable.id == pybamm.t.id: + elif variable == pybamm.t: raise pybamm.ModelError("cannot take second time derivative of a Variable") else: return pybamm.Scalar(0) @@ -262,9 +262,9 @@ def _base_evaluate(self, t=None, y=None, y_dot=None, inputs=None): raise KeyError("External variable '{}' not found".format(self.name)) def diff(self, variable): - if variable.id == self.id: + if variable == self: return pybamm.Scalar(1) - elif variable.id == pybamm.t.id: + elif variable == pybamm.t: raise pybamm.ModelError( "cannot take time derivative of an external variable" ) diff --git a/pybamm/geometry/geometry.py b/pybamm/geometry/geometry.py index 36ae2f93e6..35fb79f9cc 100644 --- a/pybamm/geometry/geometry.py +++ b/pybamm/geometry/geometry.py @@ -61,4 +61,4 @@ def NestedDictValues(d): yield v all_parameters = unpacker.unpack_list_of_symbols(list(NestedDictValues(self))) - return list(all_parameters.values()) + return list(all_parameters) diff --git a/pybamm/models/base_model.py b/pybamm/models/base_model.py index b65187584e..5dff678ae9 100644 --- a/pybamm/models/base_model.py +++ b/pybamm/models/base_model.py @@ -176,7 +176,7 @@ def variables(self, variables): isinstance(var, pybamm.Variable) and var.name != name # Exception if the variable is also there under its own name - and not (var.name in variables and variables[var.name].id == var.id) + and not (var.name in variables and variables[var.name] == var) # Exception for the key "Leading-order" and "leading-order" not in var.name.lower() and "leading-order" not in name.lower() @@ -358,7 +358,7 @@ def _find_symbols(self, typ): + [self.timescale] + list(self.length_scales.values()) ) - return list(all_input_parameters.values()) + return list(all_input_parameters) def __getitem__(self, key): return self.rhs[key] @@ -482,7 +482,7 @@ def set_initial_conditions_from(self, solution, inplace=True): # discretised if self.is_discretised: # Unpack slices for sorting - y_slices = {var.id: slce for var, slce in self.y_slices.items()} + y_slices = {var: slce for var, slce in self.y_slices.items()} slices = [] for symbol in self.initial_conditions.keys(): if isinstance(symbol, pybamm.Concatenation): @@ -490,12 +490,12 @@ def set_initial_conditions_from(self, solution, inplace=True): # equations get sorted correctly slices.append( slice( - y_slices[symbol.children[0].id][0].start, - y_slices[symbol.children[-1].id][0].stop, + y_slices[symbol.children[0]][0].start, + y_slices[symbol.children[-1]][0].stop, ) ) else: - slices.append(y_slices[symbol.id][0]) + slices.append(y_slices[symbol][0]) equations = list(model.initial_conditions.values()) # sort equations according to slices sorted_equations = [eq for _, eq in sorted(zip(slices, equations))] @@ -507,10 +507,10 @@ def set_initial_conditions_from(self, solution, inplace=True): def check_and_combine_dict(self, dict1, dict2): # check that the key ids are distinct - ids1 = set(x.id for x in dict1.keys()) - ids2 = set(x.id for x in dict2.keys()) + ids1 = set(x for x in dict1.keys()) + ids2 = set(x for x in dict2.keys()) if len(ids1.intersection(ids2)) != 0: - variables = [x for x in dict1.keys() if x.id in ids1.intersection(ids2)] + variables = ids1.intersection(ids2) raise pybamm.ModelError( "Submodel incompatible: duplicate variables '{}'".format(variables) ) @@ -577,9 +577,9 @@ def check_well_determined(self, post_discretisation): """Check that the model is not under- or over-determined.""" # Equations (differential and algebraic) # Get all the variables from differential and algebraic equations - vars_in_rhs_keys = set() - vars_in_algebraic_keys = set() - vars_in_eqns = set() + all_vars_in_rhs_keys = set() + all_vars_in_algebraic_keys = set() + all_vars_in_eqns = set() # Get all variables ids from rhs and algebraic keys and equations, and # from boundary conditions # For equations we look through the whole expression tree. @@ -589,64 +589,59 @@ def check_well_determined(self, post_discretisation): for var, eqn in self.rhs.items(): # Find all variables and variabledot objects - vars_in_rhs_keys_dict = unpacker.unpack_symbol(var) - vars_in_eqns_dict = unpacker.unpack_symbol(eqn) + vars_in_rhs_keys = unpacker.unpack_symbol(var) + vars_in_eqns = unpacker.unpack_symbol(eqn) - # Store ids only # Look only for Variable (not VariableDot) in rhs keys - vars_in_rhs_keys.update( - [ - var_id - for var_id, var in vars_in_rhs_keys_dict.items() - if isinstance(var, pybamm.Variable) - ] + all_vars_in_rhs_keys.update( + [var for var in vars_in_rhs_keys if isinstance(var, pybamm.Variable)] ) - vars_in_eqns.update(vars_in_eqns_dict.keys()) + all_vars_in_eqns.update(vars_in_eqns) for var, eqn in self.algebraic.items(): # Find all variables and variabledot objects - vars_in_algebraic_keys_dict = unpacker.unpack_symbol(var) - vars_in_eqns_dict = unpacker.unpack_symbol(eqn) + vars_in_algebraic_keys = unpacker.unpack_symbol(var) + vars_in_eqns = unpacker.unpack_symbol(eqn) # Store ids only # Look only for Variable (not VariableDot) in algebraic keys - vars_in_algebraic_keys.update( + all_vars_in_algebraic_keys.update( [ - var_id - for var_id, var in vars_in_algebraic_keys_dict.items() + var + for var in vars_in_algebraic_keys if isinstance(var, pybamm.Variable) ] ) - vars_in_eqns.update(vars_in_eqns_dict.keys()) + all_vars_in_eqns.update(vars_in_eqns) for var, side_eqn in self.boundary_conditions.items(): for side, (eqn, typ) in side_eqn.items(): - vars_in_eqns_dict = unpacker.unpack_symbol(eqn) - vars_in_eqns.update(vars_in_eqns_dict.keys()) + vars_in_eqns = unpacker.unpack_symbol(eqn) + all_vars_in_eqns.update(vars_in_eqns) # If any keys are repeated between rhs and algebraic then the model is # overdetermined - if not set(vars_in_rhs_keys).isdisjoint(vars_in_algebraic_keys): + if not set(all_vars_in_rhs_keys).isdisjoint(all_vars_in_algebraic_keys): raise pybamm.ModelError("model is overdetermined (repeated keys)") # If any algebraic keys don't appear in the eqns (or bcs) then the model is # overdetermined (but rhs keys can be absent from the eqns, e.g. dcdt = -1 is # fine) # Skip this step after discretisation, as any variables in the equations will # have been discretised to slices but keys will still be variables - extra_algebraic_keys = vars_in_algebraic_keys.difference(vars_in_eqns) + extra_algebraic_keys = all_vars_in_algebraic_keys.difference(all_vars_in_eqns) if extra_algebraic_keys and not post_discretisation: raise pybamm.ModelError("model is overdetermined (extra algebraic keys)") # If any variables in the equations don't appear in the keys then the model is # underdetermined - vars_in_keys = vars_in_rhs_keys.union(vars_in_algebraic_keys) - extra_variables_in_equations = vars_in_eqns.difference(vars_in_keys) + all_vars_in_keys = all_vars_in_rhs_keys.union(all_vars_in_algebraic_keys) + extra_variables_in_equations = all_vars_in_eqns.difference(all_vars_in_keys) - # get ids of external variables - external_ids = {var.id for var in self.external_variables} + # get external variables + external_vars = set(self.external_variables) for var in self.external_variables: if isinstance(var, pybamm.Concatenation): - child_ids = {child.id for child in var.children} - external_ids = external_ids.union(child_ids) + child_vars = set(var.children) + external_vars = external_vars.union(child_vars) - extra_variables = extra_variables_in_equations.difference(external_ids) + extra_variables = extra_variables_in_equations.difference(external_vars) if extra_variables: raise pybamm.ModelError("model is underdetermined (too many variables)") @@ -700,7 +695,7 @@ def check_variables(self): unpacker = pybamm.SymbolUnpacker(pybamm.Variable) all_vars = unpacker.unpack_list_of_symbols(self.variables.values()) - var_ids_in_keys = set() + vars_in_keys = set() model_and_external_variables = ( list(self.rhs.keys()) @@ -710,13 +705,13 @@ def check_variables(self): for var in model_and_external_variables: if isinstance(var, pybamm.Variable): - var_ids_in_keys.add(var.id) + vars_in_keys.add(var) # Key can be a concatenation elif isinstance(var, pybamm.Concatenation): - var_ids_in_keys.update([child.id for child in var.children]) + vars_in_keys.update(var.children) - for var_id, var in all_vars.items(): - if var_id not in var_ids_in_keys: + for var in all_vars: + if var not in vars_in_keys: raise pybamm.ModelError( """ No key set for variable '{}'. Make sure it is included in either @@ -729,18 +724,15 @@ def check_variables(self): def check_no_repeated_keys(self): """Check that no equation keys are repeated.""" - rhs_alg = {**self.rhs, **self.algebraic} - rhs_alg_keys = [] + rhs_keys = set(self.rhs.keys()) + alg_keys = set(self.algebraic.keys()) - for var in rhs_alg.keys(): - # Check the variable has not already been defined - if var.id in rhs_alg_keys: - raise pybamm.ModelError( - "Multiple equations specified for variable {!r}".format(var) + if not rhs_keys.isdisjoint(alg_keys): + raise pybamm.ModelError( + "Multiple equations specified for variables {}".format( + rhs_keys.intersection(alg_keys) ) - # Update list of variables - else: - rhs_alg_keys.append(var.id) + ) def info(self, symbol_name): """ @@ -1023,7 +1015,7 @@ def check_and_convert_equations(self, equations): for var, eqn in equations.items(): if eqn.has_symbol_of_classes(pybamm.Variable): unpacker = pybamm.SymbolUnpacker(pybamm.Variable) - variable_in_equation = list(unpacker.unpack_symbol(eqn).values())[0] + variable_in_equation = list(unpacker.unpack_symbol(eqn))[0] raise TypeError( "Initial conditions cannot contain 'Variable' objects, " "but '{!r}' found in initial conditions for '{}'".format( diff --git a/pybamm/models/event.py b/pybamm/models/event.py index 328dd89f08..b5885609e2 100644 --- a/pybamm/models/event.py +++ b/pybamm/models/event.py @@ -43,11 +43,11 @@ def __init__(self, name, expression, event_type=EventType.TERMINATION): self._expression = expression self._event_type = event_type - def evaluate(self, t=None, y=None, y_dot=None, inputs=None, known_evals=None): + def evaluate(self, t=None, y=None, y_dot=None, inputs=None): """ Acts as a drop-in replacement for :func:`pybamm.Symbol.evaluate` """ - return self._expression.evaluate(t, y, y_dot, inputs, known_evals) + return self._expression.evaluate(t, y, y_dot, inputs) def __str__(self): return self._name diff --git a/pybamm/models/submodels/base_submodel.py b/pybamm/models/submodels/base_submodel.py index 030e07eff1..8629e8321d 100644 --- a/pybamm/models/submodels/base_submodel.py +++ b/pybamm/models/submodels/base_submodel.py @@ -157,16 +157,16 @@ def get_external_variables(self): for var in list_of_vars: if var.id not in unique_ids and isinstance(var, pybamm.Concatenation): external_variables += [var] - unique_ids += [var.id] + unique_ids += [var] # also add the ids of the children to unique ids for child in var.children: - unique_ids += [child.id] + unique_ids += [child] # now add any unique variables that are not part of a concatentation for var in list_of_vars: if var.id not in unique_ids: external_variables += [var] - unique_ids += [var.id] + unique_ids += [var] return external_variables diff --git a/pybamm/parameters/parameter_values.py b/pybamm/parameters/parameter_values.py index c6d9a9d2c0..357249add4 100644 --- a/pybamm/parameters/parameter_values.py +++ b/pybamm/parameters/parameter_values.py @@ -600,10 +600,10 @@ def process_symbol(self, symbol): """ try: - return self._processed_symbols[symbol.id] + return self._processed_symbols[symbol] except KeyError: processed_symbol = self._process_symbol(symbol) - self._processed_symbols[symbol.id] = processed_symbol + self._processed_symbols[symbol] = processed_symbol return processed_symbol @@ -629,7 +629,7 @@ def _process_symbol(self, symbol): new_children = [] for child in symbol.children: if symbol.diff_variable is not None and any( - x.id == symbol.diff_variable.id for x in child.pre_order() + x == symbol.diff_variable for x in child.pre_order() ): # Wrap with NotConstant to avoid simplification, # which would stop symbolic diff from working properly diff --git a/pybamm/solvers/base_solver.py b/pybamm/solvers/base_solver.py index 6bc05e1296..5e63927e26 100644 --- a/pybamm/solvers/base_solver.py +++ b/pybamm/solvers/base_solver.py @@ -289,9 +289,7 @@ def set_up(self, model, inputs=None, t_eval=None, ics_only=False): ): if model.mass_matrix_inv is not None: model.mass_matrix_inv = pybamm.Matrix( - model.mass_matrix_inv.entries[ - : model.len_rhs, : model.len_rhs - ] + model.mass_matrix_inv.entries[: model.len_rhs, : model.len_rhs] ) model.mass_matrix = pybamm.Matrix( model.mass_matrix.entries[ @@ -343,15 +341,12 @@ def report(string): report(f"Converting sensitivities for {name} to python") jacp_dict = { - p: pybamm.EvaluatorPython(jacp) - for p, jacp in jacp_dict.items() + p: pybamm.EvaluatorPython(jacp) for p, jacp in jacp_dict.items() } # jacp should be a function that returns a dict of sensitivities def jacp(*args, **kwargs): - return { - k: v(*args, **kwargs) for k, v in jacp_dict.items() - } + return {k: v(*args, **kwargs) for k, v in jacp_dict.items()} else: jacp = None @@ -372,7 +367,8 @@ def jacp(*args, **kwargs): # Process with CasADi report(f"Converting {name} to CasADi") casadi_expression = symbol.to_casadi( - t_casadi, y_casadi, inputs=p_casadi) + t_casadi, y_casadi, inputs=p_casadi + ) # Add sensitivity vectors to the rhs and algebraic equations jacp = None if calculate_sensitivities_explicit: @@ -512,17 +508,17 @@ def jacp(*args, **kwargs): if isinstance(symbol, _Heaviside): found_t = False # Dimensionless - if symbol.right.id == pybamm.t.id: + if symbol.right == pybamm.t: expr = symbol.left found_t = True - elif symbol.left.id == pybamm.t.id: + elif symbol.left == pybamm.t: expr = symbol.right found_t = True # Dimensional - elif symbol.right.id == (pybamm.t * model.timescale_eval).id: + elif symbol.right == (pybamm.t * model.timescale_eval): expr = symbol.left / symbol.right.right found_t = True - elif symbol.left.id == (pybamm.t * model.timescale_eval).id: + elif symbol.left == (pybamm.t * model.timescale_eval): expr = symbol.right / symbol.left.right found_t = True @@ -530,17 +526,19 @@ def jacp(*args, **kwargs): if found_t: model.events.append( pybamm.Event( - str(symbol), expr, pybamm.EventType.DISCONTINUITY, + str(symbol), + expr, + pybamm.EventType.DISCONTINUITY, ) ) elif isinstance(symbol, pybamm.Modulo): found_t = False # Dimensionless - if symbol.left.id == pybamm.t.id: + if symbol.left == pybamm.t: expr = symbol.right found_t = True # Dimensional - elif symbol.left.id == (pybamm.t * model.timescale_eval).id: + elif symbol.left == (pybamm.t * model.timescale_eval): expr = symbol.right / symbol.left.right found_t = True @@ -554,8 +552,9 @@ def jacp(*args, **kwargs): for i in np.arange(N_events): model.events.append( pybamm.Event( - str(symbol), expr * pybamm.Scalar(i + 1), - pybamm.EventType.DISCONTINUITY + str(symbol), + expr * pybamm.Scalar(i + 1), + pybamm.EventType.DISCONTINUITY, ) ) @@ -910,7 +909,7 @@ def solve( else: ics_set_up = self.models_set_up[model]["initial conditions"] # Check that initial conditions have not been updated - if ics_set_up.id != model.concatenated_initial_conditions.id: + if ics_set_up != model.concatenated_initial_conditions: # If the new initial conditions are different, set up again self.set_up(model, ext_and_inputs_list[0], t_eval, ics_only=True) self.models_set_up[model][ @@ -1234,10 +1233,9 @@ def step( # initialize with old solution model.y0 = old_solution.all_ys[-1][:, -1] else: - model.y0 = ( - model.set_initial_conditions_from(old_solution) - .concatenated_initial_conditions.evaluate(0, inputs=ext_and_inputs) - ) + model.y0 = model.set_initial_conditions_from( + old_solution + ).concatenated_initial_conditions.evaluate(0, inputs=ext_and_inputs) set_up_time = timer.time() # (Re-)calculate consistent initial conditions diff --git a/pybamm/spatial_methods/finite_volume.py b/pybamm/spatial_methods/finite_volume.py index 70ff222010..c5726e8d13 100644 --- a/pybamm/spatial_methods/finite_volume.py +++ b/pybamm/spatial_methods/finite_volume.py @@ -99,8 +99,8 @@ def gradient(self, symbol, discretised_symbol, boundary_conditions): domain = symbol.domain # Add Dirichlet boundary conditions, if defined - if symbol.id in boundary_conditions: - bcs = boundary_conditions[symbol.id] + if symbol in boundary_conditions: + bcs = boundary_conditions[symbol] if any(bc[1] == "Dirichlet" for bc in bcs.values()): # add ghost nodes and update domain discretised_symbol, domain = self.add_ghost_nodes( @@ -114,8 +114,8 @@ def gradient(self, symbol, discretised_symbol, boundary_conditions): out = gradient_matrix @ discretised_symbol # Add Neumann boundary conditions, if defined - if symbol.id in boundary_conditions: - bcs = boundary_conditions[symbol.id] + if symbol in boundary_conditions: + bcs = boundary_conditions[symbol] if any(bc[1] == "Neumann" for bc in bcs.values()): out = self.add_neumann_values(symbol, out, bcs, domain) @@ -881,7 +881,7 @@ def boundary_value_or_flux(self, symbol, discretised_child, bcs=None): if use_bcs and pybamm.has_bc_of_form(child, symbol.side, bcs, "Dirichlet"): # just use the value from the bc: f(x*) sub_matrix = csr_matrix((1, prim_pts)) - additive = bcs[child.id][symbol.side][0] + additive = bcs[child][symbol.side][0] elif symbol.side == "left": @@ -894,7 +894,7 @@ def boundary_value_or_flux(self, symbol, discretised_child, bcs=None): ): sub_matrix = csr_matrix(([1], ([0], [0])), shape=(1, prim_pts)) - additive = -dx0 * bcs[child.id][symbol.side][0] + additive = -dx0 * bcs[child][symbol.side][0] else: sub_matrix = csr_matrix( @@ -915,7 +915,7 @@ def boundary_value_or_flux(self, symbol, discretised_child, bcs=None): sub_matrix = csr_matrix( ([a, b], ([0, 0], [0, 1])), shape=(1, prim_pts) ) - additive = alpha * bcs[child.id][symbol.side][0] + additive = alpha * bcs[child][symbol.side][0] else: a = (dx0 + dx1) * (dx0 + dx1 + dx2) / (dx1 * (dx1 + dx2)) @@ -942,7 +942,7 @@ def boundary_value_or_flux(self, symbol, discretised_child, bcs=None): sub_matrix = csr_matrix( ([1], ([0], [prim_pts - 1])), shape=(1, prim_pts) ) - additive = dxN * bcs[child.id][symbol.side][0] + additive = dxN * bcs[child][symbol.side][0] else: # to find value at x* use formula: @@ -968,7 +968,7 @@ def boundary_value_or_flux(self, symbol, discretised_child, bcs=None): shape=(1, prim_pts), ) - additive = alpha * bcs[child.id][symbol.side][0] + additive = alpha * bcs[child][symbol.side][0] else: a = ( @@ -995,7 +995,7 @@ def boundary_value_or_flux(self, symbol, discretised_child, bcs=None): if use_bcs and pybamm.has_bc_of_form(child, symbol.side, bcs, "Neumann"): # just use the value from the bc: f'(x*) sub_matrix = csr_matrix((1, prim_pts)) - additive = bcs[child.id][symbol.side][0] + additive = bcs[child][symbol.side][0] elif symbol.side == "left": @@ -1401,14 +1401,14 @@ def upwind_or_downwind(self, symbol, discretised_symbol, bcs, direction): submesh = self.mesh.combine_submeshes(*symbol.domain) n = submesh.npts - if symbol.id not in bcs: + if symbol not in bcs: raise pybamm.ModelError( "Boundary conditions must be provided for " "{}ing '{}'".format(direction, symbol) ) if direction == "upwind": - bc, typ = bcs[symbol.id]["left"] + bc, typ = bcs[symbol]["left"] if typ != "Dirichlet": raise pybamm.ModelError( "Dirichlet boundary conditions must be provided for " @@ -1425,7 +1425,7 @@ def upwind_or_downwind(self, symbol, discretised_symbol, bcs, direction): ) symbol_out = pybamm.Matrix(upwind_mat) @ concat_bc elif direction == "downwind": - bc, typ = bcs[symbol.id]["right"] + bc, typ = bcs[symbol]["right"] if typ != "Dirichlet": raise pybamm.ModelError( "Dirichlet boundary conditions must be provided for " diff --git a/pybamm/spatial_methods/scikit_finite_element.py b/pybamm/spatial_methods/scikit_finite_element.py index a3bdf95895..dbdf1f063f 100644 --- a/pybamm/spatial_methods/scikit_finite_element.py +++ b/pybamm/spatial_methods/scikit_finite_element.py @@ -82,7 +82,7 @@ def gradient(self, symbol, discretised_symbol, boundary_conditions): The discretised symbol of the correct size boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) + ({symbol: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) Returns ------- @@ -140,7 +140,7 @@ def gradient_matrix(self, symbol, boundary_conditions): The symbol for which we want to calculate the gradient matrix boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) + ({symbol: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) Returns ------- @@ -184,7 +184,7 @@ def laplacian(self, symbol, discretised_symbol, boundary_conditions): The discretised symbol of the correct size boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) + ({symbol: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) Returns ------- @@ -198,8 +198,8 @@ def laplacian(self, symbol, discretised_symbol, boundary_conditions): stiffness_matrix = self.stiffness_matrix(symbol, boundary_conditions) # get boundary conditions and type - neg_bc_value, neg_bc_type = boundary_conditions[symbol.id]["negative tab"] - pos_bc_value, pos_bc_type = boundary_conditions[symbol.id]["positive tab"] + neg_bc_value, neg_bc_type = boundary_conditions[symbol]["negative tab"] + pos_bc_value, pos_bc_type = boundary_conditions[symbol]["positive tab"] # boundary load vector is adjusted to account for boundary conditions below boundary_load = pybamm.Vector(np.zeros(mesh.npts)) @@ -256,7 +256,7 @@ def stiffness_matrix(self, symbol, boundary_conditions): The symbol for which we want to calculate the laplacian matrix boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) + ({symbol: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) Returns ------- @@ -277,8 +277,8 @@ def stiffness_form(u, v, w): # get boundary conditions and type try: - _, neg_bc_type = boundary_conditions[symbol.id]["negative tab"] - _, pos_bc_type = boundary_conditions[symbol.id]["positive tab"] + _, neg_bc_type = boundary_conditions[symbol]["negative tab"] + _, pos_bc_type = boundary_conditions[symbol]["positive tab"] except KeyError: raise pybamm.ModelError( "No boundary conditions provided for symbol `{}``".format(symbol) @@ -451,7 +451,7 @@ def mass_matrix(self, symbol, boundary_conditions): calculating the mass matrix. boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) + ({symbol: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) Returns ------- @@ -472,7 +472,7 @@ def boundary_mass_matrix(self, symbol, boundary_conditions): calculating the mass matrix. boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) + ({symbol: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) Returns ------- @@ -493,7 +493,7 @@ def assemble_mass_form(self, symbol, boundary_conditions, region="interior"): calculating the mass matrix. boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) + ({symbol: {"negative tab": neg. tab bc, "positive tab": pos. tab bc}}) region: str, optional The domain over which to assemble the mass matrix form. Can be "interior" (default) or "boundary". @@ -519,9 +519,9 @@ def mass_form(u, v, w): mass = skfem.asm(mass_form, mesh.facet_basis) # get boundary conditions and type - if symbol.id in boundary_conditions: - _, neg_bc_type = boundary_conditions[symbol.id]["negative tab"] - _, pos_bc_type = boundary_conditions[symbol.id]["positive tab"] + if symbol in boundary_conditions: + _, neg_bc_type = boundary_conditions[symbol]["negative tab"] + _, pos_bc_type = boundary_conditions[symbol]["positive tab"] if neg_bc_type == "Dirichlet": # set source terms to zero on boundary by zeroing out mass matrix diff --git a/pybamm/spatial_methods/spatial_method.py b/pybamm/spatial_methods/spatial_method.py index 465f63f04d..232ce4d775 100644 --- a/pybamm/spatial_methods/spatial_method.py +++ b/pybamm/spatial_methods/spatial_method.py @@ -153,7 +153,7 @@ def gradient(self, symbol, discretised_symbol, boundary_conditions): boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"left": left bc, "right": right bc}}) + ({symbol: {"left": left bc, "right": right bc}}) Returns ------- @@ -175,7 +175,7 @@ def divergence(self, symbol, discretised_symbol, boundary_conditions): The discretised symbol of the correct size boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"left": left bc, "right": right bc}}) + ({symbol: {"left": left bc, "right": right bc}}) Returns ------- @@ -197,7 +197,7 @@ def laplacian(self, symbol, discretised_symbol, boundary_conditions): The discretised symbol of the correct size boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"left": left bc, "right": right bc}}) + ({symbol: {"left": left bc, "right": right bc}}) Returns ------- @@ -219,7 +219,7 @@ def gradient_squared(self, symbol, discretised_symbol, boundary_conditions): The discretised symbol of the correct size boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"left": left bc, "right": right bc}}) + ({symbol: {"left": left bc, "right": right bc}}) Returns ------- @@ -392,7 +392,7 @@ def mass_matrix(self, symbol, boundary_conditions): calculating the mass matrix. boundary_conditions : dict The boundary conditions of the model - ({symbol.id: {"left": left bc, "right": right bc}}) + ({symbol: {"left": left bc, "right": right bc}}) Returns ------- diff --git a/pybamm/spatial_methods/spectral_volume.py b/pybamm/spatial_methods/spectral_volume.py index e825db954a..dd45fbaf2c 100644 --- a/pybamm/spatial_methods/spectral_volume.py +++ b/pybamm/spatial_methods/spectral_volume.py @@ -267,8 +267,8 @@ def gradient(self, symbol, discretised_symbol, boundary_conditions): ) # Add Dirichlet boundary conditions, if defined - if symbol.id in boundary_conditions: - bcs = boundary_conditions[symbol.id] + if symbol in boundary_conditions: + bcs = boundary_conditions[symbol] if any(bc[1] == "Dirichlet" for bc in bcs.values()): # add ghost nodes and update domain reconstructed_symbol = self.replace_dirichlet_values( @@ -285,8 +285,8 @@ def gradient(self, symbol, discretised_symbol, boundary_conditions): ) # Add Neumann boundary conditions, if defined - if symbol.id in boundary_conditions: - bcs = boundary_conditions[symbol.id] + if symbol in boundary_conditions: + bcs = boundary_conditions[symbol] if any(bc[1] == "Neumann" for bc in bcs.values()): out = self.replace_neumann_values(symbol, out, bcs) diff --git a/tests/integration/test_models/standard_model_tests.py b/tests/integration/test_models/standard_model_tests.py index 66ceb58d79..17cac23bb7 100644 --- a/tests/integration/test_models/standard_model_tests.py +++ b/tests/integration/test_models/standard_model_tests.py @@ -182,14 +182,12 @@ def __init__(self, model, parameter_values=None, disc=None): self.model = model - def evaluate_model(self, use_known_evals=False, to_python=False, to_jax=False): + def evaluate_model(self, to_python=False, to_jax=False): result = np.empty((0, 1)) for eqn in [self.model.concatenated_rhs, self.model.concatenated_algebraic]: y = self.model.concatenated_initial_conditions.evaluate(t=0) - if use_known_evals: - eqn_eval, known_evals = eqn.evaluate(0, y, known_evals={}) - elif to_python: + if to_python: evaluator = pybamm.EvaluatorPython(eqn) eqn_eval = evaluator(0, y) elif to_jax: diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_composite.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_composite.py index cbcdfb076a..4bc6b80896 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_composite.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_composite.py @@ -28,9 +28,7 @@ def test_optimisations(self): optimtest = tests.OptimisationsTest(model) original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) to_python = optimtest.evaluate_model(to_python=True) - np.testing.assert_array_almost_equal(original, using_known_evals) np.testing.assert_array_almost_equal(original, to_python) def test_set_up(self): diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_foqs.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_foqs.py index c29b984d27..a92dcfb26a 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_foqs.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_foqs.py @@ -29,9 +29,7 @@ def test_optimisations(self): optimtest = tests.OptimisationsTest(model) original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) to_python = optimtest.evaluate_model(to_python=True) - np.testing.assert_array_almost_equal(original, using_known_evals) np.testing.assert_array_almost_equal(original, to_python) def test_set_up(self): diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_full.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_full.py index 44f83b588f..7138c1789d 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_full.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_full.py @@ -30,9 +30,7 @@ def test_optimisations(self): optimtest = tests.OptimisationsTest(model) original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) to_python = optimtest.evaluate_model(to_python=True) - np.testing.assert_array_almost_equal(original, using_known_evals) np.testing.assert_array_almost_equal(original, to_python) def test_set_up(self): @@ -72,15 +70,6 @@ def test_basic_processing_algebraic(self): modeltest = tests.StandardModelTest(model) modeltest.test_all() - def test_optimisations(self): - options = {"surface form": "differential"} - model = pybamm.lead_acid.Full(options) - optimtest = tests.OptimisationsTest(model) - - original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) - np.testing.assert_array_almost_equal(original, using_known_evals) - def test_set_up(self): options = {"surface form": "differential"} model = pybamm.lead_acid.Full(options) diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs.py index b28d9dc4bd..85781d4b8c 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs.py @@ -19,9 +19,7 @@ def test_optimisations(self): optimtest = tests.OptimisationsTest(model) original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) to_python = optimtest.evaluate_model(to_python=True) - np.testing.assert_array_almost_equal(original, using_known_evals) np.testing.assert_array_almost_equal(original, to_python) def test_set_up(self): diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs_surface_form.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs_surface_form.py index 7fcf30e235..9a166b2fad 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs_surface_form.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_loqs_surface_form.py @@ -49,9 +49,7 @@ def test_optimisations(self): optimtest = tests.OptimisationsTest(model) original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) to_python = optimtest.evaluate_model(to_python=True) - np.testing.assert_array_almost_equal(original, using_known_evals) np.testing.assert_array_almost_equal(original, to_python, decimal=5) def test_set_up(self): diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py index c2362d4a46..35f6b393df 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py @@ -45,15 +45,6 @@ def test_basic_processing_extended_differential(self): modeltest = tests.StandardModelTest(model) modeltest.test_all(skip_output_tests=True) - def test_optimisations(self): - options = {"hydrolysis": "true", "surface form": "differential"} - model = pybamm.lead_acid.Composite(options) - optimtest = tests.OptimisationsTest(model) - - original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) - np.testing.assert_array_almost_equal(original, using_known_evals) - if __name__ == "__main__": print("Add -v for more debug output") diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_full_side_reactions.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_full_side_reactions.py index 815369615a..587db7f73c 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_full_side_reactions.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_full_side_reactions.py @@ -45,15 +45,6 @@ def test_basic_processing_zero_current(self): modeltest = tests.StandardModelTest(model, parameter_values=parameter_values) modeltest.test_all(skip_output_tests=True) - def test_optimisations(self): - options = {"hydrolysis": "true", "surface form": "differential"} - model = pybamm.lead_acid.Full(options) - optimtest = tests.OptimisationsTest(model) - - original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) - np.testing.assert_array_almost_equal(original, using_known_evals) - if __name__ == "__main__": print("Add -v for more debug output") diff --git a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py index 4498228483..286d028ef3 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py +++ b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/base_lithium_ion_tests.py @@ -47,9 +47,7 @@ def test_optimisations(self): optimtest = tests.OptimisationsTest(model) original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) to_python = optimtest.evaluate_model(to_python=True) - np.testing.assert_array_almost_equal(original, using_known_evals) np.testing.assert_array_almost_equal(original, to_python) if pybamm.have_jax(): diff --git a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_mpm.py b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_mpm.py index 188a508517..eb2a88f880 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_mpm.py +++ b/tests/integration/test_models/test_full_battery_models/test_lithium_ion/test_mpm.py @@ -23,9 +23,7 @@ def test_optimisations(self): optimtest = tests.OptimisationsTest(model) original = optimtest.evaluate_model() - using_known_evals = optimtest.evaluate_model(use_known_evals=True) to_python = optimtest.evaluate_model(to_python=True) - np.testing.assert_array_almost_equal(original, using_known_evals) np.testing.assert_array_almost_equal(original, to_python) if pybamm.have_jax(): diff --git a/tests/integration/test_spatial_methods/test_finite_volume.py b/tests/integration/test_spatial_methods/test_finite_volume.py index 7d46525dde..160fcb79a2 100644 --- a/tests/integration/test_spatial_methods/test_finite_volume.py +++ b/tests/integration/test_spatial_methods/test_finite_volume.py @@ -39,7 +39,7 @@ def test_cartesian_spherical_grad_convergence(self): var = pybamm.Variable("var", domain=whole_cell) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(np.sin(1) ** 2), "Dirichlet"), } diff --git a/tests/integration/test_spatial_methods/test_spectral_volume.py b/tests/integration/test_spatial_methods/test_spectral_volume.py index 072005ac35..3de451c1ec 100644 --- a/tests/integration/test_spatial_methods/test_spectral_volume.py +++ b/tests/integration/test_spatial_methods/test_spectral_volume.py @@ -101,7 +101,7 @@ def test_cartesian_spherical_grad_convergence(self): var = pybamm.Variable("var", domain=whole_cell) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(np.sin(1) ** 2), "Dirichlet"), } diff --git a/tests/unit/test_discretisations/test_discretisation.py b/tests/unit/test_discretisations/test_discretisation.py index 51289ea443..de4e061974 100644 --- a/tests/unit/test_discretisations/test_discretisation.py +++ b/tests/unit/test_discretisations/test_discretisation.py @@ -32,7 +32,7 @@ def test_concatenate_in_order(self): # create discretisation disc = get_discretisation_for_testing() - disc.y_slices = {c.id: [slice(0, 1)], a.id: [slice(2, 3)], b.id: [slice(3, 4)]} + disc.y_slices = {c: [slice(0, 1)], a: [slice(2, 3)], b: [slice(3, 4)]} result = disc._concatenate_in_order(initial_conditions) self.assertIsInstance(result, pybamm.Vector) @@ -65,7 +65,7 @@ def test_add_internal_boundary_conditions(self): disc.set_internal_boundary_conditions(model) for child in c_e.children: - self.assertTrue(child.id in disc.bcs.keys()) + self.assertTrue(child in disc.bcs.keys()) def test_adding_0D_external_variable(self): model = pybamm.BaseModel() @@ -127,7 +127,7 @@ def test_adding_1D_external_variable(self): disc = pybamm.Discretisation(mesh, spatial_methods) disc.process_model(model) - self.assertEqual(disc.y_slices[a.id][0], slice(0, 10, None)) + self.assertEqual(disc.y_slices[a][0], slice(0, 10, None)) self.assertEqual(model.y_slices[a][0], slice(0, 10, None)) self.assertEqual(model.bounds, disc.bounds) @@ -138,8 +138,8 @@ def test_adding_1D_external_variable(self): ) # check that b is added to the boundary conditions - model.bcs[b.id]["left"] - model.bcs[b.id]["right"] + model.bcs[b]["left"] + model.bcs[b]["right"] # check that grad and div(grad ) produce the correct shapes self.assertEqual(model.variables["b"].shape_for_testing, (10, 1)) @@ -191,7 +191,7 @@ def test_concatenation_external_variables(self): disc = pybamm.Discretisation(mesh, spatial_methods) disc.process_model(model) - self.assertEqual(disc.y_slices[a.id][0], slice(0, 15, None)) + self.assertEqual(disc.y_slices[a][0], slice(0, 15, None)) b_test = np.linspace(0, 1, 15)[:, np.newaxis] np.testing.assert_array_equal( @@ -205,8 +205,8 @@ def test_concatenation_external_variables(self): ) # check that b is added to the boundary conditions - model.bcs[b.id]["left"] - model.bcs[b.id]["right"] + model.bcs[b]["left"] + model.bcs[b]["right"] # check that grad and div(grad ) produce the correct shapes self.assertEqual(model.variables["b"].shape_for_testing, (15, 1)) @@ -256,13 +256,13 @@ def test_discretise_slicing(self): variables = [c] disc.set_variable_slices(variables) - self.assertEqual(disc.y_slices, {c.id: [slice(0, 100)]}) + self.assertEqual(disc.y_slices, {c: [slice(0, 100)]}) combined_submesh = mesh.combine_submeshes(*whole_cell) c_true = combined_submesh.nodes ** 2 y = c_true - np.testing.assert_array_equal(y[disc.y_slices[c.id][0]], c_true) + np.testing.assert_array_equal(y[disc.y_slices[c][0]], c_true) # Several variables d = pybamm.Variable("d", domain=whole_cell, bounds=(0, 1)) @@ -272,7 +272,7 @@ def test_discretise_slicing(self): self.assertEqual( disc.y_slices, - {c.id: [slice(0, 100)], d.id: [slice(100, 200)], jn.id: [slice(200, 240)]}, + {c: [slice(0, 100)], d: [slice(100, 200)], jn: [slice(200, 240)]}, ) np.testing.assert_array_equal( disc.bounds[0], [-np.inf] * 100 + [0] * 100 + [-np.inf] * 40 @@ -283,9 +283,9 @@ def test_discretise_slicing(self): d_true = 4 * combined_submesh.nodes jn_true = mesh["negative electrode"].nodes ** 3 y = np.concatenate([c_true, d_true, jn_true]) - np.testing.assert_array_equal(y[disc.y_slices[c.id][0]], c_true) - np.testing.assert_array_equal(y[disc.y_slices[d.id][0]], d_true) - np.testing.assert_array_equal(y[disc.y_slices[jn.id][0]], jn_true) + np.testing.assert_array_equal(y[disc.y_slices[c][0]], c_true) + np.testing.assert_array_equal(y[disc.y_slices[d][0]], d_true) + np.testing.assert_array_equal(y[disc.y_slices[jn][0]], jn_true) # Variables with a concatenation js = pybamm.Variable("js", domain=["separator"]) @@ -296,12 +296,12 @@ def test_discretise_slicing(self): self.assertEqual( disc.y_slices, { - c.id: [slice(0, 100)], - d.id: [slice(100, 200)], - jn.id: [slice(200, 240)], - js.id: [slice(240, 265)], - jp.id: [slice(265, 300)], - j.id: [slice(200, 300)], + c: [slice(0, 100)], + d: [slice(100, 200)], + jn: [slice(200, 240)], + js: [slice(240, 265)], + jp: [slice(265, 300)], + j: [slice(200, 300)], }, ) np.testing.assert_array_equal( @@ -313,9 +313,9 @@ def test_discretise_slicing(self): d_true = 4 * combined_submesh.nodes jn_true = mesh["negative electrode"].nodes ** 3 y = np.concatenate([c_true, d_true, jn_true]) - np.testing.assert_array_equal(y[disc.y_slices[c.id][0]], c_true) - np.testing.assert_array_equal(y[disc.y_slices[d.id][0]], d_true) - np.testing.assert_array_equal(y[disc.y_slices[jn.id][0]], jn_true) + np.testing.assert_array_equal(y[disc.y_slices[c][0]], c_true) + np.testing.assert_array_equal(y[disc.y_slices[d][0]], d_true) + np.testing.assert_array_equal(y[disc.y_slices[jn][0]], jn_true) with self.assertRaisesRegex(TypeError, "y_slices should be"): disc.y_slices = 1 @@ -334,16 +334,16 @@ def test_process_symbol_base(self): # variable var = pybamm.Variable("var") var_vec = pybamm.Variable("var vec", domain=["negative electrode"]) - disc.y_slices = {var.id: [slice(53)], var_vec.id: [slice(53, 93)]} + disc.y_slices = {var: [slice(53)], var_vec: [slice(53, 93)]} var_disc = disc.process_symbol(var) self.assertIsInstance(var_disc, pybamm.StateVector) - self.assertEqual(var_disc.y_slices[0], disc.y_slices[var.id][0]) + self.assertEqual(var_disc.y_slices[0], disc.y_slices[var][0]) # variable dot var_dot = pybamm.VariableDot("var'") var_dot_disc = disc.process_symbol(var_dot) self.assertIsInstance(var_dot_disc, pybamm.StateVectorDot) - self.assertEqual(var_dot_disc.y_slices[0], disc.y_slices[var.id][0]) + self.assertEqual(var_dot_disc.y_slices[0], disc.y_slices[var][0]) # scalar scal = pybamm.Scalar(5) @@ -434,7 +434,7 @@ def test_process_complex_expression(self): # create discretisation disc = get_discretisation_for_testing() - disc.y_slices = {var1.id: [slice(53)], var2.id: [slice(53, 106)]} + disc.y_slices = {var1: [slice(53)], var2: [slice(53, 106)]} exp_disc = disc.process_symbol(expression) self.assertIsInstance(exp_disc, pybamm.Division) # left side @@ -445,7 +445,7 @@ def test_process_complex_expression(self): self.assertIsInstance(exp_disc.left.right.right, pybamm.StateVector) self.assertEqual( exp_disc.left.right.right.y_slices[0], - disc.y_slices[var2.id][0], + disc.y_slices[var2][0], ) # right side self.assertIsInstance(exp_disc.right, pybamm.Addition) @@ -453,7 +453,7 @@ def test_process_complex_expression(self): self.assertIsInstance(exp_disc.right.left.left, pybamm.StateVector) self.assertEqual( exp_disc.right.left.left.y_slices[0], - disc.y_slices[var1.id][0], + disc.y_slices[var1][0], ) self.assertIsInstance(exp_disc.right.left.right, pybamm.Scalar) self.assertIsInstance(exp_disc.right.right, pybamm.StateVector) @@ -526,7 +526,7 @@ def test_process_dict(self): rhs = {c: pybamm.div(N)} initial_conditions = {c: pybamm.Scalar(3)} variables = {"c_squared": c ** 2} - boundary_conditions = {c.id: {"left": (0, "Neumann"), "right": (0, "Neumann")}} + boundary_conditions = {c: {"left": (0, "Neumann"), "right": (0, "Neumann")}} # create discretisation disc = get_discretisation_for_testing() @@ -568,10 +568,10 @@ def test_process_dict(self): # rhs processed_rhs = disc.process_dict(rhs) np.testing.assert_array_equal( - y[disc.y_slices[c.id][0]], processed_rhs[c].evaluate(None, y) + y[disc.y_slices[c][0]], processed_rhs[c].evaluate(None, y) ) np.testing.assert_array_equal( - y[disc.y_slices[T.id][0]], processed_rhs[T].evaluate(None, y) + y[disc.y_slices[T][0]], processed_rhs[T].evaluate(None, y) ) # initial conditions y0 = disc.process_dict(initial_conditions) @@ -658,9 +658,9 @@ def test_process_model_ode(self): y0 = model.concatenated_initial_conditions.evaluate() y0_expect = np.empty((0, 1)) for var_id, _ in sorted(disc.y_slices.items(), key=lambda kv: kv[1]): - if var_id == c.id: + if var_id == c: vect = 2 * np.ones_like(combined_submesh.nodes[:, np.newaxis]) - elif var_id == T.id: + elif var_id == T: vect = 5 * np.ones_like(mesh["negative electrode"].nodes[:, np.newaxis]) else: vect = 8 * np.ones_like(mesh["negative electrode"].nodes[:, np.newaxis]) @@ -836,13 +836,6 @@ def test_process_model_dae(self): model_jacobian = model.jacobian.evaluate(0, y0) np.testing.assert_array_equal(model_jacobian.toarray(), jacobian.toarray()) - # test known_evals - expr = pybamm.SparseStack(jac_rhs, jac_algebraic) - jacobian, known_evals = expr.evaluate(0, y0, known_evals={}) - np.testing.assert_array_equal(jacobian_actual, jacobian.toarray()) - jacobian = expr.evaluate(0, y0, known_evals=known_evals)[0] - np.testing.assert_array_equal(jacobian_actual, jacobian.toarray()) - # check that any time derivatives of variables in algebraic raises an # error model = pybamm.BaseModel() @@ -965,7 +958,7 @@ def test_broadcast(self): self.assertIsInstance(broad_disc.children[1], pybamm.Vector) # process Broadcast variable - disc.y_slices = {var.id: [slice(1)]} + disc.y_slices = {var: [slice(1)]} broad1 = pybamm.FullBroadcast(var, ["negative electrode"], None) broad1_disc = disc.process_symbol(broad1) self.assertIsInstance(broad1_disc, pybamm.Multiplication) @@ -1149,13 +1142,13 @@ def test_concatenation_2D(self): conc = pybamm.concatenation(a, b, c) disc.set_variable_slices([conc]) self.assertEqual( - disc.y_slices[a.id], [slice(0, 40), slice(100, 140), slice(200, 240)] + disc.y_slices[a], [slice(0, 40), slice(100, 140), slice(200, 240)] ) self.assertEqual( - disc.y_slices[b.id], [slice(40, 65), slice(140, 165), slice(240, 265)] + disc.y_slices[b], [slice(40, 65), slice(140, 165), slice(240, 265)] ) self.assertEqual( - disc.y_slices[c.id], [slice(65, 100), slice(165, 200), slice(265, 300)] + disc.y_slices[c], [slice(65, 100), slice(165, 200), slice(265, 300)] ) np.testing.assert_array_equal(disc.bounds[0], 6) np.testing.assert_array_equal(disc.bounds[1], -2) @@ -1307,8 +1300,8 @@ def test_process_not_constant(self): disc = pybamm.Discretisation() a = pybamm.NotConstant(pybamm.Scalar(1)) - self.assertEqual(disc.process_symbol(a).id, pybamm.Scalar(1).id) - self.assertEqual(disc.process_symbol(2 * a).id, pybamm.Scalar(2).id) + self.assertEqual(disc.process_symbol(a), pybamm.Scalar(1)) + self.assertEqual(disc.process_symbol(2 * a), pybamm.Scalar(2)) def test_bc_symmetry(self): # define model @@ -1391,9 +1384,7 @@ def test_length_scale_errors(self): model.initial_conditions = {var: pybamm.Scalar(1)} model.length_scales = {"negative electrode": pybamm.Vector([1])} disc.process_model(model) - self.assertEqual( - model.length_scales["negative electrode"].id, pybamm.Scalar(1).id - ) + self.assertEqual(model.length_scales["negative electrode"], pybamm.Scalar(1)) if __name__ == "__main__": diff --git a/tests/unit/test_expression_tree/test_averages.py b/tests/unit/test_expression_tree/test_averages.py index 30665a9aa9..8923d049ca 100644 --- a/tests/unit/test_expression_tree/test_averages.py +++ b/tests/unit/test_expression_tree/test_averages.py @@ -11,23 +11,23 @@ class TestUnaryOperators(TestCase): def test_x_average(self): a = pybamm.Scalar(4) average_a = pybamm.x_average(a) - self.assertEqual(average_a.id, a.id) + self.assertEqual(average_a, a) # average of a broadcast is the child average_broad_a = pybamm.x_average( pybamm.PrimaryBroadcast(a, ["negative electrode"]) ) - self.assertEqual(average_broad_a.id, pybamm.Scalar(4).id) + self.assertEqual(average_broad_a, pybamm.Scalar(4)) # average of a number times a broadcast is the number times the child average_two_broad_a = pybamm.x_average( 2 * pybamm.PrimaryBroadcast(a, ["negative electrode"]) ) - self.assertEqual(average_two_broad_a.id, pybamm.Scalar(8).id) + self.assertEqual(average_two_broad_a, pybamm.Scalar(8)) average_t_broad_a = pybamm.x_average( pybamm.t * pybamm.PrimaryBroadcast(a, ["negative electrode"]) ) - self.assertEqual(average_t_broad_a.id, (pybamm.t * pybamm.Scalar(4)).id) + self.assertEqual(average_t_broad_a, (pybamm.t * pybamm.Scalar(4))) # full broadcasts average_broad_a = pybamm.x_average( @@ -46,7 +46,7 @@ def test_x_average(self): ["negative particle"], {"secondary": "negative particle size", "tertiary": "current collector"}, ) - self.assertEqual(average_broad_a.id, average_broad_a_simp.id) + self.assertEqual(average_broad_a, average_broad_a_simp) # x-average of concatenation of broadcasts conc_broad = pybamm.concatenation( @@ -137,7 +137,7 @@ def test_x_average(self): a = pybamm.Variable("a", domain="new domain") av_a = pybamm.x_average(a) - self.assertEqual(av_a.id, a.id) + self.assertEqual(av_a, a) # x-average of symbol that evaluates on edges raises error symbol_on_edges = pybamm.PrimaryBroadcastToEdges(1, "domain") @@ -170,7 +170,7 @@ def test_size_average(self): # no domain a = pybamm.Scalar(1) average_a = pybamm.size_average(a) - self.assertEqual(average_a.id, a.id) + self.assertEqual(average_a, a) b = pybamm.FullBroadcast( 1, @@ -179,7 +179,7 @@ def test_size_average(self): ) # no "particle size" domain average_b = pybamm.size_average(b) - self.assertEqual(average_b.id, b.id) + self.assertEqual(average_b, b) # primary or secondary broadcast to "particle size" domain average_a = pybamm.size_average( @@ -191,7 +191,7 @@ def test_size_average(self): average_a = pybamm.size_average( pybamm.SecondaryBroadcast(a, "negative particle size") ) - self.assertEqual(average_a.id, a.id) + self.assertEqual(average_a, a) for domain in [["negative particle size"], ["positive particle size"]]: a = pybamm.Symbol("a", domain=domain) @@ -213,7 +213,7 @@ def test_size_average(self): def test_r_average(self): a = pybamm.Scalar(1) average_a = pybamm.r_average(a) - self.assertEqual(average_a.id, a.id) + self.assertEqual(average_a, a) average_broad_a = pybamm.r_average( pybamm.PrimaryBroadcast(a, ["negative particle"]) @@ -236,7 +236,7 @@ def test_r_average(self): average_broad_a = pybamm.r_average(broad_a) self.assertIsInstance(average_broad_a, pybamm.PrimaryBroadcast) self.assertEqual(average_broad_a.domain, ["positive electrode"]) - self.assertEqual(average_broad_a.children[0].id, pybamm.r_average(a).id) + self.assertEqual(average_broad_a.children[0], pybamm.r_average(a)) # r-average of symbol that evaluates on edges raises error symbol_on_edges = pybamm.PrimaryBroadcastToEdges(1, "domain") @@ -249,8 +249,8 @@ def test_yz_average(self): a = pybamm.Scalar(1) z_average_a = pybamm.z_average(a) yz_average_a = pybamm.yz_average(a) - self.assertEqual(z_average_a.id, a.id) - self.assertEqual(yz_average_a.id, a.id) + self.assertEqual(z_average_a, a) + self.assertEqual(yz_average_a, a) z_average_broad_a = pybamm.z_average( pybamm.PrimaryBroadcast(a, ["current collector"]) diff --git a/tests/unit/test_expression_tree/test_binary_operators.py b/tests/unit/test_expression_tree/test_binary_operators.py index 5b67bdff89..708dca6c78 100644 --- a/tests/unit/test_expression_tree/test_binary_operators.py +++ b/tests/unit/test_expression_tree/test_binary_operators.py @@ -49,7 +49,7 @@ def test_addition(self): # test simplifying summ2 = pybamm.Scalar(1) + pybamm.Scalar(3) - self.assertEqual(summ2.id, pybamm.Scalar(4).id) + self.assertEqual(summ2, pybamm.Scalar(4)) def test_power(self): a = pybamm.Symbol("a") @@ -64,33 +64,6 @@ def test_power(self): pow2 = pybamm.Power(a, b) self.assertEqual(pow2.evaluate(), 16) - def test_known_eval(self): - # Scalars - a = pybamm.Scalar(4) - b = pybamm.StateVector(slice(0, 1)) - expr = (a + b) - (a + b) * (a + b) - value = expr.evaluate(y=np.array([2])) - self.assertEqual(expr.evaluate(y=np.array([2]), known_evals={})[0], value) - self.assertIn((a + b).id, expr.evaluate(y=np.array([2]), known_evals={})[1]) - self.assertEqual( - expr.evaluate(y=np.array([2]), known_evals={})[1][(a + b).id], 6 - ) - - # Matrices - a = pybamm.Matrix(np.random.rand(5, 5)) - b = pybamm.StateVector(slice(0, 5)) - expr2 = (a @ b) - (a @ b) * (a @ b) + (a @ b) - y_test = np.linspace(0, 1, 5) - value = expr2.evaluate(y=y_test) - np.testing.assert_array_equal( - expr2.evaluate(y=y_test, known_evals={})[0], value - ) - self.assertIn((a @ b).id, expr2.evaluate(y=y_test, known_evals={})[1]) - np.testing.assert_array_equal( - expr2.evaluate(y=y_test, known_evals={})[1][(a @ b).id], - (a @ b).evaluate(y=y_test), - ) - def test_diff(self): a = pybamm.StateVector(slice(0, 1)) b = pybamm.StateVector(slice(1, 2)) @@ -170,20 +143,20 @@ def test_printing(self): self.assertEqual(str((a * b) / (c + d)), "a * b / (c + d)") self.assertEqual(str(a * (b / (c + d))), "a * b / (c + d)") - def test_id(self): + def test_equality(self): a = pybamm.Scalar(4) b = pybamm.Scalar(5) bin1 = pybamm.BinaryOperator("test", a, b) bin2 = pybamm.BinaryOperator("test", a, b) bin3 = pybamm.BinaryOperator("new test", a, b) - self.assertEqual(bin1.id, bin2.id) - self.assertNotEqual(bin1.id, bin3.id) + self.assertEqual(bin1, bin2) + self.assertNotEqual(bin1, bin3) c = pybamm.Scalar(5) bin4 = pybamm.BinaryOperator("test", a, c) - self.assertEqual(bin1.id, bin4.id) + self.assertEqual(bin1, bin4) d = pybamm.Scalar(42) bin5 = pybamm.BinaryOperator("test", a, d) - self.assertNotEqual(bin1.id, bin5.id) + self.assertNotEqual(bin1, bin5) def test_number_overloading(self): a = pybamm.Scalar(4) @@ -422,20 +395,20 @@ def test_binary_simplifications(self): broad2_edge = pybamm.PrimaryBroadcastToEdges(2, "domain") # power - self.assertEqual((c ** 0).id, pybamm.Scalar(1).id) - self.assertEqual((0 ** c).id, pybamm.Scalar(0).id) - self.assertEqual((c ** 1).id, c.id) + self.assertEqual((c ** 0), pybamm.Scalar(1)) + self.assertEqual((0 ** c), pybamm.Scalar(0)) + self.assertEqual((c ** 1), c) # power with broadcasts - self.assertEqual((c ** broad2).id, pybamm.PrimaryBroadcast(c ** 2, "domain").id) - self.assertEqual((broad2 ** c).id, pybamm.PrimaryBroadcast(2 ** c, "domain").id) + self.assertEqual((c ** broad2), pybamm.PrimaryBroadcast(c ** 2, "domain")) + self.assertEqual((broad2 ** c), pybamm.PrimaryBroadcast(2 ** c, "domain")) self.assertEqual( - (broad2 ** pybamm.PrimaryBroadcast(c, "domain")).id, - pybamm.PrimaryBroadcast(2 ** c, "domain").id, + (broad2 ** pybamm.PrimaryBroadcast(c, "domain")), + pybamm.PrimaryBroadcast(2 ** c, "domain"), ) # power with broadcasts to edge self.assertIsInstance(var ** broad2_edge, pybamm.Power) - self.assertEqual((var ** broad2_edge).left.id, var.id) - self.assertEqual((var ** broad2_edge).right.id, broad2_edge.id) + self.assertEqual((var ** broad2_edge).left, var) + self.assertEqual((var ** broad2_edge).right, broad2_edge) # addition self.assertIsInstance((a + b), pybamm.Scalar) @@ -458,8 +431,8 @@ def test_binary_simplifications(self): np.testing.assert_array_equal((broad0 + 1).child.evaluate(), 1) np.testing.assert_array_equal((broad0 + 1).domain, "domain") # addition with broadcasts - self.assertEqual((c + broad2).id, pybamm.PrimaryBroadcast(c + 2, "domain").id) - self.assertEqual((broad2 + c).id, pybamm.PrimaryBroadcast(2 + c, "domain").id) + self.assertEqual((c + broad2), pybamm.PrimaryBroadcast(c + 2, "domain")) + self.assertEqual((broad2 + c), pybamm.PrimaryBroadcast(2 + c, "domain")) # subtraction self.assertIsInstance((a - b), pybamm.Scalar) @@ -469,11 +442,11 @@ def test_binary_simplifications(self): self.assertIsInstance((b - a), pybamm.Scalar) self.assertEqual((b - a).evaluate(), 1) # subtraction with broadcasts - self.assertEqual((c - broad2).id, pybamm.PrimaryBroadcast(c - 2, "domain").id) - self.assertEqual((broad2 - c).id, pybamm.PrimaryBroadcast(2 - c, "domain").id) + self.assertEqual((c - broad2), pybamm.PrimaryBroadcast(c - 2, "domain")) + self.assertEqual((broad2 - c), pybamm.PrimaryBroadcast(2 - c, "domain")) # subtraction from itself - self.assertEqual((c - c).id, pybamm.Scalar(0).id) - self.assertEqual((broad2 - broad2).id, broad0.id) + self.assertEqual((c - c), pybamm.Scalar(0)) + self.assertEqual((broad2 - broad2), broad0) # addition and subtraction with matrix zero self.assertIsInstance((b + v), pybamm.Array) @@ -501,15 +474,15 @@ def test_binary_simplifications(self): self.assertIsInstance((b * c), pybamm.Parameter) self.assertIsInstance((2 * c), pybamm.Multiplication) # multiplication with -1 - self.assertEqual((c * -1).id, (-c).id) - self.assertEqual((-1 * c).id, (-c).id) + self.assertEqual((c * -1), (-c)) + self.assertEqual((-1 * c), (-c)) # multiplication with a negation - self.assertEqual((-c * -f).id, (c * f).id) - self.assertEqual((-c * 4).id, (c * -4).id) - self.assertEqual((4 * -c).id, (-4 * c).id) + self.assertEqual((-c * -f), (c * f)) + self.assertEqual((-c * 4), (c * -4)) + self.assertEqual((4 * -c), (-4 * c)) # multiplication with broadcasts - self.assertEqual((c * broad2).id, pybamm.PrimaryBroadcast(c * 2, "domain").id) - self.assertEqual((broad2 * c).id, pybamm.PrimaryBroadcast(2 * c, "domain").id) + self.assertEqual((c * broad2), pybamm.PrimaryBroadcast(c * 2, "domain")) + self.assertEqual((broad2 * c), pybamm.PrimaryBroadcast(2 * c, "domain")) # multiplication with matrix zero self.assertIsInstance((b * v), pybamm.Array) @@ -520,31 +493,31 @@ def test_binary_simplifications(self): self.assertEqual((f * v1), f) self.assertEqual((v1 * f), f) # multiplication with matrix minus one - self.assertEqual((f * (-v1)).id, (-f).id) - self.assertEqual(((-v1) * f).id, (-f).id) + self.assertEqual((f * (-v1)), (-f)) + self.assertEqual(((-v1) * f), (-f)) # multiplication with broadcast - self.assertEqual((var * broad2).id, (var * 2).id) - self.assertEqual((broad2 * var).id, (2 * var).id) + self.assertEqual((var * broad2), (var * 2)) + self.assertEqual((broad2 * var), (2 * var)) # multiplication with broadcast one - self.assertEqual((var * broad1).id, var.id) - self.assertEqual((broad1 * var).id, var.id) + self.assertEqual((var * broad1), var) + self.assertEqual((broad1 * var), var) # multiplication with broadcast minus one - self.assertEqual((var * -broad1).id, (-var).id) - self.assertEqual((-broad1 * var).id, (-var).id) + self.assertEqual((var * -broad1), (-var)) + self.assertEqual((-broad1 * var), (-var)) # division by itself - self.assertEqual((c / c).id, pybamm.Scalar(1).id) - self.assertEqual((broad2 / broad2).id, broad1.id) + self.assertEqual((c / c), pybamm.Scalar(1)) + self.assertEqual((broad2 / broad2), broad1) # division with a negation - self.assertEqual((-c / -f).id, (c / f).id) - self.assertEqual((-c / 4).id, (c / -4).id) - self.assertEqual((4 / -c).id, (-4 / c).id) + self.assertEqual((-c / -f), (c / f)) + self.assertEqual((-c / 4), (c / -4)) + self.assertEqual((4 / -c), (-4 / c)) # division with broadcasts - self.assertEqual((c / broad2).id, pybamm.PrimaryBroadcast(c / 2, "domain").id) - self.assertEqual((broad2 / c).id, pybamm.PrimaryBroadcast(2 / c, "domain").id) + self.assertEqual((c / broad2), pybamm.PrimaryBroadcast(c / 2, "domain")) + self.assertEqual((broad2 / c), pybamm.PrimaryBroadcast(2 / c, "domain")) # division with matrix one self.assertEqual((f / v1), f) - self.assertEqual((f / -v1).id, (-f).id) + self.assertEqual((f / -v1), (-f)) # division by zero with self.assertRaises(ZeroDivisionError): b / a @@ -565,9 +538,9 @@ def conc_broad(x, y, z): pybamm.InputParameter("y"), pybamm.InputParameter("z"), ) - self.assertEqual((a + 4).id, conc_broad(5, 6, 7).id) - self.assertEqual((4 + a).id, conc_broad(5, 6, 7).id) - self.assertEqual((a + b).id, conc_broad(12, 14, 16).id) + self.assertEqual((a + 4), conc_broad(5, 6, 7)) + self.assertEqual((4 + a), conc_broad(5, 6, 7)) + self.assertEqual((a + b), conc_broad(12, 14, 16)) self.assertIsInstance((a + c), pybamm.Concatenation) # No simplifications if are Variable or StateVector objects @@ -588,110 +561,110 @@ def test_advanced_binary_simplifications(self): # Do A@B first if it is constant expr = A @ (B @ var) - self.assertEqual(expr.id, ((A @ B) @ var).id) + self.assertEqual(expr, ((A @ B) @ var)) # Distribute the @ operator to a sum if one of the symbols being summed is # constant expr = A @ (var + vec) - self.assertEqual(expr.id, ((A @ var) + (A @ vec)).id) + self.assertEqual(expr, ((A @ var) + (A @ vec))) expr = A @ ((B @ var) + vec) - self.assertEqual(expr.id, (((A @ B) @ var) + (A @ vec)).id) + self.assertEqual(expr, (((A @ B) @ var) + (A @ vec))) # Reduce (A@var + B@var) to ((A+B)@var) expr = A @ var + B @ var - self.assertEqual(expr.id, ((A + B) @ var).id) + self.assertEqual(expr, ((A + B) @ var)) # Do A*e first if it is constant expr = A @ (5 * var) - self.assertEqual(expr.id, ((A * 5) @ var).id) + self.assertEqual(expr, ((A * 5) @ var)) expr = A @ (var * 5) - self.assertEqual(expr.id, ((A * 5) @ var).id) + self.assertEqual(expr, ((A * 5) @ var)) # Do A/e first if it is constant expr = A @ (var / 5) - self.assertEqual(expr.id, ((A / 5) @ var).id) + self.assertEqual(expr, ((A / 5) @ var)) # Do (d*A) first if it is constant expr = vec * (A @ var) - self.assertEqual(expr.id, ((vec * A) @ var).id) + self.assertEqual(expr, ((vec * A) @ var)) expr = (A @ var) * vec - self.assertEqual(expr.id, ((vec * A) @ var).id) + self.assertEqual(expr, ((vec * A) @ var)) # Do (A/d) first if it is constant expr = (A @ var) / vec - self.assertEqual(expr.id, ((A / vec) @ var).id) + self.assertEqual(expr, ((A / vec) @ var)) # simplify additions and subtractions expr = 7 + (var + 5) - self.assertEqual(expr.id, (12 + var).id) + self.assertEqual(expr, (12 + var)) expr = 7 + (5 + var) - self.assertEqual(expr.id, (12 + var).id) + self.assertEqual(expr, (12 + var)) expr = (var + 5) + 7 - self.assertEqual(expr.id, (var + 12).id) + self.assertEqual(expr, (var + 12)) expr = (5 + var) + 7 - self.assertEqual(expr.id, (12 + var).id) + self.assertEqual(expr, (12 + var)) expr = 7 + (var - 5) - self.assertEqual(expr.id, (2 + var).id) + self.assertEqual(expr, (2 + var)) expr = 7 + (5 - var) - self.assertEqual(expr.id, (12 - var).id) + self.assertEqual(expr, (12 - var)) expr = (var - 5) + 7 - self.assertEqual(expr.id, (var + 2).id) + self.assertEqual(expr, (var + 2)) expr = (5 - var) + 7 - self.assertEqual(expr.id, (12 - var).id) + self.assertEqual(expr, (12 - var)) expr = 7 - (var + 5) - self.assertEqual(expr.id, (2 - var).id) + self.assertEqual(expr, (2 - var)) expr = 7 - (5 + var) - self.assertEqual(expr.id, (2 - var).id) + self.assertEqual(expr, (2 - var)) expr = (var + 5) - 7 - self.assertEqual(expr.id, (var + -2).id) + self.assertEqual(expr, (var + -2)) expr = (5 + var) - 7 - self.assertEqual(expr.id, (-2 + var).id) + self.assertEqual(expr, (-2 + var)) expr = 7 - (var - 5) - self.assertEqual(expr.id, (12 - var).id) + self.assertEqual(expr, (12 - var)) expr = 7 - (5 - var) - self.assertEqual(expr.id, (2 + var).id) + self.assertEqual(expr, (2 + var)) expr = (var - 5) - 7 - self.assertEqual(expr.id, (var - 12).id) + self.assertEqual(expr, (var - 12)) expr = (5 - var) - 7 - self.assertEqual(expr.id, (-2 - var).id) + self.assertEqual(expr, (-2 - var)) # simplify multiplications and divisions expr = 7 * (var * 5) - self.assertEqual(expr.id, (35 * var).id) + self.assertEqual(expr, (35 * var)) expr = (var * 5) * 7 - self.assertEqual(expr.id, (var * 35).id) + self.assertEqual(expr, (var * 35)) expr = 7 * (5 * var) - self.assertEqual(expr.id, (35 * var).id) + self.assertEqual(expr, (35 * var)) expr = (5 * var) * 7 - self.assertEqual(expr.id, (35 * var).id) + self.assertEqual(expr, (35 * var)) expr = 7 * (var / 5) - self.assertEqual(expr.id, ((7 / 5) * var).id) + self.assertEqual(expr, ((7 / 5) * var)) expr = (var / 5) * 7 - self.assertEqual(expr.id, (var * (7 / 5)).id) + self.assertEqual(expr, (var * (7 / 5))) expr = (var * 5) / 7 - self.assertEqual(expr.id, (var * (5 / 7)).id) + self.assertEqual(expr, (var * (5 / 7))) expr = (5 * var) / 7 - self.assertEqual(expr.id, ((5 / 7) * var).id) + self.assertEqual(expr, ((5 / 7) * var)) expr = 5 / (7 * var) - self.assertEqual(expr.id, ((5 / 7) / var).id) + self.assertEqual(expr, ((5 / 7) / var)) expr = 5 / (var * 7) - self.assertEqual(expr.id, ((5 / 7) / var).id) + self.assertEqual(expr, ((5 / 7) / var)) expr = (var / 5) / 7 - self.assertEqual(expr.id, (var / 35).id) + self.assertEqual(expr, (var / 35)) expr = (5 / var) / 7 - self.assertEqual(expr.id, ((5 / 7) / var).id) + self.assertEqual(expr, ((5 / 7) / var)) expr = 5 / (7 / var) - self.assertEqual(expr.id, ((5 / 7) * var).id) + self.assertEqual(expr, ((5 / 7) * var)) expr = 5 / (var / 7) - self.assertEqual(expr.id, (35 / var).id) + self.assertEqual(expr, (35 / var)) # use power rules on multiplications and divisions expr = (var * 5) ** 2 - self.assertEqual(expr.id, (var ** 2 * 25).id) + self.assertEqual(expr, (var ** 2 * 25)) expr = (5 * var) ** 2 - self.assertEqual(expr.id, (25 * var ** 2).id) + self.assertEqual(expr, (25 * var ** 2)) expr = (var / 5) ** 2 - self.assertEqual(expr.id, (var ** 2 / 25).id) + self.assertEqual(expr, (var ** 2 / 25)) expr = (5 / var) ** 2 - self.assertEqual(expr.id, (25 / var ** 2).id) + self.assertEqual(expr, (25 / var ** 2)) def test_inner_simplifications(self): a1 = pybamm.Scalar(0) diff --git a/tests/unit/test_expression_tree/test_broadcasts.py b/tests/unit/test_expression_tree/test_broadcasts.py index a51116288b..300deb9710 100644 --- a/tests/unit/test_expression_tree/test_broadcasts.py +++ b/tests/unit/test_expression_tree/test_broadcasts.py @@ -181,8 +181,8 @@ def test_full_broadcast(self): self.assertEqual(broad_a.domains["secondary"], ["current collector"]) self.assertTrue(broad_a.broadcasts_to_nodes) self.assertEqual( - broad_a.reduce_one_dimension().id, - pybamm.PrimaryBroadcast(a, "current collector").id, + broad_a.reduce_one_dimension(), + pybamm.PrimaryBroadcast(a, "current collector"), ) broad_a = pybamm.FullBroadcast(a, ["negative electrode"], {}) @@ -198,7 +198,7 @@ def test_full_broadcast(self): }, ) self.assertEqual( - broad_a.reduce_one_dimension().id, + broad_a.reduce_one_dimension(), pybamm.FullBroadcast( a, "negative particle size", @@ -206,7 +206,7 @@ def test_full_broadcast(self): "secondary": "negative electrode", "tertiary": "current collector", }, - ).id, + ), ) def test_full_broadcast_number(self): @@ -223,7 +223,7 @@ def test_full_broadcast_number(self): def test_ones_like(self): a = pybamm.Parameter("a") ones_like_a = pybamm.ones_like(a) - self.assertEqual(ones_like_a.id, pybamm.Scalar(1).id) + self.assertEqual(ones_like_a, pybamm.Scalar(1)) a = pybamm.Variable( "a", @@ -303,8 +303,8 @@ def test_broadcast_to_edges(self): self.assertTrue(broad_a.evaluates_on_edges("primary")) self.assertFalse(broad_a.broadcasts_to_nodes) self.assertEqual( - broad_a.reduce_one_dimension().id, - pybamm.PrimaryBroadcastToEdges(a, "current collector").id, + broad_a.reduce_one_dimension(), + pybamm.PrimaryBroadcastToEdges(a, "current collector"), ) broad_a = pybamm.FullBroadcastToEdges(a, ["negative electrode"], {}) self.assertEqual(broad_a.reduce_one_dimension(), a) @@ -315,10 +315,8 @@ def test_broadcast_to_edges(self): {"secondary": "negative electrode", "tertiary": "current collector"}, ) self.assertEqual( - broad_a.reduce_one_dimension().id, - pybamm.FullBroadcastToEdges( - a, "negative electrode", "current collector" - ).id, + broad_a.reduce_one_dimension(), + pybamm.FullBroadcastToEdges(a, "negative electrode", "current collector"), ) def test_to_equation(self): diff --git a/tests/unit/test_expression_tree/test_concatenations.py b/tests/unit/test_expression_tree/test_concatenations.py index c5ab83e2af..6d9c95e1f2 100644 --- a/tests/unit/test_expression_tree/test_concatenations.py +++ b/tests/unit/test_expression_tree/test_concatenations.py @@ -111,7 +111,7 @@ def test_concatenation_simplify(self): concat = pybamm.concatenation(a, b, c) self.assertIsInstance(concat, pybamm.FullBroadcast) - self.assertEqual(concat.orphans[0].id, pybamm.Scalar(0).id) + self.assertEqual(concat.orphans[0], pybamm.Scalar(0)) self.assertDomainEqual( concat.domains, { @@ -189,10 +189,10 @@ def test_concatenation_orphans(self): self.assertIsInstance(4 - c_new, pybamm.Subtraction) # ids should stay the same - self.assertEqual(a.id, a_new.id) - self.assertEqual(b.id, b_new.id) - self.assertEqual(c.id, c_new.id) - self.assertEqual(conc.id, pybamm.concatenation(a_new, b_new, c_new).id) + self.assertEqual(a, a_new) + self.assertEqual(b, b_new) + self.assertEqual(c, c_new) + self.assertEqual(conc, pybamm.concatenation(a_new, b_new, c_new)) def test_broadcast_and_concatenate(self): # create discretisation @@ -313,8 +313,8 @@ def test_numpy_concatenation(self): b = pybamm.Variable("b") c = pybamm.Variable("c") self.assertEqual( - pybamm.numpy_concatenation(pybamm.numpy_concatenation(a, b), c).id, - pybamm.NumpyConcatenation(a, b, c).id, + pybamm.numpy_concatenation(pybamm.numpy_concatenation(a, b), c), + pybamm.NumpyConcatenation(a, b, c), ) def test_to_equation(self): diff --git a/tests/unit/test_expression_tree/test_d_dt.py b/tests/unit/test_expression_tree/test_d_dt.py index ce8f86d1e9..bed244e765 100644 --- a/tests/unit/test_expression_tree/test_d_dt.py +++ b/tests/unit/test_expression_tree/test_d_dt.py @@ -18,7 +18,7 @@ def test_time_derivative(self): self.assertEqual(a.value, 1) a = (pybamm.t ** 2).diff(pybamm.t) - self.assertEqual(a.id, (2 * pybamm.t ** 1 * 1).id) + self.assertEqual(a, (2 * pybamm.t ** 1 * 1)) self.assertEqual(a.evaluate(t=1), 2) a = (2 + pybamm.t ** 2).diff(pybamm.t) diff --git a/tests/unit/test_expression_tree/test_functions.py b/tests/unit/test_expression_tree/test_functions.py index e46f0f2869..979a7db4e2 100644 --- a/tests/unit/test_expression_tree/test_functions.py +++ b/tests/unit/test_expression_tree/test_functions.py @@ -55,11 +55,6 @@ def test_function_of_one_variable(self): logvar = pybamm.Function(np.log1p, var) np.testing.assert_array_equal(logvar.evaluate(y=y), np.log1p(y)) - # use known_evals - np.testing.assert_array_equal( - logvar.evaluate(y=y, known_evals={})[0], np.log1p(y) - ) - def test_diff(self): a = pybamm.StateVector(slice(0, 1)) b = pybamm.StateVector(slice(1, 2)) @@ -170,18 +165,18 @@ def test_arcsinh(self): # Test broadcast gets switched broad_a = pybamm.PrimaryBroadcast(a, "test") fun_broad = pybamm.arcsinh(broad_a) - self.assertEqual(fun_broad.id, pybamm.PrimaryBroadcast(fun, "test").id) + self.assertEqual(fun_broad, pybamm.PrimaryBroadcast(fun, "test")) broad_a = pybamm.FullBroadcast(a, "test", "test2") fun_broad = pybamm.arcsinh(broad_a) - self.assertEqual(fun_broad.id, pybamm.FullBroadcast(fun, "test", "test2").id) + self.assertEqual(fun_broad, pybamm.FullBroadcast(fun, "test", "test2")) # Test recursion broad_a = pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(a, "test"), "test2") fun_broad = pybamm.arcsinh(broad_a) self.assertEqual( - fun_broad.id, - pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(fun, "test"), "test2").id, + fun_broad, + pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(fun, "test"), "test2"), ) def test_arctan(self): @@ -204,7 +199,7 @@ def test_cos(self): a = pybamm.InputParameter("a") fun = pybamm.cos(a) self.assertIsInstance(fun, pybamm.Cos) - self.assertEqual(fun.children[0].id, a.id) + self.assertEqual(fun.children[0], a) self.assertEqual(fun.evaluate(inputs={"a": 3}), np.cos(3)) h = 0.0000001 self.assertAlmostEqual( @@ -221,7 +216,7 @@ def test_cosh(self): a = pybamm.InputParameter("a") fun = pybamm.cosh(a) self.assertIsInstance(fun, pybamm.Cosh) - self.assertEqual(fun.children[0].id, a.id) + self.assertEqual(fun.children[0], a) self.assertEqual(fun.evaluate(inputs={"a": 3}), np.cosh(3)) h = 0.0000001 self.assertAlmostEqual( @@ -238,7 +233,7 @@ def test_exp(self): a = pybamm.InputParameter("a") fun = pybamm.exp(a) self.assertIsInstance(fun, pybamm.Exponential) - self.assertEqual(fun.children[0].id, a.id) + self.assertEqual(fun.children[0], a) self.assertEqual(fun.evaluate(inputs={"a": 3}), np.exp(3)) h = 0.0000001 self.assertAlmostEqual( @@ -298,7 +293,7 @@ def test_sin(self): a = pybamm.InputParameter("a") fun = pybamm.sin(a) self.assertIsInstance(fun, pybamm.Sin) - self.assertEqual(fun.children[0].id, a.id) + self.assertEqual(fun.children[0], a) self.assertEqual(fun.evaluate(inputs={"a": 3}), np.sin(3)) h = 0.0000001 self.assertAlmostEqual( @@ -315,7 +310,7 @@ def test_sinh(self): a = pybamm.InputParameter("a") fun = pybamm.sinh(a) self.assertIsInstance(fun, pybamm.Sinh) - self.assertEqual(fun.children[0].id, a.id) + self.assertEqual(fun.children[0], a) self.assertEqual(fun.evaluate(inputs={"a": 3}), np.sinh(3)) h = 0.0000001 self.assertAlmostEqual( diff --git a/tests/unit/test_expression_tree/test_interpolant.py b/tests/unit/test_expression_tree/test_interpolant.py index 2a9d0679a3..fec8e1a6a3 100644 --- a/tests/unit/test_expression_tree/test_interpolant.py +++ b/tests/unit/test_expression_tree/test_interpolant.py @@ -124,7 +124,7 @@ def test_processing(self): y = pybamm.StateVector(slice(0, 2)) interp = pybamm.Interpolant(x, 2 * x, y) - self.assertEqual(interp.id, interp.new_copy().id) + self.assertEqual(interp, interp.new_copy()) if __name__ == "__main__": diff --git a/tests/unit/test_expression_tree/test_operations/test_copy.py b/tests/unit/test_expression_tree/test_operations/test_copy.py index a5ae93e2f7..e005e6c583 100644 --- a/tests/unit/test_expression_tree/test_operations/test_copy.py +++ b/tests/unit/test_expression_tree/test_operations/test_copy.py @@ -15,7 +15,7 @@ def test_symbol_new_copy(self): v_n_2D = pybamm.Variable( "v", domain="negative particle", - auxiliary_domains={"secondary": "negative electrode"} + auxiliary_domains={"secondary": "negative electrode"}, ) x_n = pybamm.standard_spatial_vars.x_n v_s = pybamm.Variable("v", "separator") @@ -66,7 +66,7 @@ def test_symbol_new_copy(self): pybamm.SparseStack(mat, mat), pybamm.Equality(a, b), ]: - self.assertEqual(symbol.id, symbol.new_copy().id) + self.assertEqual(symbol, symbol.new_copy()) if __name__ == "__main__": diff --git a/tests/unit/test_expression_tree/test_operations/test_jac.py b/tests/unit/test_expression_tree/test_operations/test_jac.py index 6d6d2deedf..98cb9b3578 100644 --- a/tests/unit/test_expression_tree/test_operations/test_jac.py +++ b/tests/unit/test_expression_tree/test_operations/test_jac.py @@ -393,7 +393,7 @@ def test_jac_of_numpy_concatenation(self): np.testing.assert_array_equal(jacobian, dfunc_dy.toarray()) # One child - self.assertEqual(u.jac(u).id, pybamm.NumpyConcatenation(u).jac(u).id) + self.assertEqual(u.jac(u), pybamm.NumpyConcatenation(u).jac(u)) def test_jac_of_domain_concatenation(self): # create mesh diff --git a/tests/unit/test_expression_tree/test_operations/test_replace_symbols.py b/tests/unit/test_expression_tree/test_operations/test_replace_symbols.py index 75a5e9ba60..79c59ed300 100644 --- a/tests/unit/test_expression_tree/test_operations/test_replace_symbols.py +++ b/tests/unit/test_expression_tree/test_operations/test_replace_symbols.py @@ -21,7 +21,7 @@ def test_symbol_replacements(self): (a + c, b + d), # two replacements ]: replaced_symbol = replacer.process_symbol(symbol_in) - self.assertEqual(replaced_symbol.id, symbol_out.id) + self.assertEqual(replaced_symbol, symbol_out) var1 = pybamm.Variable("var 1", domain="dom 1") var2 = pybamm.Variable("var 2", domain="dom 2") @@ -30,7 +30,7 @@ def test_symbol_replacements(self): replacer = pybamm.SymbolReplacer({var1: var3}) replaced_symbol = replacer.process_symbol(conc) - self.assertEqual(replaced_symbol.id, pybamm.concatenation(var3, var2).id) + self.assertEqual(replaced_symbol, pybamm.concatenation(var3, var2)) def test_process_model(self): model = pybamm.BaseModel() @@ -88,10 +88,10 @@ def test_process_model(self): self.assertIsInstance(bc_value["right"][0], pybamm.Scalar) self.assertEqual(bc_value["right"][0].value, 42) # variables - self.assertEqual(model.variables["var1"].id, var1.id) + self.assertEqual(model.variables["var1"], var1) self.assertIsInstance(model.variables["grad_var1"], pybamm.Gradient) self.assertIsInstance(model.variables["grad_var1"].children[0], pybamm.Variable) - self.assertEqual(model.variables["d_var1"].id, (pybamm.Scalar(42) * var1).id) + self.assertEqual(model.variables["d_var1"], (pybamm.Scalar(42) * var1)) self.assertIsInstance(model.variables["d_var1"].children[0], pybamm.Scalar) self.assertIsInstance(model.variables["d_var1"].children[1], pybamm.Variable) # timescale and length scales diff --git a/tests/unit/test_expression_tree/test_operations/test_unpack_symbols.py b/tests/unit/test_expression_tree/test_operations/test_unpack_symbols.py index 16ba005293..42a8f0fc17 100644 --- a/tests/unit/test_expression_tree/test_operations/test_unpack_symbols.py +++ b/tests/unit/test_expression_tree/test_operations/test_unpack_symbols.py @@ -11,16 +11,16 @@ def test_basic_symbols(self): unpacker = pybamm.SymbolUnpacker(pybamm.Scalar) unpacked = unpacker.unpack_symbol(a) - self.assertEqual(unpacked, {a.id: a}) + self.assertEqual(unpacked, set([a])) b = pybamm.Parameter("b") unpacker_param = pybamm.SymbolUnpacker(pybamm.Parameter) unpacked = unpacker_param.unpack_symbol(a) - self.assertEqual(unpacked, {}) + self.assertEqual(unpacked, set()) unpacked = unpacker_param.unpack_symbol(b) - self.assertEqual(unpacked, {b.id: b}) + self.assertEqual(unpacked, set([b])) def test_binary(self): a = pybamm.Scalar(1) @@ -28,15 +28,11 @@ def test_binary(self): unpacker = pybamm.SymbolUnpacker(pybamm.Scalar) unpacked = unpacker.unpack_symbol(a + b) - # Can't check dictionary directly so check ids - self.assertEqual(unpacked.keys(), {a.id: a}.keys()) - self.assertEqual(unpacked[a.id].id, a.id) + self.assertEqual(unpacked, set([a])) unpacker_param = pybamm.SymbolUnpacker(pybamm.Parameter) unpacked = unpacker_param.unpack_symbol(a + b) - # Can't check dictionary directly so check ids - self.assertEqual(unpacked.keys(), {b.id: b}.keys()) - self.assertEqual(unpacked[b.id].id, b.id) + self.assertEqual(unpacked, set([b])) def test_unpack_list_of_symbols(self): a = pybamm.Scalar(1) @@ -45,10 +41,7 @@ def test_unpack_list_of_symbols(self): unpacker = pybamm.SymbolUnpacker(pybamm.Parameter) unpacked = unpacker.unpack_list_of_symbols([a + b, a - c, b + c]) - # Can't check dictionary directly so check ids - self.assertEqual(unpacked.keys(), {b.id: b, c.id: c}.keys()) - self.assertEqual(unpacked[b.id].id, b.id) - self.assertEqual(unpacked[c.id].id, c.id) + self.assertEqual(unpacked, set([b, c])) if __name__ == "__main__": diff --git a/tests/unit/test_expression_tree/test_parameter.py b/tests/unit/test_expression_tree/test_parameter.py index 85d0956b98..191d02929c 100644 --- a/tests/unit/test_expression_tree/test_parameter.py +++ b/tests/unit/test_expression_tree/test_parameter.py @@ -36,7 +36,7 @@ def test_function_parameter_init(self): var = pybamm.Variable("var") func = pybamm.FunctionParameter("func", {"var": var}) self.assertEqual(func.name, "func") - self.assertEqual(func.children[0].id, var.id) + self.assertEqual(func.children[0], var) self.assertEqual(func.domain, []) self.assertEqual(func.diff_variable, None) diff --git a/tests/unit/test_expression_tree/test_scalar.py b/tests/unit/test_expression_tree/test_scalar.py index 0685a6003f..52dd1faa63 100644 --- a/tests/unit/test_expression_tree/test_scalar.py +++ b/tests/unit/test_expression_tree/test_scalar.py @@ -12,11 +12,6 @@ def test_scalar_eval(self): self.assertEqual(a.value, 5) self.assertEqual(a.evaluate(), 5) - # with known_evals - self.assertEqual(a.evaluate(known_evals={a.id: 5})[0], 5) - # it's possible to provide a conflicting value of known_evals - self.assertEqual(a.evaluate(known_evals={a.id: 15})[0], 15) - def test_scalar_operations(self): a = pybamm.Scalar(5) b = pybamm.Scalar(6) @@ -25,12 +20,12 @@ def test_scalar_operations(self): self.assertEqual((a * b).evaluate(), 30) self.assertEqual((a / b).evaluate(), 5 / 6) - def test_scalar_id(self): + def test_scalar_eq(self): a1 = pybamm.Scalar(4) a2 = pybamm.Scalar(4) - self.assertEqual(a1.id, a2.id) + self.assertEqual(a1, a2) a3 = pybamm.Scalar(5) - self.assertNotEqual(a1.id, a3.id) + self.assertNotEqual(a1, a3) def test_to_equation(self): a = pybamm.Scalar(3) diff --git a/tests/unit/test_expression_tree/test_symbol.py b/tests/unit/test_expression_tree/test_symbol.py index 6adcb57433..36ec4f7ef8 100644 --- a/tests/unit/test_expression_tree/test_symbol.py +++ b/tests/unit/test_expression_tree/test_symbol.py @@ -145,17 +145,17 @@ def test_symbol_methods(self): # binary - number and symbol self.assertIsInstance(3 + b, pybamm.Addition) - self.assertEqual((3 + b).children[1].id, b.id) + self.assertEqual((3 + b).children[1], b) self.assertIsInstance(3 - b, pybamm.Subtraction) - self.assertEqual((3 - b).children[1].id, b.id) + self.assertEqual((3 - b).children[1], b) self.assertIsInstance(3 * b, pybamm.Multiplication) - self.assertEqual((3 * b).children[1].id, b.id) + self.assertEqual((3 * b).children[1], b) self.assertIsInstance(3 @ b, pybamm.MatrixMultiplication) - self.assertEqual((3 @ b).children[1].id, b.id) + self.assertEqual((3 @ b).children[1], b) self.assertIsInstance(3 / b, pybamm.Division) - self.assertEqual((3 / b).children[1].id, b.id) + self.assertEqual((3 / b).children[1], b) self.assertIsInstance(3 ** b, pybamm.Power) - self.assertEqual((3 ** b).children[1].id, b.id) + self.assertEqual((3 ** b).children[1], b) # error raising with self.assertRaisesRegex( @@ -413,8 +413,8 @@ def test_orphans(self): summ = a + b a_orp, b_orp = summ.orphans - self.assertEqual(a.id, a_orp.id) - self.assertEqual(b.id, b_orp.id) + self.assertEqual(a, a_orp) + self.assertEqual(b, b_orp) def test_shape(self): scal = pybamm.Scalar(1) diff --git a/tests/unit/test_expression_tree/test_symbolic_diff.py b/tests/unit/test_expression_tree/test_symbolic_diff.py index f559b8b743..6f3d797bf4 100644 --- a/tests/unit/test_expression_tree/test_symbolic_diff.py +++ b/tests/unit/test_expression_tree/test_symbolic_diff.py @@ -57,14 +57,14 @@ def test_diff_zero(self): a = pybamm.StateVector(slice(0, 1)) b = pybamm.StateVector(slice(1, 2)) func = (a * 2 + 5 * (-a)) / (a * a) - self.assertEqual(func.diff(b).id, pybamm.Scalar(0).id) - self.assertNotEqual(func.diff(a).id, pybamm.Scalar(0).id) + self.assertEqual(func.diff(b), pybamm.Scalar(0)) + self.assertNotEqual(func.diff(a), pybamm.Scalar(0)) def test_diff_state_vector_dot(self): a = pybamm.StateVectorDot(slice(0, 1)) b = pybamm.StateVector(slice(1, 2)) - self.assertEqual(a.diff(a).id, pybamm.Scalar(1).id) - self.assertEqual(a.diff(b).id, pybamm.Scalar(0).id) + self.assertEqual(a.diff(a), pybamm.Scalar(1)) + self.assertEqual(a.diff(b), pybamm.Scalar(0)) def test_diff_heaviside(self): a = pybamm.Scalar(1) diff --git a/tests/unit/test_expression_tree/test_unary_operators.py b/tests/unit/test_expression_tree/test_unary_operators.py index 6576a458d5..042de6f7b8 100644 --- a/tests/unit/test_expression_tree/test_unary_operators.py +++ b/tests/unit/test_expression_tree/test_unary_operators.py @@ -24,7 +24,6 @@ def test_unary_operator(self): a = pybamm.InputParameter("a") absval = pybamm.AbsoluteValue(-a) self.assertEqual(absval.evaluate(inputs={"a": 10}), 10) - self.assertEqual(absval.evaluate(inputs={"a": 10}, known_evals={})[0], 10) def test_negation(self): a = pybamm.Symbol("a") @@ -39,18 +38,18 @@ def test_negation(self): # Test broadcast gets switched broad_a = pybamm.PrimaryBroadcast(a, "test") neg_broad = -broad_a - self.assertEqual(neg_broad.id, pybamm.PrimaryBroadcast(nega, "test").id) + self.assertEqual(neg_broad, pybamm.PrimaryBroadcast(nega, "test")) broad_a = pybamm.FullBroadcast(a, "test", "test2") neg_broad = -broad_a - self.assertEqual(neg_broad.id, pybamm.FullBroadcast(nega, "test", "test2").id) + self.assertEqual(neg_broad, pybamm.FullBroadcast(nega, "test", "test2")) # Test recursion broad_a = pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(a, "test"), "test2") neg_broad = -broad_a self.assertEqual( - neg_broad.id, - pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(nega, "test"), "test2").id, + neg_broad, + pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(nega, "test"), "test2"), ) def test_absolute(self): @@ -66,18 +65,18 @@ def test_absolute(self): # Test broadcast gets switched broad_a = pybamm.PrimaryBroadcast(a, "test") abs_broad = abs(broad_a) - self.assertEqual(abs_broad.id, pybamm.PrimaryBroadcast(absa, "test").id) + self.assertEqual(abs_broad, pybamm.PrimaryBroadcast(absa, "test")) broad_a = pybamm.FullBroadcast(a, "test", "test2") abs_broad = abs(broad_a) - self.assertEqual(abs_broad.id, pybamm.FullBroadcast(absa, "test", "test2").id) + self.assertEqual(abs_broad, pybamm.FullBroadcast(absa, "test", "test2")) # Test recursion broad_a = pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(a, "test"), "test2") abs_broad = abs(broad_a) self.assertEqual( - abs_broad.id, - pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(absa, "test"), "test2").id, + abs_broad, + pybamm.PrimaryBroadcast(pybamm.PrimaryBroadcast(absa, "test"), "test2"), ) def test_smooth_absolute_value(self): @@ -189,13 +188,13 @@ def test_div(self): # check div commutes with negation a = pybamm.Symbol("a", domain="test domain") div = pybamm.div(-pybamm.Gradient(a)) - self.assertEqual(div.id, (-pybamm.Divergence(pybamm.Gradient(a))).id) + self.assertEqual(div, (-pybamm.Divergence(pybamm.Gradient(a)))) div = pybamm.div(-a * pybamm.Gradient(a)) - self.assertEqual(div.id, (-pybamm.Divergence(a * pybamm.Gradient(a))).id) + self.assertEqual(div, (-pybamm.Divergence(a * pybamm.Gradient(a)))) # div = pybamm.div(a * -pybamm.Gradient(a)) - # self.assertEqual(div.id, (-pybamm.Divergence(a * pybamm.Gradient(a))).id) + # self.assertEqual(div, (-pybamm.Divergence(a * pybamm.Gradient(a)))) def test_integral(self): # space integral @@ -441,25 +440,25 @@ def test_printing(self): self.assertEqual(grad.name, "grad") self.assertEqual(str(grad), "grad(a)") - def test_id(self): + def test_eq(self): a = pybamm.Scalar(4) un1 = pybamm.UnaryOperator("test", a) un2 = pybamm.UnaryOperator("test", a) un3 = pybamm.UnaryOperator("new test", a) - self.assertEqual(un1.id, un2.id) - self.assertNotEqual(un1.id, un3.id) + self.assertEqual(un1, un2) + self.assertNotEqual(un1, un3) a = pybamm.Scalar(4) un4 = pybamm.UnaryOperator("test", a) - self.assertEqual(un1.id, un4.id) + self.assertEqual(un1, un4) d = pybamm.Scalar(42) un5 = pybamm.UnaryOperator("test", d) - self.assertNotEqual(un1.id, un5.id) + self.assertNotEqual(un1, un5) def test_delta_function(self): a = pybamm.Symbol("a") delta_a = pybamm.DeltaFunction(a, "right", "some domain") self.assertEqual(delta_a.side, "right") - self.assertEqual(delta_a.child.id, a.id) + self.assertEqual(delta_a.child, a) self.assertEqual(delta_a.domain, ["some domain"]) self.assertFalse(delta_a.evaluates_on_edges("primary")) @@ -480,7 +479,7 @@ def test_boundary_operators(self): a = pybamm.Symbol("a", domain="some domain") boundary_a = pybamm.BoundaryOperator("boundary", a, "right") self.assertEqual(boundary_a.side, "right") - self.assertEqual(boundary_a.child.id, a.id) + self.assertEqual(boundary_a.child, a) def test_evaluates_on_edges(self): a = pybamm.StateVector(slice(0, 10), domain="test") @@ -494,7 +493,7 @@ def test_evaluates_on_edges(self): def test_boundary_value(self): a = pybamm.Scalar(1) boundary_a = pybamm.boundary_value(a, "right") - self.assertEqual(boundary_a.id, a.id) + self.assertEqual(boundary_a, a) boundary_broad_a = pybamm.boundary_value( pybamm.PrimaryBroadcast(a, ["negative electrode"]), "left" diff --git a/tests/unit/test_expression_tree/test_variable.py b/tests/unit/test_expression_tree/test_variable.py index e380a13134..f2a32f2a81 100644 --- a/tests/unit/test_expression_tree/test_variable.py +++ b/tests/unit/test_expression_tree/test_variable.py @@ -26,14 +26,14 @@ def test_variable_diff(self): self.assertIsInstance(a.diff(b), pybamm.Scalar) self.assertEqual(a.diff(b).evaluate(), 0) - def test_variable_id(self): + def test_variable_eq(self): a1 = pybamm.Variable("a", domain=["negative electrode"]) a2 = pybamm.Variable("a", domain=["negative electrode"]) - self.assertEqual(a1.id, a2.id) + self.assertEqual(a1, a2) a3 = pybamm.Variable("b", domain=["negative electrode"]) a4 = pybamm.Variable("a", domain=["positive electrode"]) - self.assertNotEqual(a1.id, a3.id) - self.assertNotEqual(a1.id, a4.id) + self.assertNotEqual(a1, a3) + self.assertNotEqual(a1, a4) def test_variable_bounds(self): var = pybamm.Variable("var") @@ -69,11 +69,11 @@ def test_variable_init(self): def test_variable_id(self): a1 = pybamm.VariableDot("a", domain=["negative electrode"]) a2 = pybamm.VariableDot("a", domain=["negative electrode"]) - self.assertEqual(a1.id, a2.id) + self.assertEqual(a1, a2) a3 = pybamm.VariableDot("b", domain=["negative electrode"]) a4 = pybamm.VariableDot("a", domain=["positive electrode"]) - self.assertNotEqual(a1.id, a3.id) - self.assertNotEqual(a1.id, a4.id) + self.assertNotEqual(a1, a3) + self.assertNotEqual(a1, a4) def test_variable_diff(self): a = pybamm.VariableDot("a") diff --git a/tests/unit/test_geometry/test_battery_geometry.py b/tests/unit/test_geometry/test_battery_geometry.py index c69ede0479..04e6629550 100644 --- a/tests/unit/test_geometry/test_battery_geometry.py +++ b/tests/unit/test_geometry/test_battery_geometry.py @@ -31,9 +31,7 @@ def test_geometry(self): self.assertIn("negative particle", geometry) self.assertIn("negative particle size", geometry) self.assertEqual(geometry["negative electrode"]["x_n"]["min"], 0) - self.assertEqual( - geometry["negative electrode"]["x_n"]["max"].id, geo.l_n.id - ) + self.assertEqual(geometry["negative electrode"]["x_n"]["max"], geo.l_n) if cc_dimension == 1: self.assertIn("tabs", geometry["current collector"]) @@ -49,9 +47,7 @@ def test_geometry(self): geometry = pybamm.battery_geometry( form_factor="cylindrical", current_collector_dimension=1 ) - self.assertEqual( - geometry["current collector"]["r_macro"]["min"].id, geo.r_inner.id - ) + self.assertEqual(geometry["current collector"]["r_macro"]["min"], geo.r_inner) self.assertEqual(geometry["current collector"]["r_macro"]["max"], 1) def test_geometry_error(self): diff --git a/tests/unit/test_models/test_base_model.py b/tests/unit/test_models/test_base_model.py index c56d2802f3..6a1329f7fa 100644 --- a/tests/unit/test_models/test_base_model.py +++ b/tests/unit/test_models/test_base_model.py @@ -277,23 +277,15 @@ def test_new_copy(self): self.assertEqual(new_model.name, model.name) self.assertEqual(new_model.use_jacobian, model.use_jacobian) self.assertEqual(new_model.convert_to_format, model.convert_to_format) - self.assertEqual(new_model.timescale.id, model.timescale.id) + self.assertEqual(new_model.timescale, model.timescale) def test_check_no_repeated_keys(self): model = pybamm.BaseModel() - # rhs twice var = pybamm.Variable("var") model.rhs = {var: -1} var = pybamm.Variable("var") - model.rhs.update({var: -1}) - with self.assertRaisesRegex(pybamm.ModelError, "Multiple equations specified"): - model.check_no_repeated_keys() - - # rhs and algebraic - model.rhs = {var: -1} - var = pybamm.Variable("var") - model.algebraic.update({var: var}) + model.algebraic = {var: var} with self.assertRaisesRegex(pybamm.ModelError, "Multiple equations specified"): model.check_no_repeated_keys() @@ -598,7 +590,7 @@ def test_generate_casadi(self): var_fn = casadi.external("variables", "./test.so") # Test that function values are as expected - self.assertEqual(x0_fn([0, 5]), 5) + self.assertEqual(x0_fn([2, 5]), 5) self.assertEqual(z0_fn([0, 0]), 1) self.assertEqual(rhs_fn(0, 3, 2, [7, 2]), -21) self.assertEqual(alg_fn(0, 3, 2, [7, 2]), 1) diff --git a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py index 2a16da3981..e09a713c46 100644 --- a/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py +++ b/tests/unit/test_models/test_full_battery_models/test_base_battery_model.py @@ -79,7 +79,7 @@ def test_process_parameters_and_discretise(self): flux_2 = model.variables["X-averaged negative particle flux"] param_flux_2 = parameter_values.process_symbol(flux_2) disc_flux_2 = disc.process_symbol(param_flux_2) - self.assertEqual(flux_1.id, disc_flux_2.id) + self.assertEqual(flux_1, disc_flux_2) def test_summary_variables(self): model = pybamm.BaseBatteryModel() diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py index 052af7e864..e49197bd3a 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spm.py @@ -28,11 +28,11 @@ def test_new_model(self): new_model = model.new_copy() model_T_eqn = model.rhs[model.variables["Cell temperature"]] new_model_T_eqn = new_model.rhs[new_model.variables["Cell temperature"]] - self.assertEqual(new_model_T_eqn.id, model_T_eqn.id) + self.assertEqual(new_model_T_eqn, model_T_eqn) self.assertEqual(new_model.name, model.name) self.assertEqual(new_model.use_jacobian, model.use_jacobian) self.assertEqual(new_model.convert_to_format, model.convert_to_format) - self.assertEqual(new_model.timescale.id, model.timescale.id) + self.assertEqual(new_model.timescale, model.timescale) # with custom submodels options = {"stress-induced diffusion": "false", "thermal": "x-full"} @@ -45,7 +45,7 @@ def test_new_model(self): new_model = model.new_copy() new_model_cs_eqn = list(new_model.rhs.values())[1] model_cs_eqn = list(model.rhs.values())[1] - self.assertEqual(new_model_cs_eqn.id, model_cs_eqn.id) + self.assertEqual(new_model_cs_eqn, model_cs_eqn) if __name__ == "__main__": diff --git a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spme.py b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spme.py index b32739dfdf..af208bd432 100644 --- a/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spme.py +++ b/tests/unit/test_models/test_full_battery_models/test_lithium_ion/test_spme.py @@ -15,16 +15,16 @@ def test_external_variables(self): model_options = {"external submodels": ["electrolyte diffusion"]} model = pybamm.lithium_ion.SPMe(model_options) self.assertEqual( - model.external_variables[0].id, - model.variables["Porosity times concentration"].id, + model.external_variables[0], + model.variables["Porosity times concentration"], ) # a variable model_options = {"thermal": "lumped", "external submodels": ["thermal"]} model = pybamm.lithium_ion.SPMe(model_options) self.assertEqual( - model.external_variables[0].id, - model.variables["Volume-averaged cell temperature"].id, + model.external_variables[0], + model.variables["Volume-averaged cell temperature"], ) def test_electrolyte_options(self): diff --git a/tests/unit/test_parameters/test_parameter_values.py b/tests/unit/test_parameters/test_parameter_values.py index f57003019e..12f5ec15d1 100644 --- a/tests/unit/test_parameters/test_parameter_values.py +++ b/tests/unit/test_parameters/test_parameter_values.py @@ -199,7 +199,7 @@ def test_process_symbol(self): self.assertIsInstance(processed_integ, pybamm.Integral) self.assertIsInstance(processed_integ.children[0], pybamm.PrimaryBroadcast) self.assertEqual(processed_integ.children[0].child.value, 4) - self.assertEqual(processed_integ.integration_variable[0].id, x.id) + self.assertEqual(processed_integ.integration_variable[0], x) # process unary operation v = pybamm.Variable("v", domain="test") @@ -228,7 +228,7 @@ def test_process_symbol(self): processed_x = processed_boundary_op.children[0].children[1] self.assertIsInstance(processed_a, pybamm.Scalar) self.assertEqual(processed_a.value, 4) - self.assertEqual(processed_x.id, x.id) + self.assertEqual(processed_x, x) # process broadcast whole_cell = ["negative electrode", "separator", "positive electrode"] @@ -670,7 +670,7 @@ def test_process_integral_broadcast(self): param = pybamm.ParameterValues({"func": 2}) func_proc = param.process_symbol(func) - self.assertEqual(func_proc.id, pybamm.Scalar(2, name="func").id) + self.assertEqual(func_proc, pybamm.Scalar(2, name="func")) # test with auxiliary domains @@ -686,10 +686,8 @@ def test_process_integral_broadcast(self): func_proc = param.process_symbol(func) self.assertEqual( - func_proc.id, - pybamm.PrimaryBroadcast( - pybamm.Scalar(2, name="func"), "current collector" - ).id, + func_proc, + pybamm.PrimaryBroadcast(pybamm.Scalar(2, name="func"), "current collector"), ) # secondary and tertiary @@ -707,10 +705,10 @@ def test_process_integral_broadcast(self): func_proc = param.process_symbol(func) self.assertEqual( - func_proc.id, + func_proc, pybamm.FullBroadcast( pybamm.Scalar(2, name="func"), "negative particle", "current collector" - ).id, + ), ) # secondary, tertiary and quaternary @@ -729,7 +727,7 @@ def test_process_integral_broadcast(self): func_proc = param.process_symbol(func) self.assertEqual( - func_proc.id, + func_proc, pybamm.FullBroadcast( pybamm.Scalar(2, name="func"), "negative particle", @@ -737,7 +735,7 @@ def test_process_integral_broadcast(self): "secondary": "negative particle size", "tertiary": "current collector", }, - ).id, + ), ) # special case for integral of concatenations of broadcasts @@ -761,7 +759,7 @@ def test_process_integral_broadcast(self): ) func_proc = param.process_symbol(func) - self.assertEqual(func_proc.id, pybamm.Scalar(3).id) + self.assertEqual(func_proc, pybamm.Scalar(3)) # with auxiliary domains var_n = pybamm.Variable( @@ -797,8 +795,8 @@ def test_process_integral_broadcast(self): func_proc = param.process_symbol(func) self.assertEqual( - func_proc.id, - pybamm.PrimaryBroadcast(pybamm.Scalar(3), "current collector").id, + func_proc, + pybamm.PrimaryBroadcast(pybamm.Scalar(3), "current collector"), ) def test_process_size_average(self): @@ -822,7 +820,7 @@ def dist(R): self.assertIsInstance(var_av_proc, pybamm.SizeAverage) R = pybamm.SpatialVariable("R", "negative particle size") - self.assertEqual(var_av_proc.f_a_dist.id, ((R * 2) ** 2 * 2).id) + self.assertEqual(var_av_proc.f_a_dist, ((R * 2) ** 2 * 2)) def test_process_not_constant(self): param = pybamm.ParameterValues({"a": 4}) @@ -900,11 +898,11 @@ def test_process_model(self): self.assertIsInstance(bc_value["right"][0], pybamm.Scalar) self.assertEqual(bc_value["right"][0].value, 42) # variables - self.assertEqual(model.variables["var1"].id, var1.id) + self.assertEqual(model.variables["var1"], var1) self.assertIsInstance(model.variables["grad_var1"], pybamm.Gradient) self.assertIsInstance(model.variables["grad_var1"].children[0], pybamm.Variable) self.assertEqual( - model.variables["d_var1"].id, (pybamm.Scalar(42, name="d") * var1).id + model.variables["d_var1"], (pybamm.Scalar(42, name="d") * var1) ) self.assertIsInstance(model.variables["d_var1"].children[0], pybamm.Scalar) self.assertIsInstance(model.variables["d_var1"].children[1], pybamm.Variable) diff --git a/tests/unit/test_solvers/test_scipy_solver.py b/tests/unit/test_solvers/test_scipy_solver.py index ceb4fcbab0..3a5625aace 100644 --- a/tests/unit/test_solvers/test_scipy_solver.py +++ b/tests/unit/test_solvers/test_scipy_solver.py @@ -128,7 +128,7 @@ def test_model_solver_ode_with_jacobian_python(self): # construct jacobian in order of model.rhs J = [] for var in model.rhs.keys(): - if var.id == var1.id: + if var == var1: J.append([np.eye(N), np.zeros((N, N))]) else: J.append([-1.0 * np.eye(N), np.zeros((N, N))]) diff --git a/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py b/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py index 89098d5cec..1d802b6bd3 100644 --- a/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py +++ b/tests/unit/test_spatial_methods/test_finite_volume/test_finite_volume.py @@ -108,7 +108,7 @@ def test_discretise_diffusivity_times_spatial_operator(self): # of boundary conditions # Dirichlet disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -117,7 +117,7 @@ def test_discretise_diffusivity_times_spatial_operator(self): eqn_disc.evaluate(None, y_test) # Neumann disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(1), "Neumann"), } @@ -126,7 +126,7 @@ def test_discretise_diffusivity_times_spatial_operator(self): eqn_disc.evaluate(None, y_test) # One of each disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Neumann"), } @@ -134,7 +134,7 @@ def test_discretise_diffusivity_times_spatial_operator(self): eqn_disc = disc.process_symbol(eqn) eqn_disc.evaluate(None, y_test) disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -251,7 +251,7 @@ def test_jacobian(self): # grad eqn = pybamm.grad(var) disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(2), "Dirichlet"), } @@ -280,7 +280,7 @@ def test_jacobian(self): flux = pybamm.grad(var) eqn = pybamm.div(flux) disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -293,7 +293,7 @@ def test_jacobian(self): flux = var * pybamm.grad(var) eqn = pybamm.div(flux) disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -396,7 +396,7 @@ def test_upwind_downwind(self): downwind = pybamm.downwind(var) disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(5), "Dirichlet"), "right": (pybamm.Scalar(3), "Dirichlet"), } @@ -427,7 +427,7 @@ def test_upwind_downwind(self): # Set wrong boundary conditions and check error is raised disc.bcs = { - var.id: { + var: { "left": (pybamm.Scalar(5), "Neumann"), "right": (pybamm.Scalar(3), "Neumann"), } @@ -460,7 +460,7 @@ def test_grad_div_with_bcs_on_tab(self): # bcs (on each tab) boundary_conditions = { - var.id: { + var: { "negative tab": (pybamm.Scalar(1), "Dirichlet"), "positive tab": (pybamm.Scalar(0), "Neumann"), } @@ -473,7 +473,7 @@ def test_grad_div_with_bcs_on_tab(self): # bcs (one pos, one not tab) boundary_conditions = { - var.id: { + var: { "no tab": (pybamm.Scalar(1), "Dirichlet"), "positive tab": (pybamm.Scalar(0), "Dirichlet"), } @@ -486,7 +486,7 @@ def test_grad_div_with_bcs_on_tab(self): # bcs (one neg, one not tab) boundary_conditions = { - var.id: { + var: { "negative tab": (pybamm.Scalar(1), "Neumann"), "no tab": (pybamm.Scalar(0), "Neumann"), } @@ -516,7 +516,7 @@ def test_neg_pos_bcs(self): # bcs (on each tab) boundary_conditions = { - var.id: { + var: { "negative tab": (pybamm.Scalar(1), "Dirichlet"), "positive tab": (pybamm.Scalar(0), "Neumann"), "no tab": (pybamm.Scalar(8), "Dirichlet"), @@ -527,10 +527,10 @@ def test_neg_pos_bcs(self): # check after disc that negative tab goes to left and positive tab goes # to right disc.process_symbol(grad_eqn) - self.assertEqual(disc.bcs[var.id]["left"][0].id, pybamm.Scalar(1).id) - self.assertEqual(disc.bcs[var.id]["left"][1], "Dirichlet") - self.assertEqual(disc.bcs[var.id]["right"][0].id, pybamm.Scalar(0).id) - self.assertEqual(disc.bcs[var.id]["right"][1], "Neumann") + self.assertEqual(disc.bcs[var]["left"][0], pybamm.Scalar(1)) + self.assertEqual(disc.bcs[var]["left"][1], "Dirichlet") + self.assertEqual(disc.bcs[var]["right"][0], pybamm.Scalar(0)) + self.assertEqual(disc.bcs[var]["right"][1], "Neumann") if __name__ == "__main__": diff --git a/tests/unit/test_spatial_methods/test_finite_volume/test_ghost_nodes_and_neumann.py b/tests/unit/test_spatial_methods/test_finite_volume/test_ghost_nodes_and_neumann.py index 92c93fbb5f..d9f35523f7 100644 --- a/tests/unit/test_spatial_methods/test_finite_volume/test_ghost_nodes_and_neumann.py +++ b/tests/unit/test_spatial_methods/test_finite_volume/test_ghost_nodes_and_neumann.py @@ -20,7 +20,7 @@ def test_add_ghost_nodes(self): whole_cell = ["negative electrode", "separator", "positive electrode"] var = pybamm.Variable("var", domain=whole_cell) disc.set_variable_slices([var]) - discretised_symbol = pybamm.StateVector(*disc.y_slices[var.id]) + discretised_symbol = pybamm.StateVector(*disc.y_slices[var]) bcs = { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(3), "Dirichlet"), @@ -129,10 +129,10 @@ def test_p2d_add_ghost_nodes(self): ) disc.set_variable_slices([c_s_n]) - disc_c_s_n = pybamm.StateVector(*disc.y_slices[c_s_n.id]) + disc_c_s_n = pybamm.StateVector(*disc.y_slices[c_s_n]) disc.set_variable_slices([c_s_p]) - disc_c_s_p = pybamm.StateVector(*disc.y_slices[c_s_p.id]) + disc_c_s_p = pybamm.StateVector(*disc.y_slices[c_s_p]) bcs = { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(3), "Dirichlet"), diff --git a/tests/unit/test_spatial_methods/test_finite_volume/test_grad_div_shapes.py b/tests/unit/test_spatial_methods/test_finite_volume/test_grad_div_shapes.py index d9c6140596..2c83ca0787 100644 --- a/tests/unit/test_spatial_methods/test_finite_volume/test_grad_div_shapes.py +++ b/tests/unit/test_spatial_methods/test_finite_volume/test_grad_div_shapes.py @@ -30,7 +30,7 @@ def test_grad_div_shapes_Dirichlet_bcs(self): var = pybamm.Variable("var", domain=whole_cell) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -48,7 +48,7 @@ def test_grad_div_shapes_Dirichlet_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -89,7 +89,7 @@ def test_cylindrical_grad_div_shapes_Dirichlet_bcs(self): ) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -105,7 +105,7 @@ def test_cylindrical_grad_div_shapes_Dirichlet_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(submesh.edges[0]), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -154,7 +154,7 @@ def test_spherical_grad_div_shapes_Dirichlet_bcs(self): # grad(1) = 0 constant_y = np.ones((total_npts, 1)) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -168,7 +168,7 @@ def test_spherical_grad_div_shapes_Dirichlet_bcs(self): # grad(r) == 1 y_linear = np.tile(submesh.nodes, sec_npts) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -185,7 +185,7 @@ def test_spherical_grad_div_shapes_Dirichlet_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -221,7 +221,7 @@ def test_p2d_spherical_grad_div_shapes_Dirichlet_bcs(self): ) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -239,7 +239,7 @@ def test_p2d_spherical_grad_div_shapes_Dirichlet_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -269,7 +269,7 @@ def test_grad_div_shapes_Neumann_bcs(self): var = pybamm.Variable("var", domain=whole_cell) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -287,7 +287,7 @@ def test_grad_div_shapes_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(1), "Neumann"), } @@ -325,7 +325,7 @@ def test_grad_div_shapes_Dirichlet_and_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -348,7 +348,7 @@ def test_grad_div_shapes_Dirichlet_and_Neumann_bcs(self): # Test gradient and divergence of linear x linear_y = combined_submesh.nodes boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -386,7 +386,7 @@ def test_cylindrical_grad_div_shapes_Neumann_bcs(self): # grad(1) = 0 constant_y = np.ones((npts, 1)) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -400,7 +400,7 @@ def test_cylindrical_grad_div_shapes_Neumann_bcs(self): # grad(r) = 1 y_linear = submesh.nodes boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(1), "Neumann"), } @@ -418,7 +418,7 @@ def test_cylindrical_grad_div_shapes_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(2 * submesh.edges[0]), "Neumann"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -447,7 +447,7 @@ def test_spherical_grad_div_shapes_Neumann_bcs(self): # grad(1) = 0 constant_y = np.ones_like(combined_submesh.nodes[:, np.newaxis]) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -462,7 +462,7 @@ def test_spherical_grad_div_shapes_Neumann_bcs(self): # grad(r) == 1 linear_y = combined_submesh.nodes boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(1), "Neumann"), } @@ -480,7 +480,7 @@ def test_spherical_grad_div_shapes_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -514,7 +514,7 @@ def test_p2d_spherical_grad_div_shapes_Neumann_bcs(self): ) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -532,7 +532,7 @@ def test_p2d_spherical_grad_div_shapes_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -556,7 +556,7 @@ def test_grad_div_shapes_mixed_domain(self): var = pybamm.Variable("var", domain=["negative electrode", "separator"]) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -574,7 +574,7 @@ def test_grad_div_shapes_mixed_domain(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(combined_submesh.edges[-1]), "Dirichlet"), } @@ -615,7 +615,7 @@ def test_grad_1plus1d(self): ) var = pybamm.concatenation(a, b, c) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Vector(np.linspace(0, 1, 15)), "Neumann"), "right": (pybamm.Vector(np.linspace(0, 1, 15)), "Neumann"), } diff --git a/tests/unit/test_spatial_methods/test_finite_volume/test_integration.py b/tests/unit/test_spatial_methods/test_finite_volume/test_integration.py index a8d1866e1a..83988054ca 100644 --- a/tests/unit/test_spatial_methods/test_finite_volume/test_integration.py +++ b/tests/unit/test_spatial_methods/test_finite_volume/test_integration.py @@ -319,7 +319,7 @@ def test_indefinite_integral(self): disc.set_variable_slices([phi]) # i is not a fundamental variable # Set boundary conditions (required for shape but don't matter) disc._bcs = { - phi.id: { + phi: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -356,7 +356,7 @@ def test_indefinite_integral(self): int_grad_phi = pybamm.IndefiniteIntegral(i, x) disc.set_variable_slices([phi]) # i is not a fundamental variable disc._bcs = { - phi.id: { + phi: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -418,7 +418,7 @@ def test_indefinite_integral(self): c_integral = pybamm.IndefiniteIntegral(N, r_n) disc.set_variable_slices([c]) # N is not a fundamental variable disc._bcs = { - c.id: { + c: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -467,7 +467,7 @@ def test_backward_indefinite_integral(self): int_grad_phi = pybamm.BackwardIndefiniteIntegral(i, x) disc.set_variable_slices([phi]) # i is not a fundamental variable disc._bcs = { - phi.id: { + phi: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } diff --git a/tests/unit/test_spatial_methods/test_scikit_finite_element.py b/tests/unit/test_spatial_methods/test_scikit_finite_element.py index b4fad0bef0..a45d2dfeff 100644 --- a/tests/unit/test_spatial_methods/test_scikit_finite_element.py +++ b/tests/unit/test_spatial_methods/test_scikit_finite_element.py @@ -34,7 +34,7 @@ def test_discretise_equations(self): y_test = np.ones(mesh["current collector"].npts) unit_source = pybamm.PrimaryBroadcast(1, "current collector") disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Neumann"), "positive tab": (pybamm.Scalar(0), "Neumann"), } @@ -56,7 +56,7 @@ def test_discretise_equations(self): # Check that equation can be evaluated in each case # Dirichlet disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Dirichlet"), "positive tab": (pybamm.Scalar(1), "Dirichlet"), } @@ -65,7 +65,7 @@ def test_discretise_equations(self): eqn_disc.evaluate(None, y_test) # Neumann disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Neumann"), "positive tab": (pybamm.Scalar(1), "Neumann"), } @@ -74,7 +74,7 @@ def test_discretise_equations(self): eqn_disc.evaluate(None, y_test) # One of each disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Neumann"), "positive tab": (pybamm.Scalar(1), "Dirichlet"), } @@ -83,7 +83,7 @@ def test_discretise_equations(self): eqn_disc.evaluate(None, y_test) # One of each disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Dirichlet"), "positive tab": (pybamm.Scalar(1), "Neumann"), } @@ -94,7 +94,7 @@ def test_discretise_equations(self): # check ValueError raised for non Dirichlet or Neumann BCs eqn = pybamm.laplacian(var) - pybamm.source(unit_source, var) disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Dirichlet"), "positive tab": (pybamm.Scalar(1), "Other BC"), } @@ -102,7 +102,7 @@ def test_discretise_equations(self): with self.assertRaises(ValueError): eqn_disc = disc.process_symbol(eqn) disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Other BC"), "positive tab": (pybamm.Scalar(1), "Neumann"), } @@ -191,7 +191,7 @@ def test_manufactured_solution(self): # set boundary conditions ("negative tab" = bottom of unit square, # "positive tab" = top of unit square, elsewhere normal derivative is zero) disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Dirichlet"), "positive tab": (pybamm.Scalar(0), "Dirichlet"), } @@ -213,7 +213,7 @@ def test_manufactured_solution(self): # set boundary conditions ("negative tab" = bottom of unit square, # "positive tab" = top of unit square, elsewhere normal derivative is zero) disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Dirichlet"), "positive tab": (pybamm.Scalar(0), "Dirichlet"), } @@ -274,7 +274,7 @@ def test_manufactured_solution_cheb_grid(self): # set boundary conditions ("negative tab" = bottom of unit square, # "positive tab" = top of unit square, elsewhere normal derivative is zero) disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Dirichlet"), "positive tab": (pybamm.Scalar(0), "Dirichlet"), } @@ -337,7 +337,7 @@ def test_manufactured_solution_exponential_grid(self): # set boundary conditions ("negative tab" = bottom of unit square, # "positive tab" = top of unit square, elsewhere normal derivative is zero) disc.bcs = { - var.id: { + var: { "negative tab": (pybamm.Scalar(0), "Dirichlet"), "positive tab": (pybamm.Scalar(0), "Dirichlet"), } diff --git a/tests/unit/test_spatial_methods/test_spectral_volume.py b/tests/unit/test_spatial_methods/test_spectral_volume.py index 2cb1a32ce2..88a811533b 100644 --- a/tests/unit/test_spatial_methods/test_spectral_volume.py +++ b/tests/unit/test_spatial_methods/test_spectral_volume.py @@ -97,7 +97,7 @@ def test_exceptions(self): whole_cell = ["negative electrode", "separator", "positive electrode"] var = pybamm.Variable("var", domain=whole_cell) disc.set_variable_slices([var]) - discretised_symbol = pybamm.StateVector(*disc.y_slices[var.id]) + discretised_symbol = pybamm.StateVector(*disc.y_slices[var]) sp_meth.build(mesh) bcs = {"left": (pybamm.Scalar(0), "x"), "right": (pybamm.Scalar(3), "Neumann")} @@ -129,7 +129,7 @@ def test_grad_div_shapes_Dirichlet_bcs(self): var = pybamm.Variable("var", domain=whole_cell) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -147,7 +147,7 @@ def test_grad_div_shapes_Dirichlet_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -194,7 +194,7 @@ def test_spherical_grad_div_shapes_Dirichlet_bcs(self): # grad(1) = 0 constant_y = np.ones((total_npts, 1)) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -211,7 +211,7 @@ def test_spherical_grad_div_shapes_Dirichlet_bcs(self): mesh["negative electrode"].npts * mesh["current collector"].npts, ) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -231,7 +231,7 @@ def test_spherical_grad_div_shapes_Dirichlet_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -270,7 +270,7 @@ def test_p2d_spherical_grad_div_shapes_Dirichlet_bcs(self): ) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -290,7 +290,7 @@ def test_p2d_spherical_grad_div_shapes_Dirichlet_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -320,7 +320,7 @@ def test_grad_div_shapes_Neumann_bcs(self): var = pybamm.Variable("var", domain=whole_cell) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -338,7 +338,7 @@ def test_grad_div_shapes_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(1), "Neumann"), } @@ -376,7 +376,7 @@ def test_grad_div_shapes_Dirichlet_and_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -399,7 +399,7 @@ def test_grad_div_shapes_Dirichlet_and_Neumann_bcs(self): # Test gradient and divergence of linear x linear_y = combined_submesh.nodes boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -435,7 +435,7 @@ def test_spherical_grad_div_shapes_Neumann_bcs(self): # grad(1) = 0 constant_y = np.ones_like(combined_submesh.nodes[:, np.newaxis]) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -450,7 +450,7 @@ def test_spherical_grad_div_shapes_Neumann_bcs(self): # grad(r) == 1 linear_y = combined_submesh.nodes boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Neumann"), "right": (pybamm.Scalar(1), "Neumann"), } @@ -468,7 +468,7 @@ def test_spherical_grad_div_shapes_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -502,7 +502,7 @@ def test_p2d_spherical_grad_div_shapes_Neumann_bcs(self): ) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(0), "Neumann"), } @@ -520,7 +520,7 @@ def test_p2d_spherical_grad_div_shapes_Neumann_bcs(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Neumann"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -545,7 +545,7 @@ def test_grad_div_shapes_mixed_domain(self): var = pybamm.Variable("var", domain=["negative electrode", "separator"]) grad_eqn = pybamm.grad(var) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(1), "Dirichlet"), } @@ -563,7 +563,7 @@ def test_grad_div_shapes_mixed_domain(self): N = pybamm.grad(var) div_eqn = pybamm.div(N) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(0), "Dirichlet"), "right": (pybamm.Scalar(combined_submesh.edges[-1]), "Dirichlet"), } @@ -604,7 +604,7 @@ def test_grad_1plus1d(self): ) var = pybamm.concatenation(a, b, c) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Vector(np.linspace(0, 1, 15)), "Neumann"), "right": (pybamm.Vector(np.linspace(0, 1, 15)), "Neumann"), } diff --git a/tests/unit/test_spatial_methods/test_zero_dimensional_method.py b/tests/unit/test_spatial_methods/test_zero_dimensional_method.py index 2ba6f4d22f..4ba2e71cc6 100644 --- a/tests/unit/test_spatial_methods/test_zero_dimensional_method.py +++ b/tests/unit/test_spatial_methods/test_zero_dimensional_method.py @@ -18,9 +18,7 @@ def test_identity_ops(self): self.assertEqual(a, spatial_method.integral(None, a, "primary")) self.assertEqual(a, spatial_method.indefinite_integral(None, a, "forward")) self.assertEqual(a, spatial_method.boundary_value_or_flux(None, a)) - self.assertEqual( - (-a).id, spatial_method.indefinite_integral(None, a, "backward").id - ) + self.assertEqual((-a), spatial_method.indefinite_integral(None, a, "backward")) mass_matrix = spatial_method.mass_matrix(None, None) self.assertIsInstance(mass_matrix, pybamm.Matrix) From 5915cfe4c2bc57aa80d21fbb2c86a9a5ca4e6fba Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Fri, 11 Mar 2022 09:19:26 -0500 Subject: [PATCH 2/7] flake8 --- CHANGELOG.md | 7 +++++++ .../test_side_reactions/test_composite_side_reactions.py | 1 - tests/unit/test_expression_tree/test_binary_operators.py | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b75419b52d..5c6a0e89c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,14 @@ ## Features +- Added `__eq__` and `__hash__` methods for `Symbol` objects, using `.id` ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) - Added "Discharge energy [W.h]", which is the integral of the power in Watts, as an optional output. Set the option "calculate discharge energy" to "true" to get this output ("false" by default, since it can slow down some of the simple models) ([#1969](https://github.com/pybamm-team/PyBaMM/pull/1969))) - Added an option "calculate heat source for isothermal models" to choose whether or not the heat generation terms are computed when running models with the option `thermal="isothermal"` ([#1958](https://github.com/pybamm-team/PyBaMM/pull/1958)) +## Optimizations + +- Simplified `model.new_copy()` ([#1977](https://github.com/pybamm-team/PyBaMM/pull/1977)) + ## Bug fixes - Fixed a bug in the eSOH variable calculation when OCV is given as data ([#1975](https://github.com/pybamm-team/PyBaMM/pull/1975)) @@ -12,6 +17,8 @@ ## Breaking changes +- Changed some dictionary keys to `Symbol` instead of `Symbol.id` (internal change only, should not affect external facing functions) ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) +- Removed `model.new_empty_copy()` (use `model.new_copy()` instead) ([#1977](https://github.com/pybamm-team/PyBaMM/pull/1977)) - Dropped support for Windows 32-bit architecture ([#1964](https://github.com/pybamm-team/PyBaMM/pull/1964)) # [v22.2](https://github.com/pybamm-team/PyBaMM/tree/v22.2) - 2022-02-28 diff --git a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py index 35f6b393df..a6b7397fa7 100644 --- a/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py +++ b/tests/integration/test_models/test_full_battery_models/test_lead_acid/test_side_reactions/test_composite_side_reactions.py @@ -5,7 +5,6 @@ import tests import unittest -import numpy as np class TestLeadAcidCompositeSideReactions(unittest.TestCase): diff --git a/tests/unit/test_expression_tree/test_binary_operators.py b/tests/unit/test_expression_tree/test_binary_operators.py index 708dca6c78..2625df5da4 100644 --- a/tests/unit/test_expression_tree/test_binary_operators.py +++ b/tests/unit/test_expression_tree/test_binary_operators.py @@ -143,7 +143,7 @@ def test_printing(self): self.assertEqual(str((a * b) / (c + d)), "a * b / (c + d)") self.assertEqual(str(a * (b / (c + d))), "a * b / (c + d)") - def test_equality(self): + def test_eq(self): a = pybamm.Scalar(4) b = pybamm.Scalar(5) bin1 = pybamm.BinaryOperator("test", a, b) From 0a4a48a7b56c840163ca06c29a2251092d641cfd Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 26 May 2022 17:39:57 -0400 Subject: [PATCH 3/7] fix test --- tests/unit/test_models/test_base_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/test_models/test_base_model.py b/tests/unit/test_models/test_base_model.py index 6a1329f7fa..d5a2fe26a6 100644 --- a/tests/unit/test_models/test_base_model.py +++ b/tests/unit/test_models/test_base_model.py @@ -496,7 +496,7 @@ def test_export_casadi(self): model.initial_conditions = {a: q, b: 1} model.variables = {"a+b": a + b - t} - out = model.export_casadi_objects(["a+b"]) + out = model.export_casadi_objects(["a+b"], input_parameter_order=["p", "q"]) # Try making a function from the outputs t, x, z, p = out["t"], out["x"], out["z"], out["inputs"] @@ -575,7 +575,7 @@ def test_generate_casadi(self): model.variables = {"a+b": a + b - t} # Generate C code - model.generate("test.c", ["a+b"]) + model.generate("test.c", ["a+b"], input_parameter_order=["p", "q"]) # Compile subprocess.run(["gcc", "-fPIC", "-shared", "-o", "test.so", "test.c"]) # nosec From e9db85fdc0bf6b5267f6b8049c9c54a51761d865 Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Mon, 30 May 2022 08:39:28 -0400 Subject: [PATCH 4/7] fix julia tests --- pybamm/expression_tree/operations/evaluate_julia.py | 10 ++++------ .../test_operations/test_evaluate_julia.py | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/pybamm/expression_tree/operations/evaluate_julia.py b/pybamm/expression_tree/operations/evaluate_julia.py index 35b9656386..6923e6f3cc 100644 --- a/pybamm/expression_tree/operations/evaluate_julia.py +++ b/pybamm/expression_tree/operations/evaluate_julia.py @@ -861,12 +861,10 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): limits = domain_name_to_limits[tuple(var.domain)] # left bc e.g. (t, 0) or (t, 0, xn) - var_to_ind_vars_left_boundary[ - var.id - ] = f"(t, {limits[0]}{aux_domain_symbols})" + var_to_ind_vars_left_boundary[var] = f"(t, {limits[0]}{aux_domain_symbols})" # right bc e.g. (t, 1) or (t, 1, xn) var_to_ind_vars_right_boundary[ - var.id + var ] = f"(t, {limits[1]}{aux_domain_symbols})" mtk_str = "begin\n" @@ -1020,9 +1018,9 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): ) if side == "left": - limit = var_to_ind_vars_left_boundary[var.id] + limit = var_to_ind_vars_left_boundary[var] elif side == "right": - limit = var_to_ind_vars_right_boundary[var.id] + limit = var_to_ind_vars_right_boundary[var] bc = f"{variable_id_to_print_name[var.id]}{limit}" if typ == "Dirichlet": diff --git a/tests/unit/test_expression_tree/test_operations/test_evaluate_julia.py b/tests/unit/test_expression_tree/test_operations/test_evaluate_julia.py index 7fc92c0f7d..6c148ce3c1 100644 --- a/tests/unit/test_expression_tree/test_operations/test_evaluate_julia.py +++ b/tests/unit/test_expression_tree/test_operations/test_evaluate_julia.py @@ -287,7 +287,7 @@ def test_evaluator_julia_discretised_operators(self): var = pybamm.Variable("var", domain=whole_cell) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(2), "Neumann"), } @@ -332,7 +332,7 @@ def test_evaluator_julia_discretised_microscale(self): div_eqn = pybamm.div(var * grad_eqn) boundary_conditions = { - var.id: { + var: { "left": (pybamm.Scalar(1), "Dirichlet"), "right": (pybamm.Scalar(2), "Neumann"), } From 5fa0d9eafc5c26adfb7f57ad7d5c65be7ff6fe6d Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 1 Jun 2022 09:51:55 -0400 Subject: [PATCH 5/7] remove some ids --- .../operations/evaluate_julia.py | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/pybamm/expression_tree/operations/evaluate_julia.py b/pybamm/expression_tree/operations/evaluate_julia.py index 6923e6f3cc..4c1699f199 100644 --- a/pybamm/expression_tree/operations/evaluate_julia.py +++ b/pybamm/expression_tree/operations/evaluate_julia.py @@ -775,16 +775,16 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): """ # Extract variables variables = {**model.rhs, **model.algebraic}.keys() - variable_id_to_print_name = {} + variable_to_print_name = {} for i, var in enumerate(variables): if var.print_name is not None: print_name = var._raw_print_name else: print_name = f"u{i+1}" - variable_id_to_print_name[var.id] = print_name + variable_to_print_name[var] = print_name if isinstance(var, pybamm.ConcatenationVariable): for child in var.children: - variable_id_to_print_name[child.id] = print_name + variable_to_print_name[child] = print_name # Extract domain and auxiliary domains all_domains = set( @@ -839,7 +839,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): var_to_ind_vars_right_boundary = {} for var in variables: if var.domain in [[], ["current collector"]]: - var_to_ind_vars[var.id] = "(t)" + var_to_ind_vars[var] = "(t)" else: # all independent variables e.g. (t, x) or (t, rn, xn) domain_symbols = ", ".join( @@ -847,7 +847,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): for dom in var.domains.values() if domain_name_to_limits[tuple(dom)] is not None ) - var_to_ind_vars[var.id] = f"(t, {domain_symbols})" + var_to_ind_vars[var] = f"(t, {domain_symbols})" if isinstance(var, pybamm.ConcatenationVariable): for child in var.children: var_to_ind_vars[child.id] = f"(t, {domain_symbols})" @@ -887,13 +887,13 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): # Add a comment with the variable names for var in variables: - mtk_str += f"# '{var.name}' -> {variable_id_to_print_name[var.id]}\n" + mtk_str += f"# '{var.name}' -> {variable_to_print_name[var]}\n" # Makes a line of the form '@variables u1(t) u2(t)' dep_vars = [] mtk_str += "@variables" for var in variables: - mtk_str += f" {variable_id_to_print_name[var.id]}(..)" - dep_var = variable_id_to_print_name[var.id] + var_to_ind_vars[var.id] + mtk_str += f" {variable_to_print_name[var]}(..)" + dep_var = variable_to_print_name[var] + var_to_ind_vars[var] dep_vars.append(dep_var) mtk_str += "\n" @@ -913,7 +913,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): if var in model.rhs: all_eqns_str += ( - f" Dt({variable_id_to_print_name[var.id]}{var_to_ind_vars[var.id]}) " + f" Dt({variable_to_print_name[var]}{var_to_ind_vars[var]}) " + f"~ {eqn_str},\n" ) elif var in model.algebraic: @@ -927,17 +927,17 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): # Replace variables in the julia strings that correspond to pybamm variables with # their julia equivalent - for var_id, julia_id in variable_id_to_print_name.items(): + for var, julia_id in variable_to_print_name.items(): # e.g. boundary_value_right(cache_123456789) gets replaced with u1(t, 1) - cache_var_id = id_to_julia_variable(var_id, "cache") + cache_var_id = id_to_julia_variable(var.id, "cache") if f"boundary_value_right({cache_var_id})" in all_julia_str: all_julia_str = all_julia_str.replace( f"boundary_value_right({cache_var_id})", - julia_id + var_to_ind_vars_right_boundary[var_id], + julia_id + var_to_ind_vars_right_boundary[var], ) # e.g. cache_123456789 gets replaced with u1(t, x) all_julia_str = all_julia_str.replace( - cache_var_id, julia_id + var_to_ind_vars[var_id] + cache_var_id, julia_id + var_to_ind_vars[var] ) # Replace independent variables (domain names) in julia strings with the @@ -987,9 +987,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): ) if not is_pde: - all_ic_bc_str += ( - f" {variable_id_to_print_name[var.id]}(t) => {eqn_str},\n" - ) + all_ic_bc_str += f" {variable_to_print_name[var]}(t) => {eqn_str},\n" else: if var.domain == []: doms = "" @@ -997,7 +995,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): doms = ", " + domain_name_to_symbol[tuple(var.domain)] all_ic_bc_str += ( - f" {variable_id_to_print_name[var.id]}(0{doms}) ~ {eqn_str},\n" + f" {variable_to_print_name[var]}(0{doms}) ~ {eqn_str},\n" ) # Boundary conditions if is_pde: @@ -1022,7 +1020,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): elif side == "right": limit = var_to_ind_vars_right_boundary[var] - bc = f"{variable_id_to_print_name[var.id]}{limit}" + bc = f"{variable_to_print_name[var]}{limit}" if typ == "Dirichlet": bc = bc elif typ == "Neumann": @@ -1031,17 +1029,17 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): # Replace variables in the julia strings that correspond to pybamm variables with # their julia equivalent - for var_id, julia_id in variable_id_to_print_name.items(): + for var, julia_id in variable_to_print_name.items(): # e.g. boundary_value_right(cache_123456789) gets replaced with u1(t, 1) - cache_var_id = id_to_julia_variable(var_id, "cache") + cache_var_id = id_to_julia_variable(var.id, "cache") if f"boundary_value_right({cache_var_id})" in all_ic_bc_julia_str: all_ic_bc_julia_str = all_ic_bc_julia_str.replace( f"boundary_value_right({cache_var_id})", - julia_id + var_to_ind_vars_right_boundary[var_id], + julia_id + var_to_ind_vars_right_boundary[var], ) # e.g. cache_123456789 gets replaced with u1(t, x) all_ic_bc_julia_str = all_ic_bc_julia_str.replace( - cache_var_id, julia_id + var_to_ind_vars[var_id] + cache_var_id, julia_id + var_to_ind_vars[var] ) #################################################################################### From 18bc2834434839358b78e9f93411ecae5e4b9f7b Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Wed, 1 Jun 2022 09:52:57 -0400 Subject: [PATCH 6/7] remove some ids --- pybamm/expression_tree/operations/evaluate_julia.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pybamm/expression_tree/operations/evaluate_julia.py b/pybamm/expression_tree/operations/evaluate_julia.py index 4c1699f199..e077d7cdb9 100644 --- a/pybamm/expression_tree/operations/evaluate_julia.py +++ b/pybamm/expression_tree/operations/evaluate_julia.py @@ -850,7 +850,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): var_to_ind_vars[var] = f"(t, {domain_symbols})" if isinstance(var, pybamm.ConcatenationVariable): for child in var.children: - var_to_ind_vars[child.id] = f"(t, {domain_symbols})" + var_to_ind_vars[child] = f"(t, {domain_symbols})" aux_domain_symbols = ", ".join( domain_name_to_symbol[tuple(dom)] for level, dom in var.domains.items() @@ -994,9 +994,7 @@ def get_julia_mtk_model(model, geometry=None, tspan=None): else: doms = ", " + domain_name_to_symbol[tuple(var.domain)] - all_ic_bc_str += ( - f" {variable_to_print_name[var]}(0{doms}) ~ {eqn_str},\n" - ) + all_ic_bc_str += f" {variable_to_print_name[var]}(0{doms}) ~ {eqn_str},\n" # Boundary conditions if is_pde: all_ic_bc_str += " # boundary conditions\n" From f1954eff5246524103d4509cedd948a652d088ea Mon Sep 17 00:00:00 2001 From: Valentin Sulzer Date: Thu, 2 Jun 2022 11:59:41 -0400 Subject: [PATCH 7/7] update changelog --- CHANGELOG.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 693a80f38d..b979c769a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,10 @@ # [Unreleased](https://github.com/pybamm-team/PyBaMM/) +## Features + +- Added `__eq__` and `__hash__` methods for `Symbol` objects, using `.id` ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) +## Breaking changes + +- Changed some dictionary keys to `Symbol` instead of `Symbol.id` (internal change only, should not affect external facing functions) ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) # [v22.5](https://github.com/pybamm-team/PyBaMM/tree/v22.5) - 2022-05-31 @@ -29,7 +35,6 @@ ## Features -- Added `__eq__` and `__hash__` methods for `Symbol` objects, using `.id` ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) - Added "Discharge energy [W.h]", which is the integral of the power in Watts, as an optional output. Set the option "calculate discharge energy" to "true" to get this output ("false" by default, since it can slow down some of the simple models) ([#1969](https://github.com/pybamm-team/PyBaMM/pull/1969))) - Added an option "calculate heat source for isothermal models" to choose whether or not the heat generation terms are computed when running models with the option `thermal="isothermal"` ([#1958](https://github.com/pybamm-team/PyBaMM/pull/1958)) @@ -45,7 +50,6 @@ ## Breaking changes -- Changed some dictionary keys to `Symbol` instead of `Symbol.id` (internal change only, should not affect external facing functions) ([#1978](https://github.com/pybamm-team/PyBaMM/pull/1978)) - Removed `model.new_empty_copy()` (use `model.new_copy()` instead) ([#1977](https://github.com/pybamm-team/PyBaMM/pull/1977)) - Dropped support for Windows 32-bit architecture ([#1964](https://github.com/pybamm-team/PyBaMM/pull/1964))