diff --git a/doc/source/samples/grid and battery/battery_own_consumption.ipynb b/doc/source/samples/grid and battery/battery_own_consumption.ipynb index 70f5c0a..d890563 100644 --- a/doc/source/samples/grid and battery/battery_own_consumption.ipynb +++ b/doc/source/samples/grid and battery/battery_own_consumption.ipynb @@ -20,6 +20,12 @@ "metadata": {}, "outputs": [], "source": [ + "import os, sys\n", + "# in case eao is not installed, set path\n", + "myDir = os.path.join(os.getcwd(), '../..')\n", + "sys.path.append(myDir)\n", + "addDir = os.path.join(os.getcwd(), '../../../..')\n", + "sys.path.append(addDir)\n", "import eaopack as eao\n", "import pandas as pd\n", "import datetime as dt\n", @@ -77,7 +83,7 @@ "## basics\n", "S = dt.date(2023,11,1)\n", "E = dt.date(2024,11,1)\n", - "timegrid = eao.assets.Timegrid(S, E, freq = 'h') # hourly\n", + "timegrid = eao.Timegrid(S, E, freq = 'h') # hourly\n", "\n", "## settings\n", "input_ts = pd.DataFrame()\n", @@ -103,8 +109,8 @@ "outputs": [], "source": [ "### Structural setup, distinguishing own assets and supply from the grid\n", - "behind_meter = eao.assets.Node('behind meter')\n", - "front_of_meter = eao.assets.Node('front of meter')\n", + "behind_meter = eao.Node('behind meter')\n", + "front_of_meter = eao.Node('front of meter')\n", "\n", "### Here: No flexibility in our consumption. Easily changed by adjusting min_cap/max_cap\n", "consumption = eao.assets.SimpleContract(name = 'consumption', \n", @@ -156,7 +162,7 @@ " price = 'price', # assuming no feed in tariff\n", " min_cap = -1000,\n", " max_cap = 0)\n", - "portf = eao.portfolio.Portfolio([supply, consumption, grid_feedin, grid_consumption, pv, feedin, battery])" + "portf = eao.Portfolio([supply, consumption, grid_feedin, grid_consumption, pv, feedin, battery])" ] }, { @@ -173,7 +179,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGbCAYAAABZBpPkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlfElEQVR4nO3deXxU1f3/8ddMkslKVkKQNYQlYQ8CskgAF3aQgNW6iwoUl1pbbS3VorZ1abU/laKioojbV0XZREVl30EQZE0ghABJWBKyr5OZub8/0kwJCSEJ2fN+Ph48au7cufdzJ+nMe8459xyTYRgGIiIi0myZ67sAERERqV8KAyIiIs2cwoCIiEgzpzAgIiLSzCkMiIiINHMKAyIiIs2cwoCIiEgzpzAgIiLSzCkMiIiINHMKAyLVMG3aNHx8fOq7jBpVE9f08ssvExYWhouLC5GRkTVTWCPw0UcfERERgZubG/7+/lV67rRp0wgNDS21zWQy8eyzz9ZYfSKXozAgNeKDDz7AZDLh4eFBUlJSmcdHjhxJr169qnXsTz/9lNdee+0KK5Ta9sMPP/CnP/2Ja6+9loULF/LCCy/Ud0k1Jjk5mWeffZa9e/eWeSwmJoZp06bRuXNn3n33Xd555526L1DkCrnWdwHStBQWFvLSSy/xn//8p8aO+emnn3LgwAEee+yxGjum1Ly1a9diNpt57733sFgs9V1OjUpOTua5554jNDS0TIvH+vXrcTgcvP7663Tp0qVGzpefn4+rq96epe6oZUBqVGRkJO+++y7Jycn1XUqtyM3Nrdfz22w2rFZrvdZwKefOncPT07PGgoBhGOTn59fIsaqrMq/3uXPnAKrcPVARDw8PhQGpUwoDUqP+8pe/YLfbeemllyq1/8cff0z//v3x9PQkMDCQ2267jVOnTjkfHzlyJN988w0nTpzAZDJhMpkIDQ3FMAxatmzJH/7wB+e+DocDf39/XFxcyMjIcG7/5z//iaurKzk5Oc5ta9euJSoqCm9vb/z9/Zk8eTKHDx8uVduzzz6LyWTi0KFD3HHHHQQEBDBs2LBLXsvevXsJDg5m5MiRpc5VnsWLF9OjRw88PDzo1asXS5cuLdN3nJCQgMlk4pVXXuG1116jc+fOuLu7c+jQIaxWK3PmzKF///74+fnh7e1NVFQU69atK3WeC4/x6quv0rFjRzw9PRkxYgQHDhwot7akpCSio6Px8fEhODiYJ554ArvdXuH1mEwmFi5cSG5urvP39MEHHwDFH6h///vfnfWHhobyl7/8hcLCwlLHCA0NZeLEiXz//fcMGDAAT09P3n777Uues6Traffu3QwdOhRPT086derE/Pnzy+x77tw5HnjgAUJCQvDw8KBv374sWrTokq/Vha/3m2++ycCBAwG47777Sl1faGgozzzzDADBwcFl+vrffPNNevbsibu7O23atOHhhx8u9bdZ0et58ZiBPXv2MG7cOHx9ffHx8eGGG25g+/btlz2WSGUoekqN6tSpE/fccw/vvvsuf/7zn2nTps0l933++ef561//yq233sr06dNJSUnhP//5D8OHD2fPnj34+/vz1FNPkZmZSWJiIq+++ioAPj4+mEwmrr32WjZu3Og83r59+8jMzMRsNrNlyxYmTJgAwKZNm+jXr59zcNzq1asZN24cYWFhPPvss+Tn5/Of//yHa6+9lp9//rnMYK5bbrmFrl278sILL3CpFb9/+uknxowZw4ABA1i+fDmenp6XvO5vvvmGX//61/Tu3ZsXX3yR9PR0HnjgAdq2bVvu/gsXLqSgoICZM2fi7u5OYGAgWVlZLFiwgNtvv50ZM2aQnZ3Ne++9x5gxY9i5c2eZpuwPP/yQ7OxsHn74YQoKCnj99de5/vrr2b9/PyEhIc797HY7Y8aMYdCgQbzyyiusXr2af//733Tu3JkHH3zwktf00Ucf8c4777Bz504WLFgAwNChQwGYPn06ixYt4le/+hWPP/44O3bs4MUXX+Tw4cMsXbq01HFiY2O5/fbb+c1vfsOMGTMIDw+/5DkB0tPTGT9+PLfeeiu33347X3zxBQ8++CAWi4X7778fKG5yHzlyJHFxcTzyyCN06tSJxYsXM23aNDIyMvjd735X4es9ZcoUsrOzmTNnDjNnziQqKsp5fa+99hoffvghS5cu5a233sLHx4c+ffoAxWHyueee48Ybb+TBBx8kNjaWt956i59++oktW7bg5uZW4bVd6ODBg0RFReHr68uf/vQn3NzcePvttxk5ciQbNmxg0KBBlT6WSLkMkRqwcOFCAzB++ukn49ixY4arq6vx6KOPOh8fMWKE0bNnT+fPCQkJhouLi/H888+XOs7+/fsNV1fXUtsnTJhgdOzYscw5X375ZcPFxcXIysoyDMMw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W1c4wZGISG1RGBCpYwEBAfTv358FCxaQkpKCt7c3EyZM4KWXXiIoKKi+yxORZkhjBkRERJo5jRkQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBERKSZUxgQERFp5hQGREREmjmFARERkWZOYUBEGhWHw4HNZsMwjPouRaTJcK3vAkREKmIYBqdPnyYhIYEzZ86QkZGBYRi4urrSsmVLrrrqKjp37oyfn199lyrSaJkMxWsRaaBSUlLYunUrp0+fxmaz4eLigpubGyaTCYfDQVFREXa7HQ8PD7p27cqgQYPw9PSs77JFGh2FARFpcAzD4ODBg2zfvp2CggJ8fHywWCyYTKZy983Pzyc/P5/AwECuv/56WrduXQ9VizReCgMi0uDs27ePrVu3YjKZaNGiRbkh4GIOh4P09HR8fHwYN24cISEhdVCpSNOgAYQi0qCcOXOGHTt2YDab8fX1rVQQADCbzQQGBpKTk8P69espLCys5UpFmg6FARFpMBwOB1u2bMFqteLj41Pl55tMJvz9/UlJSWHPnj21UKFI06QwICJ1bvny5XTv3p3IyEj279/v3H7q1CnOnTtX6a6BC5/36KOPApCVlcXrr79OTEwMBQUFNV67SFOkMCAidW7+/PnMmTOHvXv30rt3b+f2Y8eOYbfbcXNzq/axAwICePbZZ8nNzSUhIaEGqhVp+jTPgIjUqUcffZRNmzYRExPDf/7zH15//XWefPJJsrKySE1NZcyYMYwcORKAX375haVLl2K1WjGbzdx+++307NkTgC+//JItW7bg6elJZGSk8/gpKSnMnj2bf/3rX6SmpmIymXj++edZtmwZKSkpzJkzh/vuu68erlyk4VIYEJE6NXfuXPbt28djjz3GyJEjue666/j222/x8/Nj/vz5PP/88/Tp04eioiK++uor/vznP+Pl5cWZM2f429/+xuuvv86BAwfYsWMHzz//PJ6enrz55ptlzmM2m0lNTQXA3d2dnTt3EhMTw8CBA7n77rtxddXbn0gJ/b9BROrN1q1biY+PZ9y4cc5bAwFOnz5NcnIyZ8+e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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGbCAYAAABZBpPkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABr8ElEQVR4nO3deVxU9f7H8des7MiOO4sLoCAYLii4pKapZWZpe1m2L15bbmb109vtlu2WdcvKrlm2m0urlmYmiLsICiIoKIgssu/DzJzfH8Qk4S4wwHyej8d93Dhz5pzPGUbmPd/zXVSKoigIIYQQwmaprV2AEEIIIaxLwoAQQghh4yQMCCGEEDZOwoAQQghh4yQMCCGEEDZOwoAQQghh4yQMCCGEEDZOwoAQQghh4yQMCCGEEDZOwoAQF2HmzJk4Oztbu4xm1RzX9OqrrxIYGIhGoyEiIqJ5CmsHPv30U4KDg9HpdLi5uV3Qc2fOnIm/v3+jbSqVin/961/NVp8Q5yJhQDSLjz/+GJVKhb29PcePH2/y+OjRowkNDb2oY3/++ee8+eabl1ihaGm//PILTz75JNHR0SxbtowXX3zR2iU1m5ycHP71r3+RkJDQ5LGDBw8yc+ZMevXqxYcffsgHH3zQ+gUKcYm01i5AdCy1tbW89NJLvP322812zM8//5z9+/czZ86cZjumaH6//fYbarWajz76CL1eb+1ymlVOTg7PPfcc/v7+TVo8fv/9d8xmM2+99Ra9e/dulvNVV1ej1cqfZ9F6pGVANKuIiAg+/PBDcnJyrF1Ki6isrLTq+Y1GIwaDwao1nEl+fj4ODg7NFgQURaG6urpZjnWxzuf1zs/PB7jg2wNnY29vL2FAtCoJA6JZPf3005hMJl566aXz2n/FihVERkbi4OCAh4cHN954I1lZWZbHR48ezY8//sjRo0dRqVSoVCr8/f1RFAUvLy8ee+wxy75msxk3Nzc0Gg0lJSWW7S+//DJarZaKigrLtt9++40RI0bg5OSEm5sb11xzDSkpKY1q+9e//oVKpSI5OZmbb74Zd3d3YmJizngtCQkJeHt7M3r06EbnOp1vvvmGfv36YW9vT2hoKKtXr25y7zgzMxOVSsVrr73Gm2++Sa9evbCzsyM5ORmDwcD8+fOJjIykU6dOODk5MWLECDZt2tToPKceY9GiRfj5+eHg4MCoUaPYv3//aWs7fvw4U6dOxdnZGW9vb5544glMJtNZr0elUrFs2TIqKystv6ePP/4YqP9Aff755y31+/v78/TTT1NbW9voGP7+/lx11VWsX7+eQYMG4eDgwPvvv3/Gczbcetq9ezfDhw/HwcGBgIAAlixZ0mTf/Px8Zs2aha+vL/b29oSHh7N8+fIzvlanvt7vvvsugwcPBuDOO+9sdH3+/v4sWLAAAG9v7yb3+t9991369++PnZ0dXbt25aGHHmr03jzb6/n3PgN79+5l4sSJuLq64uzszNixY9m2bds5jyXE+ZDoKZpVQEAAt99+Ox9++CFPPfUUXbt2PeO+L7zwAv/3f//HjBkzuPvuuykoKODtt99m5MiR7N27Fzc3N5555hlKS0vJzs5m0aJFADg7O6NSqYiOjuaPP/6wHC8xMZHS0lLUajVxcXFMnjwZgC1btjBw4EBL57gNGzYwceJEAgMD+de//kV1dTVvv/020dHR7Nmzp0lnrunTp9OnTx9efPFFzrTi986dO5kwYQKDBg1i7dq1ODg4nPG6f/zxR2644QbCwsJYuHAhxcXFzJo1i27dup12/2XLllFTU8O9996LnZ0dHh4elJWVsXTpUm666SbuueceysvL+eijj5gwYQI7duxo0pT9ySefUF5ezkMPPURNTQ1vvfUWY8aMISkpCV9fX8t+JpOJCRMmMHToUF577TU2bNjA66+/Tq9evXjggQfOeE2ffvopH3zwATt27GDp0qUADB8+HIC7776b5cuXc/311/P444+zfft2Fi5cSEpKCqtXr250nNTUVG666Sbuu+8+7rnnHoKCgs54ToDi4mImTZrEjBkzuOmmm/j666954IEH0Ov13HXXXUB9k/vo0aNJT0/n4YcfJiAggG+++YaZM2dSUlLCP/7xj7O+3tdeey3l5eXMnz+fe++9lxEjRliu78033+STTz5h9erVvPfeezg7OzNgwACgPkw+99xzjBs3jgceeIDU1FTee+89du7cSVxcHDqd7qzXdqoDBw4wYsQIXF1defLJJ9HpdLz//vuMHj2azZs3M3To0PM+lhCnpQjRDJYtW6YAys6dO5XDhw8rWq1WmT17tuXxUaNGKf3797f8nJmZqWg0GuWFF15odJykpCRFq9U22j558mTFz8+vyTlfffVVRaPRKGVlZYqiKMrixYsVPz8/ZciQIcrc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8f333zN69GhWrFiBi4sLDz/8MH369AGathT4+PiwdOlSpk6dSkREBElJSTg7O1smQfLz80Or1VJbW9voeT169OC6667jueeeY968eWddnVBRFCorK3Fzc5MwIIQ4Jxla2EI+/fRTjhw5QlRUFBMmTLB2OeIS5OXlMXPmTO677z4mTZrEK6+8wvLly/n555+54ooreP7557n11lsxGo3s3LmTJUuWMH36dK666irLMRRFwWw2W24nlJeXW2YXXLNmDfPmzSMlJcWy77p16zh8+PBFTzxUVVWFyWRi0qRJLT5/ghCi/ZPRBC1gw4YNHDlyBD8/PwkC7VxFRQU6nY7nnnuO//znP2zbto1Fixbx0UcfsWLFCiIjI5k+fToAWq2W4uJi9u7dy0svvQRAdnY2FRUVBAcHo9Fo+PTTT8nMzESj0fDVV19hMplwdXXls88+s5xTpVIRHR1NQUEBxcXFuLu7X1AgqK2tpbq6mssuuwyNRkNSUhKhoaFWmztBCNH2SctAMztw4AArV67E1dWVf/zjH9JhsJ3bs2cPCxYsYPTo0dx000288847rF69ms2bN9O3b1++/vprxo8fD0BhYSFz5szBz8+P//znP6xYsYJ33nmHyspKunfvzvLlyxk0aBD/+Mc/ePzxxzGbzWd9fxw/fpxff/2ViooKOnXqdMbbAqWlpbz00kuW1gdFUbCzs2Pq1KnceuutfPfdd+j1esLCwvD398fLywtPT89WWdpZCNE+SBhoRvn5+SxZsgSNRsOcOXNktbgOIj8/n5dffpkNGzYwduxYRowYwdSpU5k/fz5z5861rIL4+++/8+ijj7Ju3Tr27NnD0qVLufLKK7nnnntYvnw5a9euZevWreTm5p73ufPy8tiyZQu5ublotVqcnJzQaDSNvuUrikJNTQ1VVVXY2dkRFhbGoEGDLOFh8+bN/P77702O7ezsTPfu3Zk2bZoEAyFsnISBZlJTU8OiRYuoq6vjrrvukvu0HVBtbS16vf60ze0lJSU88MADODs78+GHH/LCCy9QXFzMSy+9hFar5dChQ/Tr148333yThx9+GKPReNYOgKcyGAwcOHCAlJQUSktLG81poFKpLC0BPXr0YMCAAXTt2rXJMT755BMyMjKabHdycmLOnDnnXYsQomOSvwDNwGw28+GHH2IwGLj66qslCHRQp/bK/3sTv5OTE+Hh4UyaNAmon2iqX79+lg/ZgoIC7OzsePjhhwHO+uFrNptRqVSW0KHX6xk4cCBhYWHk5uZSWFhIeXk5ZrMZOzs73N3d8fHxOeuSzJMnT+add95psv26666TICCEkDDQHL7++mvLgjCXXXaZtcsRreDv9/p1Oh1PPfWU5efJkyezZs0aMjMzyc7OZtasWZYgcLZWgVNDxt8Dh1arpXv37hcVNj09PbnsssvYu3dvo6GO8fHx+Pn5Sd8WIWyc3Ca4RA33Y7t168bdd99t7XKElSiK0uj2gclk4rnnnuPgwYOoVCq++eYbampq0Ov1jfZt+MCvqKhg9+7drFy5EgcHBx577DE6d+7crDWWl5fz1ltvYTKZ8PLyQqfTceLECezt7bn11lvp1q1bs55PCNF+SBi4BIcOHeKLL76Q+67irL7++muSk5P517/+dcZWgYULF7Jp0ybGjRtHdXU1P//8M6+//nqjiY6aw8aNG9m2bRv33nsv3t7ebN26lQ0bNqAoisyJIcQ5KIpCeXk51dXVqFQqHBwccHZ27hDDdiUMXKTCwkLeffddVCoVs2fPxtXV1doliTZEURQURWnS/H7qKocNLQTp6ek88sgjPPLII5Y+B7NmzSI8PJzZs2ezY8cOfH198fPza3T8i/kDpCgK1dXVODo6WrYVFRXx8ccfU15ejoeHB3fccYe8n4X4k6Io5Ofnc+jQIY4ePUp1dbWlE69Go8HJyYmAgAD69OmDl5eXlau9eHKj8CIYDAaWLl2K2Wzm1ltvlT+cogmVSoVarcZsNjfartFoMJlMjT7MT5w4gU6no2fPnkD97IH+/v4cO3YMgP/+97+89dZbFBUVNTo+1C+rXFdXd0F1nRoEADw8PJgzZw4DBw6kqKiIt956i927d1/4RQvRwVRVVbFp0ybWrFnDvn37qKqqsgzxdXR0RKvVUl5ezu7du1m9ejWxsbFNphFvLyQMXISPPvqImpoaJkyYgL+/v7XLEW2YWq3GaDRy6623smjRIgDLPAEN3y5CQkKorKy0fKvYt28fe/bsYciQISQlJVFbW0tMTAweHh6YTCbee+89kpOTAdi7dy9r164lPz//kuucMmUKt99+OxqNhh9++IGPP/5YVjUUNquwsJC1a9dy4MABdDodHh4euLi4YG9vj1arRafTYW9vj6urKx4eHqjVahISEli7dq1l0bL2RMLABVq5ciX5+fmEhYURFRVl7XJEO6DVann//ffRaDQMHjyYl19+maqqKsvtAldXV0aNGsXYsWN55JFHeOaZZ/Dz82P69Ol88cUX9OzZk8jISKB+gaSNGzeydetWfv/9d5555hl27NiBj49Ps9QaEBDAE088Qc+ePTl69CivvvoqmZmZzXJsIdqL0tJS1q1bR2FhIR4eHjg4OJz1tlxDi5ubmxt5eXmsX7+eqqqqVqz40kkYuADx8fEcOHAAX19fpk2bZu1yRDvi5OTE7NmziYuLw9fXl/Hjx/Pjjz8C9fMIzJ8/nzVr1hAQEMCCBQt4+eWXKSws5MiRIwQFBVn6C2zevJlu3boxffp0srOzLc2T33zzTZPVES+WXq/nzjvvZNKkSRiNRpYvX87333/f5JaHEB2R2WwmNjaWoqIi3N3dL2jYrUajwd3dnby8PLZt29Zs/yZbg4SB85SRkcEvv/yCg4ODDCEUF02v1zNz5kw2b95saVkyGo2YzWb69OnDY489xqhRo7Czs8PLy4va2lpLC8Ivv/zC4cOHGTx4MC4uLmRlZXHXXXexZMkS0tPTm/0b/ODBg/nHP/6Bu7s7e/bs4a233qK4uLhZzyFEW3P48GGOHj2Kq6vrRc2/odFocHZ25tChQ2RlZbVAhS1DwsB5KC0t5bPPPkOtVnPPPffIEEJxyTQaDZ6enkD9bQS1Wn3abxETJkzgjTfe4B//+AdPPPEEBoOBiRMnsmPHDg4cOEB4eDhjx45l3rx5BAQENHudrq6uzJ49myFDhlBWVsbbb7/Ntm3bmv08QrQGlUpFSUnJGR9XFIXk5GQURUGv1wNQWVnJd99912i/zZs3c/z48TMex97eHqPRyMGDB5ul7tYgYeAcjEYjH3zwASaTiZtuugl3d3drlyQ6qNPdk7z//vtJSEhgzJgxjBs3jqFDh+Lp6cmWLVtwdna2rJh4ahN+SzRNTpw4kbvuugu9Xs/69etZunQpBoOh2c8jhDWVlpaSl5fXaMRNVVVVkzDwxx9/kJOTc9ZjOTg4cOzYMaqrqy3bzGZzm73dJvMMnMMHH3zAiRMnGDNmDCNGjLB2OcKGNCxJ3HCbAOrnBPDw8OC5554jLS2NFStWnPa5v/32GyEhIXTp0qVZazIajXz55ZccPnwYrVbLjBkz6NOnT7OeQ4iWolKpeOaZZ/jxxx+prKxkwYIF3HLLLQDccsstJCYmUlRUhLe3N/fddx9ubm689NJLJCUl0bNnT9RqNePGjeOTTz7B1dUVR0dHZsyYwcCBA/nhhx/Ytm0bZrMZV1dXZs6cib29PWlpaRw9epSKigqysrKYO3cun332Gb/88gtQP/dIYGAgP//8M/369bPeayNh4My+++479u7dS3BwMDfccIO1yxE27O/rFMTFxfHUU08RERHB/Pnz8fb2BuoDRGVlJf/73/8oLi6mV69exMTE4Ofn16yzpO3bt4/vvvsOs9lMaGgo1157raxvINo8lUrFs88+y/PPP8+RI0cYNGgQe/bswd/fn4KCAo4fP05cXByxsbEUFBQwa9YsCgoKmDdvHkuXLrUc5/nnn+fKK69k8ODBQP2/x+TkZGbNmoVarWbLli3Ex8cza9YsDh48yKpVq9i7dy++vr6YTCZ69erF+vXrCQoKYvXq1bzzzjts3LjRWi8LIAsVndHOnTvZu3cvnp6eTJ8+3drlCBv39w/a6OhotmzZQlpamiUIQP0fO2dnZx5++GEOHDhAXFwcy5cvp3v37sTExNC3b99mCQXh4eH06tWL5cuXs3//fjIyMrjjjjsa1SJEW9TQATwwMJCRI0fyxx9/4O/vz+eff877779PSUkJZrMZFxeX8z7mrl27OHLkCM888wzw1227hiXGJ02ahK+vL1DfX+jBBx/kv//9L4sXL+a///2vZREza5IwcBrHjh3jp59+ws7OjnvvvVe+8Yg2p2Fa4zM10avVasLCwggNDSUtLY3Y2Fi+/PJLfHx8iI6OJjQ09JLf187Ozjz00EP89ttvbNmyhffee4/Ro0czcuTISzquEC2hoePr8ePH6datm6UjuEqlIjY2lsWLF7Ns2TISExPJyMjg22+/Pe9jK4rClClTGDt2bKNtRUVFltEFp7rnnnvo168ft99+O+np6UyZMqUZrvDSyKfc31RUVPDpp5+iVquZNWuWpUepEG3Jqf0IzkalUtG3b1/uuusuZs6ciaurK6tXr+btt99m586dFzSV8ZmMGTOG+++/HwcHBzZt2sSSJUva3YQrouOLjY0F4Omnn2bhwoUsXLiQ3377DZVKxdatW9FqtQQEBKAoSqMmewcHBwwGQ6PZOB0cHBp1DBw0aBAbN26koqICqO9bk56ejk6nw8HBoUkt7u7uXHPNNVx77bXcd9995/3vuSVJn4FTmM1mFi1aREVFBTNmzCAkJMTaJQnR7HJzc4mNjSU5ORlHR0eioqIYNGgQ9vb2l3Rcs9nMN998w8GDB9FoNEybNs2qHaKEONU333zDjBkzGDlyJIcOHcJgMDB69GgGDBiA2Wxm48aNnDhxAoCgoCCSk5NZuHAhAB9++CEHDx7E3t6eF154gT179vDZZ5+h1+stHQjXrVvH77//DtS33EVFRTFt2jRSU1MpLS3lzTffbFTP7t27iY6OJjs7u00scCRh4BTLli3j2LFjjBgxgjFjxli7HCFaVFFREXFxcezbtw+tVsvgwYOJiorCycnpko6bkpLCqlWrMBqNBAUFMWPGDLnVJqyiurqaffv2kZqayvHjx0/bEta9e3duueUWSxjeunUru3fvxtPT86L715jNZoqLi4mOjmbgwIGn3ee1114jJSWFjz766KLO0dxsNgw0rBzXcN/o559/ZseOHfTq1Ytbb73VytUJ0XrKy8uJj49n9+7dmM1mBg4cyPDhw3Fzc7voY9bU1LB8+XJyc3NxcHDgtttua/ZhjkL8XUVFBXv37iUtLY38/PxGKwj+vWkf6if1Gjp0aKMP/dLSUlavXk1NTQ2dOnW6qDqKi4txdXVl2rRpTVYJBejfvz8qlYp169bRvXv3izpHc7PZMLBu3ToSExO58cYbKS4uZs2aNbi5ufHII4/Itxhhk6qrq9mxYwfbt2+npqaGsLAwoqOjL2kRpC1btrBp0yYURWH48OFcccUVzVixsHXFxcXs3buX9PR0Tp482eibv4uLC927d6d///4EBQWh0Wh4+eWXqa2tRavVMn36dPr27Xva4x44cIDNmzdjb29/2nv+Z1NZWYnRaGTcuHH07t37kq6vNdlsGFi8eHGjedZ1Oh2PPfbYJd83FaK9MxgM7N27l61bt1JWVkZQUBAxMTEX/Q3m5MmTLF++nIqKCjw9PZk5c2aT3tVCnI/8/HwSEhI4cuQIhYWFlk59KpUKV1dXevbsSVhYGL169Trtl7qVK1dy9OhRbrnlFjp37nzG8yiKQnx8PAkJCWi1Wpydnc95y0BRFMrLyzGbzQwZMoTLLrusWef2aGk2GQaqqqp49dVXG20LCwtj6tSp0iogxJ9MJhNJSUnExcVx8uRJ/P39iYmJITAw8IL/yJnNZtauXUtiYiJqtZqrr76aiIiIlilcdBjHjx8nISGBzMxMiouLMZlMQP3QWTc3N/z8/BgwYIBldsBzMRqNqFSq8+q9rygK+/btY/fu3VRVVeHo6HjapYwVRaG6uprq6mqcnJwYMmQI/fr1a1dBAGw0DKSmpvLll1822d63b19uuukmK1QkRNulKAoHDx4kNjaWnJwcunTpQnR0NCEhIRccntPT0/n666+pq6sjICCAm2++WRb+EkB9YDx69CiJiYkcPXqU0tJSy+Q9DUsDBwQEEBERQdeuXVutroKCAvbu3cvRo0ctfRAaPugbPj7t7e0JDAxk4MCB7Xb9GpsMA7/++itbt261/KxWqzGbzfj5+XH77bdL64AQp6EoChkZGcTGxpKRkYGnpyfDhw8nPDz8gsZJGwwGVqxYQVZWFnZ2dtx888307NmzBSsXbZHZbCYtLY39+/eTlZVFWVmZ5cNVq9Xi5eVFYGAgERERbWJmy9LSUnJycigqKqKyshKo75fg7u5Ot27dLmjGwrbIJsPA66+/bpkcAiA4OJhhw4bRo0ePdte0I4Q1HD9+nNjYWA4ePIiLiwvDhg0jMjLygibp2r59O+vXr0dRFAYPHsykSZNasGJhbUajkZSUFJKTkzl+/Djl5eWWx/R6PV5eXvTu3ZuBAwde0kgWcXE6RBhoWJylqKiIqqoqFEXBwcEBDw8PXFxcGn3A5+XlsWTJEgCGDBlCVFRUu23WEcLaCgoKiIuLIykpCTs7O4YMGcLQoUPPuwd2SUkJH3/8MaWlpXTq1Ik777zzoodzibbFYDCwf/9+UlJSyMnJaTQrpZ2dHb6+vvTt25fw8HDpUNoGtOswYDKZOHLkCCkpKeTl5VFXV9dogYiGtBkcHEyfPn3QarUsWbKEuro6brvtNkmfQjSTkpIS4uPj2bNnDyqVisjISIYNG4arq+t5Pf/HH39k165dqFQqrrzySoYMGdLCFYvmVlNTQ0JCAqmpqeTl5TUa0+/g4EDnzp0JDg5mwIABMmqrDWq3YaCwsJC4uDiys7OB+g4cer3ecu/SbDZjMBgsabRLly7ExMRQUlJC165dJYkK0QIqKyvZvn07O3bsoK6ujvDwcKKjo/H09Dznc48dO8bnn39ObW0tPXr04NZbb5W1Qdqws03w4+TkRNeuXQkJCaF///7ye2wH2mUYOH78OBs2bKC8vBxXV1d0Ot1Z9zcajZSWluLo6Mjll19OQEBAK1UqhG2qra1l165dbNu2jYqKCvr160dMTMw5ZyE0Go188cUXHDlyBJ1Oxw033ECvXr1aqWpxNsXFxSQkJJCWlnbOCX5khEj70+7CQGFhIT/88AMVFRW4u7ufd4c/RVEoKSnBzs6OyZMnn3XCCSFE8zAajSQkJLB161aKi4vp1asXMTEx+Pn5nfXf7t69e/nhhx8wm82Eh4czZcoUGeXTys42wU+nTp3o0aPHWSf4Ee1LuwoDJpOJH374gaysLDw8PC6453/D+tKdO3dmypQp0nQlRCsxm80cOHCAuLg48vLy6N69OzExMfTt2/eM/44rKir4+OOPKSwsxNnZmZkzZ57X7QZxcZp7gh/RvrSrMHDo0CE2bNiAs7PzOW8NnInRaKSsrIyRI0cSFhbWzBUKIc5GURTS0tKIjY0lKysLHx8foqOjCQ0NPeMHTMO8ICqVirFjxxIdHX1pRRiroOIIlKdDTR6Y60CtAa0LOAeCS2+w84YOPMy4rU7wI6yn3YQBRVH47rvvyM7OxsPD45KOdfjwYRYuXEh5ebkkXCGs5OjRo8TGxpKeno6bmxvDhw9n4MCBp73fnJOTw4oVK6iurqZLly7cfvvtF9Yj3WyEk9vg+HdQsBWMFWCqAdUp//4VpT4UaJzA2R+6XwtdxoPdpf29aQva2wQ/ovW1mzBQXl7Ol19+iVarveRhKcePH2f+/PkcO3YMLy+vZqpQCHExcnNziY2NJTk5GUdHR6Kiohg0aFCTf+dms5mvvvqKQ4cOodVque666wgODrY8npGRQbdu3Rrf/lMUyNsEae9BWSoodaDtBFon0Dg0/fZvNoCxEupKQTHWtxD0vB56zap/TjtxPhP89OnTh4iICBliLYA2Fgaqq6uZOXMmSUlJ6HQ6fH19efrpp5kzZw5r167lhx9+oKysjDfeeIPFixdTUFDAvHnzuPzyy0lMTMRsNnP77bcTFhZ21sfy8/OZN28eCQkJfPfddxw6dIgPPvgAqB8v3bt3bw4dOnTJLRBCiPNXVFREXFwc+/btQ6vVMnjwYKKionByavwhfODAAVavXo3JZCIkJITrr7+egwcP8s033xAZGclVV11Vv2NtEaS+Bdlr628F2HcGbdO15c/IbITak2AsB7cB0H8ueEQ24xU3H5ngR1yqNjX+Y926dZSUlJCcnAzU/3FITEwEsMws+Pc50KuqqujatSu33HILaWlpvP766yxatOisjzV0WKqsrOTuu++mb9++vPLKK7i5ubFs2TKuueYaCQJCtDIPDw+uvvpqRo8eTXx8PDt27GDbtm0MHDiQ4cOHW77B9u/fn4CAAD755BNSUlJ49dVXLZ3d9uzZw7Bhw/C0K4U9j0Npcv23e/1FzDKq1oJDZzB5QGkS7HgAQp6AntOt3p/gXBP8BAQEyAQ/4oK0qTAQHh5OSkoKDz74IKNGjWo0V/mZGjA0Gg2jRo0CoE+fPri7u5OZmYmXl9dZH2vg5ubG9ddfz//+9z8effRR3nvvPb766qsWvEohxNm4uLgwfvx4RowYwY4dO9i+fTu7du0iLCyM6OhofHx8cHR05P777+f3339n8+bNlueqVCq2b/yCST4/Q/lhcAoA9cV1NrbQ6MGpF9TkQPJCUEzg37qrm55rgp8+ffrIBD/ikrSpMBAYGEhycjK//fYbGzZs4Mknn2TFihWYTCbLOtKn/iM4k7MNOVSpVJZg0TB/+uzZs5kyZQohISF4e3szcODA5rkgIcRFc3BwYNSoUQwbNoy9e/eydetWEhMTCQoKIiYmhu7duzf54NNRSUDJ59TpDOg6BdV3CGwOKhU4dIPqHEh5Dex9oPPY5jn2aZxrgp/AwECZ4Ec0qzb1LsrOzsbd3Z0pU6Zw5ZVXsmbNGhRF4ejRo5jNZnQ6HX/88Uej55hMJrZs2cKoUaNIT0+nuLgYPz8/KioqzvhYcXExgOVWQHBwMIGBgdx777288sorrX7dQogz0+v1DB06lEGDBpGUlERcXBwfffQRPXr0sExHXk9hSKcdeOsLOFHmQ0/3ZgoCp7LvAlWZ9YHALRzsm6cDskzwI6ytTYWBpKQk5s2bh6IoGI1GbrvtNkaOHMmTTz7JuHHj0Ol09OnTp9FzHB0dyc7O5qmnnsJkMvHQQw/h4OBARUXFGR87ceIEKpWq0QQm99xzDw8//DDXX399a1+2EOI8aDQaIiIiCA8P5+DBg2zZsgVFUbCzs0On0+FpTibEOYUqoyPVZhO5ebn4+vqiohnv76tU4NCjfp6C1DdhwPOW/gN5eXn4+Pic12RoMsGPaGva1GiCc0lOTmbTpk24urqi1WotIwaWLl3aZN8zPWYymSgpKSE6OrrR7YCHH34YX19f/u///q/Fr0MIcekURSEjI4PY2FgyMo5wY48f6OF8EqODP8XFRdTU1OLj44N7SwydMxSDqRqGfYzZtT/r169nx44dTJs2rclkZjLBj2gP2lTLwLn06dOH5ORkcnNzL6q3v6IolJaW4unpSUhICFA/mcmYMWPw8PBg/fr1zV2yEKKFqFQqAgMDCQwMJP/gz+j2fExuqQqlogB3d3d8fR3QaS+x8+CZ6NygtgDj0TV8mbSPw4cPA/VzHfTv3/+sE/z4+PjIBD+izWlXLQNQP0HJjz/+iMFgoFOnThe0UFHDjIMTJkygZ8+eLVypEKLVJC6Ao19Sq6/vE1RWXoavb2c6ubq22CmNlcfJP1nGiqzrqTbVd0Y+tYMyyAQ/ov1od2EA4MiRI2zatImamho6derUZO6BvzOZTJSWlqLX64mJibG0CgghOgCzETZNAENZ/bwAgMlsRq1WNW9/gT8pKBQXFVNYmI+btoSfCiaTWf3XsujdunUjJCREJvgR7Uq77JkSGBjIxIkT8fb2prS0lJKSEgwGQ6NErigKdXV1lsc9PDwYP368BAEhrEylUlFSUnJBz8nMzDzzt+qqLCLujafcYGfZpFGrzysIXL9gFx+vyzrvOgx1Bg4fPkzByZOYFTWowF1X1GifqKgooqOjcXZ2JiEhgS+//PK8jy+EtbSrPgOn6tq1K1OnTiUlJYWUlBRKSkooLy+33DZQFAWtVouLiwshISGEhIRY5hUQQnQg5ekkvOUHTi13S6CBVqvF29sbnU6H2aygqqyht9bAgRo9BoMBqO+HFBoaCkBCQgJr1qzhxhtvvOBzGY1GmUNAtJp2/U7T6/WEh4cTGhpKYWEhRUVFljm5HRwc8PDwwNPTU/5BCdHGvPbaa/z4449UVlayYMECbrnlFgB27tzJ3LlzKSsrw2Qy8fTTTzN9+nTL8xYsWMAPP/xAaWkpixcvrp+ltLYA1dUHKf7eDzdnDf43buT28d35dXcBuUW1zJrUk2dvqx+SfPBYBXe9so/Sijr6dHeiqtZ02voyc6uIuPsPHpkWwI/b8iivMvLx3AhW/nGCTXsLMZoUvpw/kFBfD/q5dmKXuRtvvvkmVVVVrFu3Dl9fX7p06cL8+fMpLS0lIiKCqKgolixZcsZrzMzMJCIigvvuu49ff/2V22+/nTlz5rT470IIABQhhGhFgPLss88qiqIohw8fVtzd3ZWMjAyluLhYiYiIUHJychRFUZSCggKlR48eSnZ2tpKRkaEAysqVKxVFUZSff/5Z6du3b/0BD3+sAErx9xMUZdNVip+vg/LItf6KsukqpWDNeMXVSatkfz1WUTZdpQwK6qQsfWKAomy6Skn8aKSi16mVZXPDFWXTVY3+l/HFGAVQVj8/SFE2XaUsfWKA4mSvUX57I0pRNl2lvHJfiHL9qC6K8tNAJfbtaGXixIlKTU2NoiiK8scffyj9+vVTFEVRli1bplxzzTWWaz+fa1y+fHkr/BaEaEy+MgshWt3dd98N1Pf/GTlyJH/88QdeXl4cOXKEiRMnNto3NTWVwMBA7O3tmTZtGgDDhg2zDOdD1fTP2M3jugHg1UlPYBdHMnKrcXHUkpBexswrewAQFuhKTOiZFzCy16uZGlPfIXFQkBvODlouH1g/4+CQYDc+23AcFIW1WwvYty+DoUOHWp5bVFTUaPGgBlu3bj3rNep0Om699dYzv3BCtBAJA0IIq2sYkte/f3+2bt3a5PHMzEzs7OwsfYI0Go1l1j50f/YVUMyW/e31f/WN1qhVGE1/Pfb3856Jne6UY2j+dkyNCqNJAbMBRW3PHXdcx4svvnjO6zzXNTo6OsqMg8Iq5F0nhGh1y5YtA+o/ALds2cKIESMYPnw4GRkZbNiwwbJfQkKCpWPeGbn0rv9/U9Nv4qdyddIxsI8rn/xSv57BgYxyYpOKzvqcczMxZeLlrFixgmPHjgH1Mw7u2rWr/pyurpSWllr2vuhrFKKFSRgQQrQ6k8nEwIEDGT9+PIsXL8bf3x93d3d+/PFHXnzxRcLDw+nXrx9PPfWUZereM3L+c4y/8exhAOCTeQP54IejhN65mWf/d5CR4Rc+k+lfFFBUjLh8Aq+88grXXnst4eHh9O/f3zKccOzYsdTW1jJgwADuv//+i79GIVpYu5x0SAghGtk1G3J/BefeLXYKs2LGYDBgZ2dfP4NBbREoRhixEpx6tNh5hWgN0mdACNH+dZ8Ceb+BqQY09i1yiqqqao4fP45Go8He3g53bSGF9sPISjiGVpuDXq8nODhY5jMR7ZKEASFE++c9Apz8ofIYOPm1yCmcnJzo1q0rx4/nYKgqpUJby29HnTm2b6Nl9lOz2UxkZGSLnF+IliR9BoQQ7Z/GDgJuA8UExsoWOYUKcHZyplvXrrjqysip6cqx6m6WIGBvb2+ZeVCI9kbCgBCiY+hxHfiMhOrjjYYZNjdnTRkaBx+2loxA4a9F0hwdHamrq2ux8wrRkqQDoRCi46jIgG13Qs3J+tsG57nE+XkzlIChCGPQYyxZX01RURGKoqBWqzGbzahUKkJDQ5kyZYpMgy7aFQkDQoiOJf8PSHgK6srA0b/5AoGhBAyF4Hcj9H+aE3kFfPjhhyiKwnXXXYerqyurV6+mpKQEjUZDVFQUY8aMkUmERLsgYUAI0fHkbYJ9/we1heDYo75PwRkUl5RQWVlB927dT7+DYoaaE2A2QM8Z0O8p0OgB2LVrFxkZGVx//fWW2QyTkpL4+eefqa6uRq/Xc8UVVzBo0KBmv0QhmpOEASFEx1ScCAcWQvHe+imL7bxB1fRbem5eLhUVFfTudZo5CowVUJ1T/9w+D9S3Cqg1Tfc7jS1btvDHH39gNBpxcXHh6quvpk+fPpd6VUK0CAkDQoiOy1gNhz+CzM/AUAQaB7DzArW95fZB+uHDmEwm/Pz8sLezA7MR6orrbwto7MFzCPR78q9pjy+A2Wzmxx9/ZO/evSiKgpeXF9dffz2+vr7NfKFCXBoJA0KIjq/qOOT8DNmroSq7vslfUTCaVZwsLEIF2Ok1uLl1AtSg7wS+Y+snM/KIPG2LwoWoqalh1apVpKWlAeDn58d1112Hi4vLpV+bEM1AwoAQwnaYaqEsBcrToTyNzOQ/KD6Zi0lRU2N2oG/kVfj0Gg6uIWDv3eynLy4uZuXKleTk5ADQv39/pkyZgl6vb/ZzCXEhJAwIIWxSRUUFixYtsiwSpFKp8PLy4v7772/xEQBZWVmsXr2a4uJi1Go1UVFRjB07VkYeCKuRMCCEsEmbNm1iy5Yt/P1P4DXXXENERESr1HDgwAF+/PFHy8iDsWPHMmTIkFY5txCnkjAghLBJr7zyCtXV1ahUqkaBoGvXrtxzzz2tWktcXBy///47RqMRZ2dnrrrqKoKCglq1BmHbJAwIIWzSzp07qaio4MSJE6SlpTF06FC6du1Kly5d8PZu/v4C52I2m1m3bh27d+/GbDbj6enJddddR5cuXVq9FmF7JAwIIWxaQkICa9eu5frrr6d///7WLoeamhrWrFlDamoqAD169OD666/H1dXVypWJjkwmzxZC2DR7e3ug/kO4LbC3t+fGG2+kpKSElStXkpWVxaJFiwgJCWHq1Kky8kC0CAkDQgib1hAGamtrrVxJY25ubtx9990cP36cVatWkZKSQmpqKoMHD2b8+PEy8kA0K3k3CSFsmoODA9D2wkCDbt268cgjjzBjxgzs7e3Zvn07L730Etu2bbN2aaIDkZYBIYRNa+thoEFISAghISFs27aN3377jfXr17NlyxauuuoqQkJCrF2eaOckDAghbFrDbQKDwWDlSs5PVFQUQ4YM4ZdffmHnzp18/fXXeHh4MG3aNLp162bt8kQ7JbcJhBA2raFDXnsJAwBqtZorr7ySuXPnEhISQlFREUuXLmXp0qWUlJRYuzzRDknLgBBC0L7CQAO9Xs+MGTMoKyuzjDx46623CAoKYurUqZZWDyHORVoGhBA2T6VSUVdXZ+0yLpqrqyt33XUX9957L56enqSmpvLqq6/y008/WdZeEOJsJAwIIWxeew8DDbp06cLDDz/MjTfeiKOjIzt37mThwoXExcVZuzTRxsltAiGEzVOpVBiNRmuX0WyCgoIICgpix44dbNy4kQ0bNhAXF8fkyZPbxCyLou2RlgEhhM1Tq9UdKgw0GDJkCHPnzmXYsGHU1taycuVKFi9eTFZWlrVLE22MhAEhhM3rqGEA6q9t/PjxzJ07l/79+1NcXMz//vc/PvzwQ4qLi61dnmgjJAwIIWyeRqPBZDJZu4wWpdfruf7663n00Ufx8/MjJyeHxYsX8/nnn7eZdRmE9UgYEELYPFsIAw1cXV2ZOXMm999/P97e3qSlpfHKK6/w/fffy8gDGyZhQAhh8zQajc19EPr6+vLggw9y88034+zszJ49e1i4cCFbtmxBVra3PRIGhBA2T6vV2lwYaNCnTx8ee+wxJk+ejFqt5rfffuPVV18lKSnJ2qWJViRhQAhh82w5DDQYNGgQc+fOJSYmBoPBwKpVq3jzzTfJzMy0dmmiFUgYEELYPJ1OJ03j1I88GDt2LE899RRhYWGUlZWxfPly3n//fQoLC61dnmhBEgaEEDZPWgYa02q1TJs2jcceewx/f39yc3N55513WLFiBVVVVdYuT7QACQNCCJvXsHKhaMzZ2Zk77riDBx54AB8fHw4fPsxrr73G2rVrO+y8DLZKpiMWQtg8nU4HgNlsRq2W70h/5+PjwwMPPMDhw4f57rvvSEhIICkpiZiYGEaOHCmvWQcgv0EhhM1raBloj8sYt6ZevXrx6KOPMmXKFLRaLZs3b+bVV18lISHB2qWJSyRhQAhh8+zs7ABkJr7zNHDgQJ588klGjhxJXV0da9euZdGiRWRkZFi7NHGRJAwIIWxeQ8tAdXW1lStpP9RqNZdffjlPPfUUERERlJeX88knn7BkyRIKCgqsXZ64QBIGhBA2z97eHpAwcDG0Wi3XXHMNTzzxBIGBgeTl5fHuu+/yySefyMiDdkTCgBDC5sltgkvn6OjIbbfdxkMPPUTnzp3JyMjgtddeY/Xq1TLyoB2Q0QRCCJvX0DIgYeDSeXl5cd9995GZmcmaNWtITEzkwIEDDB8+nNGjR8vIgzZKfitCCJsnYaD5+fv7M2fOHKZOnYpOp2PLli288sor7Nmzx9qlidOQMCCEsHkODg4A1NbWWrmSjic8PJx//vOfjB49GpPJxPfff88bb7xBenq6tUsTp5DbBEIIm9cQBmSegZahVqsZNWoU0dHR/PTTTyQkJPDZZ5/h7e3Nddddh6+vr7VLtHnSMiCEsHnSMtA6tFotU6ZM4Z///Ce9e/emoKCAJUuWsHz5cioqKqxdnk2TMCCEsHkyA2HrcnBw4JZbbuGRRx6hS5cuZGZm8sYbb/Dtt9/K78BK5DaBEEL8ST6IWpeHhwf33nsvx44dY/Xq1ezfv5/k5GSioqIYO3asjDxoRfJKCyEEoFKpZDy8lfTs2ZN//OMfTJs2DTs7O7Zu3crLL7/Mzp07rV2azZAwIIQQ1IeBuro6a5dh08LCwnjyyScZO3YsZrOZn376iddff520tLRG+/3yyy/s3bvXSlV2THKbQAghkDDQlsTExDB8+HB+/vlndu/ezeeff46XlxfTpk2jtraW+Ph41Go1nTt3pkuXLhd0bLPZjNlsRqPRoFKpWugK2h+VoiiKtYsQQghre/HFF3F1deXhhx+2diniFDU1NaxevZpDhw4BoNPpqKurQ6VS4eHhwX333YdOpzvj8xVF4cSJE2RkZJCXl0dJSQmKoqDRaPDy8qJLly706tULNze3VrqitklaBoQQgvqx8CaTydpliL+xt7fnpptuori4mE8//ZTi4mKg/kO+sLCQjRs3cuWVV572ufn5+WzdupXc3FyMRiMajQadTmdpBTp27BiZmZns2bOH3r17M3ToUBwdHVvz8toMCQNCCAFoNBoJA22Yq6srZrO5yfbt27fTu3dvevfubdmmKAr79+9n+/bt1NTU4OLiYgkBf6coCtXV1ezfv5+cnBzGjBlzwbceOgLpQCiEEEgYaOsOHjxIaWkpKpUKtVrd6IP9s88+4/Dhw5afk5KSiIuLw2Qy4eHhgV6vP2P/AJVKhaOjIx4eHpSUlLB+/Xpyc3Nb/HraGmkZEEII6sOAzDPQdvn7+3PFFVdgMBgwGo3U1dVhNBo5ceIEBQUFrFixghkzZuDu7s727dtRq9W4uLic9/HVajXu7u4UFRXx+++/c+2111qWtrYFEgaEEIL6MHC6ZmjRNjg5OTF8+PDTPqYoChkZGfj4+LB+/Xpqa2vx8PC44HOoVCrc3Nw4efIke/bsYdiwYZdadrshtwmEEIL6XuoSBtonlUpFYGAghYWF5Ofn4+rqetHDBjUaDXZ2dhw8eJDq6uomj2dmZrJkyZJG2yZNmkRqaupFna+tkDAghBDUL6IjI63bt8OHD2Mymc461PB8ODo6UlVVxdGjR5s8drow8NNPPxEUFHRJ57Q2CQNCCIG0DLSG+Ph4YmJiCA8PZ8CAAaxdu5Zdu3YxfPhwBgwYwJAhQ4iLiwPqP3Td3NxYsGABkZGR9O7dm59++gmA6upqbrjhBvr160d4eDjjx49HURQ2btzIyy+/bDlfVlYWs2fPBqCgoIC7776br7/+mqeffppHH32U1NRUPv30U+bNm8eTTz5JVlYWUN9Z8YUXXmDOnDmEhoYSGRlJQkICAPfffz+pqalEREQwZcoUoL4/Q8Pj6enpjBs3jgEDBhAREcGaNWss9ahUKl588UWGDBlCQEAAy5Yta8mX+4JIGBBCCLjkb5Pi7IqKipg6dSoLFy5k3759JCQkMGzYMKZNm8aCBQtITEzkjTfe4LrrrrMsZ1xaWsqAAQPYvXs377zzDo8++igA69ato6SkhOTkZPbt28eXX35JdXU1BoPhrLcHqqqqCAgI4MUXX2TKlCm89NJLXHbZZSxcuJARI0bw7bffWvY9ceIEw4cPZ//+/cydO5cbb7wRRVFYsmQJQUFBJCQk8N133zU5xy233ML06dNJTEzkm2++YdasWY1aGOzs7NixYwc///wzs2fPbjPrYUgYEEII/lrGWFoHWkZ8fDxBQUGMGDECqO+9n5eXh1qtZsKECUD9NMS+vr6Wb9n29vZMmzYNgGHDhlmGD4aHh5OSksKDDz7IV199hU6nw2QynfN3p9PpGDx4MACBgYHY29vTv39/AHr37k1eXp5lX09PT0JCQgCYMWMGubm5lpaDMykvL2fPnj3MmjULgD59+hATE8OWLVss+9xyyy0ABAcHo9Vq28wwRgkDQgjBX2GgrXxTs1WnfrO3s7Oz/HzqPBCBgYEkJydz5ZVXEhcXR2hoKOXl5Wi12kaB4O9rTZza+qNWqxv9rFKpmswz0fCeaHj8Yjol/v059vb2lv/WaDRt5v0mYUAIIfjrD39VVZWVK+mYhg8fTlpamuVbstlsxtfXF7PZzK+//gpgmTo4IiLirMfKzs5GpVIxZcoUXnvtNRRFoaCggJ49e1JYWEhZWRlAo2/kF6qwsJBjx44BsHLlSnx9fenevTuurq6Ulpae9jkuLi5cdtlllr4A6enpxMbGMnLkyIuuo7XIPANCCMFfYaC6utrmF61pCe7u7qxevZrHH3+c8vJy1Go1zz//PKtWrWL27Nk8/vjj2Nvbs3LlSpydnTl58uQZj5WUlMS8efNQFAWj0chtt91GeHg4RUVFjB07lv/7v/+jU6dOhIeHX1StZrOZLl26sHHjRj744AP0ej1ffPEFKpWKAQMG0L9/f0JDQwkMDGzSb+Czzz7j/vvv55133kGlUrF06VJ69ux5UXW0Jlm1UAghqL+n/csvv3D77bcTEBBg7XLERcjOzub777/H0dGxURP/hdq1axfffPMNaWlpNjMLodwmEEIIsPzRP91EM6J96Nq1K126dKG8vPyi54wwGo0YjUbs7e1tJgiAhAEhhAD+6thVU1Nj5UrExVKr1URHR+Pg4GDpN3AhzGYzpaWljBgxgv3797dAhW2XhAEhhOCvMFBbW2vlSsSl8Pb2Jjo6GrVaTUlJyXm3EJhMJoqLi+nUqROjR4++pNsM7ZF0IBRCCMDBwQGQMNARBAcHo1Kp2Lp1K4WFhTg7Ozcapngqs9lMVVUVtbW1eHt7M2bMGLy8vKxQtXVJGBBCCP4KA7KMcccQFBSEr68v8fHxZGVlUVlZiVqtRqvVolKpMJvNGI1GFEXB0dGRyMhILrvsMpvqJ3AqCQNCCEH94jQgLQMdiZubG1deeSVFRUVkZGSQn59PUVERJpMJvV6Pj48PPj4+9OrVy/L7t1USBoQQgvpVC0FaBjoalUqFp6cnnp6e1i6lTZMOhEIIQX1PdJAwIGyThAEhhDjF3+ezF8IWSBgQQog/qdVqCQPCJkkYEEKIP6lUqjazipwQrUnCgBBC/EmtVksYEDZJwoAQQvxJwoCwVRIGhBDiT2q1GpPJZO0yhGh1EgaEEOJPGo1GwoCwSRIGhBDiT1qtVsKAsEkSBoQQ4k8ajQaz2WztMoRodRIGhBDiT1qtVsKAsEkSBoQQ4k9arRZFUaxdhhCtTsKAEEL8SafTSRgQNknCgBBC/EnCgLBVKkXe+UIIG1ZXV8cXX3xBWVkZpaWlGI1GdDodRqORQYMGMWnSJGuXKESL01q7ACGEsCaVSkVeXh5VVVWWbQ2LFbm6ulqrLCFaldwmEELYNK1Wy5gxY067PTIy0goVCdH6JAwIIWzewIED8fDwaLTtsssuw8HBwUoVCdG6JAwIIWyeWq1m/PjxjbZFRUVZqRohWp+EASGEAPr27Yu7uzsA3bt3t/y3ELZAwoAQQlDfkbChNaBfv35WrkaI1iVhQAgh/tSrVy8AunTpYuVKhGhdEgaEEOJPHh4ejB07lq5du1q7FCFalUw6JISweSaTiYKCAoqKiizzDTg4OODh4YG3tzdarUzJIjo2eYcLIWxWTU0NKSkppKSkUFZWhtFoRKVSAaAoClqtFmdnZ0JCQujXr58MNRQdlrQMCCFsUnZ2NrGxsZw8eRKtVoujoyNarbZRGDAajVRXV1NXV4eHhwfDhw/H39/fuoUL0QIkDAghbE5aWhqbN2+mtraWTp06odFozrq/2WymtLQUrVZLTEyMjDYQHY50IBRC2JScnBw2b95MXV0d7u7u5wwCUD8pkZubG4qiEBcXx9GjR1uhUiFaj4QBIYTNMBgMxMbGWloEGm4JnA+VSoWLiwsGg4GtW7dSU1PTgpUK0bokDAghbMahQ4coKCi44CDQQKVS0alTJwoLC0lJSWmBCoWwDgkDQgiboCgKKSkpqFSq87o1cCYajQatVktKSgomk6kZKxTCeiQMCCFsQmlpKcXFxTg6Ol7ysRwcHCgrK6OoqKgZKhPC+iQMCCFsQlFREXV1deh0Osu2m2++ma+//pp58+bx2GOPERsbC8CaNWtYtmyZZb+amhruueceysrKANDpdBiNRgoLC1v3IoRoIRIGhBA2obq6GkVRUKub/tlbuHAhc+fOZfny5RQUFDBixAi2b99OXV0dANu2baNfv364uroC9X0HVCqVdCIUHYaEASGETWj4AP+7yy+/HABfX1+Cg4NJSUnB09MTPz8/du/eDcAff/zBqFGjWrVeIVqThAEhhE1wcnIC6icQOpuGwDB69Gg2b95MXl4eeXl5hIeHW/ZRFAVFUSzHFKK9kzAghLAJ7u7u6PV6DAZDo+2bN28GoKCggNTUVIKDgwEYNGgQR44c4bvvviMmJqbRCASDwYBOp8PDw6P1LkCIFiQLFQkhbIKLiws+Pj5kZ2djb29v2W42m5k3bx61tbXcfvvteHt7A/WdBKOiovj111959dVXGx2rqqoKb29v3N3dW/UahGgpsjaBEMJmpKamsmHDBlxcXNDpdNx88818+OGHF9TcbzQaKSsrY9SoUYSGhrZgtUK0HrlNIISwGb1796Z79+6UlZVxMd+DFEWhtLSUzp07W24nCNERSMuAEMKmFBYW8sMPP1BRUYG7u/t5T0usKAolJSU4ODgwadIkfH19W7hSIVqPtAwIIWyKp6cnV1xxBc7OzhQVFTXpUHg6dXV1FBUV4eDgwNixYyUIiA5HWgaEEDapuLiY2NhYsrKyUBQFBwcH9Ho9arUalUqFyWTCYDBQXV0NQLdu3YiJicHLy8vKlQvR/CQMCCFsltls5siRI6SkpJCXl4fBYLDMQ6BWq9HpdPj4+BAcHEzv3r0vaYEjIdoyCQNCCJunKArV1dUUFRVRWVkJgKOjIx4eHjg6Ol7UcsdCtCcSBoQQQggbJx0IhRBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcRIGhBBCCBsnYUAIIYSwcf8PSfxgbgN4fpAAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -212,11 +218,9 @@ } ], "source": [ - "op = portf.setup_optim_problem(prices = input_ts, timegrid = timegrid)\n", - "res = op.optimize()\n", - "out = eao.io.extract_output(portf, op, res, input_ts)\n", + "out = eao.optimize(portf=portf, timegrid=timegrid, data=input_ts)\n", "print(out['summary'])\n", - "eao.io.output_to_file(output=out, file_name='test.xlsx') ### Commented out. Try it out" + "eao.io.output_to_file(output=out, file_name='test.xlsx') ### All details. Have look into the file" ] }, { @@ -233,9 +237,7 @@ "outputs": [], "source": [ "portf_benchmark = eao.portfolio.Portfolio([supply, consumption, grid_feedin, grid_consumption, pv, feedin])\n", - "op_benchmark = portf_benchmark.setup_optim_problem(prices = input_ts, timegrid = timegrid)\n", - "res_benchmark = op_benchmark.optimize()\n", - "out_benchmark = eao.io.extract_output(portf_benchmark, op_benchmark, res_benchmark, input_ts) " + "out_benchmark = eao.optimize(portf=portf_benchmark, timegrid=timegrid, data=input_ts)" ] }, { @@ -263,16 +265,18 @@ } ], "source": [ - "print('Overall costs with battery: '+ str(round(-res.value)))\n", - "print('Overall costs without battery: '+ str(round(-res_benchmark.value)))\n", - "print('So the battery saved us: '+ str(round(res.value - res_benchmark.value)))" + "print('Overall costs with battery: '+ str(round(-out['summary'].loc['value', 'Values'])))\n", + "print('Overall costs without battery: '+ str(round(-out_benchmark['summary'].loc['value', 'Values'])))\n", + "print('So the battery saved us: '+ str(round(out['summary'].loc['value', 'Values'] - out_benchmark['summary'].loc['value', 'Values'])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "There is a significant saving. But where does the saving come from? Let us look into the details, starting with the overall quantities. See below. Note how quantities are always balanced at nodes. Transport always balances as well -- transporting from one node to the other." + "There is a significant saving. But where does the saving come from? Let us look into the details, starting with the overall quantities. See below. Note how quantities are always balanced at nodes. Transport always balances as well -- transporting from one node to the other.\n", + "\n", + "Check out the output \"out\" in detail. It contains detailed dispatch, cash flows and internal variables such as battery fill levels." ] }, { @@ -414,9 +418,7 @@ "outputs": [], "source": [ "portf_start = eao.portfolio.Portfolio([supply, consumption, grid_feedin, grid_consumption, feedin])\n", - "op_start = portf_start.setup_optim_problem(prices = input_ts, timegrid = timegrid)\n", - "res_start = op_start.optimize()\n", - "out_start = eao.io.extract_output(portf_start, op_start, res_start, input_ts) " + "out_start = eao.optimize(portf=portf_start, timegrid=timegrid, data=input_ts)" ] }, { @@ -435,8 +437,8 @@ "outputs": [], "source": [ "## bookkeeping - looking at cost components in different scenarios. Attention - costs are negative numbers\n", - "start = -res_start.value # no assets\n", - "with_pv = -res_benchmark.value # PV, no battery\n", + "start = -out_start['summary'].loc['value', 'Values'] # no assets\n", + "with_pv = -out_benchmark['summary'].loc['value', 'Values'] # PV, no battery\n", "saving_supply = -((out_benchmark['DCF']['supply'].sum() + out_benchmark['DCF']['feedin'].sum())- (out['DCF']['supply'].sum() + out['DCF']['feedin'].sum()))\n", "saving_grid = -(out_benchmark['DCF']['grid_in'].sum() - out['DCF']['grid_in'].sum())" ] @@ -496,7 +498,7 @@ ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "cvxpy16", "language": "python", "name": "python3" }, diff --git a/eaopack/__init__.py b/eaopack/__init__.py index 822d759..2e58fae 100644 --- a/eaopack/__init__.py +++ b/eaopack/__init__.py @@ -5,4 +5,7 @@ from eaopack import serialization from eaopack import network_graphs from eaopack import io -from eaopack import stoch_lin_prog \ No newline at end of file +from eaopack import stoch_lin_prog +from eaopack.io import optimize # to have it on top level +from eaopack.basic_classes import * +from eaopack.portfolio import Portfolio \ No newline at end of file diff --git a/eaopack/assets.py b/eaopack/assets.py index 61d3c9b..94bdbb5 100644 --- a/eaopack/assets.py +++ b/eaopack/assets.py @@ -2649,7 +2649,6 @@ def __init__(self, consumption_if_on = consumption_if_on, _no_heat = True) - class OrderBook(Asset): """ Contract Class """ def __init__(self, diff --git a/eaopack/io.py b/eaopack/io.py index fb105db..78d4d5e 100644 --- a/eaopack/io.py +++ b/eaopack/io.py @@ -8,6 +8,7 @@ from eaopack.optimization import Results, OptimProblem from eaopack import serialization from eaopack.assets import Storage +from eaopack.basic_classes import Timegrid def extract_output(portf: Portfolio, op: OptimProblem, res:Results, prices: dict = None) -> dict: @@ -92,19 +93,13 @@ def extract_output(portf: Portfolio, op: OptimProblem, res:Results, prices: dict my_mapping = op.mapping.loc[I,:] ### extract ... disp in what = 'charge' - if len(portf.nodes)==1: - myCol = a.name+'_'+what - else: # add node information - myCol = (a.name +' ('+ n.name +'_'+ what + ')') + myCol = a.name+'_'+what internal_variables[myCol] = 0. for i,r in my_mapping.iterrows(): internal_variables.loc[times[r.time_step], myCol] += max(0,-res.x[i])*r.disp_factor ### extract ... disp out what = 'discharge' - if len(portf.nodes)==1: - myCol = a.name+'_'+what - else: # add node information - myCol = (a.name +' ('+ n.name +'_'+ what + ')') + myCol = a.name+'_'+what internal_variables[myCol] = 0. for i,r in my_mapping.iterrows(): internal_variables.loc[times[r.time_step], myCol] += min(0,-res.x[i])*r.disp_factor @@ -266,7 +261,6 @@ def get(d,l): if not isinstance(path, list): path = [path] return get(o, path) - def set_param(obj, path, value): """ Set parameters of EAO objects. Limited checks, but facilitating managing nested objects such as portfolios or assets @@ -297,3 +291,33 @@ def sett(o,l,v): raise ValueError('Error. Object could not be created. Parameter issue? Object: '+n+' | parameter '+str(path)) return res +def optimize(portf:Portfolio, timegrid:Timegrid, data = None, split_interval_size = None) -> Dict: + """ Optimization shortcut: Cast data into timegrid, do the optimization and extract the results in one go + + Args: + portf (Portfolio): The portfolio to be optimized + timegrid (Timegrid): Timegrid for optimization + data (StartEndValueDict, DataFrame, optional): input time series. Defaults to None (optional). Will be cast into timegrid + split_interval_size (str, optional, default to None): Interval size for split optimization + Hard cut of optimization into time split for faster calculation. + Pandas convention 'd', 'h', 'W', ... + (none for no split) + Returns: Output dictionary with keys (if optimization feasible): + - summary + - dispatch + - DCF (discounted cash flows) + - prices + - asset internal variables + - special variables + """ + if data is not None: + my_data = timegrid.prices_to_grid(data) + else: my_data = None + if split_interval_size is None: + op = portf.setup_optim_problem(prices = my_data, timegrid = timegrid) + else: + if not isinstance(split_interval_size, str): raise ValueError('split_interval_size must be a string') + op = portf.setup_split_optim_problem(prices = my_data, timegrid = timegrid, interval_size = split_interval_size) + res = op.optimize() + out = extract_output(portf, op, res, my_data) + return out diff --git a/eaopack/optimization.py b/eaopack/optimization.py index f3c3a5f..fc9a7eb 100644 --- a/eaopack/optimization.py +++ b/eaopack/optimization.py @@ -416,7 +416,6 @@ def optimize(self, target = 'value', return results - class SplitOptimProblem(OptimProblem): def __init__(self, ops, mapping): """ Collection of consecutive OptimProblems @@ -455,4 +454,3 @@ def optimize(self, *args, **kwargs) -> Results: res.duals = res_tmp.duals return res - diff --git a/eaopack/portfolio.py b/eaopack/portfolio.py index ea92acc..7b639d6 100644 --- a/eaopack/portfolio.py +++ b/eaopack/portfolio.py @@ -400,7 +400,6 @@ def setup_optim_problem(self, prices: dict, timegrid:Timegrid = None, costs_only op.mapping.loc[In, 'type'] = 'i' return op - class LinkedAsset(StructuredAsset): """ Linked asset that wraps a portfolio in one asset and poses additional constraints on variables. diff --git a/setup.cfg b/setup.cfg index f99a640..45e059f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = eaopack -version = 2.1.4 +version = 2.1.5 author = The EAO development Team description = A Framework for Optimizing Decentralized Portfolios and Green Supply long_description = file: README.md diff --git a/tests/test_various.py b/tests/test_various.py index a1cce7e..e115a46 100644 --- a/tests/test_various.py +++ b/tests/test_various.py @@ -97,7 +97,7 @@ def test_battery_efficiency(self): prices ={ 'price': np.sin(np.linspace(0,40,tg.T))} op = portf.setup_optim_problem(timegrid = tg, prices = prices) res = op.optimize() - out = eao.io.extract_output(portf = portf, op = op, res = res) + out = eao.io.extract_output(portf = portf, op = op, res = res, prices=prices) # eao.io.output_to_file(out, 'test.xlsx') # get fill level from asset bat = portf.assets[0] @@ -112,6 +112,9 @@ def test_battery_efficiency(self): # get fill level from output and check fl_out = out['internal_variables'].loc[:,'battery_fill_level'].values self.assertAlmostEqual(abs(fill_level-fl_out).sum(), 0,4) + self.assertAlmostEqual(res.value, 1137.69104689219,3) # reversion test + self.assertAlmostEqual(out['dispatch'].loc[:,'battery'].sum(), -71.66666667,3) # reversion test + self.assertAlmostEqual(fill_level[-1], bat.end_level,3) def test_battery_efficiency_100(self): """ test specific setup of a battery to show the importance of no_simult_in_out. @@ -312,6 +315,131 @@ def test_battery_efficiency_asset_only(self): self.assertGreaterEqual(100, fill_level.max()) self.assertAlmostEqual(abs(fill_level_asset-fill_level).sum(), 0,4) + def test_opt_shortcut(self): + """ test opt shortcut + """ + ### manual benchmark + node1 = eao.Node('node_1') + node2 = eao.Node('node_2') + timegrid = eao.Timegrid(dt.date(2021,1,1), dt.date(2021,2,1), freq = 'd') + a1 = eao.assets.SimpleContract(name = 'SC_1', price = 'rand_price_1', nodes = node1 , + min_cap= -20., max_cap=20., start = dt.date(2021,1,10), end = dt.date(2021,1,20)) + #a1.set_timegrid(timegrid) + a2 = eao.assets.SimpleContract(name = 'SC_2', price = 'rand_price_1', nodes = node1 , + min_cap= -5., max_cap=10.)#, extra_costs= 1.) + #a2.set_timegrid(timegrid) + a3 = eao.assets.SimpleContract(name = 'SC_3', price = 'rand_price_2', nodes = node2 , + min_cap= -10., max_cap=10., extra_costs= 1., start = dt.date(2021,1,10), end = dt.date(2021,1,25)) + a4 = eao.assets.Transport(name = 'Tr', costs_const= 5., nodes = [node1, node2], + min_cap= 0., max_cap=1.) + + #a3.set_timegrid(timegrid) + prices ={'rand_price_1': np.ones(timegrid.T)*1., + 'rand_price_2': np.ones(timegrid.T)*10., + } + portf = eao.portfolio.Portfolio([a1, a2, a3, a4]) + op = portf.setup_optim_problem(prices, timegrid) + res = op.optimize() + out = eao.io.extract_output(portf, op, res, prices) + # shortcut + #out2 = eao.io.optimize(portf, timegrid, prices) + out2 = eao.optimize(portf, timegrid, prices) + self.assertAlmostEqual(out['summary'].loc['value','Values'], out2['summary'].loc['value','Values'], 2) + self.assertAlmostEqual(out['dispatch'].abs().sum().sum(), out2['dispatch'].abs().sum().sum(), 2) + + def test_opt_shortcut_split(self): + """ test opt shortcut + """ + ### manual benchmark + s = """{ + "__class__": "Portfolio", + "assets": [ + { + "__class__": "Asset", + "asset_type": "Storage", + "block_size": null, + "cap_in": 50, + "cap_out": 50, + "cost_in": 0.0, + "cost_out": 0.0, + "cost_store": 0.0, + "eff_in": 0.9, + "end": null, + "end_level": 50.0, + "freq": null, + "inflow": 0.0, + "max_store_duration": null, + "name": "battery", + "no_simult_in_out": false, + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": null, + "profile": null, + "size": 100.0, + "start": null, + "start_level": 50.0, + "wacc": 0.0 + }, + { + "__class__": "Asset", + "asset_type": "SimpleContract", + "end": null, + "extra_costs": 0, + "freq": null, + "max_cap": 500, + "min_cap": -500, + "name": "supply", + "nodes": [ + { + "__class__": "Node", + "commodity": null, + "name": "power", + "unit": { + "__class__": "Unit", + "factor": 1.0, + "flow": "MW", + "volume": "MWh" + } + } + ], + "periodicity": null, + "periodicity_duration": null, + "price": "price", + "profile": null, + "start": null, + "wacc": 0 + } + ] + }""" + size = 100 # battery size + eff = 1 + portf = eao.serialization.load_from_json(s) + portf.assets[0].eff_in = eff + portf.assets[0].size = size + portf.assets[0].no_simult_in_out = False + tg = eao.assets.Timegrid(dt.date(2021,1,1), dt.date(2021,1,3), freq = 'h') + prices ={ 'price': np.sin(np.linspace(0,40,tg.T))} + op = portf.setup_split_optim_problem(timegrid = tg, prices = prices, interval_size='d') + res = op.optimize() + out = eao.io.extract_output(portf = portf, op = op, res = res) + # shortcut + out2 = eao.optimize(portf, tg, prices, split_interval_size='d') + self.assertAlmostEqual(out['summary'].loc['value','Values'], out2['summary'].loc['value','Values'], 2) + self.assertAlmostEqual(out['dispatch'].abs().sum().sum(), out2['dispatch'].abs().sum().sum(), 2) + ########################################################################################################### ########################################################################################################### ###########################################################################################################