diff --git a/matpowercaseframes/core.py b/matpowercaseframes/core.py index 05340b9..336629c 100644 --- a/matpowercaseframes/core.py +++ b/matpowercaseframes/core.py @@ -1045,11 +1045,12 @@ def _update_index(self, allow_any_keys=False): # gencost is optional # NOTE: try except is better than checking hasattr for common possitive try: - if "gen_name" in self._attributes: + gencost_len = len(self.gencost) + if gencost_len == len(self.gen) and "gen_name" in self._attributes: self.gencost.set_index(self.gen_name, drop=False, inplace=True) else: self.gencost.set_index( - pd.RangeIndex(1, len(self.gen.index) + 1, name="gen"), + pd.RangeIndex(1, len(self.gencost.index) + 1, name="gen"), drop=False, inplace=True, ) diff --git a/notebooks/load_cases.ipynb b/notebooks/load_cases.ipynb new file mode 100644 index 0000000..cbd5d3b --- /dev/null +++ b/notebooks/load_cases.ipynb @@ -0,0 +1,953 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "9a5ee8df", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ec020628", + "metadata": {}, + "outputs": [], + "source": [ + "import glob\n", + "import os\n", + "\n", + "import itables\n", + "import pandas as pd\n", + "from matpower import path_matpower, start_instance\n", + "\n", + "from matpowercaseframes import CaseFrames" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1d8d4ab", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "This is the init_notebook_mode cell from ITables v2.7.1\n", + "(you should not see this message - is your notebook trusted?)\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "itables.init_notebook_mode()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88546245", + "metadata": {}, + "outputs": [], + "source": [ + "m = start_instance()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce620000", + "metadata": {}, + "outputs": [], + "source": [ + "data_dir = os.path.join(path_matpower, \"data\")\n", + "case_paths = glob.glob(os.path.join(data_dir, \"case*.m\"))\n", + "\n", + "cfs = {}\n", + "for case_path in case_paths:\n", + " case_name = os.path.splitext(os.path.basename(case_path))[0]\n", + " try:\n", + " cfs[case_name] = CaseFrames(case_path, load_case_engine=m)\n", + " except Exception:\n", + " print(f\"Failed to load case: {case_name}\")\n", + " continue" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83619b0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " Loading ITables v2.7.1 from the init_notebook_mode cell...\n", + " (need help?)\n", + " \n", + " \n", + " \n", + "\n", + "\n" + ], + "text/plain": [ + " case n_bus n_gen n_line max_voltage_level \\\n", + "55 case4gs 4 2 4 230.0 \n", + "33 case4_dist 4 2 3 12.5 \n", + "24 case5 5 5 6 230.0 \n", + "23 case6ww 6 3 11 230.0 \n", + "75 case9 9 3 9 345.0 \n", + ".. ... ... ... ... ... \n", + "57 case_ACTIVSg10k 10000 2485 12706 765.0 \n", + "5 case13659pegase 13659 4092 20467 750.0 \n", + "77 case_ACTIVSg25k 25000 4834 32230 765.0 \n", + "72 case_ACTIVSg70k 70000 10390 88207 765.0 \n", + "38 case_SyntheticUSA 82000 13419 104121 765.0 \n", + "\n", + " min_voltage_level total_demand_MW \n", + "55 230.0 500.00 \n", + "33 12.5 1.20 \n", + "24 230.0 1000.00 \n", + "23 230.0 210.00 \n", + "75 345.0 315.00 \n", + ".. ... ... \n", + "57 1.0 150916.88 \n", + "5 0.4 381431.85 \n", + "77 1.0 234527.52 \n", + "72 1.0 594658.65 \n", + "38 1.0 812684.74 \n", + "\n", + "[78 rows x 7 columns]" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rows = []\n", + "for name, cf in cfs.items():\n", + " n_bus = len(cf.bus)\n", + " n_gen = len(cf.gen)\n", + " n_line = len(cf.branch)\n", + " voltage_levels = sorted(cf.bus[\"BASE_KV\"].unique())\n", + " max_voltage_level = max(voltage_levels)\n", + " min_voltage_level = min(voltage_levels)\n", + " total_demand = cf.bus[\"PD\"].sum()\n", + "\n", + " rows.append(\n", + " {\n", + " \"case\": name,\n", + " \"n_bus\": n_bus,\n", + " \"n_gen\": n_gen,\n", + " \"n_line\": n_line,\n", + " \"total_demand_MW\": total_demand,\n", + " \"voltage_levels\": voltage_levels,\n", + " \"max_voltage_level\": max_voltage_level,\n", + " \"min_voltage_level\": min_voltage_level,\n", + " }\n", + " )\n", + "report_df = pd.DataFrame(rows).sort_values(\"n_bus\")\n", + "report_df.loc[\n", + " :,\n", + " [\n", + " \"case\",\n", + " \"n_bus\",\n", + " \"n_gen\",\n", + " \"n_line\",\n", + " \"max_voltage_level\",\n", + " \"min_voltage_level\",\n", + " \"total_demand_MW\",\n", + " ],\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e5da2d6f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " Loading ITables v2.7.1 from the init_notebook_mode cell...\n", + " (need help?)\n", + " \n", + " \n", + " \n", + "\n", + "\n" + ], + "text/plain": [ + " F_BUS T_BUS BR_R BR_X BR_B RATE_A RATE_B RATE_C TAP \\\n", + "branch \n", + "1 1.0 2.0 0.0035 0.0411 0.6987 600.0 600.0 600.0 0.000 \n", + "2 1.0 39.0 0.0010 0.0250 0.7500 1000.0 1000.0 1000.0 0.000 \n", + "3 2.0 3.0 0.0013 0.0151 0.2572 500.0 500.0 500.0 0.000 \n", + "4 2.0 25.0 0.0070 0.0086 0.1460 500.0 500.0 500.0 0.000 \n", + "5 2.0 30.0 0.0000 0.0181 0.0000 900.0 900.0 2500.0 1.025 \n", + "6 3.0 4.0 0.0013 0.0213 0.2214 500.0 500.0 500.0 0.000 \n", + "7 3.0 18.0 0.0011 0.0133 0.2138 500.0 500.0 500.0 0.000 \n", + "8 4.0 5.0 0.0008 0.0128 0.1342 600.0 600.0 600.0 0.000 \n", + "9 4.0 14.0 0.0008 0.0129 0.1382 500.0 500.0 500.0 0.000 \n", + "10 5.0 6.0 0.0002 0.0026 0.0434 1200.0 1200.0 1200.0 0.000 \n", + "11 5.0 8.0 0.0008 0.0112 0.1476 900.0 900.0 900.0 0.000 \n", + "12 6.0 7.0 0.0006 0.0092 0.1130 900.0 900.0 900.0 0.000 \n", + "13 6.0 11.0 0.0007 0.0082 0.1389 480.0 480.0 480.0 0.000 \n", + "14 6.0 31.0 0.0000 0.0250 0.0000 1800.0 1800.0 1800.0 1.070 \n", + "15 7.0 8.0 0.0004 0.0046 0.0780 900.0 900.0 900.0 0.000 \n", + "16 8.0 9.0 0.0023 0.0363 0.3804 900.0 900.0 900.0 0.000 \n", + "17 9.0 39.0 0.0010 0.0250 1.2000 900.0 900.0 900.0 0.000 \n", + "18 10.0 11.0 0.0004 0.0043 0.0729 600.0 600.0 600.0 0.000 \n", + "19 10.0 13.0 0.0004 0.0043 0.0729 600.0 600.0 600.0 0.000 \n", + "20 10.0 32.0 0.0000 0.0200 0.0000 900.0 900.0 2500.0 1.070 \n", + "21 12.0 11.0 0.0016 0.0435 0.0000 500.0 500.0 500.0 1.006 \n", + "22 12.0 13.0 0.0016 0.0435 0.0000 500.0 500.0 500.0 1.006 \n", + "23 13.0 14.0 0.0009 0.0101 0.1723 600.0 600.0 600.0 0.000 \n", + "24 14.0 15.0 0.0018 0.0217 0.3660 600.0 600.0 600.0 0.000 \n", + "25 15.0 16.0 0.0009 0.0094 0.1710 600.0 600.0 600.0 0.000 \n", + "26 16.0 17.0 0.0007 0.0089 0.1342 600.0 600.0 600.0 0.000 \n", + "27 16.0 19.0 0.0016 0.0195 0.3040 600.0 600.0 2500.0 0.000 \n", + "28 16.0 21.0 0.0008 0.0135 0.2548 600.0 600.0 600.0 0.000 \n", + "29 16.0 24.0 0.0003 0.0059 0.0680 600.0 600.0 600.0 0.000 \n", + "30 17.0 18.0 0.0007 0.0082 0.1319 600.0 600.0 600.0 0.000 \n", + "31 17.0 27.0 0.0013 0.0173 0.3216 600.0 600.0 600.0 0.000 \n", + "32 19.0 20.0 0.0007 0.0138 0.0000 900.0 900.0 2500.0 1.060 \n", + "33 19.0 33.0 0.0007 0.0142 0.0000 900.0 900.0 2500.0 1.070 \n", + "34 20.0 34.0 0.0009 0.0180 0.0000 900.0 900.0 2500.0 1.009 \n", + "35 21.0 22.0 0.0008 0.0140 0.2565 900.0 900.0 900.0 0.000 \n", + "36 22.0 23.0 0.0006 0.0096 0.1846 600.0 600.0 600.0 0.000 \n", + "37 22.0 35.0 0.0000 0.0143 0.0000 900.0 900.0 2500.0 1.025 \n", + "38 23.0 24.0 0.0022 0.0350 0.3610 600.0 600.0 600.0 0.000 \n", + "39 23.0 36.0 0.0005 0.0272 0.0000 900.0 900.0 2500.0 1.000 \n", + "40 25.0 26.0 0.0032 0.0323 0.5310 600.0 600.0 600.0 0.000 \n", + "41 25.0 37.0 0.0006 0.0232 0.0000 900.0 900.0 2500.0 1.025 \n", + "42 26.0 27.0 0.0014 0.0147 0.2396 600.0 600.0 600.0 0.000 \n", + "43 26.0 28.0 0.0043 0.0474 0.7802 600.0 600.0 600.0 0.000 \n", + "44 26.0 29.0 0.0057 0.0625 1.0290 600.0 600.0 600.0 0.000 \n", + "45 28.0 29.0 0.0014 0.0151 0.2490 600.0 600.0 600.0 0.000 \n", + "46 29.0 38.0 0.0008 0.0156 0.0000 1200.0 1200.0 2500.0 1.025 \n", + "\n", + " SHIFT BR_STATUS ANGMIN ANGMAX \n", + "branch \n", + "1 0.0 1.0 -360.0 360.0 \n", + "2 0.0 1.0 -360.0 360.0 \n", + "3 0.0 1.0 -360.0 360.0 \n", + "4 0.0 1.0 -360.0 360.0 \n", + "5 0.0 1.0 -360.0 360.0 \n", + "6 0.0 1.0 -360.0 360.0 \n", + "7 0.0 1.0 -360.0 360.0 \n", + "8 0.0 1.0 -360.0 360.0 \n", + "9 0.0 1.0 -360.0 360.0 \n", + "10 0.0 1.0 -360.0 360.0 \n", + "11 0.0 1.0 -360.0 360.0 \n", + "12 0.0 1.0 -360.0 360.0 \n", + "13 0.0 1.0 -360.0 360.0 \n", + "14 0.0 1.0 -360.0 360.0 \n", + "15 0.0 1.0 -360.0 360.0 \n", + "16 0.0 1.0 -360.0 360.0 \n", + "17 0.0 1.0 -360.0 360.0 \n", + "18 0.0 1.0 -360.0 360.0 \n", + "19 0.0 1.0 -360.0 360.0 \n", + "20 0.0 1.0 -360.0 360.0 \n", + "21 0.0 1.0 -360.0 360.0 \n", + "22 0.0 1.0 -360.0 360.0 \n", + "23 0.0 1.0 -360.0 360.0 \n", + "24 0.0 1.0 -360.0 360.0 \n", + "25 0.0 1.0 -360.0 360.0 \n", + "26 0.0 1.0 -360.0 360.0 \n", + "27 0.0 1.0 -360.0 360.0 \n", + "28 0.0 1.0 -360.0 360.0 \n", + "29 0.0 1.0 -360.0 360.0 \n", + "30 0.0 1.0 -360.0 360.0 \n", + "31 0.0 1.0 -360.0 360.0 \n", + "32 0.0 1.0 -360.0 360.0 \n", + "33 0.0 1.0 -360.0 360.0 \n", + "34 0.0 1.0 -360.0 360.0 \n", + "35 0.0 1.0 -360.0 360.0 \n", + "36 0.0 1.0 -360.0 360.0 \n", + "37 0.0 1.0 -360.0 360.0 \n", + "38 0.0 1.0 -360.0 360.0 \n", + "39 0.0 1.0 -360.0 360.0 \n", + "40 0.0 1.0 -360.0 360.0 \n", + "41 0.0 1.0 -360.0 360.0 \n", + "42 0.0 1.0 -360.0 360.0 \n", + "43 0.0 1.0 -360.0 360.0 \n", + "44 0.0 1.0 -360.0 360.0 \n", + "45 0.0 1.0 -360.0 360.0 \n", + "46 0.0 1.0 -360.0 360.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " Loading ITables v2.7.1 from the init_notebook_mode cell...\n", + " (need help?)\n", + " \n", + " \n", + " \n", + "\n", + "\n" + ], + "text/plain": [ + " BUS_I BUS_TYPE PD QD GS BS BUS_AREA VM VA \\\n", + "bus \n", + "1 1.0 1.0 97.60 44.2 0.0 0.0 2.0 1.039384 -13.536602 \n", + "2 2.0 1.0 0.00 0.0 0.0 0.0 2.0 1.048494 -9.785267 \n", + "3 3.0 1.0 322.00 2.4 0.0 0.0 2.0 1.030708 -12.276384 \n", + "4 4.0 1.0 500.00 184.0 0.0 0.0 1.0 1.004460 -12.626734 \n", + "5 5.0 1.0 0.00 0.0 0.0 0.0 1.0 1.006006 -11.192339 \n", + "6 6.0 1.0 0.00 0.0 0.0 0.0 1.0 1.008226 -10.408330 \n", + "7 7.0 1.0 233.80 84.0 0.0 0.0 1.0 0.998397 -12.755626 \n", + "8 8.0 1.0 522.00 176.6 0.0 0.0 1.0 0.997872 -13.335844 \n", + "9 9.0 1.0 6.50 -66.6 0.0 0.0 1.0 1.038332 -14.178442 \n", + "10 10.0 1.0 0.00 0.0 0.0 0.0 1.0 1.017843 -8.170875 \n", + "11 11.0 1.0 0.00 0.0 0.0 0.0 1.0 1.013386 -8.936966 \n", + "12 12.0 1.0 8.53 88.0 0.0 0.0 1.0 1.000815 -8.998824 \n", + "13 13.0 1.0 0.00 0.0 0.0 0.0 1.0 1.014923 -8.929927 \n", + "14 14.0 1.0 0.00 0.0 0.0 0.0 1.0 1.012319 -10.715295 \n", + "15 15.0 1.0 320.00 153.0 0.0 0.0 3.0 1.016185 -11.345399 \n", + "16 16.0 1.0 329.00 32.3 0.0 0.0 3.0 1.032520 -10.033348 \n", + "17 17.0 1.0 0.00 0.0 0.0 0.0 2.0 1.034237 -11.116436 \n", + "18 18.0 1.0 158.00 30.0 0.0 0.0 2.0 1.031573 -11.986168 \n", + "19 19.0 1.0 0.00 0.0 0.0 0.0 3.0 1.050107 -5.410073 \n", + "20 20.0 1.0 680.00 103.0 0.0 0.0 3.0 0.991011 -6.821178 \n", + "21 21.0 1.0 274.00 115.0 0.0 0.0 3.0 1.032319 -7.628746 \n", + "22 22.0 1.0 0.00 0.0 0.0 0.0 3.0 1.050143 -3.183120 \n", + "23 23.0 1.0 247.50 84.6 0.0 0.0 3.0 1.045145 -3.381276 \n", + "24 24.0 1.0 308.60 -92.2 0.0 0.0 3.0 1.038001 -9.913759 \n", + "25 25.0 1.0 224.00 47.2 0.0 0.0 2.0 1.057683 -8.369235 \n", + "26 26.0 1.0 139.00 17.0 0.0 0.0 2.0 1.052561 -9.438770 \n", + "27 27.0 1.0 281.00 75.5 0.0 0.0 2.0 1.038345 -11.362152 \n", + "28 28.0 1.0 206.00 27.6 0.0 0.0 3.0 1.050374 -5.928359 \n", + "29 29.0 1.0 283.50 26.9 0.0 0.0 3.0 1.050115 -3.169874 \n", + "30 30.0 2.0 0.00 0.0 0.0 0.0 2.0 1.049900 -7.370475 \n", + "31 31.0 3.0 9.20 4.6 0.0 0.0 1.0 0.982000 0.000000 \n", + "32 32.0 2.0 0.00 0.0 0.0 0.0 1.0 0.984100 -0.188437 \n", + "33 33.0 2.0 0.00 0.0 0.0 0.0 3.0 0.997200 -0.193174 \n", + "34 34.0 2.0 0.00 0.0 0.0 0.0 3.0 1.012300 -1.631119 \n", + "35 35.0 2.0 0.00 0.0 0.0 0.0 3.0 1.049400 1.776507 \n", + "36 36.0 2.0 0.00 0.0 0.0 0.0 3.0 1.063600 4.468437 \n", + "37 37.0 2.0 0.00 0.0 0.0 0.0 2.0 1.027500 -1.582899 \n", + "38 38.0 2.0 0.00 0.0 0.0 0.0 3.0 1.026500 3.892818 \n", + "39 39.0 2.0 1104.00 250.0 0.0 0.0 1.0 1.030000 -14.535256 \n", + "\n", + " BASE_KV ZONE VMAX VMIN \n", + "bus \n", + "1 345.0 1.0 1.06 0.94 \n", + "2 345.0 1.0 1.06 0.94 \n", + "3 345.0 1.0 1.06 0.94 \n", + "4 345.0 1.0 1.06 0.94 \n", + "5 345.0 1.0 1.06 0.94 \n", + "6 345.0 1.0 1.06 0.94 \n", + "7 345.0 1.0 1.06 0.94 \n", + "8 345.0 1.0 1.06 0.94 \n", + "9 345.0 1.0 1.06 0.94 \n", + "10 345.0 1.0 1.06 0.94 \n", + "11 345.0 1.0 1.06 0.94 \n", + "12 345.0 1.0 1.06 0.94 \n", + "13 345.0 1.0 1.06 0.94 \n", + "14 345.0 1.0 1.06 0.94 \n", + "15 345.0 1.0 1.06 0.94 \n", + "16 345.0 1.0 1.06 0.94 \n", + "17 345.0 1.0 1.06 0.94 \n", + "18 345.0 1.0 1.06 0.94 \n", + "19 345.0 1.0 1.06 0.94 \n", + "20 345.0 1.0 1.06 0.94 \n", + "21 345.0 1.0 1.06 0.94 \n", + "22 345.0 1.0 1.06 0.94 \n", + "23 345.0 1.0 1.06 0.94 \n", + "24 345.0 1.0 1.06 0.94 \n", + "25 345.0 1.0 1.06 0.94 \n", + "26 345.0 1.0 1.06 0.94 \n", + "27 345.0 1.0 1.06 0.94 \n", + "28 345.0 1.0 1.06 0.94 \n", + "29 345.0 1.0 1.06 0.94 \n", + "30 345.0 1.0 1.06 0.94 \n", + "31 345.0 1.0 1.06 0.94 \n", + "32 345.0 1.0 1.06 0.94 \n", + "33 345.0 1.0 1.06 0.94 \n", + "34 345.0 1.0 1.06 0.94 \n", + "35 345.0 1.0 1.06 0.94 \n", + "36 345.0 1.0 1.06 0.94 \n", + "37 345.0 1.0 1.06 0.94 \n", + "38 345.0 1.0 1.06 0.94 \n", + "39 345.0 1.0 1.06 0.94 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(cfs[\"case39\"].branch)\n", + "display(cfs[\"case39\"].bus)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b256266", + "metadata": {}, + "outputs": [], + "source": [ + "m.exit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c8685d9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/requirements-all.txt b/requirements-all.txt index fa71396..55a13e1 100644 --- a/requirements-all.txt +++ b/requirements-all.txt @@ -6,6 +6,8 @@ openpyxl==3.1.5 oct2py==5.8.0 matpower==8.1.0.2.3.0 +itables==2.7.1 + pre-commit==4.5.1 ruff==0.15.5 setuptools==82.0.0 diff --git a/tests/test_read_matpower_cases.py b/tests/test_read_matpower_cases.py index 7c840aa..d968bd2 100644 --- a/tests/test_read_matpower_cases.py +++ b/tests/test_read_matpower_cases.py @@ -19,6 +19,7 @@ pytest -n auto -rA --cov-report term --cov=matpowercaseframes tests/ case9 : default MATPOWER case, polynomial gencost (TYPE=2) + case9Q : case with Q gencost case4_dist : small distribution network case case118 : medium-scale IEEE case, tests all three loading methods case_RTS_GMLC : piecewise linear gencost (TYPE=1) and contains bus_name @@ -41,6 +42,16 @@ def test_case9(): assert cf.gencost.columns.equals(cols) +def test_case9Q(): + """ + Default MATPOWER 9-bus case, polynomial gencost columns: + MODEL, STARTUP, SHUTDOWN, NCOST, C2, C1, C0. + """ + CASE_NAME = "case9Q.m" + cf = CaseFrames(CASE_NAME) + assert len(cf.gencost) // len(cf.gen) == 2 + + def test_case4_dist(): """Small 4-bus radial distribution network case.""" CASE_NAME = "case4_dist.m"
init_notebook_mode