From eb49d8cae3e0537602f011e85dcf58f1823dfeab Mon Sep 17 00:00:00 2001 From: lucasdelimanogueira Date: Fri, 17 May 2024 20:12:57 -0300 Subject: [PATCH] fixed sum axis with keepdim --- examples/train.ipynb | 561 ++++++++++++++++++++++- norch/__pycache__/tensor.cpython-38.pyc | Bin 15530 -> 15534 bytes norch/nn/__pycache__/loss.cpython-38.pyc | Bin 1416 -> 1420 bytes test.py | 76 ++- 4 files changed, 614 insertions(+), 23 deletions(-) diff --git a/examples/train.ipynb b/examples/train.ipynb index 9c92203..05e4e42 100644 --- a/examples/train.ipynb +++ b/examples/train.ipynb @@ -26,28 +26,523 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Invalid axis" - ] - }, - { - "ename": "ValueError", - "evalue": "Matrix multiplication requires 2D tensors", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[7], line 56\u001b[0m\n\u001b[1;32m 53\u001b[0m loss \u001b[38;5;241m=\u001b[39m criterion(outputs, target)\n\u001b[1;32m 55\u001b[0m optimizer\u001b[38;5;241m.\u001b[39mzero_grad()\n\u001b[0;32m---> 56\u001b[0m \u001b[43mloss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 57\u001b[0m optimizer\u001b[38;5;241m.\u001b[39mstep()\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEpoch [\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mepoch\u001b[38;5;250m \u001b[39m\u001b[38;5;241m+\u001b[39m\u001b[38;5;250m \u001b[39m\u001b[38;5;241m1\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mepochs\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m], Loss: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mloss[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.4f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n", - "File \u001b[0;32m~/Documentos/recreate_pytorch/PyNorch/norch/tensor.py:167\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient)\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[38;5;66;03m# Propagate gradients to inputs if not a leaf tensor\u001b[39;00m\n\u001b[1;32m 166\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m tensor\u001b[38;5;241m.\u001b[39mgrad_fn \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 167\u001b[0m grads \u001b[38;5;241m=\u001b[39m \u001b[43mtensor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgrad_fn\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgrad\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m tensor, grad \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(tensor\u001b[38;5;241m.\u001b[39mgrad_fn\u001b[38;5;241m.\u001b[39minput, grads):\n\u001b[1;32m 169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(tensor, Tensor) \u001b[38;5;129;01mand\u001b[39;00m tensor \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m visited:\n", - "File \u001b[0;32m~/Documentos/recreate_pytorch/PyNorch/norch/autograd/functions.py:90\u001b[0m, in \u001b[0;36mMatmulBackward.backward\u001b[0;34m(self, gradient)\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [aux_sum, x\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m2\u001b[39m) \u001b[38;5;241m@\u001b[39m gradient]\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 90\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\u001b[43mgradient\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m@\u001b[39;49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtranspose\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m)\u001b[49m, x\u001b[38;5;241m.\u001b[39mtranspose(\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m2\u001b[39m) \u001b[38;5;241m@\u001b[39m gradient]\n", - "File \u001b[0;32m~/Documentos/recreate_pytorch/PyNorch/norch/tensor.py:487\u001b[0m, in \u001b[0;36mTensor.__matmul__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 484\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 485\u001b[0m \u001b[38;5;66;03m#2D matmul\u001b[39;00m\n\u001b[1;32m 486\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m2\u001b[39m \u001b[38;5;129;01mor\u001b[39;00m other\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m2\u001b[39m:\n\u001b[0;32m--> 487\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMatrix multiplication requires 2D tensors\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 489\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m!=\u001b[39m other\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m]:\n\u001b[1;32m 490\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIncompatible shapes for matrix multiplication\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mValueError\u001b[0m: Matrix multiplication requires 2D tensors" + "tensor([3.3399136066436768,], device=\"cpu\", requires_grad=True)\n", + "tensor([inf,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n", + "tensor([nan,], device=\"cpu\", requires_grad=True)\n" ] } ], @@ -92,7 +587,7 @@ "for x in x_values:\n", " y_true.append(math.pow(math.sin(x), 2))\n", "\n", - "batch_size = 5\n", + "batch_size = 2\n", "\n", "\n", "for epoch in range(epochs):\n", @@ -104,6 +599,7 @@ " target = target.to(device)\n", "\n", " outputs = model(x)\n", + "\n", " loss = criterion(outputs, target)\n", " \n", " optimizer.zero_grad()\n", @@ -114,6 +610,26 @@ " loss_list.append(loss[0])" ] }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss_list" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -147,12 +663,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "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evVqdejQQTfccINzv0qVKun+++/XoUOH9OOPP0qSPvnkE9WoUUOPPPJItjx/HXJ5Jb9TAOCqKE4A4Cbq1q0rX1/fbNt/+OEH9e3bV4GBgQoICFDNmjWdb8CTkpLy/b5XXXVVls8z3/DmVi7yOjbz+Mxjjx8/rj///FONGzfOtl9O24ri119/lSQ1bdo029eaNWvm/Lqfn5+mTZumNWvWKCgoSDfeeKNeeeUVZ4GQpJtuukn9+/fX888/rxo1aqh379768MMPlZaWVqAsjRs3zlYimjRpIknO+6iqVKmiXr16acGCBc59oqKiVLduXd1yyy0F+jlXX321IiMjsy0BAQGFzvPrr7/meO4yZ3HMPH+//PKLmjZtWqBJQq7kdwoAXBXFCQDcxOVXljKdPn1aN910k3bu3KkpU6bo008/VUxMjKZNmyZJBZp+3NvbO8ftlmWV6LEmjB07Vj///LOmTp0qf39/TZw4Uc2bN9eOHTsk2VdOlixZok2bNunhhx/WkSNHNGrUKLVr105nzpwpthzDhw/XgQMH9N133yklJUUrV67UkCFD5OXlGf8su9vvBQAUhGf8FxoAyqgNGzbo999/19y5czVmzBj17NlTkZGRWYZJmVSrVi35+/tr//792b6W07aiqF+/viRp79692b62d+9e59czNWrUSP/4xz+0fv167d69W+fPn9drr72WZZ/rrrtOL774orZu3aqoqCj98MMPWrhwYb5Z9u/fn60c/Pzzz5KUZUbDO+64QzVr1lRUVJSWLVums2fP6p577inQ6y2MguSpX79+jucuc5hn5vlr1KiR9u7dW6QhjADgCShOAODGMv+yf/mb4/Pnz+vdd981FSkLb29vRUZGavny5Tp69Khz+/79+7VmzZpi+Rnt27dXrVq1NGvWrCxD6tasWaM9e/aoR48ekuyZ6M6dO5fl2EaNGqly5crO4/74449sRaNNmzaSVKDhekePHtWyZcucnycnJ+ujjz5SmzZtVLt2bed2Hx8fDRkyRIsXL9bcuXN1zTXXqHXr1oV74QVQkDzdu3fX5s2btWnTJud+qampmj17tkJDQ533TfXv318nT57U9OnTs/0criQBKAuYjhwA3Nj111+vqlWrasSIEXr00UflcDg0f/58l3oj+9xzz2n9+vXq1KmTHnzwQaWnp2v69Olq1aqV4uLiCvQ9Lly4oH/+85/ZtlerVk0PPfSQpk2bppEjR+qmm27SkCFDnNORh4aGOqf9/vnnn3Xrrbdq4MCBatGihXx8fLRs2TIlJiZq8ODBkqR58+bp3XffVd++fdWoUSOlpKRozpw5CggIUPfu3fPN2aRJE/3tb3/Tli1bFBQUpA8++ECJiYn68MMPs+07fPhwvf322/ryyy+dQysLavv27fr444+zbW/UqJEiIiIKlWf8+PGKjo5Wt27d9Oijj6patWqaN2+eDh48qE8++cQ5fHD48OH66KOPNG7cOG3evFmdO3dWamqqPv/8cz300EMFmkYdANwZxQkA3Fj16tX12Wef6R//+IeeffZZVa1aVXfffbduvfVWde3a1XQ8SVK7du20Zs0aPf7445o4caJCQkI0ZcoU7dmzp0Cz/kn2VbSJEydm296oUSM99NBDuvfee1WhQgW9/PLLeuqpp1SxYkX17dtX06ZNc86UFxISoiFDhig2Nlbz58+Xj4+PmjVrpsWLF6t///6S7MkhNm/erIULFyoxMVGBgYHq0KGDoqKi1KBBg3xzXn311XrnnXf0xBNPaO/evWrQoIEWLVqU4/8W7dq1U8uWLbVnzx4NGzasQOchU3R0dI4Pyh0xYkSW4lSQPEFBQfruu+/01FNP6Z133tG5c+fUunVrffrpp86rdZJ99XD16tV68cUXtWDBAn3yySeqXr26brjhBl1zzTWFyg8A7shhudKfJQEAZUafPn30ww8/aN++faajGBMeHq5q1aopNja22L93aGioWrVqpc8++6zYvzcAlEXc4wQAKHF//vlnls/37dun1atX6+abbzYTyAVs3bpVcXFxGj58uOkoAIACYKgeAKDENWzYUPfee68aNmyoX3/9VTNnzpSvr6+efPJJ09FK3e7du7Vt2za99tprCg4O1qBBg0xHAgAUAMUJAFDi7rjjDkVHRyshIUF+fn6KiIjQSy+9pKuvvtp0tFK3ZMkSTZkyRU2bNlV0dLT8/f1NRwIAFAD3OAEAAABAPrjHCQAAAADyQXECAAAAgHyUuXucMjIydPToUVWuXFkOh8N0HAAAAACGWJallJQU1alTx/nA79yUueJ09OhRhYSEmI4BAAAAwEXEx8erXr16ee5T5opT5cqVJdknJyAgwHAaAAAAAKYkJycrJCTE2RHyUuaKU+bwvICAAIoTAAAAgALdwsPk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iT/H6c8//1RaWpqzNP3666968803tXfvXpcuTTAvMlKqVUs6eVJav950GgAAAKBgilScevfurY8++kiSdPr0aXXs2FGvvfaa+vTpo5kzZxZrQHgWHx9pyBB7neF6AAAAcBdFKk7bt29X586dJUlLlixRUFCQfv31V3300Ud6++23izUgPE/m7HrLl0vJyUajAAAAAAVSpOJ09uxZVa5cWZK0fv169evXT15eXrruuuv066+/FmtAeJ527aSmTaVz56Rly0ynAQAAAPJXpOLUuHFjLV++XPHx8Vq3bp1uv/12SdLx48eZcAH5cjguXXViuB4AAADcQZGK06RJk/T4448rNDRUHTp0UEREhCT76lN4eHixBoRnGjrU/hgba8+uBwAAALiyIhWnAQMG6PDhw9q6davWrVvn3H7rrbfqjTfeKLZw8FwNG0qdOkmWJUVHm04DAAAA5K1IxUmSateurfDwcB09elS//fabJKlDhw5q1qxZsYWDZ2O4HgAAANxFkYpTRkaGpkyZosDAQNWvX1/169dXlSpV9MILLygjI6O4M8JD3XWX/QDcuDhp927TaQAAAIDcFak4PfPMM5o+fbpefvll7dixQzt27NBLL72kd955RxMnTizujPBQ1atL3bvb61FRZrMAAAAAeXFYlmUV9qA6depo1qxZuvPOO7NsX7FihR566CEdOXKk2AIWt+TkZAUGBiopKYkZAF3AkiX2laeQEOnQIcmryINHAQAAgMIpTDco0tvUU6dO5XgvU7NmzXTq1KmifEuUUT17SgEBUny89PXXptMAAAAAOStScQoLC9P06dOzbZ8+fbpat259xaFQdvj721ecJCaJAAAAgOsq0lC9jRs3qkePHrrqqqucz3DatGmT4uPjtXr1anXu3LnYgxYXhuq5ng0bpC5dpMBAKSHBLlMAAABASSvxoXo33XSTfv75Z/Xt21enT5/W6dOn1a9fP/3www+aP39+kUKj7LrxRqlePSkpSVq1ynQaAAAAILsiXXHKzc6dO9W2bVulp6cX17csdlxxck3jx0vTpkl9+kjLlplOAwAAgLKgxK84AcUt82G4q1ZJzC8CAAAAV0Nxgkto1UoKC5MuXJD+8x/TaQAAAICsKE5wGZlXnZhdDwAAAK7GpzA79+vXL8+vnz59+kqyoIwbMkR68knpm2+kgwelBg1MJwIAAABs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5F4+/PBD1apVSz169DAdxS2cPXtWXl5Z3wp6e3srIyPDUCL3U7FiRQUHB+uPP/7QunXr1Lt3b9OR3EaDBg1Uu3ZtxcbGOrclJyfr+++/d9l7sBmqZ8iZM2ey/PX14MGDiouLU7Vq1XTVVVcZTObaRo8erQULFmjFihWqXLmycwxsYGCgypcvbzid65owYYK6deumq666SikpKVqwYIE2bNigdevWmY7m0ipXrpzt/rmKFSuqevXq3FeXh8cff1y9evVS/fr1dfToUU2ePFne3t4aMmSI6Wgu77HHHtP111+vl156SQMHDtTmzZs1e/ZszZ4923Q0l5eRkaEPP/xQI0aMkI8Pb28KolevXnrxxRd11VVXqWXLltqxY4def/11jRo1ynQ0l7du3TpZlqWmTZtq//79euKJJ9SsWTONHDnSdDSXkt/73bFjx+qf//ynrr76ajVo0EATJ05UnTp11KdPH3Oh82J6Wr+y6ssvv7QkZVtGjBhhOppLy+mcSbI+/PBD09Fc2qhRo6z69etbvr6+Vs2aNa1bb73VWr9+velYbonpyPM3aNAgKzg42PL19bXq1q1rDRo0yNq/f7/pWG7j008/tVq1amX5+flZzZo1s2bPnm06kltYt26dJcnau3ev6ShuIzk52RozZox11VVXWf7+/lbDhg2tZ555xkpLSzMdzeUtWrTIatiwoeXr62vVrl3bGj16tHX69GnTsVxOfu93MzIyrIkTJ1pBQUGWn5+fdeutt7r0/4cdlsXjoQEAAAAgL9zjBAAAAAD5oDgBAAAAQD4oTgAAAACQD4oTAAAAAOSD4gQAAAAA+aA4AQAAAEA+KE4AAAAAkA+KEwAAAADkg+IEAEAhOBwOLV++3HQMAEApozgBANzGvffeK4fDkW254447TEcDAHg4H9MBAAAojDvuuEMffvhhlm1+fn6G0gAAygquOAEA3Iqfn59q166dZalataokexjdzJkz1a1bN5UvX14NGzbUkiVLshy/a9cu3XLLLSpfvryqV6+u+++/X2fOnMmyzwcffKCWLVvKz89PwcHBevjhh7N8/eTJk+rbt68qVKigq6++WitXrizZFw0AMI7iBADwKBMnTlT//v21c+dODRs2TIMHD9aePXskSampqeratauqVq2qLVu26D//+Y8+//zzLMVo5syZGj16tO6//37t2rVLK1euVOPGjbP8jOeff14DBw7U//73P3Xv3l3Dhg3TqVOnSvV1AgBKl8OyLMt0CAAACuLee+/Vxx9/LH9//yzbn376aT399NNyOBx64IEHNHPmTOfXrrvuOrVt21bvvvuu5syZo6eeekrx8fGqWLGiJGn16tXq1auXjh49qqCgINWtW1cjR47UP//5zxwzOBwOPfvss3rhhRck2WWsUqVKWrNmDfdaAYAH4x4nAIBb6dKlS5ZiJEnVqlVzrkdERGT5WkREhOLi4iRJe/bsUVhYmLM0SVKnTp2UkZGhvXv3yuFw6OjRo7r11lvzzNC6dWvnesWKFRUQEKDjx48X9SUBANwAxQkA4FYqVqyYbehccSlfvnyB9itXrlyWzx0OhzIyMkoiEgDARXCPEwDAo/z3v//N9nnz5s0lSc2bN9fOnTuVmprq/Pq3334rLy8vNW3aVJUrV1ZoaKhiY2NLNTMAwPVxxQkA4FbS0tKUkJCQZZuPj49q1KghSfrPf/6j9u3b64YbblBUVJQ2b96s999/X5I0bNgwTZ48WSNGjNBzzz2nEydO6JFHHtE999yjoKAgSdJzzz2nBx54QLVq1VK3bt2UkpKib7/9Vo888kjpvlAAgEuhOAEA3MratWsVHBycZVvTpk31008/SbJnvFu4cKEeeughBQcHKzo6Wi1atJAkVahQQevWrdOYMWN07bXXqkKFCurfv79ef/115/caMWKEzp07pzfeeEOPP/64atSooQEDBpTeCwQAuCRm1QMAeAyHw6Fly5apT58+pqMAADwM9zgBAAAAQD4oTgAAAACQD+5xAgB4DEafAwBKClecAAAAACAfFCcAAAAAyAfFCQAAAADyQXECAAAAgHxQnAAAAAAgHxQnAAAAAMgHxQkAAAAA8kFxAgAAAIB8/D9+bdOrEm6qZgAAAABJRU5ErkJggg==", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2sAAAHWCAYAAADpfhESAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA3S0lEQVR4nO3deVxV9b7/8fdGZIPKoKgMhqJo4jymonXsBic0K1Eq5VricI6nHNKsTmpOaWXWtcEszU5pFg5paeZ1CKlskFJxOGpK2qAkAZkCiokcWL8/+rlvO1AGsf0lXs/HYz+Ktdfa+7NWVLxcey1slmVZAgAAAAAYxc3VAwAAAAAAiiPWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAFTZs2DCFhoZWaNuZM2fKZrNV7kB/MqGhobr11ltdPYZLff/997LZbPqf//kfV48CAH84Yg0A/oRsNluZHh9//LGrR3WJYcOGqU6dOq4ewwgXY+hSj6eeesrVIwJAteXu6gEAAJXvzTffdPp62bJlSkxMLLa8VatWV/Q+r776qoqKiiq07dSpUzVp0qQren9Unri4ON1yyy3Flnfq1MkF0wAAJGINAP6U7r77bqevv/jiCyUmJhZb/nvnzp1TrVq1yvw+NWvWrNB8kuTu7i53d/43ZIrOnTuX+v0BAPhj8TFIAKimbrzxRrVt21YpKSn6y1/+olq1amnKlCmSpPfee0/9+vVTcHCw7Ha7wsLCNHv2bBUWFjq9xu+vWfvt9UWLFy9WWFiY7Ha7rrvuOu3cudNp25KuWbPZbBo7dqzWrVuntm3bym63q02bNtq8eXOx+T/++GN17dpVnp6eCgsL0yuvvFLp18GtXr1aXbp0kZeXl+rXr6+7775bJ06ccFonIyNDw4cP1zXXXCO73a6goCD1799f33//vWOdXbt2KTo6WvXr15eXl5eaNm2qESNGlHmODz74QB07dpSnp6dat26td9991/Hct99+K5vNpueee67Ydtu3b5fNZtOKFSvKv/MluHgN3eXm+e1cd955p+rVq6datWqpR48e+t///d9i650/f14zZ87UtddeK09PTwUFBWngwIH65ptviq1b2vcUAPzZ8EeaAFCN/fzzz+rbt68GDx6su+++WwEBAZKkpUuXqk6dOpo4caLq1KmjDz/8UNOnT1dubq6eeeaZUl93+fLlOnPmjP7xj3/IZrPp6aef1sCBA/Xtt9+Wejbus88+07vvvqvRo0fL29tb8+fPV2xsrI4fPy5/f39J0p49e9SnTx8FBQXpscceU2FhoWbNmqUGDRpc+UH5/5YuXarhw4fruuuu05w5c5SZmakXXnhBn3/+ufbs2SM/Pz9JUmxsrA4ePKhx48YpNDRUWVlZSkxM1PHjxx1f33zzzWrQoIEmTZokPz8/ff/99yUGTkmOHDmiQYMG6d5771V8fLyWLFmiO++8U5s3b9Zf//pXNWvWTL169VJCQoIeeOABp20TEhLk7e2t/v37l/o+586d08mTJ4st9/PzczoDWto8kpSZmamePXvq3Llzuv/+++Xv76833nhDt99+u9asWaMBAwZIkgoLC3XrrbcqKSlJgwcP1vjx43XmzBklJibqwIEDCgsLc7zvlXxPAUCVZQEA/vTGjBlj/f4/+b1797YkWYsWLSq2/rlz54ot+8c//mHVqlXLOn/+vGNZfHy81aRJE8fX3333nSXJ8vf3t06dOuVY/t5771mSrPfff9+xbMaMGcVmkmR5eHhYR48edSzbt2+fJcl68cUXHctuu+02q1atWtaJEyccy44cOWK5u7sXe82SxMfHW7Vr177k8xcuXLAaNmxotW3b1vrll18cyzds2GBJsqZPn25ZlmWdPn3akmQ988wzl3yttWvXWpKsnTt3ljrX7zVp0sSSZL3zzjuOZTk5OVZQUJDVqVMnx7JXXnnFkmQdOnTIaR/q169vxcfHX/Y9Lv4zu9QjOTm53PNMmDDBkmR9+umnjmVnzpyxmjZtaoWGhlqFhYWWZVnW66+/bkmynn322WJzFRUVOc1Xlu8pAPiz4WOQAFCN2e12DR8+vNhyLy8vx9+fOXNGJ0+e1A033KBz587p8OHDpb7uoEGDVLduXcfXN9xwg6RfPxpXmqioKKczKu3bt5ePj49j28LCQm3dulUxMTEKDg52rNe8eXP17du31Ncvi127dikrK0ujR4+Wp6enY3m/fv0UHh7u+Difl5eXPDw89PHHH+v06dMlvtbFM3AbNmxQQUFBuWcJDg52nImSJB8fHw0dOlR79uxRRkaGJOmuu+6Sp6enEhISHOtt2bJFJ0+eLPN1aKNGjVJiYmKxR+vWrcs9z8aNG9WtWzddf/31jvXq1KmjUaNG6fvvv9dXX30lSXrnnXdUv359jRs3rtg8v/8465V8TwFAVUWsAUA11qhRI3l4eBRbfvDgQQ0YMEC+vr7y8fFRgwYNHD/05+TklPq6jRs3dvr64g/Zlwqay217cfuL22ZlZemXX35R8+bNi61X0rKKOHbsmCSpZcuWxZ4LDw93PG+32zV37lxt2rRJAQEB+stf/qKnn37aES2S1Lt3b8XGxuqxxx5T/fr11b9/fy1ZskT5+fllmqV58+bFwuXaa6+VJMd1cX5+frrtttu0fPlyxzoJCQlq1KiRbrrppjK9T4sWLRQVFVXs4ePjU+55jh07VuKxu3j30YvH75tvvlHLli3LdKOZK/meAoCqilgDgGrst2fQLsrOzlbv3r21b98+zZo1S++//74SExM1d+5cSSrTrfpr1KhR4nLLsq7qtq4wYcIEff3115ozZ448PT01bdo0tWrVSnv27JH06xmiNWvWKDk5WWPHjtWJEyc0YsQIdenSRWfPnq20OYYOHapvv/1W27dv15kzZ7R+/XrFxcXJze3P8b/6qvZ9AQCV4c/xX3AAQKX5+OOP9fPPP2vp0qUaP368br31VkVFRTl9BM2VGjZsKE9PTx09erTYcyUtq4gmTZpIklJTU4s9l5qa6nj+orCwMD344IP64IMPdODAAV24cEHz5s1zWqdHjx564okntGvXLiUkJOjgwYNauXJlqbMcPXq0WJB8/fXXkuR0J84+ffqoQYMGSkhI0Nq1a3Xu3Dndc889Zdrf8ijLPE2aNCnx2F38CO3F4xcWFqbU1NQKfTwUAKoDYg0A4OTiGYzf/kB+4cIFvfzyy64ayUmNGjUUFRWldevWKT093bH86NGj2rRpU6W8R9euXdWwYUMtWrTI6eOKmzZt0qFDh9SvXz9Jv95B8fz5807bhoWFydvb27Hd6dOni8VNx44dJalMH4VMT0/X2rVrHV/n5uZq2bJl6tixowIDAx3L3d3dFRcXp7fffltLly5Vu3bt1L59+/LteBmUZZ5bbrlFO3bsUHJysmO9vLw8LV68WKGhoY7r4GJjY3Xy5EktWLCg2PtwxgwAuHU/AOB3evbsqbp16yo+Pl7333+/bDab3nzzTaN+eJ45c6Y++OAD9erVS/fdd58KCwu1YMECtW3bVnv37i3TaxQUFOjxxx8vtrxevXoaPXq05s6dq+HDh6t3796Ki4tz3Lo/NDTUcYv8r7/+WpGRkbrrrrvUunVrubu7a+3atcrMzNTgwYMlSW+88YZefvllDRgwQGFhYTpz5oxeffVV+fj46JZbbil1zmuvvVYjR47Uzp07FRAQoNdff12ZmZlasmRJsXWHDh2q+fPn66OPPnJ8bLWsdu/erbfeeqvY8rCwMEVERJRrnkmTJmnFihXq27ev7r//ftWrV09vvPGGvvvuO73zzjuOj2YOHTpUy5Yt08SJE7Vjxw7dcMMNysvL09atWzV69Ogy/coBAPgzI9YAAE78/f21YcMGPfjgg5o6darq1q2ru+++W5GRkYqOjnb1eJKkLl26aNOmTXrooYc0bdo0hYSEaNasWTp06FCZ7lYp/Xq2cNq0acWWh4WFafTo0Ro2bJhq1aqlp556So888ohq166tAQMGaO7cuY47PIaEhCguLk5JSUl688035e7urvDwcL399tuKjY2V9OsNRnbs2KGVK1cqMzNTvr6+6tatmxISEtS0adNS52zRooVefPFFPfzww0pNTVXTpk21atWqEv9ZdOnSRW3atNGhQ4c0ZMiQMh2Hi1asWFHiL8+Oj493irWyzBMQEKDt27frkUce0Ysvvqjz58+rffv2ev/99x1nJaVfz5Ju3LhRTzzxhJYvX6533nlH/v7+uv7669WuXbtyzQ8Af0Y2y6Q/KgUA4ArExMTo4MGDOnLkiKtHcZlOnTqpXr16SkpKqvTXDg0NVdu2bbVhw4ZKf20AQHFcswYAqJJ++eUXp6+PHDmijRs36sYbb3TNQAbYtWuX9u7dq6FDh7p6FABAJeBjkACAKqlZs2YaNmyYmjVrpmPHjmnhwoXy8PDQP//5T1eP9oc7cOCAUlJSNG/ePAUFBWnQoEGuHgkAUAmINQBAldSnTx+tWLFCGRkZstvtioiI0JNPPqkWLVq4erQ/3Jo1azRr1iy1bNlSK1askKenp6tHAgBUAq5ZAwAAAAADcc0aAAAAABiIWAMAAAAAA3HNWiUoKipSenq6vL29ZbPZXD0OAAAAABexLEtnzpxRcHCw3Nyu7NwYsVYJ0tPTFRIS4uoxAAAAABgiLS1N11xzzRW9BrFWCby9vSX9+g/Ex8fHxdMAAAAAcJXc3FyFhIQ4GuFKEGuV4OJHH318fIg1AAAAAJVyeRQ3GAEAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwUJWLtZdeekmhoaHy9PRU9+7dtWPHjsuuv3r1aoWHh8vT01Pt2rXTxo0bL7nuvffeK5vNpueff76SpwYAAACA8qlSsbZq1SpNnDhRM2bM0O7du9WhQwdFR0crKyurxPW3b9+uuLg4jRw5Unv27FFMTIxiYmJ04MCBYuuuXbtWX3zxhYKDg6/2bgAAAABAqapUrD377LP6+9//ruHDh6t169ZatGiRatWqpddff73E9V944QX16dNHDz/8sFq1aqXZs2erc+fOWrBggdN6J06c0Lhx45SQkKCaNWv+EbsCAAAAAJdVZWLtwoULSklJUVRUlGOZm5uboqKilJycXOI2ycnJTutLUnR0tNP6RUVFuueee/Twww+rTZs2ZZolPz9fubm5Tg8AAAAAqExVJtZOnjypwsJCBQQEOC0PCAhQRkZGidtkZGSUuv7cuXPl7u6u+++/v8yzzJkzR76+vo5HSEhIOfYEAAAAAEpXZWLtakhJSdELL7ygpUuXymazlXm7yZMnKycnx/FIS0u7ilMCAAAAqI6qTKzVr19fNWrUUGZmptPyzMxMBQYGlrhNYGDgZdf/9NNPlZWVpcaNG8vd3V3u7u46duyYHnzwQYWGhl5yFrvdLh8fH6cHAAAAAFSmKhNrHh4e6tKli5KSkhzLioqKlJSUpIiIiBK3iYiIcFpfkhITEx3r33PPPfr3v/+tvXv3Oh7BwcF6+OGHtWXLlqu3MwAAAABQCndXD1AeEydOVHx8vLp27apu3brp+eefV15enoYPHy5JGjp0qBo1aqQ5c+ZIksaPH6/evXtr3rx56tevn1auXKldu3Zp8eLFkiR/f3/5+/s7vUfNmjUVGBioli1b/rE7BwAAAAC/UaVibdCgQfrpp580ffp0ZWRkqGPHjtq8ebPjJiLHjx+Xm9v/nSzs2bOnli9frqlTp2rKlClq0aKF1q1bp7Zt27pqFwAAAACgTGyWZVmuHqKqy83Nla+vr3Jycrh+DQAAAKjGKrMNqsw1awAAAABQnRBrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxU5WLtpZdeUmhoqDw9PdW9e3ft2LHjsuuvXr1a4eHh8vT0VLt27bRx40bHcwUFBXrkkUfUrl071a5dW8HBwRo6dKjS09Ov9m4AAAAAwGVVqVhbtWqVJk6cqBkzZmj37t3q0KGDoqOjlZWVVeL627dvV1xcnEaOHKk9e/YoJiZGMTExOnDggCTp3Llz2r17t6ZNm6bdu3fr3XffVWpqqm6//fY/crcAAAAAoBibZVmWq4coq+7du+u6667TggULJElFRUUKCQnRuHHjNGnSpGLrDxo0SHl5edqwYYNjWY8ePdSxY0ctWrSoxPfYuXOnunXrpmPHjqlx48Zlmis3N1e+vr7KycmRj49PBfYMAAAAwJ9BZbZBlTmzduHCBaWkpCgqKsqxzM3NTVFRUUpOTi5xm+TkZKf1JSk6OvqS60tSTk6ObDab/Pz8LrlOfn6+cnNznR4AAAAAUJmqTKydPHlShYWFCggIcFoeEBCgjIyMErfJyMgo1/rnz5/XI488ori4uMtW8Jw5c+Tr6+t4hISElHNvAAAAAODyqkysXW0FBQW66667ZFmWFi5ceNl1J0+erJycHMcjLS3tD5oSAAAAQHXh7uoByqp+/fqqUaOGMjMznZZnZmYqMDCwxG0CAwPLtP7FUDt27Jg+/PDDUj9barfbZbfbK7AXAAAAAFA2VebMmoeHh7p06aKkpCTHsqKiIiUlJSkiIqLEbSIiIpzWl6TExESn9S+G2pEjR7R161b5+/tfnR0AAAAAgHKoMmfWJGnixImKj49X165d1a1bNz3//PPKy8vT8OHDJUlDhw5Vo0aNNGfOHEnS+PHj1bt3b82bN0/9+vXTypUrtWvXLi1evFjSr6F2xx13aPfu3dqwYYMKCwsd17PVq1dPHh4ertlRAAAAANVelYq1QYMG6aefftL06dOVkZGhjh07avPmzY6biBw/flxubv93srBnz55avny5pk6dqilTpqhFixZat26d2rZtK0k6ceKE1q9fL0nq2LGj03t99NFHuvHGG/+Q/QIAAACA36tSv2fNVPyeNQAAAABSNf09awAAAABQnRBrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBKhRraWlp+uGHHxxf79ixQxMmTNDixYsrbTAAAAAAqM4qFGv//d//rY8++kiSlJGRob/+9a/asWOHHn30Uc2aNatSBwQAAACA6qhCsXbgwAF169ZNkvT222+rbdu22r59uxISErR06dLKnA8AAAAAqqUKxVpBQYHsdrskaevWrbr99tslSeHh4frxxx8rbzoAAAAAqKYqFGtt2rTRokWL9OmnnyoxMVF9+vSRJKWnp8vf379SBwQAAACA6qhCsTZ37ly98soruvHGGxUXF6cOHTpIktavX+/4eCQAAAAAoOJslmVZFdmwsLBQubm5qlu3rmPZ999/r1q1aqlhw4aVNmBVkJubK19fX+Xk5MjHx8fV4wAAAABwkcpsgwqdWfvll1+Un5/vCLVjx47p+eefV2pq6lUPtZdeekmhoaHy9PRU9+7dtWPHjsuuv3r1aoWHh8vT01Pt2rXTxo0bnZ63LEvTp09XUFCQvLy8FBUVpSNHjlzNXQAAAACAUlUo1vr3769ly5ZJkrKzs9W9e3fNmzdPMTExWrhwYaUO+FurVq3SxIkTNWPGDO3evVsdOnRQdHS0srKySlx/+/btiouL08iRI7Vnzx7FxMQoJiZGBw4ccKzz9NNPa/78+Vq0aJG+/PJL1a5dW9HR0Tp//vxV2w8AAAAAKE2FPgZZv359bdu2TW3atNG//vUvvfjii9qzZ4/eeecdTZ8+XYcOHboas6p79+667rrrtGDBAklSUVGRQkJCNG7cOE2aNKnY+oMGDVJeXp42bNjgWNajRw917NhRixYtkmVZCg4O1oMPPqiHHnpIkpSTk6OAgAAtXbpUgwcPLtNcfAwSAAAAgGTAxyDPnTsnb29vSdIHH3yggQMHys3NTT169NCxY8euaKBLuXDhglJSUhQVFeVY5ubmpqioKCUnJ5e4TXJystP6khQdHe1Y/7vvvlNGRobTOr6+vurevfslX1OS8vPzlZub6/QAAAAAgMpUoVhr3ry51q1bp7S0NG3ZskU333yzJCkrK+uqnVk6efKkCgsLFRAQ4LQ8ICBAGRkZJW6TkZFx2fUv/rU8rylJc+bMka+vr+MREhJS7v0BAAAAgMupUKxNnz5dDz30kEJDQ9WtWzdFRERI+vUsW6dOnSp1QBNNnjxZOTk5jkdaWpqrRwIAAADwJ+NekY3uuOMOXX/99frxxx8dv2NNkiIjIzVgwIBKG+636tevrxo1aigzM9NpeWZmpgIDA0vcJjAw8LLrX/xrZmamgoKCnNbp2LHjJWex2+2y2+0V2Q0AAAAAKJMKnVmTfg2dTp06KT09XT/88IMkqVu3bgoPD6+04X7Lw8NDXbp0UVJSkmNZUVGRkpKSHGf2fi8iIsJpfUlKTEx0rN+0aVMFBgY6rZObm6svv/zykq8JAAAAAH+ECsVaUVGRZs2aJV9fXzVp0kRNmjSRn5+fZs+eraKiosqe0WHixIl69dVX9cYbb+jQoUO67777lJeXp+HDh0uShg4dqsmTJzvWHz9+vDZv3qx58+bp8OHDmjlzpnbt2qWxY8dKkmw2myZMmKDHH39c69ev1/79+zV06FAFBwcrJibmqu0HAAAAAJSmQh+DfPTRR/Xaa6/pqaeeUq9evSRJn332mWbOnKnz58/riSeeqNQhLxo0aJB++uknTZ8+XRkZGerYsaM2b97suEHI8ePH5eb2f/3Zs2dPLV++XFOnTtWUKVPUokULrVu3Tm3btnWs889//lN5eXkaNWqUsrOzdf3112vz5s3y9PS8KvsAAAAAAGVRod+zFhwcrEWLFun22293Wv7ee+9p9OjROnHiRKUNWBXwe9YAAAAASAb8nrVTp06VeG1aeHi4Tp06dUUDAQAAAAAqGGsdOnTQggULii1fsGCB2rdvf8VDAQAAAEB1V6Fr1p5++mn169dPW7duddw1MTk5WWlpadq4cWOlDggAAAAA1VGFzqz17t1bX3/9tQYMGKDs7GxlZ2dr4MCBOnjwoN58883KnhEAAAAAqp0K3WDkUvbt26fOnTursLCwsl6ySuAGIwAAAAAkA24wAgAAAAC4uog1AAAAADAQsQYAAAAABirX3SAHDhx42eezs7OvZBYAAAAAwP9Xrljz9fUt9fmhQ4de0UAAAAAAgHLG2pIlS67WHAAAAACA3+CaNQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGqTKydOnVKQ4YMkY+Pj/z8/DRy5EidPXv2stucP39eY8aMkb+/v+rUqaPY2FhlZmY6nt+3b5/i4uIUEhIiLy8vtWrVSi+88MLV3hUAAAAAKFWVibUhQ4bo4MGDSkxM1IYNG/TJJ59o1KhRl93mgQce0Pvvv6/Vq1dr27ZtSk9P18CBAx3Pp6SkqGHDhnrrrbd08OBBPfroo5o8ebIWLFhwtXcHAAAAAC7LZlmW5eohSnPo0CG1bt1aO3fuVNeuXSVJmzdv1i233KIffvhBwcHBxbbJyclRgwYNtHz5ct1xxx2SpMOHD6tVq1ZKTk5Wjx49SnyvMWPG6NChQ/rwww/LPF9ubq58fX2Vk5MjHx+fCuwhAAAAgD+DymyDKnFmLTk5WX5+fo5Qk6SoqCi5ubnpyy+/LHGblJQUFRQUKCoqyrEsPDxcjRs3VnJy8iXfKycnR/Xq1bvsPPn5+crNzXV6AAAAAEBlqhKxlpGRoYYNGzotc3d3V7169ZSRkXHJbTw8POTn5+e0PCAg4JLbbN++XatWrSr145Vz5syRr6+v4xESElL2nQEAAACAMnBprE2aNEk2m+2yj8OHD/8hsxw4cED9+/fXjBkzdPPNN1923cmTJysnJ8fxSEtL+0NmBAAAAFB9uLvyzR988EENGzbssus0a9ZMgYGBysrKclr+n//8R6dOnVJgYGCJ2wUGBurChQvKzs52OruWmZlZbJuvvvpKkZGRGjVqlKZOnVrq3Ha7XXa7vdT1AAAAAKCiXBprDRo0UIMGDUpdLyIiQtnZ2UpJSVGXLl0kSR9++KGKiorUvXv3Erfp0qWLatasqaSkJMXGxkqSUlNTdfz4cUVERDjWO3jwoG666SbFx8friSeeqIS9AgAAAIArVyXuBilJffv2VWZmphYtWqSCggINHz5cXbt21fLlyyVJJ06cUGRkpJYtW6Zu3bpJku677z5t3LhRS5culY+Pj8aNGyfp12vTpF8/+njTTTcpOjpazzzzjOO9atSoUaaIvIi7QQIAAACQKrcNXHpmrTwSEhI0duxYRUZGys3NTbGxsZo/f77j+YKCAqWmpurcuXOOZc8995xj3fz8fEVHR+vll192PL9mzRr99NNPeuutt/TWW285ljdp0kTff//9H7JfAAAAAFCSKnNmzWScWQMAAAAgVcPfswYAAAAA1Q2xBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAVSbWTp06pSFDhsjHx0d+fn4aOXKkzp49e9ltzp8/rzFjxsjf31916tRRbGysMjMzS1z3559/1jXXXCObzabs7OyrsAcAAAAAUHZVJtaGDBmigwcPKjExURs2bNAnn3yiUaNGXXabBx54QO+//75Wr16tbdu2KT09XQMHDixx3ZEjR6p9+/ZXY3QAAAAAKDebZVmWq4cozaFDh9S6dWvt3LlTXbt2lSRt3rxZt9xyi3744QcFBwcX2yYnJ0cNGjTQ8uXLdccdd0iSDh8+rFatWik5OVk9evRwrLtw4UKtWrVK06dPV2RkpE6fPi0/P78yz5ebmytfX1/l5OTIx8fnynYWAAAAQJVVmW1QJc6sJScny8/PzxFqkhQVFSU3Nzd9+eWXJW6TkpKigoICRUVFOZaFh4ercePGSk5Odiz76quvNGvWLC1btkxubmU7HPn5+crNzXV6AAAAAEBlqhKxlpGRoYYNGzotc3d3V7169ZSRkXHJbTw8PIqdIQsICHBsk5+fr7i4OD3zzDNq3LhxmeeZM2eOfH19HY+QkJDy7RAAAAAAlMKlsTZp0iTZbLbLPg4fPnzV3n/y5Mlq1aqV7r777nJvl5OT43ikpaVdpQkBAAAAVFfurnzzBx98UMOGDbvsOs2aNVNgYKCysrKclv/nP//RqVOnFBgYWOJ2gYGBunDhgrKzs53OrmVmZjq2+fDDD7V//36tWbNGknTx8r369evr0Ucf1WOPPVbia9vtdtnt9rLsIgAAAABUiEtjrUGDBmrQoEGp60VERCg7O1spKSnq0qWLpF9Dq6ioSN27dy9xmy5duqhmzZpKSkpSbGysJCk1NVXHjx9XRESEJOmdd97RL7/84thm586dGjFihD799FOFhYVd6e4BAAAAQIW5NNbKqlWrVurTp4/+/ve/a9GiRSooKNDYsWM1ePBgx50gT5w4ocjISC1btkzdunWTr6+vRo4cqYkTJ6pevXry8fHRuHHjFBER4bgT5O+D7OTJk473K8/dIAEAAACgslWJWJOkhIQEjR07VpGRkXJzc1NsbKzmz5/veL6goECpqak6d+6cY9lzzz3nWDc/P1/R0dF6+eWXXTE+AAAAAJRLlfg9a6bj96wBAAAAkKrh71kDAAAAgOqGWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICBiDUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFgDAAAAAAMRawAAAABgIGINAAAAAAxErAEAAACAgYg1AAAAADAQsQYAAAAABiLWAAAAAMBAxBoAAAAAGIhYAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIHcXT3An4FlWZKk3NxcF08CAAAAwJUuNsHFRrgSxFolOHPmjCQpJCTExZMAAAAAMMHPP/8sX1/fK3oNm1UZyVfNFRUVKT09Xd7e3rLZbK4ep0rKzc1VSEiI0tLS5OPj4+pxqgSOWflxzMqPY1Z+HLPy45iVH8es/Dhm5ccxq5icnBw1btxYp0+flp+f3xW9FmfWKoGbm5uuueYaV4/xp+Dj48N/DMqJY1Z+HLPy45iVH8es/Dhm5ccxKz+OWflxzCrGze3Kbw/CDUYAAAAAwEDEGgAAAAAYiFiDEex2u2bMmCG73e7qUaoMjln5cczKj2NWfhyz8uOYlR/HrPw4ZuXHMauYyjxu3GAEAAAAAAzEmTUAAAAAMBCxBgAAAAAGItYAAAAAwEDEGgAAAAAYiFiDS33yySe67bbbFBwcLJvNpnXr1rl6JOPNmTNH1113nby9vdWwYUPFxMQoNTXV1WMZbeHChWrfvr3jl3pGRERo06ZNrh6rynjqqadks9k0YcIEV49itJkzZ8pmszk9wsPDXT2W8U6cOKG7775b/v7+8vLyUrt27bRr1y5Xj2Ws0NDQYt9nNptNY8aMcfVoxiosLNS0adPUtGlTeXl5KSwsTLNnzxb32Lu8M2fOaMKECWrSpIm8vLzUs2dP7dy509VjGaO0n2Ety9L06dMVFBQkLy8vRUVF6ciRI+V+H2INLpWXl6cOHTropZdecvUoVca2bds0ZswYffHFF0pMTFRBQYFuvvlm5eXluXo0Y11zzTV66qmnlJKSol27dummm25S//79dfDgQVePZrydO3fqlVdeUfv27V09SpXQpk0b/fjjj47HZ5995uqRjHb69Gn16tVLNWvW1KZNm/TVV19p3rx5qlu3rqtHM9bOnTudvscSExMlSXfeeaeLJzPX3LlztXDhQi1YsECHDh3S3Llz9fTTT+vFF1909WhG+9vf/qbExES9+eab2r9/v26++WZFRUXpxIkTrh7NCKX9DPv0009r/vz5WrRokb788kvVrl1b0dHROn/+fPneyAIMIclau3atq8eocrKysixJ1rZt21w9SpVSt25d61//+perxzDamTNnrBYtWliJiYlW7969rfHjx7t6JKPNmDHD6tChg6vHqFIeeeQR6/rrr3f1GFXa+PHjrbCwMKuoqMjVoxirX79+1ogRI5yWDRw40BoyZIiLJjLfuXPnrBo1algbNmxwWt65c2fr0UcfddFU5vr9z7BFRUVWYGCg9cwzzziWZWdnW3a73VqxYkW5Xpsza0AVl5OTI0mqV6+eiyepGgoLC7Vy5Url5eUpIiLC1eMYbcyYMerXr5+ioqJcPUqVceTIEQUHB6tZs2YaMmSIjh8/7uqRjLZ+/Xp17dpVd955pxo2bKhOnTrp1VdfdfVYVcaFCxf01ltvacSIEbLZbK4ex1g9e/ZUUlKSvv76a0nSvn379Nlnn6lv374unsxc//nPf1RYWChPT0+n5V5eXnxioAy+++47ZWRkOP3/09fXV927d1dycnK5Xsu9socD8McpKirShAkT1KtXL7Vt29bV4xht//79ioiI0Pnz51WnTh2tXbtWrVu3dvVYxlq5cqV2797N9Qnl0L17dy1dulQtW7bUjz/+qMcee0w33HCDDhw4IG9vb1ePZ6Rvv/1WCxcu1MSJEzVlyhTt3LlT999/vzw8PBQfH+/q8Yy3bt06ZWdna9iwYa4exWiTJk1Sbm6uwsPDVaNGDRUWFuqJJ57QkCFDXD2asby9vRUREaHZs2erVatWCggI0IoVK5ScnKzmzZu7ejzjZWRkSJICAgKclgcEBDieKytiDajCxowZowMHDvCnXGXQsmVL7d27Vzk5OVqzZo3i4+O1bds2gq0EaWlpGj9+vBITE4v9qSou7bd/St++fXt1795dTZo00dtvv62RI0e6cDJzFRUVqWvXrnryySclSZ06ddKBAwe0aNEiYq0MXnvtNfXt21fBwcGuHsVob7/9thISErR8+XK1adNGe/fu1YQJExQcHMz32WW8+eabGjFihBo1aqQaNWqoc+fOiouLU0pKiqtHq1b4GCRQRY0dO1YbNmzQRx99pGuuucbV4xjPw8NDzZs3V5cuXTRnzhx16NBBL7zwgqvHMlJKSoqysrLUuXNnubu7y93dXdu2bdP8+fPl7u6uwsJCV49YJfj5+enaa6/V0aNHXT2KsYKCgor9gUmrVq34+GgZHDt2TFu3btXf/vY3V49ivIcffliTJk3S4MGD1a5dO91zzz164IEHNGfOHFePZrSwsDBt27ZNZ8+eVVpamnbs2KGCggI1a9bM1aMZLzAwUJKUmZnptDwzM9PxXFkRa0AVY1mWxo4dq7Vr1+rDDz9U06ZNXT1SlVRUVKT8/HxXj2GkyMhI7d+/X3v37nU8unbtqiFDhmjv3r2qUaOGq0esEs6ePatvvvlGQUFBrh7FWL169Sr2q0e+/vprNWnSxEUTVR1LlixRw4YN1a9fP1ePYrxz587Jzc35R94aNWqoqKjIRRNVLbVr11ZQUJBOnz6tLVu2qH///q4eyXhNmzZVYGCgkpKSHMtyc3P15Zdflvt6eT4GCZc6e/as0586f/fdd9q7d6/q1aunxo0bu3Ayc40ZM0bLly/Xe++9J29vb8dnn319feXl5eXi6cw0efJk9e3bV40bN9aZM2e0fPlyffzxx9qyZYurRzOSt7d3sWsga9euLX9/f66NvIyHHnpIt912m5o0aaL09HTNmDFDNWrUUFxcnKtHM9YDDzygnj176sknn9Rdd92lHTt2aPHixVq8eLGrRzNaUVGRlixZovj4eLm786NcaW677TY98cQTaty4sdq0aaM9e/bo2Wef1YgRI1w9mtG2bNkiy7LUsmVLHT16VA8//LDCw8M1fPhwV49mhNJ+hp0wYYIef/xxtWjRQk2bNtW0adMUHBysmJiY8r1R5dywEqiYjz76yJJU7BEfH+/q0YxV0vGSZC1ZssTVoxlrxIgRVpMmTSwPDw+rQYMGVmRkpPXBBx+4eqwqhVv3l27QoEFWUFCQ5eHhYTVq1MgaNGiQdfToUVePZbz333/fatu2rWW3263w8HBr8eLFrh7JeFu2bLEkWampqa4epUrIzc21xo8fbzVu3Njy9PS0mjVrZj366KNWfn6+q0cz2qpVq6xmzZpZHh4eVmBgoDVmzBgrOzvb1WMZo7SfYYuKiqxp06ZZAQEBlt1utyIjIyv076zNsvj17QAAAABgGq5ZAwAAAAADEWsAAAAAYCBiDQAAAAAMRKwBAAAAgIGINQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAwIVsNpvWrVvn6jEAAAYi1gAA1dawYcNks9mKPfr06ePq0QAAkLurBwAAwJX69OmjJUuWOC2z2+0umgYAgP/DmTUAQLVmt9sVGBjo9Khbt66kXz+iuHDhQvXt21deXl5q1qyZ1qxZ47T9/v37ddNNN8nLy0v+/v4aNWqUzp4967TO66+/rjZt2shutysoKEhjx451ev7kyZMaMGCAatWqpRYtWmj9+vVXd6cBAFUCsQYAwGVMmzZNsbGx2rdvn4YMGaLBgwfr0KFDkqS8vDxFR0erbt262rlzp1avXq2tW7c6xdjChQs1ZswYjRo1Svv379f69evVvHlzp/d47LHHdNddd+nf//63brnlFg0ZMkSnTp36Q/cTAGAem2VZlquHAADAFYYNG6a33npLnp6eTsunTJmiKVOmyGaz6d5779XChQsdz/Xo0UOdO3fWyy+/rFdffVWPPPKI0tLSVLt2bUnSxo0bddtttyk9PV0BAQFq1KiRhg8frscff7zEGWw2m6ZOnarZs2dL+jUA69Spo02bNnHtHABUc1yzBgCo1v7rv/7LKcYkqV69eo6/j4iIcHouIiJCe/fulSQdOnRIHTp0cISaJPXq1UtFRUVKTU2VzWZTenq6IiMjLztD+/btHX9fu3Zt+fj4KCsrq6K7BAD4kyDWAADVWu3atYt9LLGyeHl5lWm9mjVrOn1ts9lUVFR0NUYCAFQhXLMGAMBlfPHFF8W+btWqlSSpVatW2rdvn/Ly8hzPf/7553Jzc1PLli3l7e2t0NBQJSUl/aEzAwD+HDizBgCo1vLz85WRkeG0zN3dXfXr15ckrV69Wl27dtX111+vhIQE7dixQ6+99pokaciQIZoxY4bi4+M1c+ZM/fTTTxo3bpzuueceBQQESJJmzpype++9Vw0bNlTfvn115swZff755xo3btwfu6MAgCqHWAMAVGubN29WUFCQ07KWLVvq8OHDkn69U+PKlSs1evRoBQUFacWKFWrdurUkqVatWtqyZYvGjx+v6667TrVq1VJsbKyeffZZx2vFx8fr/Pnzeu655/TQQw+pfv36uuOOO/64HQQAVFncDRIAgEuw2Wxau3atYmJiXD0KAKAa4po1AAAAADAQsQYAAAAABuKaNQAALoErBQAArsSZNQAAAAAwELEGAAAAAAYi1gAAAADAQMQaAAAAABiIWAMAAAAAAxFrAAAAAGAgYg0AAAAADESsAQAAAICB/h9x+idSlLmpdgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -175,6 +691,13 @@ "plt.xticks(epochs_list)\n", "plt.show()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/norch/__pycache__/tensor.cpython-38.pyc b/norch/__pycache__/tensor.cpython-38.pyc index 92de5802f744c677d973b17b28e9a0a9761ffd8d..45abd37a6e25c4ec09757980a929bbc399ecda78 100644 GIT binary patch delta 953 zcmaKq&rcIk5XU?Hv8`PzrAvRM1r`AVb z5=llq5e04902U=h@2t3qK_XoL&+Ls+$*XLWK9K_K+u z^P&;%BDuK&^w?Wi{(Dadc2IOU(dw;>EFW3XWVyIrDah*PfO*!eCRNC6A+t7SZOjVk zwJf9rwqkEekhhhhtR@R{S{AY6tk>;!#CgTA%qhkdP)w;qDM$P;*<}ZIIf{*YJ+Rwb zRJAX;2bipiu8F3P;yY)9F{U3GyAg=tZ|5Ym;kc_8*LeeOyIRrg z_Hu)i7)Qz74`!?>^{bn157^r%Iz$K(jD#pIip7w?HBqt+Q$S>Rsh2CsPpYk+XIg%M z{7Zz(xDpa_>P>*6s|w3Yj&XTe>?~P@k=#)jN^kwI*%&qBQ=}&nuH=e-iD$L^!Gv~{ z%*8lb-VagyP~O8QDYK4HOX(P>Sg@qovRb=0YA*V>Bfgd1!2aKE`Fyx^B9X6C zZ71C%B>5A3_Mf8H{-?mvOv5@{GP~4xtpw14kLngoG5yfg*o1sfEek#|zyv-Hl;X$J zJ6tPCw9r;V1UExvEd5g`%r2`CZkTDHkEaM>!Wlw@&`!wR?-+TbgsX&WgzE&_Fj*!j zgh|2_;WlBKaEEZ0FhiIn+$YQt<~4#w^VyV^$J0q!$;b~VDA1(%Gdu_nv9oF553Qo< AtN;K2 delta 822 zcmaLV%TE(g6bInmK8DAnfN5)=v{h(KYok-GSZN`t&=SK2g9tuQDYV)OQilR91Q8$c zotT`sGX~ws!bc`9SZFjD{|Cpoa^XU^Y)nYJzbO*q!dZN|bLX5hC+FT5m6eKlz-+G9 z@n`L0Pp;#&`K!oO<%j4nFqMpr5=+p5#&wpYh}oiaHkGigSYqrX{j@x5I?nUtL0|zV z=!tbqIE`hJmJ(L-*gBODZl|7R?Oj3#_S5v<-d3X;$MO>ql{W0tEJag}0eb3n(Rar# zlPvKlYH)glEW$G+IfqE{MU+*io7qy>%Yi7U0cjfcdQ9?pzNTf-Mn1RIb^#y!oaaV4 zfOUaGFJmqx{^LI%KQ7#-4ub_Y*R2zC5R+vz2 zi06c8c~7RAr)=NrL?KDah)aJZ;TpV>9x(y^j2h^1y+aw@7iO%N9`1ios~Shj`6>A( z<$^nvo~UdR$~-Q(jn47&{e0+?s|&S~;Gd~?(`x$;Ugb-BoL@0}ylwFyqGBKc4ufuR z1ZcNx7^{n50u;ezfEmiOpaSN=0$2oB!8LFl+yJ-0ZEy$N)ivmJYHd-TEN10WMZQOB Lyv*)Xf8x|{PBO^g diff --git a/norch/nn/__pycache__/loss.cpython-38.pyc b/norch/nn/__pycache__/loss.cpython-38.pyc index 170a29b4b95611e278c5932f02719b7679e906db..a39202c7182c730dfc171bf4b535752507f08ad9 100644 GIT binary patch delta 39 tcmeC+?&0PR<>lpK00QGX?i;xS85!*+$1lpK0D|~FtBu@&jEq*3V;R+$)AI8-cQG=t004o?2f+XU diff --git a/test.py b/test.py index 89801e0..92d779d 100644 --- a/test.py +++ b/test.py @@ -3,7 +3,7 @@ import norch W1 = norch.Tensor([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]], requires_grad=True) # A has shape 10x1 X = norch.Tensor([[1, 2, 3, 4, 5]]) # B has shape 1x5 B1 = norch.Tensor([[1, 2, 3, 4, 5], [2, 1, 2, 3, 4], [3, 1,2,3, 4], [4, 1, 1, 1, 1,], [5,1,1,1,1], [6,1,1,1,1], [7,1,1,1,1], [8,1,1,1,1], [9,1,1,1,1], [10,1,1,1,1]], requires_grad=True) - +B1 = norch.Tensor([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]], requires_grad=True) # A has shape 10x1 W2 = norch.Tensor([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]], requires_grad=True).T B2 = norch.Tensor([[1, 2, 3, 4, 5]], requires_grad=True) @@ -13,12 +13,80 @@ Z1 = W1 @ X + B1 # Perform matrix multiplication -Z2 = W2 @ Z1 + B2 +Z2 = W2 @ Z1 * B2 print(Z2.shape) l = Z2.sum() l.backward() -#print(l) +print(l) -print("Resulting matrix shape:", W1.grad) +print("Resulting matrix shape:", B1.grad) + +"""import norch +import norch.nn as nn +import norch.optim as optim +import random +import math + +random.seed(1) + +class MyModel(nn.Module): + def __init__(self): + super(MyModel, self).__init__() + self.fc1 = nn.Linear(1, 10) + self.sigmoid = nn.Sigmoid() + self.fc2 = nn.Linear(10, 1) + + def forward(self, x): + out = self.fc1(x) + out = self.sigmoid(out) + out = self.fc2(out) + + return out + +device = "cpu" +epochs = 1 + +model = MyModel().to(device) +criterion = nn.MSELoss() +optimizer = optim.SGD(model.parameters(), lr=0.001) +loss_list = [] + +x_values = [[0., 1], [0., 1], [0., 1], [0., 1], [0., 1], [0., 1], [0., 1], [0., 1], [0., 1], [0., 1]] + +y_true = [] +for x in x_values: + y_true.append([math.pow(math.sin(x[0]), 2), math.pow(math.sin(x[1]), 2)]) + +batch_size = 5 + + +for epoch in range(epochs): + for x, target in zip(x_values, y_true): + x = norch.Tensor([x]) + target = norch.Tensor([target]) + + x = x.to(device) + target = target.to(device) + + outputs = model(x) + + loss = criterion(outputs, target) + + optimizer.zero_grad() + loss.backward() + optimizer.step() + + print('loss', loss, '\n\n') + print('weight', model.fc1.weight, '\n\n') + print('bias', model.fc1.bias, '\n\n') + + + if math.isnan(loss[0]): + print("Kkkkkkkkk") + exit() + + #print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss[0]:.4f}') + loss_list.append(loss[0]) +""" \ No newline at end of file