GitHub_collection_pykan/tutorials/physics_2B_conservation_law_2D.ipynb
2024-08-11 13:15:40 -04:00

489 lines
90 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "134e7f9d",
"metadata": {},
"source": [
"# Physics 2B: Conservation Laws"
]
},
{
"cell_type": "code",
"execution_count": 109,
"id": "fd0d2987",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"checkpoint directory created: ./model\n",
"saving model version 0.0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"| cq_loss: 1.57e-03 | reg_loss: 1.01e+01 |: 100%|███████████████████| 50/50 [00:30<00:00, 1.63it/s]\n"
]
}
],
"source": [
"from kan import *\n",
"from kan.utils import batch_jacobian, create_dataset_from_data\n",
"import numpy as np\n",
"\n",
"torch.use_deterministic_algorithms(True)\n",
"\n",
"\n",
"#model = KAN(width=[4,[0,2],1], seed=0, base_fun='identity')\n",
"#model = KAN(width=[4,[0,2],1], seed=2, base_fun='identity')\n",
"model = KAN(width=[4,[0,2],1], seed=12, base_fun='identity')\n",
"\n",
"# the model learns the Hamiltonian H = 1/2 * (x**2 + p**2)\n",
"x = torch.rand(1000,4) * 2 - 1\n",
"flow = torch.cat([x[:,[1]], -x[:,[0]], x[:,[3]], -x[:,[2]]], dim=1)\n",
"flow = flow/torch.linalg.norm(flow, dim=1, keepdim=True)\n",
"\n",
"loss_fn = lambda v1, v2: torch.mean(torch.sum(v1 * v2, dim=1)**2)\n",
"\n",
"\n",
"def get_grad_normalized(model, x):\n",
" grad = batch_jacobian(model, x, create_graph=True)\n",
" grad_normalized = grad/torch.linalg.norm(grad, dim=1, keepdim=True)\n",
" return grad_normalized\n",
"\n",
"def closure():\n",
" \n",
" global cq_loss, reg_loss\n",
" optimizer.zero_grad()\n",
"\n",
" grads = []\n",
" grad = get_grad_normalized(model, x)\n",
" cq_loss = loss_fn(grad, flow)\n",
" reg_loss = model.reg(lamb_l1=1., entropy_offset=1e-4, lamb_coef=1.)\n",
" \n",
" lamb = 1e-2\n",
" objective = cq_loss + lamb * reg_loss\n",
" objective.backward()\n",
" return objective\n",
"\n",
"steps = 50\n",
"log = 1\n",
"optimizer = LBFGS(model.parameters(), lr=1, history_size=10, line_search_fn=\"strong_wolfe\", tolerance_grad=1e-32, tolerance_change=1e-32, tolerance_ys=1e-32)\n",
"#optimizer = torch.optim.Adam(params, lr=1e-2)\n",
"pbar = tqdm(range(steps), desc='description', ncols=100)\n",
"\n",
"\n",
"for _ in pbar:\n",
" \n",
" # update grid\n",
" if _ < 5 and _ % 20 == 0:\n",
" model.update_grid_from_samples(x)\n",
" \n",
" optimizer.step(closure)\n",
" \n",
" if _ % log == 0:\n",
" pbar.set_description(\"| cq_loss: %.2e | reg_loss: %.2e |\" % (cq_loss.cpu().detach().numpy(), reg_loss.cpu().detach().numpy()))\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 110,
"id": "422b17b0",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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WL9+PUVHR1OTJk3op59+qvB7V/uAyc/VPiguLqaxY8cSABowYIDPFZz0NRaLhd58801SqVR03333OSyAWVvPg4ALLlarlVatWkVNmjShevXq0fDhw2nlypX0ww8/0Pfff0+LFy+mAQMGUHR0NPXu3ZuOHDlCN27coMcff5wA0Lhx43y64KSvuXDhAvXs2bPMXh3u9AGTlzt9cOjQIWrbti3pdDr6+OOPecrTBT/99BM1adKEoqOjaf369UTkXh8EkoAKLjabjRYuXEhhYWH0pz/9iX777TeyWq20c+dOyszMpMzMTDp27BiZzWb68ccf6Z577qEmTZpQbGws1a1blzZu3Kj0W/BL5XcZfPfdd13qg6SkJJ/cmsBfuXMexMbGUlBQELVv3z7gvuS85datW5SWlmYvgDl37txafR4EVHDZtm0bRUdHU1paGt26dct+5fX6668TAAJgv/lRFEU6f/48devWjaKioviEksGOHTsoLi6OANCTTz7pdB90796dUlJSOPNGJu6eBw0bNuSbZWtIFEVasmQJBQcHk0qlqtXngUqZlR75GY1GvPPOO4iLi8PcuXMRHR1d5UK8IAho0qQJFi5ciJCQEHz//fdebG1g6tixI+644w7ccccdyMjIcLoP5s+fj5MnT2L16tVebG1gqsl5YLPZsH79ei+2NvAIgoChQ4eiY8eOaNmyZa0+DwImuOzfvx+//PILxo0bh8aNGzuV4SUIAu666y4MHDgQy5cvh8Fg8EJLA9f+/fuxb98+jB8/nvtAIXweKG///v04dOhQrT8PNEo3QC4//PADQkJC0LdvXxw7dgxWq9X+u2vXrtn/94ULF3Do0CH7/4+Ojsbjjz+O1atX49y5c2jbtq1X2x1IuA+Ux32gPO6DPyg9LyeXYcOG0R133EEnT56kpk2bklartf9oNBr7PGdQUFCZ340aNYrOnj1L9erVo2+++Ubpt+HXuA+Ux32gPO6D2wJi5EJEMJlMCAkJgVqthslkgslkcvhYi8UCi8Vi//9msxnBwcFQqVQ4e/YsbDZblTdCMcfk6APpecw93AfK4z74n4AILoIgoF69etizZw9sNht69eqF/Px8++9PnTqFM2fOAADat2+PRo0a2X935513Ij8/H3q9HpMmTcK0adPQunVrJCcno23btvb/Ojt3WlvJ0QfFxcXYtGkToqKi0KVL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\n",
"text/plain": [
"<Figure size 500x400 with 26 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#model = KAN(width=[4,[0,2],1], seed=12, base_fun='identity')\n",
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 111,
"id": "b5e053b1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n",
"fixing (0,0,0) with 0\n",
"fixing (0,0,1) with 0\n",
"fixing (0,0,2) with 0\n",
"fixing (0,0,3) with 0\n",
"fixing (0,1,0) with 0\n",
"fixing (0,1,1) with 0\n",
"fixing (0,1,2) with 0\n",
"fixing (0,1,3) with 0\n",
"fixing (0,2,0) with 0\n",
"fixing (0,2,1) with 0\n",
"fixing (0,2,2) with x, r2=0.9983036518096924, c=1\n",
"fixing (0,2,3) with x, r2=0.9988861680030823, c=1\n",
"fixing (0,3,0) with x, r2=0.9961345195770264, c=1\n",
"fixing (0,3,1) with x, r2=0.9859936237335205, c=1\n",
"fixing (0,3,2) with 0\n",
"fixing (0,3,3) with 0\n",
"fixing (1,0,0) with x, r2=0.9999908804893494, c=1\n",
"fixing (1,1,0) with x, r2=0.9999944567680359, c=1\n",
"saving model version 0.2\n"
]
}
],
"source": [
"model = model.prune(edge_th=5e-2)\n",
"model.auto_symbolic()"
]
},
{
"cell_type": "code",
"execution_count": 112,
"id": "3b393f2d",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle - 0.011 x_{3}^{2} - 0.01 x_{4}^{2} + 0.001 x_{4} + 0.002$"
],
"text/plain": [
"-0.011*x_3**2 - 0.01*x_4**2 + 0.001*x_4 + 0.002"
]
},
"execution_count": 112,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from kan.utils import ex_round\n",
"from sympy import *\n",
"ex_round(expand(ex_round(model.symbolic_formula()[0][0],5)),3)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a76db806",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 83,
"id": "920cbdee",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 500x400 with 26 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#model = KAN(width=[4,[0,2],1], seed=0, base_fun='identity')\n",
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "6ee10d58",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n",
"fixing (0,0,0) with x, r2=0.9965425133705139, c=1\n",
"fixing (0,0,1) with x, r2=0.9997711181640625, c=1\n",
"fixing (0,0,2) with 0\n",
"fixing (0,0,3) with 0\n",
"fixing (0,1,0) with 0\n",
"fixing (0,1,1) with 0\n",
"fixing (0,1,2) with x, r2=0.9999427199363708, c=1\n",
"fixing (0,1,3) with x, r2=0.9986546635627747, c=1\n",
"fixing (0,2,0) with 0\n",
"fixing (0,2,1) with 0\n",
"fixing (0,2,2) with 0\n",
"fixing (0,2,3) with 0\n",
"fixing (0,3,0) with 0\n",
"fixing (0,3,1) with 0\n",
"fixing (0,3,2) with 0\n",
"fixing (0,3,3) with 0\n",
"fixing (1,0,0) with exp, r2=1.000000238418579, c=2\n",
"fixing (1,1,0) with x, r2=0.999911904335022, c=1\n",
"saving model version 0.2\n"
]
}
],
"source": [
"model = model.prune(edge_th=5e-2)\n",
"model.auto_symbolic()"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "23139eb0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.3\n",
"Best value at boundary.\n",
"r2 is 0.9992757439613342\n",
"saving model version 0.4\n"
]
},
{
"data": {
"text/plain": [
"tensor(0.9993)"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.unfix_symbolic(1,0,0)\n",
"model.fix_symbolic(1,0,0,'x')"
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "bb4199a4",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle - 0.011 x_{1}^{2} - 0.01 x_{2}^{2} - 0.006$"
],
"text/plain": [
"-0.011*x_1**2 - 0.01*x_2**2 - 0.006"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from kan.utils import ex_round\n",
"from sympy import *\n",
"ex_round(expand(ex_round(model.symbolic_formula()[0][0],5)),3)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ee925d8f",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "ed645f9f",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 71,
"id": "0c814b27",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAFICAYAAACcDrP3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABBg0lEQVR4nO3deVxU5f4H8M8Z9kVkExTEBVQUNUVFEXBBQS2ra664XbG4Lqiot7JcUq+a3soUXFO77iaaZt0wFwZNE0xULHcE1xDEBUF2hpnv7w8v8xNFFJjhnJn5vl8vXq9yGM535pmHD+d5nvMcgYgIjDHGmAbJxC6AMcaY/uFwYYwxpnEcLowxxjSOw4UxxpjGcbgwxhjTOA4XxhhjGsfhwhhjTOM4XBhjjGkchwtjjDGN43BhjDGmcRwujDHGNI7DhTHGmMZxuDDGGNM4DhfGGGMax+HCGGNM44zFLoAxXUBEePToEfLy8mBtbQ0HBwcIgiB2WYxJFp+5MFaJ7OxsREVFoXnz5qhXrx6aNm2KevXqoXnz5oiKikJ2drbYJTImSQLfiZKxih06dAiDBg1CQUEBgKdnL2XKzlosLS2xd+9e9O3bV5QaGZMqDhfGKnDo0CH0798fRASVSvXS75PJZBAEAfv37+eAYewZHC6MPSc7OxsNGzZEYWFhpcFSRiaTwcLCAmlpabC1tdV+gYzpAJ5zYew5W7ZsQUFBwWsFCwCoVCoUFBRg69atWq6MMd3BZy6MPYOI0Lx5c9y4cQNV6RqCIMDd3R0pKSm8iowxcLgwVs7Dhw9Rr169Gj3fwcFBgxUxppt4WIyxZ+Tl5dXo+bm5uRqqhDHdxuHC2DOsra1r9Pw6depoqBLGdBuHC2PPcHBwgIeHR5XnTQRBgIeHB+zt7bVUGWO6hcOFsWcIgoApU6ZU67kRERE8mc/Y//CEPmPP4etcGKs5PnNh7Dm2trbYu3cvBEGATFZ5Fym7Qv+HH37gYGHsGRwujFWgb9++2L9/PywsLCAIwgvDXWX/ZmFhgV9++QV9+vQRqVLGpInDhbGX6Nu3L9LS0hAZGQl3d/dyj7m7uyMyMhJ3797lYGGsAjznwthrICIcPXoUvXv3RlxcHAIDA3nynrFK8JkLY69BEAT1nIqtrS0HC2OvwOHCGGNM4zhcGGOMaRyHC2OMMY3jcGGMMaZxHC6MMcY0jsOFMcaYxnG4MMYY0zgOF8YYYxrH4cIYY0zjOFwYY4xpHIcLY4wxjeNwYYwxpnEcLowxxjSOw4UxxpjGcbgwxhjTOA4XxhhjGsfhwtgrKBQK3L17F1euXAEAXL9+HVlZWVCpVCJXxph08W2OGXuJ7Oxs7N27Fzt27MClS5eQm5uLkpISmJubo169eujWrRs++OAD+Pv7w9jYWOxyGZMUDhfGKnDy5ElMnz4d58+fh4+PD/r374833ngD1tbWyM7OxtmzZ/Hzzz8jNTUVw4YNw6JFi1CvXj2xy2ZMMjhcGHvO4cOHERoaCmtrayxZsgRvvfUWSkpKEB0djeLiYtjY2CAkJAQKhQLR0dGYP38+WrdujW3btsHZ2Vns8hmTBA4Xxp5x7do19OvXD1ZWVoiOjoaXlxcEQcCNGzfQoUMH5OTkoGnTpjh79izs7OxARDhx4gRGjBiBnj174ttvv4WZmZnYL4Mx0fGEPmP/o1QqsXjxYjx+/BirVq1SB0tlBEFAQEAAvvzyS/z00084ePBgLVXLmLRxuDD2P6mpqfj5558xcOBABAQEvDJYygiCgAEDBsDX1xcbNmxAaWmplitlTPp4iQtj/5OQkIC8vDwMGjQIt27dQn5+vvqxtLQ0KJVKAEBJSQkuXboEGxsb9eMuLi4YOHAg5s+fj3v37qFhw4a1Xj9jUsLhwtj/XL16FZaWlnB3d8f48eMRHx+vfoyIUFxcDABIT09HcHCw+jFBEPD111+jbdu2KCgoQHp6OocLM3gcLoz9T2FhIYyNjWFmZobi4mIUFRVV+H1E9MJjpaWlsLCwKBdCjBkyDhfG/sfJyQmFhYXIzs5Gly5dYGVlpX6ssLAQCQkJ6hDx8/NTXzgpCAIaNWqE+/fvQyaTwc7OTqyXwJhkcLgw9j/NmzdHcXExEhMT8cUXX5R77MaNG/Dx8UFOTg6cnZ2xa9cu2Nraqh8XBAGzZs1C/fr1eUiMMfBqMcZw/fp1TJs2DeHh4SAibN68Gfn5+TAyMir3VUYQBMhkMvW/y2QyZGRkYPfu3Xjy5Al++eUXKBQKEV8RY+LjcGEGiYjw+++/Y/jw4Wjfvj1++uknzJgxA4sXL8a5c+ewYsWK115SXFxcjIULF+LJkyfw8vJCWFgYvLy8sHz5cjx58kTLr4QxiSLGDEhpaSnt27ePevbsSVZWVtShQwfavHkzFRYWEhFRXl4eDR06lKytrenrr7+mgoICUqlUdP36dXJwcCBjY2Nq1qwZZWVlkUqlopycHJoxYwbVrVuXNm7cSEREly5dovHjx1PdunXJycmJZsyYQbdv3xbzZTNW6zhcmEHIy8ujtWvXUuvWrcnKyorefPNNOnDgACmVyhe+9/79+zRkyBCysLCgAQMG0LFjx+j+/fv022+/0bFjx+jkyZP04MED2r9/PwUGBpKdnR2tXLmSSktLy/2cjIwMmjdvHjVo0ICsra1pzJgxlJSUVFsvmTFR8d5iTK/du3cP33zzDb799lvk5uZi4MCBiIiIgLe3d6XPy8/Px4YNG7BixQpkZmbC3d0dzZs3R506dfD48WMkJycjPT0dHTt2xLx589CjRw/IZBWPMufn52Pbtm1YsWIFbt26he7du2Pq1Kno27fvS5/DmK7jcGF66fLly1ixYgV27doFMzMzjB07FuHh4XBzc6vSz7l37x7i4uJw7Ngx3LhxA0VFRbCzs0ObNm3Qp08fdOnSBZaWlq/1s5RKJf773/8iMjISp0+fhqenJ6ZOnYqQkBCYm5tX52UyJlkcLkxvEBF+/fVXREVFQS6Xw8XFBZMmTcLYsWPLbdVSXUqlEkQEmUxWozMO+t9igqioKPz8889wdHTEhAkTMG7cODg4ONS4TsakgMOF6TyFQoG9e/ciKioKFy5cwBtvvIGpU6di4MCBMDExEbu8SqWmpmLlypXYvn07AGDUqFGYMmUKmjVrJnJljNUMhwvTWU+ePMHGjRuxZs0apKeno0+fPoiIiECPHj1ee0djqXj06BHWr1+Pb775Bg8fPsTbb7+NadOmwdfXV+deC2MAhwvTQXfu3MGaNWuwadMmKBQKhISEYMqUKWjVqpXYpdVYUVERoqOjERUVheTkZHTu3BlTp07Fu+++W+5CTsakjsOF6YykpCSsWLEC+/btQ506dTBu3DiMHz9eL28trFKpcPjwYURGRuL48eNo2rQpJk+ejNGjR8Pa2lrs8hh7JQ4XJmkqlQqHDh1CVFQUTpw4of4lO2rUqHIbS+qzc+fOISoqCnv37lWH6oQJE1C/fn2xS2PspThcmCQVFRVh586dWLlyJa5du6YeHnr77bcNdnjor7/+wurVq7Fx40aUlJQgJCQEERER8PLyErs0xl7A4cIkpWxie/369Xj48CHeeecdTJ06FV26dBG7NMnIycnBxo0bsXr1avWNy6ZOnYrAwECe/GeSweHCJCE1NRWrVq3Cjh07ADxdkjt58mR4eHiIXJl0lZSUqJdgnz9/Hm3btsW0adMwePBgyS/BZvqPw4WJhohw6tQpREVFISYmRn0xYVhYGF9MWAVlF49GRkYiNjZWffHoBx98oJGLRxmrDg4XVuuUSiV+/vlnREVFqbdBiYiIwLBhw3gblBoq2/YmOjoaZmZmCA0NxaRJk9CoUSOxS2MGhsOF1ZqyDRxXrVql3sAxIiICffr04Q0cNaxsw87169cjNzcXgwYNwtSpU1+5YSdjmsLhwrTu+Z2JBw0ahIiICLRv317s0vQe78jMxMLhwrRGUzsTs5orG4qMjIxEYmIi78jMtI7DhWmUtncmZjX3+++/IzIykndkZlrF4cI0omxZ7IoVK3RuZ2JDxTsyM23icGE1UnZB39q1a3V+Z2JDxTsyM23gcGHVos87Exuq53dk9vHxwbRp03hHZlYtHC6sSgxpZ2JDxTsyM03gcGGvxDsTGy7ekZlVF4cLeynemZiVKduRedOmTSguLuYdmdkrcbiwF/DOxOxlym4tvWrVKt6RmVWKw4Wp8c7E7HXxjszsVThcDBwR4ffff8eKFSt4Z2JWZbwjM3sZDhcDVVpaip9//hkrVqzgnYmZRjy7I7OpqSnGjh3LOzIbMA4XA8M7EzNte35H5oEDB2LatGm8I7OB4XAxELwzMattvCOzYeNw0XO8MzETG+/IbJg4XPTQ8zsTu7q6Ijw8nHcmZqLjHZkNB4eLHuGdiZmuKFv2vm3bNgC8I7M+4nDRA7wzMdNVvCOz/uJw0WG8MzHTF7wjs/7hcNFBvDMx01fP78jcpEkTTJkyhXdk1kEcLjqCdyZmhub5HZn/8Y9/YOLEibwjs47gcNEBRITAwECcOXOGdyZmBuf5HZm3bduGd955R+yy2CtwuEiIm5sbgoODsWTJkhcmMxUKBWQyWaWB4uTkpO0SGdM6V1dXJCUlVfhYaWkpjI2NK3wsNTUVu3btwooVK7RZHntNHC4S4ujoiC+++ALnz5/H8uXL+SpmZpDs7e2RlZVVpedcu3YN4eHh2LVrF18zIxH820ti3n//ffj4+GDKlClQqVRil8OY5HGwSBOHi8QIgoCRI0ciICAAkyZN4oBhrBIcLNLF4SJBgiAgJCQEAQEBmDp1KnjkkrEXcbBIG4eLRAmCgBEjRqBDhw748MMPOWAYewYHi/RxuEiYIAgIDQ2Fp6cnZs2axQHDGIDk5GSEh4dj9+7dHCwSxuEicYIgYNy4cWjQoAEWLFjAAcMMWnJyMiZNmoTdu3fD3t5e7HJYJThcdIAgCJgyZQrMzc3xxRdfcMAwg8TBols4XHSEIAiYMWMGFAoFIiMjOWCYQeFg0T0cLjpEEATMmTMHWVlZWLVqFQcMMwgcLLqJw0XHCIKABQsWICMjA6tXr+aAYXqNg0V3cbjoIEEQ8PnnnyMzM5OHyJje4mDRbRwuOqrsDCYvLw+LFy/mgGF6hYNF9/HGlRLi6OiIzMzMKj8vMjISKpUKH3/8sRaqYqx22dvbo3379ti1a1e1goVvRSENFe9dzUQxadIkXLhwocrP6927N+7cuaOFihirfZMnT0ZgYCDS0tKQlpZW5ed7e3troSpWVXzmIiGVNQURQaVSQSaTvXCvlzIv+3fGdMmr+gERQRAE7gcSx3MuElLWYSr6On/+PGxtbXH+/PmXfg9j+uBV/aBOnTrcD3QAhwtjjDGN43BhjDGmcRwujDHGNI7DhTHGmMZxuDDGGNM4DhfGGGMax+HCGGNM4zhcGGOMaRyHC2OMMY3jcGGMMaZxHC6MMcY0jsOFMcaYxnG4MMYY0zgOF8YYYxrH4cIYY0zjOFwYY4xpHIcLY4wxjeNwYYwxpnEcLowxxjSOw4UxxpjGcbgwxhjTOA4XxhhjGsfhwhhjTOM4XBhjjGkchwtjjDGN43BhjDGmcRwujDHGNI7DhTHGmMZxuDDGGNM4DhfGGGMax+HCGGNM4zhcGGOMaRyHC2OMMY3jcJE4lUqFrKws3L59GyqVCunp6cjPzxe7LMZqFfcD3SMQEYldBHtRUVERjhw5gq1bt+L06dO4f/8+8vLyYGtriyZNmqBPnz4YM2YMWrVqBUEQxC6XMa3gfqC7OFwk6MaNG5gxYwb2798PFxcXBAYGwtvbGzY2Nnj06BHOnDmDo0ePQqFQ4J///CciIiJgaWkpdtmMaRT3Ax1HTFIuXbpEb7zxBtnZ2dGCBQsoIyODlEolqVQqIiJSqVSkVCrp5s2bFBERQXXq1KHx48dTfn6+yJUzpjncD3Sfsdjhxv7fo0ePMG7cOKSnp2PTpk3w8fFBWloanJ2dy53yl5SU4PTp0/jss8/g5eWFGTNmwMXFBXPmzIFMxtNoTLdxP9ATYqcb+38LFy4kMzMzWrduHaWlpVFwcDC5uLjQoUOHSKVSkUqlosLCQpo5cyaZmZnR6NGj6eHDhzR79mxycHCgs2fPiv0SGKsx7gf6gcNFIjIzM8nd3Z169uxJ2dnZFBoaSgAIADVo0IAOHTpEBQUFNHPmTDIxMSEAZGRkRKtWraLMzExq1aoVTZgwQT1swJgu4n6gPzhcJCImJoZMTEzo22+/JZVKRb///jt5eHiU61ghISHqDiUIAg0bNowePXpEKpWKZs+eTc2aNaOsrCyxXwpj1cb9QH/wwKREnDt3DqampvDx8YEgCOjcuTN27NgBd3d3AEBGRgaio6OhUCggCAKGDBmCNWvWwM7ODoIgwN/fH/fv38fdu3dFfiWMVR/3A/3B4SIR9+/fh7m5Oezt7QFA3bE2bdoEW1vbct/bvXt3rF27Vt2hAMDJyQkqlQrZ2dm1XDljmsP9QH9wuEiEmZkZVCoVFAoFAICIUFxcjIMHDyIvL6/c9yYnJ+PMmTPl/q2kpAREBBMTk1qrmTFN436gPzhcJMLDwwP5+fm4deuWukMtWLAAS5cuRWlpKQRBUF8gdu/ePYSGhiI2Nhb0dN4M165dg7m5OZydnUV+JYxVH/cD/cHhIhFdunSBqakpDhw4AIVCgUWLFmHp0qXlxpb37dtXbuw5NDQUcXFxKC0tRUxMDLy8vNCgQQORXwlj1cf9QH9wuEiEl5cXunbtip07dyI1NRWFhYUgInWHWrt2LYKDg/Hdd9/Bw8MDAPD48WMkJycjMTERcrkcw4cPh5mZmcivhLHq436gR8RZpMaeV1JSQsOGDSMA9N5771F6ejpNnz6dRowYoV5mSfR024tTp05R69at6csvv6Rbt26Rr68vNW3alJdfMp2XmZlJnTt3rnY/aNWqFfcDieBwkYDU1FTy8fEhIyMjCg4OJlNTUwoJCaHU1FTKy8t74YIwlUpFd+/epQsXLlCvXr3I1NSUANCYMWPoyZMnIr0Kxmrm0KFD5OzsTI6OjjRq1Kgq9wMjIyMyMjKir7/+mpRKpUivgpXhcBHZ1q1bydramjw8PCgxMZGKiopo/vz5ZG5uTp6enrRixQpKSUmh3NxcKioqoidPntDFixdp0aJF1LBhQ2rQoAHFxsbSli1byNrampo1a0anT58W+2Ux9tqKi4vpo48+IgDUp08fysjIqFY/+OWXX+jDDz8kANSvXz+6d++e2C/NoHG4iCQnJ4dGjhxJAOjvf/97uTOO0tJSiomJIV9fXzI1NSU7Oztq3bo1de7cmTw9PcnGxoYsLS1p1KhRlJKSon5eSkoKderUiYyNjenLL7/kv96Y5CUnJ1OHDh3IxMSEli5dWu4zW91+cPDgQXJ2diYnJyc6cOCAGC+LERHfz0UEp06dwogRI/DgwQN88803GDFiRIXfV1BQgDNnzuD48eO4dOkScnNz4eTkhM6dOyMwMBDNmjWDkZFRueeUlJTgs88+w5dffong4GBs2bKFV84wySEibNmyBZMnT4aLiwt27tyJjh07Vvi91ekHmZmZGDt2LA4cOIDp06djyZIlPMlf20QON4NSWlpKixcvJmNjY+rSpQtdv369Ss+vymZ8sbGxVL9+fXJ0dKSYmJiqlsqY1jx+/JhCQkIIAI0dO5Zyc3Or9PzX7QdKpZKWL19Opqam5O3tTVevXq1OuayaOFxqSVpaGgUGBpIgCDRr1iwqKSnR+jHv379P/fv3JwA0ZcoUKiws1PoxGatMfHw8NW7cmGxsbCg6OrpWjpmUlESenp5kaWmp3hCTaR+HSy348ccfyd7enlxdXenIkSO1emyVSkUrVqwgMzMzeuONN+jy5cu1enzGiJ6etS9YsICMjIzIz8+Pbt68WavHz8vLo7CwMAJAQ4YMocePH9fq8Q0Rh4sWFRQUUHh4OAGgv/3tb/Tw4UPRavnzzz+pVatWZGFhQevWreO/3lituXPnDvXo0YNkMhnNnTuXFAqFaLV8//33ZGtrS40aNaITJ06IVoch4HDRkgsXLlCbNm3I3Nyc1qxZI4lf5vn5+TR+/HgCQAMHDqRHjx6JXRLTc3v37iU7Oztq2LAhHTt2TOxyiIjo9u3bFBAQQDKZjObPny9q2OkzDhcNU6lUtGrVKjIzM6M2bdrQhQsXxC7pBc92+F9//VXscpgeys/Pp3Hjxkn2DxmFQkHz588nmUxGAQEBdPv2bbFL0jscLhr04MEDevfddwkATZo0iQoKCsQu6aWeHar47LPP+K83pjF//PGHegh2/fr1kjhrf5nffvuNGjVqRLa2tvT999+LXY5e4XDRkLi4OHJxcSEHBwf66aefxC7ntZSWltLChQvJyMiIunbtWuuTrEy/qFQqioqKIjMzM2rXrp3OLB7JysqiIUOGEAAKCwujvLw8sUvSCxwuNVRSUkKffvopCYJAvXr1orS0NLFLqrKEhARq0qQJ2djY0M6dO8Uuh+mgZ5e9R0RE6Nyyd5VKRd9++y1ZWlqSp6cnJSUliV2SzuNwqYHU1FTq3LkzGRsb05IlS6i0tFTskqotOztbfWFbaGholS9sY4br8OHDVL9+fapXr57OX7B75coVat++PZmamtLy5cslPaQndRwu1bRt2zaqU6cOubu706lTp8QuRyNUKhVt3ryZrKysqHnz5nTmzBmxS2ISVlxcTB9//DEBoODgYEpPTxe7JI0oKiqi6dOnEwB68803eQPMauJwqaKcnBwaNWoUAaBRo0ZRTk6O2CVpXHJyMnXs2JFMTEzoq6++4g0w2QuuXbtGnTp10uvPyIEDB8jJyYmcnZ3p4MGDYpejczhcquDUqVPk7u5OderUoW3btoldjlY9+1dp2TbojD1/dqvvt3e4d+8e9e3blwDQP//5TyoqKhK7JJ3B4fIalEolLVmyhIyNjalz586Umpoqdkm15tnx9P3794tdDhNRdnY2DR8+3ODm5ZRKJS1btoxMTEyoQ4cOlJycLHZJOoHD5RXu3r1LvXr1IkEQaObMmbWy4aTUZGZm0ltvvUUAaOrUqfzXmwE6efIkNW3a1KBXFJ49e5ZatGhBVlZWtHHjRp7sfwUOl0r897//JQcHB2rQoAHFxcWJXY6oVCoVRUZGkqmpqU5dw8BqprS0lBYtWkRGRkbk6+tLN27cELskUeXm5tL7779PAGjo0KG8AWYlOFwqUFBQQJMmTSIA9O6779KDBw/ELkky/vjjD2rZsqVOXH3Nauavv/6inj17kiAINGfOHIM8a3+ZXbt2Ud26dalx48YUHx8vdjmSpPd3oszLy0N6ejqysrJgYmICJycnODs7w9TUtMLvv3TpEkJCQpCSkoJly5Zh4sSJEAShlquWtoKCAkyfPh3r16/H4MGDsX79etjZ2b30+6vaBkzzqtoGP/74Iz744ANYWlpi+/bt6NGjRy1XLH23b9/GiBEjcOrUKcydOxezZ89+4Y6YzzK4fiB2umnL9evXaebMmdS6dWv1vbYtLS3J0dGRAgMDafPmzeXuW69SqWjNmjVkbm5OrVu3pvPnz4tYvW7Ys2cP2drakpubGx0/fvyFx6vaBkzzqtoG+fn5NGHCBAJA7733nuQ2nJQahUJBc+fOJZlMRt26datwA0xD7Qd6Fy6lpaW0bds2cnNzI0dHRxo9ejRt3bqVfv31Vzpy5AitX7+e3nvvPbK1taVevXrRpUuX6OHDhzRgwAACQOHh4ZLecFJq7ty5Q927dy93r47qtAHTrOq0wfnz58nLy4ssLCzom2++4SHPKjh+/Di5ubmRra0t7dmzh4iq1wb6RK/CRalU0urVq8nKyorefPNN+vPPP6m0tJQSEhIoKiqKoqKi6MqVK1RSUkLHjh2jTp06kZubGzk5OZG9vT39+OOPYr8EnfT8XQYXLlxYpTbw9PSU5K0JdFV1+oGTkxOZmJhQ27Zt9e6XXG3JysqiwYMHqzfAXL58uUH3A70Kl6NHj5KtrS0NHjyYsrKy1H95zZkzhwAQAPXFjyqVim7fvk2+vr5Ut25d7lAaEB8fT87OzgSABg0a9Npt4OfnRwEBAbzyRkOq2w8aNGjAF8vWkEqlog0bNpCpqSnJZDKD7gcycWZ6NK+wsBALFiyAs7Mzli9fDltb20on4gVBgJubG1avXg0zMzMcOXKkFqvVT97e3mjRogVatGiByMjI126DlStX4tq1a9i+fXstVqufatIPlEol9uzZU4vV6h9BEDBy5Eh4e3ujWbNmBt0P9CZczp49i99//x3h4eFwdXV9rRVegiCgffv2GDp0KDZv3oyCgoJaqFR/nT17FmfOnMGkSZO4DUTC/UB8Z8+exfnz5w2+HxiLXYCm/PrrrzAzM0NQUBCuXLmC0tJS9WOZmZnq/75z5w7Onz+v/n9bW1sMGDAA27dvx61bt+Dl5VWrdesTbgPxcRuIj9vgf8Qel9OUUaNGUYsWLejatWvUqFEjMjc3V38ZGxurxzlNTEzKPTZ27Fi6efMmOTo60oEDB8R+GTqN20B83Abi4zZ4Si/OXIgIRUVFMDMzg5GREYqKilBUVFTh9yoUCigUCvX/l5SUwNTUVP08Vj3cBuLjNhAft8H/04twEQQBjo6OSExMhFKpRGBgILKzs9WPp6Sk4MaNGwCAtm3bwsXFRf3YG2+8gezsbBQXF8Pe3r62S9cbmmiD/Px8xMTEwNbWFj4+PrCysqrtl6HzHBwckJOTw/1ABFlZWYiLi8OlS5eQl5fHbSDuiZPmbNiwgSwsLOj48eNUWlpa7mvWrFnqU9EtW7aUe0ypVNLmzZupfv36lJaWJvbL0Gk1bQMLCwtq0KABWVlZUd26dalnz540e/Zs+uWXX/RmeaYmqVSqF77Wr1/P/aCWKBQKio+Pp3/9618UEBBAlpaWZGFhQY0bNyZzc3ODbwO9WS3Wq1cv1KlTB1u2bAERwcjISP0lk/3/y5TJZOUeKyoqwtatWxEQEID69euL+Ap0X03boH///rh9+zZOnz6NpUuXokmTJti9ezeGDBkCNzc3+Pr64sMPP8S+ffvKTYwaCnp6XZr6q4wgCOqv3r17cz/Qojt37mDjxo0ICQlBw4YNERQUhHXr1qFp06ZYu3YtUlNTceTIEdjY2Bh8G+jFsBgANGnSBCNHjsS3336L9957D2+99dYrlwCqVCps3rwZ586dw48//ljppnPs1TTRBiYmJmjVqhVatWqFsLAwEBFu376N+Ph4JCQkQC6XY926dQAADw8PBAQEwM/PD/7+/mjcuLFebTJKFewp+6rXx/1AswoKCvDbb78hNjYWcrkc165dg0wmQ+fOnREREYE+ffrA29u73HumUqm4DQD9GRYjIsrIyKB27dpRw4YNSS6Xq+/rPXfuXDI2NiYTExPavn07qVQqUigUtG3bNnJ0dKRZs2ZRaWmpyNXrh4yMDPLx8SE3NzettUFGRgb98MMP9M9//pO6dOlC1tbW6tvuhoaG0oYNG+jy5cs6dV/3ioa4qru3V220gb5SqVR08eJFWr58Ob311ltUt25dsrCwoBYtWlB4eDjt27ePsrOzX/lzuA30bMv9/Px8dO3aFSkpKbC0tMTEiRMxduxYqFQqpKenAwCaNm2KnJwcrFmzBjt37sSoUaPw5ZdfwtLSUuTq9cfly5cxevRo3Lp1q1baIDs7GydPnlSf3SQlJaG0tBT29vbw9/dXn9m88cYbMDaWxsn6y7qdps68arsNdFnZRLxcLodcLkdGRgYsLCwQEBCA4OBgBAUFwdPTs8ptY+htoDfholKpMGLECPz666+Ijo5GdHQ0du3aBWNjY3h5ecHNzQ1KpRK3bt1CcnIyHBwc8Mknn2D06NEwMzMTu3y9c/fuXSxcuFCUNsjPz8fp06eRkJCAEydOIDExEUVFRbCysoKvry/8/f0REBCADh06wNzcXGPHrYy2w6QilbXBjRs3kJKSYpD9oLS0FKdPn4ZcLsfhw4eRlJQEIoKXl5c6TPz9/TXy2RCzH4hNb8Jl/vz5+Prrr/H999+jX79+UCqVuHLlCvbv34/ExETcv38fJiYmaNq0KQIDA9GnTx84OTmJXbZek0oblJSU4Ny5c4iPj0d8fDxOnjyJJ0+ewNTUFJ06dVLP2/j6+sLa2lojxxQjTCpSURsUFxcjKSkJM2bMwLRp0wyiH9y5cwdyuRyxsbE4evQonjx5AltbW/Tu3VsdKM8uC9YkqfSD2qYX4RIdHY2wsDAsXrwYERERLzxORFAqlRAEQT8mynSQlNpAqVTi0qVL6rCJj4/HgwcPIJPJ0L59e/Uwmp+fHxwcHF7rZ0olTCpT1gYA0KxZM4wcORKff/65yFVpR0FBAU6cOIHY2FjExsaWm4gPCgpCcHAwOnToUOufRSn1A23T+XBJTEzEm2++iaFDh2LNmjWS6sxMNxARUlNTy4XNnTt3AAAtW7YstyLN1dVV/ZyK6MrnLywsDOfPn0diYqLYpWgEEeHy5cvqVV3x8fEoLi5WLxcODg5GYGAgbG1txS7VYOh0uKSlpaF79+7w8PBATEyMXo1XMnH99ddfSEhIUIdNcnIygKdLff38/ODn54du3brB3d1dZwLlWdHR0Xj//fdx48YNnb2mIisrC0eOHFEPd2VkZMDc3BzdunWr0UQ80wydDZf8/HwEBwcjOzsbx44dQ7169cQuiemJirrEgwcP8Pvvv6vD5vz581CpVHB2doafnx8CAgLg7+8PLy+vchfKSdWDBw/QuHFjbNiwASNHjhS7nNfy7ER8bGwszp49CyJCq1atyk3EW1hYiF0qg46Gi0qlwujRoyGXyxEXF4c2bdqIXRLTYdUZ4srNzS0XNmfPnkVJSQnq1q1bbs7G29sbJiYm2iq9Rvz8/ODp6YlNmzaJXcpL/fXXX+owOXLkSLmJ+KCgIAQFBamHKpm06GS4LFq0CF988QWio6PRv39/scthOkYb8yWFhYU4e/asOmxOnTqF/Px8WFpawsfHR738uVOnTpK5jmHevHnYuHEjbt++LZmzrWcn4uVyOZKTkyGTyeDj46OeO+nYsaPeT4brA50Ll71792LMmDH417/+hQ8//FDscpgOEGPyXaFQ4Pz58+UWCWRnZ8PExAQdOnRQn9l07doVdevW1Vodlfntt9/Qt29fxMfHw9vbW5QaiAhXrlxRh8mJEyd4Il5P6FS4nD17Fn379sWAAQOwYcMGnqhjFZLiSi6VSoWrV68iPj4eJ06cQHx8PO7duwdBENC2bVv1vI2fn1+tXfNQUlKChg0b4qOPPsKMGTNq5ZgA8Pjx43JXxKenp8Pc3LzcFfEtW7bk/q3jdCZc0tPT0b17dzRq1Ai//PJLrV1ZzaSvoo+w1H8xERFu3bqlPqs5ceIEbt68CeDpNShlCwT8/PzQqFEjrb2ewYMH48mTJzh8+LBWfj7wdCL+zJkz5SbiVSoVT8TrOZ0Il4KCAvTr1w/379/HsWPH4OzsLHZJTCRSPCvRlIyMDPWWNQkJCbh06RIAoGHDhuqgCQgIQIsWLTT2etetW4ePP/4Yd+/eRZ06dTTyM4HyE/FHjx5FTk4ObG1t0atXL/VEfMOGDTV2PCY9kg8XIkJoaCgOHDiA2NhYtGvXTuySWC3S5zB5lcePHyMhIUF9vc25c+egVCrh6OioXpHm7++Ptm3bVnuC+/r162jbti2+//77Gi2OKSwsLDcRf/XqVZ6IN3CSD5d///vfWLRoEb777ju8++67YpfDtMyQw+RV8vPzkZiYqB5GO3PmDIqKimBtbY2uXbuqw6ZDhw5VuqC4devWCA4ORmRk5Gs/h4hw9epVHD58uNxEvKurq3qoq1evXjwRb8AkHS4//fQTRo4cic8++wyffPKJ2OUwLeAwqb7i4mKcO3dOPYyWkJCAvLw8mJmZqZc/+/v7o0uXLrCysnrpz5k6dSri4uJw8eLFSo/3+PHjclfE80Q8q4xkw+XPP/9EUFAQ+vfvj02bNvEHVk9wmGiPUqnEhQsXys3bPHz4EEZGRmjfvr06bPz8/GBnZ6d+XkxMDIYOHYqLFy/C3d1d/e+lpaU4e/asevPHZyfiy4a6eCKevYwkw+XevXvo0aMHnJ2dcejQIf7w6jAOE/EQEVJSUtRLn+Pj45GWlgYA8PLyUi8QaNu2LXx8fLB06VK89dZb5a6Iz8nJQd26ddGrVy/12QlPxLPXIblwKSoqwptvvom0tDQcP34cDRo0ELsk9po4SKTvzp076jt2njhxAikpKVAqlept4IkIxsbG8PHxQZ8+fRAUFISOHTtK5g6eTHdI6hNDRJg0aRIuXryIQ4cOcbBIHIeJ7nFzc0P79u3x4MED3L59Gzdv3oRCoYCRkRGKi4thZmYGmUyGu3fv4tq1a6hXrx6sra3RqlUryWwRw3SDpM5cli5divnz52Pr1q0YOHCg2OWw53CY6Kbs7GwcOXJEvUz47t27MDMzQ7du3dRzJwUFBejWrRt++OEHCIKgHkZLSkqCQqGAra1tueXP7dq1k+yGnEwaJBMuMTExCAkJwcyZMzF79myxy2HgMNFVSqWy3BXxZ86cgUqlQsuWLREUFIQ+ffq8MBGvUqnQuHFjfPDBB5g/f7763wsKCnD27Fn1vE1iYiIKCgpgZWWFzp07q8OmU6dOPDfKypFEuFy4cEH9F9TWrVv59FskHCa66+7du+ozk7i4uGpNxIeGhiIlJQXx8fEv/R6FQoE//vhDPW8THx+PnJwcmJiYoGPHjuqw8fX1hY2NjaZfJtMhoofLgwcP0L17d9jb2+Pw4cOVrsdnmsVhorsKCwsRHx+vDpQrV65AJpOhY8eOCA4OVl8RX5WJ+O3bt2P8+PG4ffs2HB0dX+s5KpUKly9fVi8QiI+PR2ZmJmQyGdq2bau+1UDXrl35hn4GRtRwKS4uRv/+/XHz5k0cP36cb/qjZRwmuqvsiviyoa4TJ06gqKgILi4u5a6If/b6laq6d+8e3N3dsWnTJgwbNqzadd68eVMdNAkJCeoNOVu0aKHe+dnf3x9ubm7VrpVJn2jhQkSYMGEC9uzZg4MHD8LHx0eMMvQWB4nuK5uILwuUson4sivig4ODNX5FvI+PD9q3b48NGzZo7GfevXtXPYQWHx+PK1euAAAaNWqkDpqAgAA0a9aMP596RLRwiYqKwuzZs7Fx40YMHTpUjBL0CoeJ7lMqleWuiH9+Ir7sinht3sly1qxZ2LlzJ27cuKG1z86jR49w8uRJddj8+eefUCqVqFevXrn72rRp04Y3utRhooTLgQMHMHToUHz00UeYN29ebR9eL3CY6IdnJ+KPHDmC7Oxs2NjYlJuIr83hoyNHjuDtt99GYmIi2rRpUyvHzMvLw6lTp9Rhc+bMGRQXF6NOnTrw8/NTB463tzdMTU1rpSZWc7UeLpcvX0ZgYCB69eqFHTt28Mqw18Rhoh/KJuLLhrquXLkCQRDQqVMndZh06tRJtCvii4qK4Orqijlz5mD69Omi1ZCUlKQOm5MnTyI/Px/m5ubw8fFR30jNx8eHFwBJWK2Gy6NHj9CjRw9YW1sjLi6OPxiV4DDRDy+biG/QoEG5iXh7e3uxS1UbMGAAFAoF9u/fL3YpAJ5uoHnhwgV12MTHxyMrKwvGxsbw9vZWb8bp5+fHW/xLSK2FS0lJCd555x1cu3YNx44dQ6NGjWrjsDqDw0R/ZGdn4+jRo+rhrrS0NPVEfNncSatWrSTbtqtXr8bs2bNx9+5dSf4BqFKpcO3atXJhc/fuXQiCgNatW5ebt6lfv77Y5RqsWgkXIsKUKVPw3Xff4cCBA+jSpYu2Dyl5unjfd1axZyfi5XI5Tp8+DZVKBU9Pz3JXxGtzIl6TkpOT4e3tjX379qFv375il/NKRKTekLPsKzU1FQDg7u5ebvlzkyZNuJ/VkloJl9WrV+OTTz7BunXrMHLkSG0fTnL4rET/pKenl7siXuyJeE0iInh6euLdd9/F0qVLxS6nWjIzM8stf7548SKICC4uLuozG39/f3h6evK8r5ZoPVxiY2MxaNAgREREYNGiRdo8lGRwmOifoqIinDhx4oWJ+LIr4oOCguDj46M3W9OHh4fj5MmTOHfunNilaER2djZOnjypDpykpCSUlpbCzs6u3E3U2rVrpzdtKDathktycjJ69uyJgIAAREdH6+2adQ4T/UNESE5OLjcRX1hYKOmJeE3at28fRo4cieTkZJ09A6tMfn4+zpw5oz6zSUxMRGFhIaysrODr66s+u+nYsSPMzc3FLlcnaS1csrKy0KNHD5ibm+PIkSOoU6eONg4jCg4T/ZSTk1Nua/q0tDSYmpqWm4j38vIyiHbOzs5Gw4YNsXLlSowdO1bscrSupKQE586dU5/ZJCQk4MmTJzA1NUXHjh3Vw2i+vr6wtrYWu1ydoJVwUSgUGDBgAC5cuIDjx4+jSZMmmj5EreIw0U9KpRJJSUnqMElMTCw3ER8cHIyAgACdmYjXtMDAQDRo0ADfffed2KXUOqVSicuXLyM+Ph4nTpxAQkIC7t+/D5lMhnbt2qmH0fz9/eHg4CB2uZKklXCZMWMGNmzYgJiYGPj7+2v6x9cKXs2l3zIzM9GhQwc8fvwYNjY2CAwMVA938TL5pz7//HOsXLkSaWlpBj8PQUS4fv26Omji4+Nx+/ZtAMCYMWOwevVqkSuUnmqHi5ubG4KDg7FkyZIXfukqlUr1vbhfxsnJqTqHZaxKXF1d0adPnwo/p6WlpZDJZJWuFnJ2dtZ2iaJydXVFv379sHjx4hceIyIolcpK+7G+vz/Ay3/XqVQqqFQqAODfdRWo9p8jhYWF6Nq1K5YsWYJly5bxcj4mSYWFhejUqRMiIyMrDBhDV1hYiMaNG2Pv3r2YOHEivz8VKCwshI+PD5YvX86foSqoUSKEhYWhU6dOCA8PR2lpqaZqYkyjwsPD0bBhQ8yaNeul82eG7LPPPkNKSgo2btzI789LTJgwAY0bN8bMmTP5PXpNNQoXQRAwcuRI9OnTB2FhYVAoFJqqizGNEQQBkyZNgqurKwdMBQRBwLJly3Dp0iWsXbuW358KCIKACRMmoEmTJvj000/5PXoNNR7LEgQBAwcOxJAhQzBmzBgUFxdroi7GNKosYBo0aIA5c+bwL4fnCIKAr7/+Gunp6fjqq6/4/amAIAgYP348mjZtygHzGjQ2UdK/f3+EhYVh5MiRKCgo0NSPZUxjBEHAlClT4OTkhM8++4x/OTxHEAQsXLgQSqUS//rXv/j9qQAHzOvT6Cx8r169MH36dAwfPhy5ubma/NGMaYQgCIiIiEC9evU4YCogCAI+/fRT2NraYvbs2fz+VODZgPnkk0/4PXoJjS/x8vf3x9y5cxESEoLHjx9r+sczVmNlAePo6Ih58+bxL4fnCIKAqVOnwsXFhf86f4mygHF3d+f36CW0sn64Y8eO+OKLLzBixAhkZmZq4xCM1UjZL1BbW1vMnz+ffzk8p2yOqkmTJvj444/V13Ow/8dDZJXT2sUpbdq0wapVqzBmzBjcvHlTW4dhrNoEQcD06dNha2vLZzAVKFsh1apVK0RERPDlBhV49gyGh8jK0+qVjx4eHti4cSMmTpyIK1euaPNQjFWLIAiYNm0a7O3teQ6mAoIg4P3330dAQADCwsJ4NWgFBEHAuHHj4OHhwQHzDK1fVu/i4oIdO3Zg2rRpuHbtmrYPx1iVlQ2ROTk58SR2BQRBwLBhwxASEsKrQV+CA+ZFtbJni4ODA3bt2oWwsDA8fPiwNg7JWJWULVN2dXXl8fMKCIKAfv364cMPP8TQoUP5DKYCzwbMjBkzDP4zVGsbgtna2mL37t145513eHKQSZIgCAgPD0eTJk34l8NLdO3aFXPmzMHQoUO5H1egLGCaNWtm8J+hau+K7OjoWK2VYPHx8fjtt98we/bs6hyWsSqxt7fHgwcPqvy8devWIS8vDzNmzNBCVdJR3fcnJiYGly9fxsyZM7VQlbRU93fd+vXrkZeXh48//lgLVUlftXdFnjRpEi5cuFDl59nY2KBdu3bVPSxjVTJ58mScP3++ys/r2rUr0tLStFCRtFT3/WnUqJHe3rb8edX9Xde1a1f89ddfWqhIN1T7zKWyp73O/Vx422pWGyr7nCoUChgbG1f6WdT3z2ll70/Z/UqMjIxe+j7o+/sDVP4elS3P5t91L6r2nIsgCC/9mjVrFpycnJCQkPDS75E6Qx4r1Scv+/wtXboUtra22L9/f6WfZX1X2Wv/97//DTc3N6hUKoN9f4DK36Phw4fjb3/7m0F/hl5GKxP6n3/+Ofz8/DB8+HDcunVLG4fQKg4W/RYTE4N58+Zh1qxZeOedd8QuR7Lkcjl69epl8Lc4rkxQUBBOnjyJ/Px8sUuRHK2Ei4mJCbZv3466detiyJAhvIklk4wLFy5g7NixeO+99zBr1iyxy5Gs7OxsnD59GsHBwWKXImlBQUFQKBQ4fvy42KVIjtaWItvZ2WHPnj1IS0vD+++/D6VSqa1DaYUhn87qqwcPHmDw4MFo1qwZ1q9fz7fmrsTRo0ehUqkQFBQkdimS5uHhgcaNG0Mul4tdiuRotXd5enpi69atOHToEObNm6fNQzFWqeLiYoSEhKCkpAR79uyBlZWV2CVJWmxsLDw9PeHm5iZ2KZImCAKCgoI4XCqg9T/dgoODsWTJEkRGRmLHjh3aPlyN8XyL/iEiREREICkpCbt374arq6vYJUkaEUEul6N3795il6ITevfujevXr+vk/LI21cq4QHh4OEJDQzFlyhScOnWqNg7JmFpUVBS2bduGb775Bj4+PmKXI3nXrl1DWloaz7e8pp49e8LIyAhxcXFilyIptRIugiBg2bJl8PHxwbBhw3Dnzp3aOGy18XyL/jhw4ABmz56NGTNmYNiwYWKXoxPkcjlMTU0REBAgdik6wcbGBj4+Phwuz6m1GU1TU1N89913sLa2xtChQ3npHtO6y5cvY8yYMXj77bcxd+5cscvRGbGxsfD39+d5qSoICgrC0aNHoVAoxC5FMmp1uYyDgwO+//573Lx5E2FhYZLb+I7nW/THo0ePMHjwYDRp0gT/+c9/eGXYayoqKsJvv/3Gq8SqKCgoCLm5uThz5ozYpUhGrfe4Vq1aYfPmzYiJicHChQtr+/CvxENiuq+kpATDhw9Hfn4+9uzZA2tra7FL0hkJCQkoLCzk+ZYq8vb2hp2dHa8ae4Yof869+eabWLRoEb766ivs2rVLjBKYniIiTJs2DYmJidi1axcaNWokdkk6RS6Xw9nZGa1btxa7FJ1iZGSEXr16cbg8Q7SxgoiICIwcORLh4eE4ffq0WGWo8ZCYflizZg02b96MVatWwdfXV+xydE5sbCyCgoL4DL4aevfujaSkJDx69EjsUiRBtHARBAErVqyAt7c3QkJCDGJ7c6ZdsbGx+OSTTzB9+nSMGjVK7HJ0zr1793Dp0iWeb6mm3r17g4jw66+/il2KJIg6y2lmZoadO3fC1NQUw4YNE30FGf+1pruuXr2K0aNHo2/fvliwYIHY5egkuVwOQRD44slqcnV1RatWrXho7H9EX0JTr149fP/990hNTcW4ceMkt4KMSV9WVhYGDx4MV1dXbNq0yWBuYqVpcrkc7du3h6Ojo9il6KyyrWB4mF0C4QIAbdq0wX/+8x/897//xZIlS2r9+PxB0F0KhQKjRo1CdnY29u7dCxsbG7FL0kkqlQpxcXG8SqyGgoKCkJGRgStXrohdiugkES4A8Pbbb2PevHlYsmQJ9u7dW+vH5yEx3fTRRx8hPj4e0dHRaNKkidjl6Kw//vgDjx494vmWGvLz84O5uTkPjUFC4QIAH374IYYNG4bx48cjKSlJ7HKYxK1btw4bNmxAVFQUb1VSQ7GxsbC2tkaXLl3ELkWnWVhYICAggMMFEgsXQRCwevVqtG3bFsOGDUN6errWj8lDYropLi4OH330ESZPnozQ0FCxy9F5crkcPXr0gImJidil6LzevXsjPj4eBQUFYpciKkmFCwCYm5sjOjoaMpkMISEhKCwsFLskJjEpKSkYNWoUevXqhcWLF4tdjs578uQJTp06xfMtGhIUFITi4mIkJCSIXYqoJBcuAODs7Izdu3fj6tWrmDhxotbPLni+RXdkZ2dj8ODBqF+/PrZt28b3d9eA48ePo7S0lOdbNKRly5ZwcXEx+KExSYYLALRr1w4bNmzAnj178OWXX4pdDpOA0tJSjB49Gg8fPsSePXt4ZZiGxMbGwt3dHe7u7mKXohf47pRPSTZcAOBvf/sb5syZg4ULF+Knn37S+M/n+Rbd8sknn+DYsWP47rvv4OHhIXY5ekMul/NZi4YFBQXh6tWrBr3ziKTDBXj6C2XQoEH4xz/+gT///FPscphI/vOf/2Dt2rVYtmwZevToIXY5euP69eu4efMmz7doWGBgIGQymUHfQEzy4SIIAr755hu0bNkSQ4cORWZmpsZ/PpO2Y8eOYfr06ZgwYQLCwsLELkevyOVyGBsbo3v37mKXolfs7OzQsWNHgx4ak3y4AE/XjkdHR0OpVCIkJARFRUVil8RqyfXr1zFixAh0796d5960IDY2Fr6+vqhTp47Ypeid3r174+jRo1AqlWKXIgqdCBcAcHFxwa5du3DhwgVMnjy5xvMlPN8ifU+ePMGQIUPg6OiI7du388owDSspKcHx48d5vkVLgoKCkJ2dbbAXhOtMuABAx44dsW7dOkRHR2PZsmU1/nk8JCZdSqUSf//735GRkYE9e/bA1tZW7JL0zqlTp5CXl8fzLVrSqVMn2NjYGOzQmE6FCwAMGjQIn376KebPn4+YmBixy2FaMnv2bMTFxWH79u1o3ry52OXoJblcDkdHR7Rr107sUvSSsbExevbsyeGiS2bNmoV3330XH3zwAS5evFjl5/OQmLRt3rwZK1aswFdffcX3FtGi2NhY9O7dGzKZTv4a0AlBQUE4c+YMcnJyxC6l1unkp0omk2H9+vVo1qwZhg4digcPHohdEtOQ+Ph4TJ06FR988AHGjx8vdjl668GDB/jjjz94vkXLgoKCoFQqDfLulDoZLgBgZWWFXbt2oaioCMOHD0dxcXGVns/zLdJz69YthISEwM/PD8uWLeM20qKy6y/4zFC7GjVqhObNmxvk0JjOhgsANGzYELt27cK5c+cwdepUHu7SYbm5uRg8eDDq1q2LHTt28O68WiaXy9GmTRvUr19f7FL0Xu/evQ3y7pQ6HS4A4OPjgzVr1mD79u1YuXLlK7/f0BpYFyiVSoSGhiItLQ179uyBvb292CXpNSKCXC7nVWK1JCgoCH/99RdSU1PFLqVW6cWFA8OGDcOVK1cwe/ZstGjRAv369RO7JFYF8+bNw6FDh/DDDz+gZcuWYpej9y5evIj79+/zfEst6datG0xNTSGXyw1q5aPOn7mUmTt3Lvr374/Q0NBy968mIjx8+BC3bt3Cw4cPQUQ8ll/LKmqDMjt27MCyZcuwZMkS9OnTR8Qq9duzbfDjjz/C0tISfn5+YpdlEKysrNC1a1fI5fKX9gO9RHokLy+PunTpQq1bt6br169TZGQkeXh4EAD1l7u7O0VGRtLjx4/FLlfvPX78uMI28PDwoMjISDp8+DDVrVuXJk6cSCqVSuxy9dLL2sDKyor7QS15/PgxDRgwgGQyWYX9QF/bQK/ChYjo9u3b5OTkREZGRgSABEEo16Bl/2ZlZUUHDx4Uu1y9dfDgQbKysiJBEF5og7L/FwSBvL29qbi4WOxy9VJlbcD9oHaUtcHz733Z+6/PbaB34XLw4MEX/kKo6Esmk5GRkZFeNqrYDh48SEZGRq/dDtwGmve6bcD9QHsMvQ0EIv0Z+MvOzkbDhg1RWFgIlUr1yu+XyWSwsLBAWloa712lIdwG4uM2EB+3gR5N6APAli1bUFBQ8FqNCQAqlQoFBQXYunWrliszHNwG4uM2EB+3AaA3Zy5EhObNm+PGjRtVWoUhCALc3d2RkpLCq8hqiNtAfNwG4uM2eEpvwuXhw4eoV69ejZ7v4OCgwYoMD7eB+LgNxMdt8JTeDIvl5eXV6Pm5ubkaqsRwcRuIj9tAfNwGT+lNuFhbW9fo+Xyb15rjNhAft4H4uA2e0ptwcXBwgIeHR5XHKgVBgIeHB+9npQHcBuLjNhAft8FTehMugiBgypQp1XpuRESEXkygiY3bQHzcBuLjNnhKbyb0AV5bLgXcBuLjNhAft4EenbkAgK2tLfbu3QtBEF5561aZTAZBEPDDDz/oTWNKAbeB+LgNxMdtAP3auLLMq/a1KtvP59ChQ2KXqre4DcTHbSA+Q24DvQwXoqc7kUZFRVW4I29UVBRlZ2eLXaLe4zYQH7eB+Ay1DfRqzqUiRISsrCzk5uaiTp06sLe315sJM13BbSA+bgPxGVob6H24MMYYq316NaHPGGNMGjhcGGOMaRyHC2OMMY3jcGGMMaZxHC6MMcY0jsOFMcaYxnG4MMYY0zgOF8YYYxrH4cIYY0zjOFwYY4xpHIcLY4wxjeNwYYwxpnEcLowxxjSOw4UxxpjG/R/vngJzMXGAVQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 500x400 with 26 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# model = KAN(width=[4,[0,2],1], seed=2, base_fun='identity')\n",
"model.plot()"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "7c9fbafb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.1\n",
"fixing (0,0,0) with x, r2=0.9994129538536072, c=1\n",
"fixing (0,0,1) with 0\n",
"fixing (0,0,2) with 0\n",
"fixing (0,0,3) with 0\n",
"fixing (0,1,0) with 0\n",
"fixing (0,1,1) with 0\n",
"fixing (0,1,2) with 0\n",
"fixing (0,1,3) with x, r2=0.9999893307685852, c=1\n",
"fixing (0,2,0) with 0\n",
"fixing (0,2,1) with 0\n",
"fixing (0,2,2) with x, r2=0.999798059463501, c=1\n",
"fixing (0,2,3) with 0\n",
"fixing (0,3,0) with 0\n",
"fixing (0,3,1) with x, r2=1.0000004768371582, c=1\n",
"fixing (0,3,2) with 0\n",
"fixing (0,3,3) with 0\n",
"fixing (1,0,0) with x, r2=0.9998863935470581, c=1\n",
"fixing (1,1,0) with exp, r2=1.0000001192092896, c=2\n",
"saving model version 0.2\n"
]
}
],
"source": [
"model = model.prune()\n",
"model.auto_symbolic()"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "140b2fe4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"saving model version 0.3\n",
"Best value at boundary.\n",
"r2 is 0.9831650257110596\n",
"saving model version 0.4\n"
]
},
{
"data": {
"text/plain": [
"tensor(0.9832)"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model.unfix_symbolic(1,1,0)\n",
"model.fix_symbolic(1,1,0,'x')"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "468d9529",
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle - 0.003 x_{1} x_{4} + 0.0031 x_{2} x_{3} - 0.0819$"
],
"text/plain": [
"-0.003*x_1*x_4 + 0.0031*x_2*x_3 - 0.0819"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from kan.utils import ex_round\n",
"from sympy import *\n",
"ex_round(expand(ex_round(model.symbolic_formula()[0][0],5)),4)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "535ca88c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "60d16a10",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "782f818f",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}