diff --git a/data-science-for-esm/14-workshop-linopy.ipynb b/data-science-for-esm/14-workshop-linopy.ipynb
index 5a675eb9..cb849f74 100644
--- a/data-science-for-esm/14-workshop-linopy.ipynb
+++ b/data-science-for-esm/14-workshop-linopy.ipynb
@@ -84,7 +84,7 @@
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"id": "d94292b1-8073-49a8-a2e9-a2c769145b2d",
"metadata": {},
"outputs": [],
@@ -124,7 +124,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"id": "64b35f1c-5398-4eb3-9135-aafce270b79b",
"metadata": {},
"outputs": [],
@@ -143,70 +143,30 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"id": "19d4b5f5-b9ae-48f6-8ce6-cd4a418dba6b",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Variable\n",
- "--------\n",
- "x ∈ [0, inf]"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"x"
]
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": null,
"id": "f6c58398",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "linopy.model.Variables\n",
- "----------------------\n",
- " * x\n",
- " * y"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.variables"
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"id": "c7f01250",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Variable\n",
- "--------\n",
- "x ∈ [0, inf]"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.variables[\"x\"]"
]
@@ -223,23 +183,10 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"id": "1df4589f-4c99-46b5-a530-63f99b4515cc",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint (unassigned)\n",
- "-----------------------\n",
- "+3 x + 7 y ≥ 10.0"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"3 * x + 7 * y >= 10"
]
@@ -254,23 +201,10 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"id": "688e0f65-9198-49b2-915a-2131084224c1",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint (unassigned)\n",
- "-----------------------\n",
- "+3 x + 7 y ≥ 10.0"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"3 * x + 7 * y - 10 >= 0"
]
@@ -293,7 +227,7 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"id": "fa233f5c-38ec-4a5a-9008-502932df968d",
"metadata": {},
"outputs": [],
@@ -304,47 +238,20 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": null,
"id": "25c7a077",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "linopy.model.Constraints\n",
- "------------------------\n",
- " * con0\n",
- " * con1"
- ]
- },
- "execution_count": 9,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.constraints"
]
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": null,
"id": "024a26c4",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint `con0`\n",
- "-----------------\n",
- "+3 x + 7 y ≥ 10.0"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.constraints[\"con0\"]"
]
@@ -361,7 +268,7 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"id": "18c6e6ce-37f9-4527-83a4-e5764b67b34c",
"metadata": {},
"outputs": [],
@@ -371,25 +278,10 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"id": "4040afc5",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Objective:\n",
- "----------\n",
- "LinearExpression: +1 x + 2 y\n",
- "Sense: min\n",
- "Value: None"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.objective"
]
@@ -404,36 +296,10 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": null,
"id": "a1e8788b",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Linopy LP model\n",
- "===============\n",
- "\n",
- "Variables:\n",
- "----------\n",
- " * x\n",
- " * y\n",
- "\n",
- "Constraints:\n",
- "------------\n",
- " * con0\n",
- " * con1\n",
- "\n",
- "Status:\n",
- "-------\n",
- "initialized"
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m"
]
@@ -450,42 +316,10 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": null,
"id": "712a0033-d027-478a-b8f2-201ec4ed1cc1",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Running HiGHS 1.5.3 [date: 2023-05-16, git hash: 594fa5a9d-dirty]\n",
- "Copyright (c) 2023 HiGHS under MIT licence terms\n",
- "Presolving model\n",
- "2 rows, 2 cols, 4 nonzeros\n",
- "2 rows, 2 cols, 4 nonzeros\n",
- "Presolve : Reductions: rows 2(-0); columns 2(-0); elements 4(-0) - Not reduced\n",
- "Problem not reduced by presolve: solving the LP\n",
- "Using EKK dual simplex solver - serial\n",
- " Iteration Objective Infeasibilities num(sum)\n",
- " 0 0.0000000000e+00 Pr: 2(13) 0s\n",
- " 2 2.8620689655e+00 Pr: 0(0) 0s\n",
- "Model status : Optimal\n",
- "Simplex iterations: 2\n",
- "Objective value : 2.8620689655e+00\n",
- "HiGHS run time : 0.00\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "('ok', 'optimal')"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solve()"
]
@@ -517,778 +351,20 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": null,
"id": "1f28aa81-d16f-4b7e-9d8e-f661d4b8bcd8",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "
<xarray.DataArray 'solution' ()> Size: 8B\n",
- "array(0.03448276)
"
- ],
- "text/plain": [
- " Size: 8B\n",
- "array(0.03448276)"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"x.solution"
]
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": null,
"id": "470e2d25-9386-438d-932e-113464907726",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
<xarray.DataArray 'solution' ()> Size: 8B\n",
- "array(1.4137931)
"
- ],
- "text/plain": [
- " Size: 8B\n",
- "array(1.4137931)"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"y.solution"
]
@@ -1303,21 +379,10 @@
},
{
"cell_type": "code",
- "execution_count": 17,
+ "execution_count": null,
"id": "b30ceb74",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "2.8620689655172415"
- ]
- },
- "execution_count": 17,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.objective.value"
]
@@ -1332,389 +397,10 @@
},
{
"cell_type": "code",
- "execution_count": 18,
+ "execution_count": null,
"id": "f6604954",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
<xarray.DataArray 'con0' ()> Size: 8B\n",
- "array(0.27586207)
"
- ],
- "text/plain": [
- " Size: 8B\n",
- "array(0.27586207)"
- ]
- },
- "execution_count": 18,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.dual[\"con0\"]"
]
@@ -1769,7 +455,7 @@
},
{
"cell_type": "code",
- "execution_count": 19,
+ "execution_count": null,
"id": "788956e7-1bc9-4298-85a1-9235486b8cad",
"metadata": {},
"outputs": [],
@@ -1787,7 +473,7 @@
},
{
"cell_type": "code",
- "execution_count": 20,
+ "execution_count": null,
"id": "d477e41c-a89f-4d3b-a1af-385820638a75",
"metadata": {},
"outputs": [],
@@ -1806,32 +492,10 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": null,
"id": "b31a72ca",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Variable (time: 10)\n",
- "-------------------\n",
- "[0]: x[0] ∈ [0, inf]\n",
- "[1]: x[1] ∈ [0, inf]\n",
- "[2]: x[2] ∈ [0, inf]\n",
- "[3]: x[3] ∈ [0, inf]\n",
- "[4]: x[4] ∈ [0, inf]\n",
- "[5]: x[5] ∈ [0, inf]\n",
- "[6]: x[6] ∈ [0, inf]\n",
- "[7]: x[7] ∈ [0, inf]\n",
- "[8]: x[8] ∈ [0, inf]\n",
- "[9]: x[9] ∈ [0, inf]"
- ]
- },
- "execution_count": 21,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"x"
]
@@ -1850,32 +514,10 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": null,
"id": "00a64dec-26a5-4f80-97c0-de0fe00188a2",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint (unassigned) (time: 10):\n",
- "-----------------------------------\n",
- "[0]: +3 x[0] + 7 y[0] ≥ -0.0\n",
- "[1]: +3 x[1] + 7 y[1] ≥ 10.0\n",
- "[2]: +3 x[2] + 7 y[2] ≥ 20.0\n",
- "[3]: +3 x[3] + 7 y[3] ≥ 30.0\n",
- "[4]: +3 x[4] + 7 y[4] ≥ 40.0\n",
- "[5]: +3 x[5] + 7 y[5] ≥ 50.0\n",
- "[6]: +3 x[6] + 7 y[6] ≥ 60.0\n",
- "[7]: +3 x[7] + 7 y[7] ≥ 70.0\n",
- "[8]: +3 x[8] + 7 y[8] ≥ 80.0\n",
- "[9]: +3 x[9] + 7 y[9] ≥ 90.0"
- ]
- },
- "execution_count": 22,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"factor = pd.Series(time, index=time)\n",
"\n",
@@ -1892,36 +534,10 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": null,
"id": "8d3a89e8-0b0e-480d-9cb8-f29931fb3559",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Linopy LP model\n",
- "===============\n",
- "\n",
- "Variables:\n",
- "----------\n",
- " * x (time)\n",
- " * y (time)\n",
- "\n",
- "Constraints:\n",
- "------------\n",
- " * con1 (time)\n",
- " * con2 (time)\n",
- "\n",
- "Status:\n",
- "-------\n",
- "initialized"
- ]
- },
- "execution_count": 23,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"con1 = m.add_constraints(3 * x + 7 * y >= 10 * factor, name=\"con1\")\n",
"con2 = m.add_constraints(5 * x + 2 * y >= 3 * factor, name=\"con2\")\n",
@@ -1938,7 +554,7 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": null,
"id": "9cbf16b4-99ed-4e33-9ea9-e8eff3503b05",
"metadata": {},
"outputs": [],
@@ -1948,30 +564,17 @@
},
{
"cell_type": "code",
- "execution_count": 25,
+ "execution_count": null,
"id": "075a8a0b",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearExpression\n",
- "----------------\n",
- "+1 x[0] + 2 y[0] + 1 x[1] ... +2 y[8] + 1 x[9] + 2 y[9]"
- ]
- },
- "execution_count": 25,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"obj"
]
},
{
"cell_type": "code",
- "execution_count": 26,
+ "execution_count": null,
"id": "8f4e2168",
"metadata": {},
"outputs": [],
@@ -1989,43 +592,10 @@
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": null,
"id": "436f52a8",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Running HiGHS 1.5.3 [date: 2023-05-16, git hash: 594fa5a9d-dirty]\n",
- "Copyright (c) 2023 HiGHS under MIT licence terms\n",
- "Presolving model\n",
- "18 rows, 18 cols, 36 nonzeros\n",
- "18 rows, 18 cols, 36 nonzeros\n",
- "Presolve : Reductions: rows 18(-2); columns 18(-2); elements 36(-4)\n",
- "Solving the presolved LP\n",
- "Using EKK dual simplex solver - serial\n",
- " Iteration Objective Infeasibilities num(sum)\n",
- " 0 0.0000000000e+00 Pr: 18(585) 0s\n",
- " 18 1.2879310345e+02 Pr: 0(0) 0s\n",
- "Solving the original LP from the solution after postsolve\n",
- "Model status : Optimal\n",
- "Simplex iterations: 18\n",
- "Objective value : 1.2879310345e+02\n",
- "HiGHS run time : 0.00\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "('ok', 'optimal')"
- ]
- },
- "execution_count": 27,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solve()"
]
@@ -2040,115 +610,10 @@
},
{
"cell_type": "code",
- "execution_count": 28,
+ "execution_count": null,
"id": "33cdfad9-0ff3-4211-afaf-b0e27fa33d5a",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " x | \n",
- " y | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 0.000000 | \n",
- " 0.000000 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 0.034483 | \n",
- " 1.413793 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 0.068966 | \n",
- " 2.827586 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 0.103448 | \n",
- " 4.241379 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " 0.137931 | \n",
- " 5.655172 | \n",
- "
\n",
- " \n",
- " 5 | \n",
- " 0.172414 | \n",
- " 7.068966 | \n",
- "
\n",
- " \n",
- " 6 | \n",
- " 0.206897 | \n",
- " 8.482759 | \n",
- "
\n",
- " \n",
- " 7 | \n",
- " 0.241379 | \n",
- " 9.896552 | \n",
- "
\n",
- " \n",
- " 8 | \n",
- " 0.275862 | \n",
- " 11.310345 | \n",
- "
\n",
- " \n",
- " 9 | \n",
- " 0.310345 | \n",
- " 12.724138 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " x y\n",
- "time \n",
- "0 0.000000 0.000000\n",
- "1 0.034483 1.413793\n",
- "2 0.068966 2.827586\n",
- "3 0.103448 4.241379\n",
- "4 0.137931 5.655172\n",
- "5 0.172414 7.068966\n",
- "6 0.206897 8.482759\n",
- "7 0.241379 9.896552\n",
- "8 0.275862 11.310345\n",
- "9 0.310345 12.724138"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solution.to_dataframe()"
]
@@ -2163,21 +628,10 @@
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": null,
"id": "5ba03b54",
"metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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ikhA6MiMiFjupZdeYvPmzTRq1IjRo0cD8OOPPxZ4XlZWFi+//DLvvfcehw8fpmfPnvTs2ZP4+Hg++eQTtmzZwo033kibNm24+eabAejXrx/btm3jvffeo2rVqsydO5dOnTrxww8/cNFFF5Xo9ykigaEyIyKWK1euHBEREcTExOQtLf38888Fnud2u5k8eTIXXnghAL169eKdd97hjz/+oGzZsjRo0ID27dvz+eefc/PNN/Pbb7/x3//+l127dlG1alUAHnjgARYtWkRqaipjx44tuW9SRAJGZUZEgkZMTExekQFITEykZs2alC1bNt9j6enpAKxfvx7DMKhbt26+7WRnZ1OxYsWSCS0iAacyIyJBIzw8PN/Y4XAU+pjX6wXA6/XicrlYt24dLpcr3/NOLUAiEtxUZkTEFiIiIvKduOsPzZo1w+PxkJ6ezlVXXeXXbYuIfejdTCJiCzVr1uSbb75h27Zt7N+/P+/oyvmoW7cuffv25fbbb2fOnDls3bqVNWvWMH78eD755BM/pBYRO1CZERFbeOCBB3C5XDRo0IALLriAHTt2+GW7qamp3H777dx///1cfPHFXH/99XzzzTckJyf7ZfsiYj1dAVhERESCmo7MiIiISFBTmREREZGgpjIjIiIiQU1lRkRERIKayoyIiIgENZUZERERCWoqMyIiIhLUVGZEREQkqKnMiIiISFBTmREREZGgpjIjIiIiQe3/AZcH96p2XDQ6AAAAAElFTkSuQmCC",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
"m.solution.to_dataframe().plot(grid=True, ylabel=\"Optimal Value\");"
]
@@ -2242,25 +696,10 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": null,
"id": "30a08a5c-a63c-4c0e-9ec0-8fbbd2e26dbb",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Wind 0\n",
- "Coal 30\n",
- "Gas 60\n",
- "Oil 80\n",
- "dtype: int64"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"marginal_costs = pd.Series(\n",
" [0, 30, 60, 80], index=[\"Wind\", \"Coal\", \"Gas\", \"Oil\"]\n",
@@ -2278,25 +717,10 @@
},
{
"cell_type": "code",
- "execution_count": 31,
+ "execution_count": null,
"id": "5864cf82-59bb-4ec2-9767-4739fd675637",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Wind 3000\n",
- "Coal 35000\n",
- "Gas 8000\n",
- "Oil 2000\n",
- "dtype: int64"
- ]
- },
- "execution_count": 31,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"capacities = pd.Series(\n",
" [3000, 35000, 8000, 2000], index=[\"Wind\", \"Coal\", \"Gas\", \"Oil\"]\n",
@@ -2314,7 +738,7 @@
},
{
"cell_type": "code",
- "execution_count": 32,
+ "execution_count": null,
"id": "9b018aa6-715e-4319-ae83-ce7a0fd3d890",
"metadata": {},
"outputs": [],
@@ -2332,7 +756,7 @@
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": null,
"id": "89d61ab1-078b-406d-b9db-1a6377843c79",
"metadata": {},
"outputs": [],
@@ -2352,26 +776,10 @@
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": null,
"id": "cd87f66b-e2f0-4676-966b-51c2f180efb1",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Variable (dim_0: 4)\n",
- "-------------------\n",
- "[Wind]: g[Wind] ∈ [0, 3000]\n",
- "[Coal]: g[Coal] ∈ [0, 3.5e+04]\n",
- "[Gas]: g[Gas] ∈ [0, 8000]\n",
- "[Oil]: g[Oil] ∈ [0, 2000]"
- ]
- },
- "execution_count": 34,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"g = m.add_variables(\n",
" lower=0, upper=capacities, coords=[capacities.index], name=\"g\"\n",
@@ -2390,25 +798,10 @@
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": null,
"id": "55cfe8c4-9816-4375-8979-a136219a96fa",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Objective:\n",
- "----------\n",
- "LinearExpression: +0 g[Wind] + 30 g[Coal] + 60 g[Gas] + 80 g[Oil]\n",
- "Sense: min\n",
- "Value: None"
- ]
- },
- "execution_count": 35,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.add_objective(marginal_costs.values * g, sense=\"min\")\n",
"m.objective"
@@ -2426,23 +819,10 @@
},
{
"cell_type": "code",
- "execution_count": 36,
+ "execution_count": null,
"id": "c37f66f5-fce5-4e54-a122-56b992ed2f95",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint `energy_balance`\n",
- "---------------------------\n",
- "+1 g[Wind] + 1 g[Coal] + 1 g[Gas] + 1 g[Oil] = 42000.0"
- ]
- },
- "execution_count": 36,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.add_constraints(g.sum() == load, name=\"energy_balance\")"
]
@@ -2457,37 +837,10 @@
},
{
"cell_type": "code",
- "execution_count": 37,
+ "execution_count": null,
"id": "1bd321b2-760f-48e4-b734-1c73daaf520d",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Running HiGHS 1.5.3 [date: 2023-05-16, git hash: 594fa5a9d-dirty]\n",
- "Copyright (c) 2023 HiGHS under MIT licence terms\n",
- "Presolving model\n",
- "1 rows, 3 cols, 3 nonzeros\n",
- "0 rows, 0 cols, 0 nonzeros\n",
- "Presolve : Reductions: rows 0(-1); columns 0(-4); elements 0(-4) - Reduced to empty\n",
- "Solving the original LP from the solution after postsolve\n",
- "Model status : Optimal\n",
- "Objective value : 1.2900000000e+06\n",
- "HiGHS run time : 0.00\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "('ok', 'optimal')"
- ]
- },
- "execution_count": 37,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solve()"
]
@@ -2502,73 +855,10 @@
},
{
"cell_type": "code",
- "execution_count": 38,
+ "execution_count": null,
"id": "876e38fd-008a-4717-ab3b-0aadac8d41bc",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " g | \n",
- "
\n",
- " \n",
- " dim_0 | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " Wind | \n",
- " 3000.0 | \n",
- "
\n",
- " \n",
- " Coal | \n",
- " 35000.0 | \n",
- "
\n",
- " \n",
- " Gas | \n",
- " 4000.0 | \n",
- "
\n",
- " \n",
- " Oil | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " g\n",
- "dim_0 \n",
- "Wind 3000.0\n",
- "Coal 35000.0\n",
- "Gas 4000.0\n",
- "Oil 0.0"
- ]
- },
- "execution_count": 38,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solution.to_dataframe()"
]
@@ -2583,389 +873,10 @@
},
{
"cell_type": "code",
- "execution_count": 39,
+ "execution_count": null,
"id": "a5870398-3420-4443-aed4-ce407ea3ad2d",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
<xarray.DataArray 'energy_balance' ()> Size: 8B\n",
- "array(60.)
"
- ],
- "text/plain": [
- " Size: 8B\n",
- "array(60.)"
- ]
- },
- "execution_count": 39,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.dual[\"energy_balance\"]"
]
@@ -3003,7 +914,7 @@
},
{
"cell_type": "code",
- "execution_count": 40,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -3013,79 +924,10 @@
},
{
"cell_type": "code",
- "execution_count": 41,
+ "execution_count": null,
"id": "4aaaa1bd-112e-4502-92fe-6291c2998046",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " generators | \n",
- " Coal | \n",
- " Wind | \n",
- " Gas | \n",
- " Oil | \n",
- " Hydro | \n",
- "
\n",
- " \n",
- " countries | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " South_Africa | \n",
- " 35000 | \n",
- " 3000 | \n",
- " 8000 | \n",
- " 2000 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " Mozambique | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1200 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "generators Coal Wind Gas Oil Hydro\n",
- "countries \n",
- "South_Africa 35000 3000 8000 2000 0\n",
- "Mozambique 0 0 0 0 1200"
- ]
- },
- "execution_count": 41,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"capacities = pd.DataFrame(\n",
" {\n",
@@ -3105,27 +947,10 @@
},
{
"cell_type": "code",
- "execution_count": 42,
+ "execution_count": null,
"id": "8822d16f-1eab-4e7d-af3b-b791113629e0",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "generators\n",
- "Coal 30\n",
- "Wind 0\n",
- "Gas 60\n",
- "Oil 80\n",
- "Hydro 0\n",
- "dtype: int64"
- ]
- },
- "execution_count": 42,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"# variable costs in EUR/MWh\n",
"marginal_costs = pd.Series([30, 0, 60, 80, 0], index=generators)\n",
@@ -3135,24 +960,10 @@
},
{
"cell_type": "code",
- "execution_count": 43,
+ "execution_count": null,
"id": "01214bbf-786c-4dcf-b3ea-179b5285e51d",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "countries\n",
- "South_Africa 42000\n",
- "Mozambique 650\n",
- "dtype: int64"
- ]
- },
- "execution_count": 43,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"load = pd.Series([42000, 650], index=countries)\n",
"load.index.name = \"countries\"\n",
@@ -3161,7 +972,7 @@
},
{
"cell_type": "code",
- "execution_count": 44,
+ "execution_count": null,
"id": "20b478e0-26e3-470b-82e6-ed0da0e0217f",
"metadata": {},
"outputs": [],
@@ -3179,7 +990,7 @@
},
{
"cell_type": "code",
- "execution_count": 45,
+ "execution_count": null,
"id": "d2996e54-fd7e-4c99-b52d-02ec6c4ec2f1",
"metadata": {},
"outputs": [],
@@ -3197,111 +1008,20 @@
},
{
"cell_type": "code",
- "execution_count": 46,
+ "execution_count": null,
"id": "83936e48",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " generators | \n",
- " Coal | \n",
- " Wind | \n",
- " Gas | \n",
- " Oil | \n",
- " Hydro | \n",
- "
\n",
- " \n",
- " countries | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " South_Africa | \n",
- " 35000 | \n",
- " 3000 | \n",
- " 8000 | \n",
- " 2000 | \n",
- " 0 | \n",
- "
\n",
- " \n",
- " Mozambique | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 0 | \n",
- " 1200 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "generators Coal Wind Gas Oil Hydro\n",
- "countries \n",
- "South_Africa 35000 3000 8000 2000 0\n",
- "Mozambique 0 0 0 0 1200"
- ]
- },
- "execution_count": 46,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"capacities"
]
},
{
"cell_type": "code",
- "execution_count": 47,
+ "execution_count": null,
"id": "d548c6ae-ae63-4a24-84f4-60cdc0537953",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Variable (countries: 2, generators: 5)\n",
- "--------------------------------------\n",
- "[South_Africa, Coal]: g[South_Africa, Coal] ∈ [0, 3.5e+04]\n",
- "[South_Africa, Wind]: g[South_Africa, Wind] ∈ [0, 3000]\n",
- "[South_Africa, Gas]: g[South_Africa, Gas] ∈ [0, 8000]\n",
- "[South_Africa, Oil]: g[South_Africa, Oil] ∈ [0, 2000]\n",
- "[South_Africa, Hydro]: g[South_Africa, Hydro] ∈ [0, 0]\n",
- "[Mozambique, Coal]: g[Mozambique, Coal] ∈ [0, 0]\n",
- "[Mozambique, Wind]: g[Mozambique, Wind] ∈ [0, 0]\n",
- "[Mozambique, Gas]: g[Mozambique, Gas] ∈ [0, 0]\n",
- "[Mozambique, Oil]: g[Mozambique, Oil] ∈ [0, 0]\n",
- "[Mozambique, Hydro]: g[Mozambique, Hydro] ∈ [0, 1200]"
- ]
- },
- "execution_count": 47,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"g = m.add_variables(lower=0, upper=capacities, name=\"g\")\n",
"g"
@@ -3328,23 +1048,10 @@
},
{
"cell_type": "code",
- "execution_count": 48,
+ "execution_count": null,
"id": "44d964fb-df92-410d-8465-cb134a0e8f9e",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Variable\n",
- "--------\n",
- "flow_MZ_SA ∈ [-500, 500]"
- ]
- },
- "execution_count": 48,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"f = m.add_variables(lower=-transmission, upper=transmission, name=\"flow_MZ_SA\")\n",
"f"
@@ -3365,7 +1072,7 @@
},
{
"cell_type": "code",
- "execution_count": 49,
+ "execution_count": null,
"id": "d4d7a22b-0b0d-43cc-bf15-658fa4e945ff",
"metadata": {},
"outputs": [],
@@ -3380,23 +1087,10 @@
},
{
"cell_type": "code",
- "execution_count": 50,
+ "execution_count": null,
"id": "b3b94f78",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint `Mozambique_KCL`\n",
- "---------------------------\n",
- "+1 g[Mozambique, Coal] + 1 g[Mozambique, Wind] + 1 g[Mozambique, Gas] + 1 g[Mozambique, Oil] + 1 g[Mozambique, Hydro] - 1 flow_MZ_SA = 650.0"
- ]
- },
- "execution_count": 50,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.constraints[\"Mozambique_KCL\"]"
]
@@ -3412,23 +1106,10 @@
},
{
"cell_type": "code",
- "execution_count": 51,
+ "execution_count": null,
"id": "75132441-0386-45bf-8f16-e2a6659922aa",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "LinearExpression\n",
- "----------------\n",
- "+30 g[South_Africa, Coal] + 30 g[Mozambique, Coal] + 0 g[South_Africa, Wind] ... +80 g[Mozambique, Oil] + 0 g[South_Africa, Hydro] + 0 g[Mozambique, Hydro]"
- ]
- },
- "execution_count": 51,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"obj = (g * marginal_costs).sum()\n",
"obj"
@@ -3436,7 +1117,7 @@
},
{
"cell_type": "code",
- "execution_count": 52,
+ "execution_count": null,
"id": "d411da42-7782-40b8-829c-bff883fc2b4b",
"metadata": {},
"outputs": [],
@@ -3454,37 +1135,10 @@
},
{
"cell_type": "code",
- "execution_count": 53,
+ "execution_count": null,
"id": "6e41147e-6771-4c04-a1f0-b9ebbe8b0edc",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Running HiGHS 1.5.3 [date: 2023-05-16, git hash: 594fa5a9d-dirty]\n",
- "Copyright (c) 2023 HiGHS under MIT licence terms\n",
- "Presolving model\n",
- "1 rows, 4 cols, 4 nonzeros\n",
- "0 rows, 0 cols, 0 nonzeros\n",
- "Presolve : Reductions: rows 0(-2); columns 0(-11); elements 0(-12) - Reduced to empty\n",
- "Solving the original LP from the solution after postsolve\n",
- "Model status : Optimal\n",
- "Objective value : 1.2600000000e+06\n",
- "HiGHS run time : 0.00\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "('ok', 'optimal')"
- ]
- },
- "execution_count": 53,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solve()"
]
@@ -3499,913 +1153,39 @@
},
{
"cell_type": "code",
- "execution_count": 54,
+ "execution_count": null,
"id": "a163fa60",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "1260000.0"
- ]
- },
- "execution_count": 54,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.objective.value"
]
},
{
"cell_type": "code",
- "execution_count": 55,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " | \n",
- " solution | \n",
- "
\n",
- " \n",
- " countries | \n",
- " generators | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " South_Africa | \n",
- " Coal | \n",
- " 35000.0 | \n",
- "
\n",
- " \n",
- " Wind | \n",
- " 3000.0 | \n",
- "
\n",
- " \n",
- " Gas | \n",
- " 3500.0 | \n",
- "
\n",
- " \n",
- " Oil | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " Hydro | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " Mozambique | \n",
- " Coal | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " Wind | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " Gas | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " Oil | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " Hydro | \n",
- " 1150.0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " solution\n",
- "countries generators \n",
- "South_Africa Coal 35000.0\n",
- " Wind 3000.0\n",
- " Gas 3500.0\n",
- " Oil 0.0\n",
- " Hydro 0.0\n",
- "Mozambique Coal 0.0\n",
- " Wind 0.0\n",
- " Gas 0.0\n",
- " Oil 0.0\n",
- " Hydro 1150.0"
- ]
- },
- "execution_count": 55,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
"source": [
"g.solution.to_dataframe()"
]
},
{
"cell_type": "code",
- "execution_count": 57,
+ "execution_count": null,
"id": "78afd5db",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
<xarray.DataArray 'dual' ()> Size: 8B\n",
- "array(60.)\n",
- "Coordinates:\n",
- " countries <U12 48B 'South_Africa'
"
- ],
- "text/plain": [
- " Size: 8B\n",
- "array(60.)\n",
- "Coordinates:\n",
- " countries \n",
- "<xarray.DataArray 'dual' ()> Size: 8B\n",
- "array(-0.)\n",
- "Coordinates:\n",
- " countries <U10 40B 'Mozambique'
"
- ],
- "text/plain": [
- " Size: 8B\n",
- "array(-0.)\n",
- "Coordinates:\n",
- " countries \n",
- "\n",
- "\n",
- " \n",
- " \n",
- " generators | \n",
- " Coal | \n",
- " Wind | \n",
- " Gas | \n",
- " Oil | \n",
- " Hydro | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 1 | \n",
- " 0.3 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 1 | \n",
- " 0.6 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 1 | \n",
- " 0.4 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 1 | \n",
- " 0.5 | \n",
- " 1 | \n",
- " 1 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- "
\n",
- ""
- ],
- "text/plain": [
- "generators Coal Wind Gas Oil Hydro\n",
- "time \n",
- "0 1 0.3 1 1 1\n",
- "1 1 0.6 1 1 1\n",
- "2 1 0.4 1 1 1\n",
- "3 1 0.5 1 1 1"
- ]
- },
- "execution_count": 61,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"capacity_factors = pd.DataFrame(\n",
" {\n",
@@ -4594,7 +1276,7 @@
},
{
"cell_type": "code",
- "execution_count": 62,
+ "execution_count": null,
"id": "74658603-cb8f-4cef-9070-ff9b2ed28c78",
"metadata": {},
"outputs": [],
@@ -4615,7 +1297,7 @@
},
{
"cell_type": "code",
- "execution_count": 63,
+ "execution_count": null,
"id": "46e65d7c-3113-43a3-a091-5f2f8bd3fdfe",
"metadata": {},
"outputs": [],
@@ -4637,37 +1319,10 @@
},
{
"cell_type": "code",
- "execution_count": 64,
+ "execution_count": null,
"id": "54c6e92d-df1a-4d81-8d06-1c47ed1ca445",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Variable (time: 4, generators: 5)\n",
- "---------------------------------\n",
- "[0, Coal]: g[0, Coal] ∈ [0, 3.5e+04]\n",
- "[0, Wind]: g[0, Wind] ∈ [0, 900]\n",
- "[0, Gas]: g[0, Gas] ∈ [0, 8000]\n",
- "[0, Oil]: g[0, Oil] ∈ [0, 2000]\n",
- "[0, Hydro]: g[0, Hydro] ∈ [0, 0]\n",
- "[1, Coal]: g[1, Coal] ∈ [0, 3.5e+04]\n",
- "[1, Wind]: g[1, Wind] ∈ [0, 1800]\n",
- "\t\t...\n",
- "[2, Oil]: g[2, Oil] ∈ [0, 2000]\n",
- "[2, Hydro]: g[2, Hydro] ∈ [0, 0]\n",
- "[3, Coal]: g[3, Coal] ∈ [0, 3.5e+04]\n",
- "[3, Wind]: g[3, Wind] ∈ [0, 1500]\n",
- "[3, Gas]: g[3, Gas] ∈ [0, 8000]\n",
- "[3, Oil]: g[3, Oil] ∈ [0, 2000]\n",
- "[3, Hydro]: g[3, Hydro] ∈ [0, 0]"
- ]
- },
- "execution_count": 64,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"g = m.add_variables(\n",
" lower=0, upper=capacities * capacity_factors, name=\"g\"\n",
@@ -4688,25 +1343,10 @@
},
{
"cell_type": "code",
- "execution_count": 65,
+ "execution_count": null,
"id": "62ba1212-347d-4b04-901d-f0cae3167e50",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Objective:\n",
- "----------\n",
- "LinearExpression: +30 g[0, Coal] + 30 g[1, Coal] + 30 g[2, Coal] ... +0 g[1, Hydro] + 0 g[2, Hydro] + 0 g[3, Hydro]\n",
- "Sense: min\n",
- "Value: None"
- ]
- },
- "execution_count": 65,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.add_objective((g * marginal_costs).sum(), sense=\"min\")\n",
"m.objective"
@@ -4725,26 +1365,10 @@
},
{
"cell_type": "code",
- "execution_count": 66,
+ "execution_count": null,
"id": "cfc40d59-0780-422f-9c21-f3a59336a230",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint `energy_balance` (time: 4):\n",
- "--------------------------------------\n",
- "[0]: +1 g[0, Coal] + 1 g[0, Wind] + 1 g[0, Gas] + 1 g[0, Oil] + 1 g[0, Hydro] = 42000.0\n",
- "[1]: +1 g[1, Coal] + 1 g[1, Wind] + 1 g[1, Gas] + 1 g[1, Oil] + 1 g[1, Hydro] = 43000.0\n",
- "[2]: +1 g[2, Coal] + 1 g[2, Wind] + 1 g[2, Gas] + 1 g[2, Oil] + 1 g[2, Hydro] = 45000.0\n",
- "[3]: +1 g[3, Coal] + 1 g[3, Wind] + 1 g[3, Gas] + 1 g[3, Oil] + 1 g[3, Hydro] = 46000.0"
- ]
- },
- "execution_count": 66,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.add_constraints(\n",
" g.sum(\"generators\") == load,\n",
@@ -4762,37 +1386,10 @@
},
{
"cell_type": "code",
- "execution_count": 67,
+ "execution_count": null,
"id": "f3b63ce4-d7c6-4b09-8e57-151c0f0040b6",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Running HiGHS 1.5.3 [date: 2023-05-16, git hash: 594fa5a9d-dirty]\n",
- "Copyright (c) 2023 HiGHS under MIT licence terms\n",
- "Presolving model\n",
- "4 rows, 12 cols, 12 nonzeros\n",
- "0 rows, 0 cols, 0 nonzeros\n",
- "Presolve : Reductions: rows 0(-4); columns 0(-20); elements 0(-20) - Reduced to empty\n",
- "Solving the original LP from the solution after postsolve\n",
- "Model status : Optimal\n",
- "Objective value : 6.0820000000e+06\n",
- "HiGHS run time : 0.00\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "('ok', 'optimal')"
- ]
- },
- "execution_count": 67,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solve()"
]
@@ -4807,190 +1404,29 @@
},
{
"cell_type": "code",
- "execution_count": 68,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "6082000.0"
- ]
- },
- "execution_count": 68,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
"source": [
"m.objective.value"
]
},
{
"cell_type": "code",
- "execution_count": 69,
+ "execution_count": null,
"id": "0bd273c4",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " generators | \n",
- " Coal | \n",
- " Wind | \n",
- " Gas | \n",
- " Oil | \n",
- " Hydro | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 35000.0 | \n",
- " 900.0 | \n",
- " 6100.0 | \n",
- " 0.0 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 35000.0 | \n",
- " 1800.0 | \n",
- " 6200.0 | \n",
- " 0.0 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 35000.0 | \n",
- " 1200.0 | \n",
- " 8000.0 | \n",
- " 800.0 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 35000.0 | \n",
- " 1500.0 | \n",
- " 8000.0 | \n",
- " 1500.0 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "generators Coal Wind Gas Oil Hydro\n",
- "time \n",
- "0 35000.0 900.0 6100.0 0.0 0.0\n",
- "1 35000.0 1800.0 6200.0 0.0 0.0\n",
- "2 35000.0 1200.0 8000.0 800.0 0.0\n",
- "3 35000.0 1500.0 8000.0 1500.0 0.0"
- ]
- },
- "execution_count": 69,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"g.solution.round(2).to_dataframe().squeeze().unstack()"
]
},
{
"cell_type": "code",
- "execution_count": 70,
+ "execution_count": null,
"id": "9d78b612",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " energy_balance | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 60.0 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 60.0 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 80.0 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 80.0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " energy_balance\n",
- "time \n",
- "0 60.0\n",
- "1 60.0\n",
- "2 80.0\n",
- "3 80.0"
- ]
- },
- "execution_count": 70,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.dual.to_dataframe()"
]
@@ -5021,7 +1457,7 @@
},
{
"cell_type": "code",
- "execution_count": 71,
+ "execution_count": null,
"id": "30b6d318-91e9-4074-b749-b2d1393e503e",
"metadata": {},
"outputs": [],
@@ -5034,34 +1470,10 @@
},
{
"cell_type": "code",
- "execution_count": 72,
+ "execution_count": null,
"id": "596f621c-70e1-4bb4-8701-e706bbd756e3",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Linopy LP model\n",
- "===============\n",
- "\n",
- "Variables:\n",
- "----------\n",
- " * g (time, generators)\n",
- "\n",
- "Constraints:\n",
- "------------\n",
- " * energy_balance (time)\n",
- "\n",
- "Status:\n",
- "-------\n",
- "ok"
- ]
- },
- "execution_count": 72,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m"
]
@@ -5076,7 +1488,7 @@
},
{
"cell_type": "code",
- "execution_count": 73,
+ "execution_count": null,
"id": "2d32118c-eeda-4ab4-8400-292aca5fa0ef",
"metadata": {},
"outputs": [],
@@ -5108,48 +1520,20 @@
},
{
"cell_type": "code",
- "execution_count": 74,
+ "execution_count": null,
"id": "37f57529-a84c-4553-86ee-180211a53af8",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint `soc_initial`\n",
- "------------------------\n",
- "+1 battery_soc[0] = -0.0"
- ]
- },
- "execution_count": 74,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.add_constraints(battery_soc.loc[0] == 0, name=\"soc_initial\")"
]
},
{
"cell_type": "code",
- "execution_count": 75,
+ "execution_count": null,
"id": "2bad2277",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint `soc_consistency` (time: 3):\n",
- "---------------------------------------\n",
- "[1]: +1 battery_soc[1] - 1 battery_soc[0] - 0.9 battery_charge[1] + 1.111 battery_discharge[1] = -0.0\n",
- "[2]: +1 battery_soc[2] - 1 battery_soc[1] - 0.9 battery_charge[2] + 1.111 battery_discharge[2] = -0.0\n",
- "[3]: +1 battery_soc[3] - 1 battery_soc[2] - 0.9 battery_charge[3] + 1.111 battery_discharge[3] = -0.0"
- ]
- },
- "execution_count": 75,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.add_constraints(\n",
" battery_soc.loc[1:] == (1 - standing_loss) * battery_soc.shift(time=1).loc[1:] + efficiency * battery_charge.loc[1:] - 1 / efficiency * battery_discharge.loc[1:],\n",
@@ -5169,7 +1553,7 @@
},
{
"cell_type": "code",
- "execution_count": 76,
+ "execution_count": null,
"id": "e1f690ff-55d0-45ff-901e-58c8adb43c18",
"metadata": {},
"outputs": [],
@@ -5179,26 +1563,10 @@
},
{
"cell_type": "code",
- "execution_count": 77,
+ "execution_count": null,
"id": "7873dec7",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Constraint `energy_balance` (time: 4):\n",
- "--------------------------------------\n",
- "[0]: +1 g[0, Coal] + 1 g[0, Wind] + 1 g[0, Gas] ... +1 g[0, Hydro] + 1 battery_discharge[0] - 1 battery_charge[0] = 42000.0\n",
- "[1]: +1 g[1, Coal] + 1 g[1, Wind] + 1 g[1, Gas] ... +1 g[1, Hydro] + 1 battery_discharge[1] - 1 battery_charge[1] = 43000.0\n",
- "[2]: +1 g[2, Coal] + 1 g[2, Wind] + 1 g[2, Gas] ... +1 g[2, Hydro] + 1 battery_discharge[2] - 1 battery_charge[2] = 45000.0\n",
- "[3]: +1 g[3, Coal] + 1 g[3, Wind] + 1 g[3, Gas] ... +1 g[3, Hydro] + 1 battery_discharge[3] - 1 battery_charge[3] = 46000.0"
- ]
- },
- "execution_count": 77,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.add_constraints(\n",
" g.sum(\"generators\") + battery_discharge - battery_charge == load,\n",
@@ -5216,44 +1584,10 @@
},
{
"cell_type": "code",
- "execution_count": 78,
+ "execution_count": null,
"id": "5700dbf1-8ced-48f4-94b0-d991f5d1b4b0",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Running HiGHS 1.5.3 [date: 2023-05-16, git hash: 594fa5a9d-dirty]\n",
- "Copyright (c) 2023 HiGHS under MIT licence terms\n",
- "Presolving model\n",
- "7 rows, 21 cols, 29 nonzeros\n",
- "4 rows, 10 cols, 15 nonzeros\n",
- "Presolve : Reductions: rows 4(-4); columns 10(-22); elements 15(-26)\n",
- "Solving the presolved LP\n",
- "Using EKK dual simplex solver - serial\n",
- " Iteration Objective Infeasibilities num(sum)\n",
- " 0 5.3580000000e+06 Pr: 2(10300) 0s\n",
- " 7 6.0172006560e+06 Pr: 0(0) 0s\n",
- " 7 6.0172006560e+06 Pr: 0(0) 0s\n",
- "Solving the original LP from the solution after postsolve\n",
- "Model status : Optimal\n",
- "Simplex iterations: 7\n",
- "Objective value : 6.0172006560e+06\n",
- "HiGHS run time : 0.00\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "('ok', 'optimal')"
- ]
- },
- "execution_count": 78,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.solve()"
]
@@ -5268,337 +1602,50 @@
},
{
"cell_type": "code",
- "execution_count": 79,
+ "execution_count": null,
"id": "b92c2f1e-113e-4dfc-9ec0-30c3ae680123",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "6017200.655993455"
- ]
- },
- "execution_count": 79,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"m.objective.value"
]
},
{
"cell_type": "code",
- "execution_count": 80,
+ "execution_count": null,
"id": "413c8dab",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " generators | \n",
- " Coal | \n",
- " Wind | \n",
- " Gas | \n",
- " Oil | \n",
- " Hydro | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 35000.0 | \n",
- " 900.0 | \n",
- " 5100.0 | \n",
- " 0.0000 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 35000.0 | \n",
- " 1800.0 | \n",
- " 7200.0 | \n",
- " 0.0000 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 35000.0 | \n",
- " 1200.0 | \n",
- " 8000.0 | \n",
- " 0.0000 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 35000.0 | \n",
- " 1500.0 | \n",
- " 8000.0 | \n",
- " 1490.0082 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- "generators Coal Wind Gas Oil Hydro\n",
- "time \n",
- "0 35000.0 900.0 5100.0 0.0000 0.0\n",
- "1 35000.0 1800.0 7200.0 0.0000 0.0\n",
- "2 35000.0 1200.0 8000.0 0.0000 0.0\n",
- "3 35000.0 1500.0 8000.0 1490.0082 0.0"
- ]
- },
- "execution_count": 80,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"g.solution.to_dataframe().squeeze().unstack()"
]
},
{
"cell_type": "code",
- "execution_count": 81,
+ "execution_count": null,
"id": "ed4ffe65-82ac-4565-a11a-fa5d99f977f5",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " solution | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 1000.0000 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 0.0000 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 800.0000 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 9.9918 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " solution\n",
- "time \n",
- "0 1000.0000\n",
- "1 0.0000\n",
- "2 800.0000\n",
- "3 9.9918"
- ]
- },
- "execution_count": 81,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"battery_discharge.solution.to_dataframe()"
]
},
{
"cell_type": "code",
- "execution_count": 82,
+ "execution_count": null,
"id": "2ff75605-f715-4f1c-9b39-0e2b46d0072b",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " solution | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 1000.0 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 0.0 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " solution\n",
- "time \n",
- "0 0.0\n",
- "1 1000.0\n",
- "2 0.0\n",
- "3 0.0"
- ]
- },
- "execution_count": 82,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"battery_charge.solution.to_dataframe()"
]
},
{
"cell_type": "code",
- "execution_count": 83,
+ "execution_count": null,
"id": "41b539b7-1011-4fd9-b30b-b474c4e365cb",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " solution | \n",
- "
\n",
- " \n",
- " time | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " -0.000000 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 900.000000 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 11.102111 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 0.000000 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " solution\n",
- "time \n",
- "0 -0.000000\n",
- "1 900.000000\n",
- "2 11.102111\n",
- "3 0.000000"
- ]
- },
- "execution_count": 83,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"battery_soc.solution.to_dataframe()"
]