{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Model to get started\n", "\n", "* File name: model_to_get_started.ipynb\n", "* Last edited: 2020-06-24\n", "* Created by: Stefan Bruche (TU Berlin)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "import aristopy as ar\n", "\n", "# Create basic energy system instance\n", "es = ar.EnergySystem(\n", " number_of_time_steps=3, hours_per_time_step=1, \n", " interest_rate=0.05, economic_lifetime=20)\n", "\n", "# Add a gas source, two different conversion units and sinks\n", "gas_source = ar.Source(\n", " ensys=es, name='gas_source', commodity_cost=20, outlet=ar.Flow('Fuel'))\n", "\n", "gas_boiler = ar.Conversion(\n", " ensys=es, name='gas_boiler', basic_variable='Heat',\n", " inlet=ar.Flow('Fuel', 'gas_source'), outlet=ar.Flow('Heat', 'heat_sink'),\n", " capacity_max=150, capex_per_capacity=60e3, \n", " user_expressions='Heat == 0.9 * Fuel')\n", "\n", "chp_unit = ar.Conversion(\n", " ensys=es, name='chp_unit', basic_variable='Elec',\n", " inlet=ar.Flow('Fuel', 'gas_source'), \n", " outlet=[ar.Flow('Heat', 'heat_sink'), ar.Flow('Elec', 'elec_sink')],\n", " capacity_max=100, capex_per_capacity=600e3,\n", " user_expressions=['Heat == 0.5 * Fuel', \n", " 'Elec == 0.4 * Fuel'])\n", "\n", "heat_sink = ar.Sink(\n", " ensys=es, name='heat_sink', inlet=ar.Flow('Heat'),\n", " commodity_rate_fix=ar.Series('heat_demand', [100, 200, 150]))\n", "\n", "elec_sink = ar.Sink(\n", " ensys=es, name='elec_sink', inlet=ar.Flow('Elec'), commodity_revenues=30)\n", "\n", "# Run the optimization\n", "es.optimize(solver='cbc', results_file='results.json')\n", "\n", "# Plot some results\n", "plotter = ar.Plotter('results.json')\n", "plotter.plot_operation('heat_sink', 'Heat', lgd_pos='lower center', \n", " bar_lw=0.5, ylabel='Thermal energy [MWh]')\n", "plotter.plot_objective(lgd_pos='lower center')\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create *aristopy* model\n", "\n", "First, we need to import the *aristopy* package. If the import fails, you might need to recheck the installation instructions." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Import the required packages (jupyter magic only required for jupyter notebooks)\n", "%reload_ext autoreload\n", "%autoreload 2\n", "%matplotlib inline\n", "\n", "import aristopy as ar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An *aristopy* model consists of an instance of the EnergySystem class and the added components.
\n", "To create an energy system, we need to specify the number of considered time steps and the number of hours per time step. Additionally, the interest rate and the economic lifetime of the installed components are required to calculate the net present value (objective function value)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Create basic energy system instance\n", "es = ar.EnergySystem(number_of_time_steps=3, hours_per_time_step=1,\n", " interest_rate=0.05, economic_lifetime=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To instantiate a Component instance (Source, Sink, Conversion, Bus, Storage), we need to specify the EnergySystem instance, where it is added to and set a name for the component. Next, we add flows on the inlets and outlets. A Flow instance represents a connection point of a component and is used to create links with other components. Additionally, the flow introduces a commodity to the component and triggers the creation of an associated commodity variable (usually with the same name). The number of required or accepted inlet and outlet flows and component commodities depends on the component type (see table below). You can add multiple flows on an inlet or outlet for setting different commodities or linking components, by arranging them in a list." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Component type | Nbr. of inlet flows | Nbr. of outlet flows | Nbr. of commodities |\n", "| :--- | :---: | :---: | :---: |\n", "| Source | 0 | $\\ge$ 1 | 1 |\n", "| Sink | $\\ge$ 1 | 0 | 1 |\n", "| Conversion | $\\ge$ 1 | $\\ge$ 1 | $\\ge$ 1 |\n", "| Storage | $\\ge$ 1 | $\\ge$ 1 | 1 |\n", "| Bus | $\\ge$ 1 | $\\ge$ 1 | 1 |\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Add a gas source\n", "gas_source = ar.Source(ensys=es, name='gas_source', outlet=ar.Flow('Fuel'),\n", " commodity_cost=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The conversion instances usually have different commodities on their inlets and outlets. That's why we need to specify the name of the basic variable for conversion components. This basic variable is used to restrict capacities, set operation rates, and calculate CAPEX and OPEX." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Add a gas boiler conversion unit\n", "gas_boiler = ar.Conversion(ensys=es, name='gas_boiler',\n", " basic_variable='Heat',\n", " inlet=ar.Flow(commodity='Fuel', link='gas_source'),\n", " outlet=ar.Flow('Heat', 'heat_sink'),\n", " capacity_max=150, capex_per_capacity=60e3,\n", " user_expressions='Heat == 0.9 * Fuel')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the keyword argument **user_expressions** to specify commodity conversion rates, limit capacities, and set other internal component constraints manually. Here we can use the names (identifiers) of the commodity variables created by adding flows, and, if applicable, variables with standard names, e.g.:\n", "\n", "* CAP - component capacity variable\n", "* BI_EX - binary existence variable\n", "* BI_OP - binary operation variable\n", "* ... (see file utils.py in your aristopy directory) \n", "\n", "The expressions are simply added as a list of strings. The options for mathematical operators are:
\n", "``sum, sin, cos, exp, log, ==, >=, <=, **, *, /, +, -, (, )``.
\n", "The indexes (sets) of the variables and parameters are processed automatically behind the scenes." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Add a CHP unit\n", "chp_unit = ar.Conversion(ensys=es, name='chp_unit', basic_variable='Elec',\n", " inlet=ar.Flow('Fuel', 'gas_source'),\n", " outlet=[ar.Flow('Heat', 'heat_sink'), ar.Flow('Elec', 'elec_sink')],\n", " capacity_max=100, capex_per_capacity=600e3,\n", " user_expressions=['Heat == 0.5 * Fuel',\n", " 'Elec == 0.4 * Fuel'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Time series data can be introduced as an aristopy Series instance and might be applied to set commodity rates, and time-dependent commodity cost or revenues, or generally for the scripting of user expressions." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Add a sink with fixed heat demand\n", "heat_sink = ar.Sink(ensys=es, name='heat_sink', inlet=ar.Flow('Heat'),\n", " commodity_rate_fix=ar.Series('heat_demand', [100, 200, 150]))\n", "\n", "elec_sink = ar.Sink(ensys=es, name='elec_sink', inlet=ar.Flow('Elec'),\n", " commodity_revenues=30)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "**Note:** \n", " \n", "Alternatively, we could use the *time_series_data* and *user_expressions* keyword arguments so set the required fixed commodity rate of the heat sink.\n", "```python\n", "heat_sink = ar.Sink(ensys=es, name='heat_sink', inlet=ar.Flow('Heat'),\n", " time_series_data=ar.Series('heat_demand', [100, 200, 150]),\n", " user_expressions='Heat == heat_demand')\n", "```\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run optimization\n", "\n", "To run the optimization, we need to call the EnergySystem method *optimize*. The most important input to this method is the name of the applied solver. You have to ensure the solver is available on your machine and can be detected with this name. The solver output is suppressed for convenience in this notebook (*tee=False*). The results of the model run are written to a JSON-file with a specified name. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "es.optimize(solver='cbc', tee=False, results_file='results.json')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Basic information about the building and solving process of the optimzation model are stored in the Python dictionary *run_info* of the EnergySystem instane." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'solver_name': 'cbc',\n", " 'time_limit': None,\n", " 'optimization_specs': '',\n", " 'model_build_time': 0,\n", " 'model_solve_time': 0,\n", " 'upper_bound': 349147961.7,\n", " 'lower_bound': 349147961.7,\n", " 'sense': 'maximize',\n", " 'solver_status': 'ok',\n", " 'termination_condition': 'optimal'}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es.run_info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The pyomo ConcreteModel instance of the energy system can be accessed with the attribute *model*. All of the conventional pyomo functions can be applied here (e.g., pprint of the objective function)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Obj : Size=1, Index=None, Active=True\n", " Key : Active : Sense : Expression\n", " None : True : maximize : -249.24420685079974*(gas_source.Fuel[0,0] + gas_source.Fuel[0,1] + gas_source.Fuel[0,2])/0.00034246575342465754 - 60000.0*gas_boiler.CAP - 600000.0*chp_unit.CAP + 373.8663102761996*(elec_sink.Elec[0,0] + elec_sink.Elec[0,1] + elec_sink.Elec[0,2])/0.00034246575342465754\n" ] } ], "source": [ "es.model.Obj.pprint()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The component variables and constraints are stored in separate pyomo Block models. They can be accessed via attribute block directly on the components. All components are also added to EnergySystem's dictionary components and can be reached with their specified name." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Heat : Size=3, Index=time_set\n", " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", " (0, 0) : 0 : 0.0 : None : False : False : NonNegativeReals\n", " (0, 1) : 0 : 75.0 : None : False : False : NonNegativeReals\n", " (0, 2) : 0 : 25.0 : None : False : False : NonNegativeReals\n" ] } ], "source": [ "gas_boiler.block.Heat.pprint()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{(0, 0): 80.0, (0, 1): 100.0, (0, 2): 100.0}" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# return dictionary of variable 'Elec' for component 'chp_unit' \n", "es.components['chp_unit'].block.Elec.get_values()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot results\n", "\n", "The Plotter class is used to read the exported optimization results from the JSON-file and to provide basic plotting routines. Additional keyword arguments are available to customize the plotting output, e.g., set labels, figure size, legend position, etc. (see dictionary *props* of the Plotter class)." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# Create instance of Plotter class and read in file 'results.json'\n", "plotter = ar.Plotter('results.json')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The method *plot_operation* returns a mixed bar and line plot that visualizes the operation of a component on the\n", "basis of a selected commodity." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plotter.plot_operation('heat_sink', 'Heat', lgd_pos='lower center',\n", " bar_lw=0.5, ylabel='Thermal energy [MWh]', \n", " show_plot=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The method *plot_objective* returns a bar chart that summarizes the cost contributions of each component to the\n", "overall objective function value." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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SZJUTAUL3vVJKf0RaLdhOyKWAJXOaiKpUN59913GjRvHokWLWL9+fbHL0TauSZMmHHDAAUycOJF27dpt+gGSlKfMg7ckZW3cuHEMHjyYX/7ylzRv3rzY5Wgbt27dOm6//XbGjRvHbbfdVuxyJJWQYs5qAkBKqaO93ZIKadGiRXzzm980dCsvzZs35/TTT2fRokXFLkVSiSl68JakQlu/fr2hW5ulefPmDkuS1OgM3pKUgbfffptTTz2VLl260K1bN44++mheeeUVAK6++mpatmzJypUra46fNWsWu+22G7169eLAAw/kkksu2ai9oqKi5vbII4/w+uuv06lTJ5YvXw7A+++/T6dOnXjttdeyf7KSpDo5xlvSF07H8Q816vmWXH5Mg/tTSgwfPpwzzjiDu+66C4AFCxbwzjvv0LVrV6ZOnUrfvn257777GDVqVM3jBgwYwG9+8xs+/PBDKioqGDZs2EbtnzV27FjGjx/P5MmTGT9+PGeddRb77rtv4z1RSdJWscdbkgps5syZNG/enDFjxtS0VVRUMGDAABYvXswHH3zAZZddxtSpU+t8/M4770yfPn1YvHhxg9c5//zzefrpp5k0aRJz5szhggsuaNTnIUnaOgZvSSqwhQsX0qdPnzr3TZ06ldNOO40BAwbw8ssv8+67737umPfee4+nn36asrIyAB5//PGNhppsCOTNmzfnyiuv5Pzzz2fSpEnssMMOhXtSkqTNZvCWpCK66667OPXUU2nSpAknnngi99xzT82+xx9/nF69ejF06FDGjx9fE7wHDBjAggULam5dunSpeczDDz9M+/btWbhwYebPRZLUMMd4S1KBlZWVMX369M+1v/DCC/z5z3/miCOOAOCTTz6hc+fOfO973wPqH8tdnwULFjBjxgyefvppDjnkEE499VTat2/fOE9CkrTV7PGWpAIbMmQIa9eu5cYbb6xpmzt3Lueddx4TJkxgyZIlLFmyhDfffJM33nhji2YiSSkxduxYJk2axD777MOFF17IuHHjGvNpSJK2ksFbkgosIrjvvvuYMWMGXbp0oaysjAkTJjBr1iyGDx++0bHDhw+vmfmkPp8d4z19+nRuvPFG9tlnn5re87PPPptFixYxe/bsgj0vSdLmiZRSsWvIW2VlZZo3b15xLv7ID4tzXeXn8J8UuwJtwyorKynae4e2W75uJG2JiJifUqqsa5893pIkSVIGDN6SJElSBgzekiRJUgYM3pIkSVIGDN6SJElSBgzekiRJUgYM3pKUgb/+9a8cf/zx7LfffnTp0oXzzjuPTz75hFmzZrHbbrvRq1cvDjzwQC655BKAmvba83U/8sgjvP7663Tq1Inly5cD8P7779OpU6ctWnRHkpQtl4yX9IVz39PvNOr5hn9lrwb3p5Q48cQTGTt2LA888ABVVVWcddZZ/OhHP+KYY46pWRr+ww8/pKKigmHDhgH1Lxk/duxYxo8fz+TJkxk/fjxnnXUW++67b6M+J0lS47PHW5IK7NFHH6Vly5aMHj0agKZNm3L11Vdz880389FHH9Uct/POO9OnTx8WL17c4PnOP/98nn76aSZNmsScOXO44IILClq/JKlxGLwlqcBefPFF+vTps1Fbq1at2GefffjLX/5S0/bee+/x9NNPU1ZWBnx+afgNgbx58+ZceeWVnH/++UyaNIkddtghuycjSdpiDjWRpAJLKRER9bY//vjj9OrViyZNmjB+/HjKysqYNWtWvUNNAB5++GHat2/PwoULOeKIIwr9FCRJjcDgLUkFVlZWxq9//euN2latWsXrr79Oly5dGgzYdVmwYAEzZszg6aef5pBDDuHUU0+lffv2jV22JKmROdREkgrssMMO46OPPuK2224DoKqqigsuuIBRo0ax0047bda5UkqMHTuWSZMmsc8++3DhhRcybty4QpQtSWpkBm9JKrCI4L777uOee+5hv/32o2vXrrRs2ZIf//jHDT7us2O8p0+fzo033sg+++xTM7zk7LPPZtGiRcyePTuLpyJJ2gqRUip2DXmrrKxM8+bNK87FH/lhca6r/Bz+k2JXoG1YZWUlRXvv0HbL142kLRER81NKlXXts8dbkiRJyoDBW5IkScqAwVuSJEnKgMFbkiRJyoDBW5IkScqAwVuSJEnKgMFbkjLw7//+75SVldGjRw8qKip45plnAJg0aRIfffTRZp9vypQpvPnmm41dZqNYsmQJv/rVr4pdhiRtc1wyXtIXz4TdGvl8Kxvc/dRTT/Gb3/yG5557jhYtWrBs2TI++eQToDp4f/Ob39ysFSyrqqqYMmUK3bt3p0OHDltVeiFsCN7f+MY3il2KJG1T7PGWpAJ76623aNOmDS1atACgTZs2dOjQgWuvvZY333yTwYMHM3jwYADGjh1LZWUlZWVlXHzxxTXn6NixI5deeimHHHIIU6dOZd68eYwcOZKKigrWrFmz0fUOPfTQmoVfli1bRseOHYHqXvLjjz+eI488kv33359LLrmkznp/+9vf0rt3b3r27Mlhhx0GwPLlyznhhBPo0aMHX/nKV3jhhRcAmD17ds3Kmr169WL16tWMHz++ZtXNq6++uvF+kZK0nbPHW5IKbOjQoVx66aV07dqVww8/nBEjRjBo0CC+//3v87Of/YyZM2fSpk0boHpISuvWramqquKwww7jhRdeoEePHgC0bNmSOXPmAHDTTTcxceJEKivrXCzIT2UAABx8SURBVBytXs8++ywLFy5kp512om/fvhxzzDEbnWPp0qWceeaZPPbYY3Tq1Inly5cDcPHFF9OrVy/uv/9+Hn30Ub71rW+xYMECJk6cyM9//nMOPvhgPvjgA1q2bMnll1/OxIkT+c1vftMYvz5JKhn2eEtSge2yyy7Mnz+fyZMn07ZtW0aMGMGUKVPqPPbuu++md+/e9OrVixdffJGXXnqpZt+IESO2upYjjjiCPffckx133JETTzyxJshv8PTTTzNw4EA6deoEQOvWrQGYM2cOp59+OgBDhgzhvffeY+XKlRx88MH84Ac/4Nprr2XFihU0a2Z/jiTVx+AtSRlo2rQphx56KJdccgnXX389v/71rz93zKuvvsrEiRP5/e9/zwsvvMAxxxzDxx9/XLN/5513zutazZo1Y/369QAbPR4gIhrcTil9rm1D+2dFBOPHj+emm25izZo1fOUrX2HRokV51ShJX0QGb0kqsJdffpk///nPNdsLFixg3333BWDXXXdl9erVAKxatYqdd96Z3XbbjXfeeYeHH3643nPWftxndezYkfnz5wMwffr0jfbNmDGD5cuXs2bNGu6//34OPvjgjfYfdNBBzJ49m1dffRWgZqjJwIEDufPOOwGYNWsWbdq0oVWrVixevJjy8nIuuugiKisrWbRoUYO1SdIXmZ8JSlKBffDBB5x77rk1QzH+/u//nsmTJwNw1llncdRRR9G+fXtmzpxJr169KCsro3Pnzp8LxbWNGjWKMWPGsOOOO/LUU0+x44471uwbN24cp5xyCrfffjtDhgzZ6HGHHHIIp59+On/5y1/4xje+8bkx4m3btmXy5MmceOKJrF+/nnbt2jFjxgwmTJjA6NGj6dGjBzvttBO33norUD0ry8yZM2natCndunXjqKOOokmTJjRr1oyePXsyatQozj///Mb6VUrSdi3q+vhwW1VZWZk2fFM/c4/8sDjXVX4O/0mxK9A2rLKykqK9d2xDpkyZwrx587j++uuLXcp2wdeNpC0REfNTSnV+892hJpIkSVIGHGoiSV8Qo0aNYtSoUcUuQ5K+sOzxliRJkjJg8JYkSZIyYPCWJEmSMmDwliRJkjJg8JakDLz99tuceuqpdOnShW7dunH00UfzyiuvFLusjUyZMoVzzjkHgBtuuIHbbrutpv3NN9/MtJYVK1bwi1/8ItNrSlKhOauJpC+exp6XfxPzyKeUGD58OGeccQZ33XUXUL165TvvvEPXrl0bt5ZGMmbMmJr7U6ZMoXv37nTo0CGz628I3meffXZm15SkQrPHW5IKbObMmTRv3nyjMFtRUcGAAQNIKXHhhRfSvXt3ysvLmTZtGlC9LPugQYM45ZRT6Nq1K+PHj+fOO++kX79+lJeXs3jxYqB6isCxY8cyePBgOnfuzOzZs/n2t7/NgQceuNHUgVOnTqW8vJzu3btz0UUX1bTfcsstdO3alUGDBvHEE0/UtE+YMIGJEycyffp05s2bx8iRI6moqOChhx5i+PDhNcfNmDGDE0888XPPee7cuXz1q1+lZ8+e9OvXj9WrV/Pxxx8zevRoysvL6dWrFzNnzgTgxRdfpF+/flRUVNCjRw/+/Oc/M378eBYvXkxFRQUXXnhh4/whJKnI7PGWpAJbuHAhffr0qXPfvffey4IFC3j++edZtmwZffv2ZeDAgQA8//zz/OlPf6J169Z07tyZ7373uzz77LNcc801XHfddUyaNAmA999/n0cffZQHH3yQY489lieeeIKbbrqJvn37smDBAtq1a8dFF13E/Pnz2WOPPRg6dCj3338//fv35+KLL2b+/PnstttuDB48mF69em1U30knncT111/PxIkTqaysJKXEBRdcwNKlS2nbti233HILo0eP3ugxn3zyCSNGjGDatGn07duXVatWseOOO3LNNdcA8Mc//pFFixYxdOhQXnnlFW644QbOO+88Ro4cySeffEJVVRWXX345CxcuZMGCBY3955CkorHHW5KKaM6cOZx22mk0bdqUvfbai0GDBjF37lwA+vbtS/v27WnRogVdunRh6NChAJSXl7NkyZKacxx7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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plotter.plot_objective(lgd_pos='lower center', show_plot=True)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }