From cf0378ae1938ad60c6862b82a4ead0e70e085503 Mon Sep 17 00:00:00 2001 From: Ya-Lan Yang <63822845+ylyangtw@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:44:31 -0500 Subject: [PATCH 1/2] Add building structural damage documentation and notebook (#404) * Add building structural damage documentation and notebook * update * change order * Update _toc.yml * Updated example notebook to use renamed building structural damage --------- Co-authored-by: Chris Navarro --- CHANGELOG.md | 1 + manual_jb/content/_toc.yml | 1 + manual_jb/content/analyses.md | 3 +- .../analyses/building_structural_dmg.md | 83 ++++ notebooks/building_structural_dmg.ipynb | 423 ++++++++++++++++++ 5 files changed, 510 insertions(+), 1 deletion(-) create mode 100644 manual_jb/content/analyses/building_structural_dmg.md create mode 100644 notebooks/building_structural_dmg.ipynb diff --git a/CHANGELOG.md b/CHANGELOG.md index 52d6609d..059328b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Update flood input to nonstructural damage output for combined wind-wave-surge building damage [#566](https://github.com/IN-CORE/incore-docs/issues/566) - pyincore, pyincore-viz and pyincore-data installation instructions to include how to use libmamba solver [#375](https://github.com/IN-CORE/incore-docs/issues/375) - Update docs to reflect Non-structural Building Damage change [#562](https://github.com/IN-CORE/pyincore/issues/562) +- Add building structural damage documentation and notebook [#402](https://github.com/IN-CORE/incore-docs/issues/402) ### Added - Gas facility damage analysis documentation and example notebook [#387](https://github.com/IN-CORE/incore-docs/issues/387) diff --git a/manual_jb/content/_toc.yml b/manual_jb/content/_toc.yml index 4bcf8ec7..891bb714 100644 --- a/manual_jb/content/_toc.yml +++ b/manual_jb/content/_toc.yml @@ -20,6 +20,7 @@ chapters: - file: analyses/building_func - file: analyses/building_loss - file: analyses/building_nonstructural_dmg + - file: analyses/building_structural_dmg - file: analyses/capital_shocks - file: analyses/combined_wind_wave_surge_building_dmg - file: analyses/combined_wind_wave_surge_building_loss diff --git a/manual_jb/content/analyses.md b/manual_jb/content/analyses.md index d545eacb..ef1fc104 100644 --- a/manual_jb/content/analyses.md +++ b/manual_jb/content/analyses.md @@ -6,7 +6,8 @@ 4. [Building functionality](analyses/building_func) 5. [Building economic loss](analyses/building_loss) 6. [Building nonstructural damage](analyses/building_nonstructural_dmg) -7. [Capital shocks](analyses/capital_shocks) +7. [Building structural damage](analyses/building_structural_dmg) +8. [Capital shocks](analyses/capital_shocks) 8. [Combined wind wave surge building damage](analyses/combined_wind_wave_surge_building_dmg) 9. [Combined wind wave surge building loss](analyses/combined_wind_wave_surge_building_loss) 10. [Commercial building recovery](analyses/commercial_building_recovery) diff --git a/manual_jb/content/analyses/building_structural_dmg.md b/manual_jb/content/analyses/building_structural_dmg.md new file mode 100644 index 00000000..b280dc67 --- /dev/null +++ b/manual_jb/content/analyses/building_structural_dmg.md @@ -0,0 +1,83 @@ +# Building structural damage + +**Description** + +This analysis computes building structural damage based on a particular hazard. Currently supported hazards are: **earthquake**, +**tsunami**, **tornado**, **hurricane** and **flood**. + +The process for computing the structural damage is similar to other parts of the built environment. First, a fragility +is obtained based on the hazard type and attributes of the building. Based on the fragility, the hazard intensity at the +location of the building is computed. Using this information, the probability of exceeding each limit state is computed, +along with the probability of damage. For the case of an earthquake hazard, soil information can be used to +modify the damage probabilities to include damage due to liquefaction. + +The outputs of this analysis are CSV file with probabilities of damage and JSON file with information about hazard and fragilities. + +**Input parameters** + +key name | type | name | description +--- | --- | --- | --- +`result_name` * | `str` | Result name | Name of the result dataset. +`hazard_type` * | `str` | Hazard type | Hazard type (earthquake, tsunami, tornado, hurricaneWindfields). +`hazard_id` * | `str` | Hazard id | ID of the hazard from the Hazard service. +`fragility_key` | `str` | Fragility key | Fragility key used in mapping dataset. +`use_liquefaction` | `bool` | Liquefaction | Use liquefaction, if applicable to the hazard.
Default is *False*. +`use_hazard_uncertainty` | `bool` | Uncertainty | Use hazard uncertainty.
Default is *False*. +`seed` * | `int` | Seed | Initial value to seed the random number generator. +`num_cpu` | `int` | Number of CPUs | Number of CPUs used for parallel computation.
Default is *1*. +`liquefaction_geology_dataset_id` | `str` | Liquefaction id | Liquefaction geology/susceptibility dataset id.
If not provided, liquefaction will be ignored. + +**Input datasets** + +key name | type | name | description +--- | --- | --- | --- +`buildings` * | [`ergo:buildingInventoryVer4`](https://incore.ncsa.illinois.edu/semantics/api/types/ergo:buildingInventoryVer4)
[`ergo:buildingInventoryVer5`](https://incore.ncsa.illinois.edu/semantics/api/types/ergo:buildingInventoryVer5)
[`ergo:buildingInventoryVer6`](https://incore.ncsa.illinois.edu/semantics/api/types/ergo:buildingInventoryVer6)
[`ergo:buildingInventoryVer7`](https://incore.ncsa.illinois.edu/semantics/api/types/ergo:buildingInventoryVer7) | Building dataset | A building dataset. +`dfr3_mapping_set` * | [`incore:dfr3MappingSet`](https://incore.ncsa.illinois.edu/semantics/api/types/incore:dfr3MappingSet) | DFR3 Mapping Set | DFR3 Mapping Set. +`retrofit_strategy` | [`incore:retrofitStrategy`](https://incore.ncsa.illinois.edu/semantics/api/types/incore:retrofitStrategy) | Retrofit Strategy | Building retrofit strategy that contains guid and retrofit method. + +**Input Hazards** + +key name | type | name | description +--- |------------------------------------------------------------------|---------------| --- +`hazard` | `earthquake`
`tornado`
`hurricane`
`flood`
`tsunami` | Hazard | Supported hazard object for using local and remote hazards. + + +**Output datasets** + +key name | type | parent key | name | description +--- | --- | --- | --- | --- +`ds_result` * | [`ergo:buildingDamageVer5`](https://incore.ncsa.illinois.edu/semantics/api/types/ergo:buildingDamageVer5) | `buildings` | Results | A dataset containing results
(format: CSV). +`damage_result` * | [`incore:buildingDamageSupplement`](https://incore.ncsa.illinois.edu/semantics/api/types/incore:buildingDamageSupplement) | `buildings` | Results | Information about applied hazard value and fragility
(format: JSON). + +(* required) + +**Execution** + +code snippet: + +``` + # Create building structural damage + bldg_dmg = BuildingStructuralDamage(client) + + # Load input dataset + bldg_dmg.load_remote_input_dataset("buildings", bldg_dataset_id) + + # Load fragility mapping + fragility_service = FragilityService(client) + mapping_set = MappingSet(fragility_service.get_mapping(mapping_id)) + bldg_dmg.set_input_dataset('dfr3_mapping_set', mapping_set) + + # Specify the result name + result_name = "memphis_bldg_dmg_result" + + # Set analysis parameters + bldg_dmg.set_parameter("result_name", result_name) + bldg_dmg.set_parameter("hazard_type", hazard_type) + bldg_dmg.set_parameter("hazard_id", hazard_id) + bldg_dmg.set_parameter("num_cpu", 10) + + # Run building structural damage analysis + bldg_dmg.run_analysis() +``` + +full analysis: [building_structural_dmg.ipynb](https://github.com/IN-CORE/incore-docs/blob/main/notebooks/building_structural_dmg.ipynb) diff --git a/notebooks/building_structural_dmg.ipynb b/notebooks/building_structural_dmg.ipynb new file mode 100644 index 00000000..41b98227 --- /dev/null +++ b/notebooks/building_structural_dmg.ipynb @@ -0,0 +1,423 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from pyincore import IncoreClient, FragilityService, MappingSet\n", + "from pyincore.analyses.buildingstructuraldamage import BuildingStructuralDamage" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Connect to IN-CORE service\n", + "client = IncoreClient()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building damage for Shelby county, TN with New Madrid earthquake." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# New madrid earthquake using Atkinson Boore 1995\n", + "hazard_type = \"earthquake\"\n", + "hazard_id = \"5b902cb273c3371e1236b36b\"\n", + "\n", + "# Building inventory in Shelby county, TN\n", + "bldg_dataset_id = \"5a284f0bc7d30d13bc081a28\"\n", + "\n", + "# Default Building Fragility mapping\n", + "mapping_id = \"5b47b350337d4a3629076f2c\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Create building damage\n", + "bldg_dmg = BuildingStructuralDamage(client)\n", + "\n", + "# Load input dataset\n", + "bldg_dmg.load_remote_input_dataset(\"buildings\", bldg_dataset_id)\n", + "\n", + "# Load fragility mapping\n", + "fragility_service = FragilityService(client)\n", + "mapping_set = MappingSet(fragility_service.get_mapping(mapping_id))\n", + "bldg_dmg.set_input_dataset(\"dfr3_mapping_set\", mapping_set)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Specify the result name\n", + "result_name = \"memphis_bldg_dmg_result\"\n", + "\n", + "# Set analysis parameters\n", + "bldg_dmg.set_parameter(\"result_name\", result_name)\n", + "bldg_dmg.set_parameter(\"hazard_type\", hazard_type)\n", + "bldg_dmg.set_parameter(\"hazard_id\", hazard_id)\n", + "bldg_dmg.set_parameter(\"num_cpu\", 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Run building damage analysis\n", + "bldg_dmg.run_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Retrieve result dataset\n", + "result = bldg_dmg.get_output_dataset(\"ds_result\")\n", + "\n", + "# Convert dataset to Pandas DataFrame\n", + "df = result.get_dataframe_from_csv()\n", + "\n", + "# Display top 5 rows of output data\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building damage for Shelby county, TN with New Madrid earthquake and liquefaction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Geology dataset, required for liquefaction to provide susceptibility\n", + "liq_geology_dataset_id = \"5a284f53c7d30d13bc08249c\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create building damage\n", + "bldg_dmg = BuildingStructuralDamage(client)\n", + "\n", + "# Load input dataset\n", + "bldg_dmg.load_remote_input_dataset(\"buildings\", bldg_dataset_id)\n", + "\n", + "# Load fragility mapping\n", + "fragility_service = FragilityService(client)\n", + "mapping_set = MappingSet(fragility_service.get_mapping(mapping_id))\n", + "bldg_dmg.set_input_dataset(\"dfr3_mapping_set\", mapping_set)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Specify the result name\n", + "result_name = \"memphis_bldg_dmg_result-liquefaction\"\n", + "\n", + "# Set analysis parameters\n", + "bldg_dmg.set_parameter(\"result_name\", result_name)\n", + "bldg_dmg.set_parameter(\"hazard_type\", hazard_type)\n", + "bldg_dmg.set_parameter(\"hazard_id\", hazard_id)\n", + "bldg_dmg.set_parameter(\"num_cpu\", 1)\n", + "\n", + "# Set analysis parameters for liquefaction\n", + "bldg_dmg.set_parameter(\"use_liquefaction\", True)\n", + "bldg_dmg.set_parameter(\"liquefaction_geology_dataset_id\", liq_geology_dataset_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Run building damage analysis\n", + "bldg_dmg.run_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Retrieve result dataset\n", + "result = bldg_dmg.get_output_dataset(\"ds_result\")\n", + "\n", + "# Convert dataset to Pandas DataFrame\n", + "df = result.get_dataframe_from_csv()\n", + "\n", + "# Display top 5 rows of output data\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Creating a chart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "ax = df['DS_3'].hist(bins=20, figsize=[10,5])\n", + "ax.set_title(\"complete damage distribution\", fontsize=12)\n", + "ax.set_xlabel(\"complete damage value\", fontsize=12)\n", + "ax.set_ylabel(\"counts\", fontsize=12)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "ax = df['DS_3'].hist(bins=20, figsize=[10,5])\n", + "ax.set_title(\"complete damage distribution\", fontsize=12)\n", + "ax.set_xlabel(\"complete damage value\", fontsize=12)\n", + "ax.set_ylabel(\"counts\", fontsize=12)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Building damage for Seaside, OR with tsunami." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "hazard_type = \"tsunami\"\n", + "hazard_id = \"5bc9e25ef7b08533c7e610dc\"\n", + "\n", + "# Seaside, OR building dataset\n", + "bldg_dataset_id = \"5bcf2fcbf242fe047ce79dad\"\n", + "\n", + "# Tsunami mapping\n", + "mapping_id = \"5b48fb1f337d4a478e7bd54d\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Create Seaside tsunami building damage\n", + "bldg_dmg = BuildingStructuralDamage(client)\n", + "\n", + "# Load input dataset and fragility mapping\n", + "bldg_dmg.load_remote_input_dataset(\"buildings\", bldg_dataset_id)\n", + "mapping_set = MappingSet(fragility_service.get_mapping(mapping_id))\n", + "bldg_dmg.set_input_dataset(\"dfr3_mapping_set\", mapping_set)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Specify the result name\n", + "result_name = \"seaside_bldg_dmg_result\"\n", + "\n", + "bldg_dmg.set_parameter(\"result_name\", result_name)\n", + "bldg_dmg.set_parameter(\"hazard_type\", hazard_type)\n", + "bldg_dmg.set_parameter(\"hazard_id\", hazard_id)\n", + "bldg_dmg.set_parameter(\"num_cpu\", 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# Run building damage analysis\n", + "bldg_dmg.run_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 8e46aae02c78f4bccc78fb53d204e8f8be7dfd89 Mon Sep 17 00:00:00 2001 From: Chen Wang Date: Fri, 7 Jun 2024 15:16:56 -0500 Subject: [PATCH 2/2] 557 rename monte carlo failure probability to monte carlo limit state probability docs (#405) * update markdowns * changelog and notebook updates * update * add notebook * fix typo * update _toc * fix building nonstructurall in the analyses.md * remove --- CHANGELOG.md | 1 + manual_jb/content/_toc.yml | 2 +- manual_jb/content/analyses.md | 41 +- manual_jb/content/analyses/building_func.md | 2 +- ...failure_prob.md => mc_limit_state_prob.md} | 19 +- notebooks/mc_failure_prob.ipynb | 482 ------------------ notebooks/mc_limit_state_prob.ipynb | 256 ++++++++++ 7 files changed, 289 insertions(+), 514 deletions(-) rename manual_jb/content/analyses/{mc_failure_prob.md => mc_limit_state_prob.md} (76%) delete mode 100644 notebooks/mc_failure_prob.ipynb create mode 100644 notebooks/mc_limit_state_prob.ipynb diff --git a/CHANGELOG.md b/CHANGELOG.md index 059328b3..01a065f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Update flood input to nonstructural damage output for combined wind-wave-surge building damage [#566](https://github.com/IN-CORE/incore-docs/issues/566) - pyincore, pyincore-viz and pyincore-data installation instructions to include how to use libmamba solver [#375](https://github.com/IN-CORE/incore-docs/issues/375) - Update docs to reflect Non-structural Building Damage change [#562](https://github.com/IN-CORE/pyincore/issues/562) +- Rename Monte Carlo failure probability analysis to Monte Carlo limit state Probability Analysis [#557](https://github.com/IN-CORE/pyincore/issues/557) - Add building structural damage documentation and notebook [#402](https://github.com/IN-CORE/incore-docs/issues/402) ### Added diff --git a/manual_jb/content/_toc.yml b/manual_jb/content/_toc.yml index 891bb714..690b1742 100644 --- a/manual_jb/content/_toc.yml +++ b/manual_jb/content/_toc.yml @@ -39,7 +39,7 @@ chapters: - file: analyses/joplin_cge - file: analyses/joplin_empirical_restoration - file: analyses/mean_dmg - - file: analyses/mc_failure_prob + - file: analyses/mc_limit_state_prob - file: analyses/multi_retrofit_optimization - file: analyses/nci_functionality - file: analyses/pipeline_dmg diff --git a/manual_jb/content/analyses.md b/manual_jb/content/analyses.md index ef1fc104..2bae61df 100644 --- a/manual_jb/content/analyses.md +++ b/manual_jb/content/analyses.md @@ -26,26 +26,25 @@ 22. [Joplin empirical building restoration](analyses/joplin_empirical_building_restoration) 23. [Machine Learning Enabled Computable General Equilibrium (CGE) - Salt Lake City](analyses/ml_slc_cge.md) 24. [Mean damage](analyses/mean_dmg) -25. [Monte Carlo failure probability](analyses/mc_failure_prob) +25. [Monte Carlo limit state probability](analyses/mc_limit_state_prob) 26. [Multi-objective retrofit optimization](analyses/multi_retrofit_optimization) 27. [Network cascading interdependency functionality](analyses/nci_functionality) -28. [Nonstructural building damage](analyses/non_structural_building_dmg) -29. [Pipeline damage](analyses/pipeline_dmg) -30. [Pipeline damage with repair rate](analyses/pipeline_dmg_w_repair_rate) -31. [Pipeline functionality](analyses/pipeline_functionality) -32. [Pipeline repair cost](analyses/pipeline_repair_cost) -33. [Pipeline restoration](analyses/pipeline_restoration) -34. [Population dislocation](analyses/populationdislocation) -35. [Residential building recovery](analyses/residential_building_recovery) -36. [Road damage](analyses/road_dmg) -37. [Salt Lake City Computable General Equilibrium (CGE)](analyses/slc_cge.md) -38. [Seaside Computable General Equilibrium (CGE)](analyses/seaside_cge) -39. [Social Vulnerability](analyses/social_vulnerability) -40. [Social Vulnerability Score](analyses/social_vulnerability_score) -41. [Tornado electric power network (EPN) damage](analyses/tornadoepn_dmg) -42. [Traffic flow recovery](analyses/traffic_flow_recovery) -43. [Transportation recovery](analyses/transportation_recovery) -44. [Water facility damage](analyses/waterfacility_dmg) -45. [Water network functionality](analyses/wfn_functionality) -46. [Water facility repair cost](analyses/water_facility_repair_cost) -47. [Water facility restoration](analyses/water_facility_restoration) \ No newline at end of file +28. [Pipeline damage](analyses/pipeline_dmg) +29. [Pipeline damage with repair rate](analyses/pipeline_dmg_w_repair_rate) +30. [Pipeline functionality](analyses/pipeline_functionality) +31. [Pipeline repair cost](analyses/pipeline_repair_cost) +32. [Pipeline restoration](analyses/pipeline_restoration) +33. [Population dislocation](analyses/populationdislocation) +34. [Residential building recovery](analyses/residential_building_recovery) +35. [Road damage](analyses/road_dmg) +36. [Salt Lake City Computable General Equilibrium (CGE)](analyses/slc_cge.md) +37. [Seaside Computable General Equilibrium (CGE)](analyses/seaside_cge) +38. [Social Vulnerability](analyses/social_vulnerability) +39. [Social Vulnerability Score](analyses/social_vulnerability_score) +40. [Tornado electric power network (EPN) damage](analyses/tornadoepn_dmg) +41. [Traffic flow recovery](analyses/traffic_flow_recovery) +42. [Transportation recovery](analyses/transportation_recovery) +43. [Water facility damage](analyses/waterfacility_dmg) +44. [Water network functionality](analyses/wfn_functionality) +45. [Water facility repair cost](analyses/water_facility_repair_cost) +46. [Water facility restoration](analyses/water_facility_restoration) diff --git a/manual_jb/content/analyses/building_func.md b/manual_jb/content/analyses/building_func.md index 94675b5f..2dd119ba 100644 --- a/manual_jb/content/analyses/building_func.md +++ b/manual_jb/content/analyses/building_func.md @@ -11,7 +11,7 @@ If both the nearest pole to the building and the substation where buildings belo functional, buildings are considered to be able to receive electric power. The outputs of this analysis are 1) a CSV file with probabilities of functionality samples -for direct comparison with [MC failure probability](mc_failure_prob) outputs and +for direct comparison with [MC limit state probability](mc_limit_state_prob) outputs and 2) a CSV file with probabilities of functionality. **Input parameters** diff --git a/manual_jb/content/analyses/mc_failure_prob.md b/manual_jb/content/analyses/mc_limit_state_prob.md similarity index 76% rename from manual_jb/content/analyses/mc_failure_prob.md rename to manual_jb/content/analyses/mc_limit_state_prob.md index 2dbc3e4d..b1f2a36e 100644 --- a/manual_jb/content/analyses/mc_failure_prob.md +++ b/manual_jb/content/analyses/mc_limit_state_prob.md @@ -1,13 +1,13 @@ -# Monte Carlo failure probability +# Monte Carlo Limit State Probability **Description** -This analysis calculates a probability of failure using a stochastic process. Failure probability and Failure state are derived -using the dictionary of failed damage states in the input infrastructure dataset. Failure probability is calculated from all -stochastic runs, failure state shows all infrastructure standings as a string of *failed* (0) and *not failed* (1) states +This analysis calculates a probability of limit state using a stochastic process. Limit state probability and +damage state are derived using the dictionary of failed damage states in the input infrastructure dataset. Limit state +probability is calculated from all stochastic runs, limit state shows all infrastructure standings as a string of *failed* (0) and *not failed* (1) states of each individual run. -The output of this analysis are two CSV files; a failure proability *base_name*_failure_probability.csv with allocated house units +The output of this analysis are two CSV files; a limit state proability *base_name*_failure_probability.csv with allocated house units and *base_name*_failure_state.csv. **Input Parameters** @@ -33,6 +33,7 @@ key name | type | name | description --- | --- | --- | --- `failure_probability` * | [`incore:failureProbability`](https://incore.ncsa.illinois.edu/semantics/api/types/incore:failureProbability) | Results | A dataset containing failure probability results
(format: CSV). `sample_failure_state` * | [`incore:sampleFailureState`](https://incore.ncsa.illinois.edu/semantics/api/types/incore:sampleFailureState) | Results | A dataset containing failure state for each sample
(format: CSV). +`sample_damage_states` * | [`incore:sampleDamageState`](https://incore.ncsa.illinois.edu/semantics/api/types/incore:sampleDamageState) | Results | A dataset containing damage state for each sample
(format: CSV). (* required) @@ -42,21 +43,21 @@ code snippet: ``` # Create instance - mc = MonteCarloFailureProbability(client) + mc = MonteCarloLimitStateProbability(client) # Load remote datasets mc.load_remote_input_dataset("damage", damage_id) # Set analysis parameters - mc.set_parameter("result_name", "mc_failure_probability") + mc.set_parameter("result_name", "mc_limit_state_probability") mc.set_parameter("num_cpu", 8) mc.set_parameter("num_samples", 10) mc.set_parameter("damage_interval_keys", ["DS_0", "DS_1", "DS_2", "DS_3"]) mc.set_parameter("failure_state_keys", ["DS_1", "DS_2", "DS_3"]) mc.set_parameter("seed", 1111) - # Run Monte Carlo failure + # Run Monte Carlo limit state analysis mc.run_analysis() ``` -full analysis: [mc_failure_prob.ipynb](https://github.com/IN-CORE/incore-docs/blob/main/notebooks/mc_failure_prob.ipynb) +full analysis: [mc_limit_state_prob.ipynb](https://github.com/IN-CORE/incore-docs/blob/main/notebooks/mc_limit_state_prob.ipynb) diff --git a/notebooks/mc_failure_prob.ipynb b/notebooks/mc_failure_prob.ipynb deleted file mode 100644 index e1bcbf87..00000000 --- a/notebooks/mc_failure_prob.ipynb +++ /dev/null @@ -1,482 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "from pyincore import IncoreClient, FragilityService, MappingSet\n", - "from pyincore.analyses.montecarlofailureprobability import MonteCarloFailureProbability\n", - "from pyincore.analyses.buildingdamage import BuildingDamage\n", - "from pyincore.analyses.waterfacilitydamage import WaterFacilityDamage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Monte Carlo failure probability analysis" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "client = IncoreClient()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Chaining with Building damage analysis" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "bldg_dmg = BuildingDamage(client)\n", - "# Memphis hospitals\n", - "bldg_dmg.load_remote_input_dataset(\"buildings\", \"5a284f0bc7d30d13bc081a28\")\n", - "\n", - "# Load fragility mapping\n", - "fragility_service = FragilityService(client)\n", - "mapping_set = MappingSet(fragility_service.get_mapping(\"5b47b350337d4a3629076f2c\"))\n", - "bldg_dmg.set_input_dataset(\"dfr3_mapping_set\", mapping_set)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "bldg_dmg.set_parameter(\"hazard_type\", \"earthquake\")\n", - "# Memphis 7.9 AB-95, New madrid Atkinson and Boore 1995 model based hazard\n", - "bldg_dmg.set_parameter(\"hazard_id\", \"5b902cb273c3371e1236b36b\")\n", - "bldg_dmg.set_parameter(\"num_cpu\", 1)\n", - "\n", - "bldg_dmg.set_parameter(\"result_name\", \"memphis_hospitals_damage\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "bldg_dmg.run_analysis()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "building_dmg_result = bldg_dmg.get_output_dataset('ds_result')\n", - "\n", - "mc = MonteCarloFailureProbability(client)\n", - "mc.set_input_dataset(\"damage\", building_dmg_result)\n", - "mc.set_parameter(\"result_name\", \"bldg_mc\")\n", - "mc.set_parameter(\"num_cpu\", 8)\n", - "mc.set_parameter(\"num_samples\", 10)\n", - "mc.set_parameter(\"damage_interval_keys\", [\"DS_0\", \"DS_1\", \"DS_2\", \"DS_3\"])\n", - "mc.set_parameter(\"failure_state_keys\", [\"DS_1\", \"DS_2\", \"DS_3\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mc.run_analysis()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result_fs = mc.get_output_dataset(\"sample_failure_state\").get_dataframe_from_csv()\n", - "result_fs.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Chaining with water facility damage" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "wf_dmg = WaterFacilityDamage(client)\n", - "# Memphis water facility\n", - "wf_dmg.load_remote_input_dataset(\"water_facilities\", \"5a284f2ac7d30d13bc081e52\")\n", - "\n", - "# Load fragility mapping\n", - "mapping_set = MappingSet(fragility_service.get_mapping(\"5b47c383337d4a387669d592\"))\n", - "wf_dmg.set_input_dataset(\"dfr3_mapping_set\", mapping_set)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "wf_dmg.set_parameter(\"hazard_type\", \"earthquake\")\n", - "# Memphis 7.9 AB-95, New madrid Atkinson and Boore 1995 model based hazard\n", - "wf_dmg.set_parameter(\"hazard_id\", \"5b902cb273c3371e1236b36b\")\n", - "wf_dmg.set_parameter(\"fragility_key\", \"pga\")\n", - "wf_dmg.set_parameter(\"use_liquefaction\", True)\n", - "wf_dmg.set_parameter(\"liquefaction_geology_dataset_id\", \"5a284f53c7d30d13bc08249c\")\n", - "wf_dmg.set_parameter(\"liquefaction_fragility_key\", \"pgd\")\n", - "wf_dmg.set_parameter(\"use_hazard_uncertainty\", False)\n", - "wf_dmg.set_parameter(\"num_cpu\", 1)\n", - "\n", - "wf_dmg.set_parameter(\"result_name\", \"wf_dmg_results\")" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "wf_dmg.run_analysis()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "water_facility_dmg_result = wf_dmg.get_output_dataset('result')\n", - "\n", - "mc = MonteCarloFailureProbability(client)\n", - "mc.set_input_dataset(\"damage\", water_facility_dmg_result)\n", - "mc.set_parameter(\"num_cpu\", 8)\n", - "mc.set_parameter(\"num_samples\", 10)\n", - "mc.set_parameter(\"damage_interval_keys\", [\"DS_0\", \"DS_1\", \"DS_2\", \"DS_3\", \"DS_4\"])\n", - "mc.set_parameter(\"failure_state_keys\", [\"DS_1\", \"DS_2\", \"DS_3\", \"DS_4\"])\n", - "\n", - "mc.set_parameter(\"result_name\", \"water_mc\")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mc.run_analysis()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "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", - "
idfailure
0NaN0,0,0,0,0,0,0,0,0,0
1NaN0,0,0,0,0,0,0,0,0,0
2NaN0,0,0,0,0,0,0,0,0,0
3NaN0,0,1,0,0,0,0,0,0,0
4NaN0,0,0,0,0,0,0,0,0,0
\n", - "
" - ], - "text/plain": [ - " id failure\n", - "0 NaN 0,0,0,0,0,0,0,0,0,0\n", - "1 NaN 0,0,0,0,0,0,0,0,0,0\n", - "2 NaN 0,0,0,0,0,0,0,0,0,0\n", - "3 NaN 0,0,1,0,0,0,0,0,0,0\n", - "4 NaN 0,0,0,0,0,0,0,0,0,0" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_fs = mc.get_output_dataset(\"sample_failure_state\")\n", - "df_fs = result_fs.get_dataframe_from_csv()\n", - "df_fs.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
LS_0LS_1LS_2LS_3DS_0DS_1DS_2DS_3DS_4failure_probability
00.9879770.9127700.7655550.6806180.0120230.0752080.1472150.0849370.6806181.0
10.9928180.9413050.8265920.7511470.0071820.0515120.1147130.0754450.7511471.0
20.9927450.9409600.8261600.7510040.0072550.0517850.1148000.0751560.7510041.0
30.9916170.9358060.8199600.7490200.0083830.0558100.1158470.0709390.7490200.9
40.9918510.9368460.8211750.7493990.0081490.0550050.1156720.0717750.7493991.0
\n", - "
" - ], - "text/plain": [ - " LS_0 LS_1 LS_2 LS_3 DS_0 DS_1 DS_2 \\\n", - "0 0.987977 0.912770 0.765555 0.680618 0.012023 0.075208 0.147215 \n", - "1 0.992818 0.941305 0.826592 0.751147 0.007182 0.051512 0.114713 \n", - "2 0.992745 0.940960 0.826160 0.751004 0.007255 0.051785 0.114800 \n", - "3 0.991617 0.935806 0.819960 0.749020 0.008383 0.055810 0.115847 \n", - "4 0.991851 0.936846 0.821175 0.749399 0.008149 0.055005 0.115672 \n", - "\n", - " DS_3 DS_4 failure_probability \n", - "0 0.084937 0.680618 1.0 \n", - "1 0.075445 0.751147 1.0 \n", - "2 0.075156 0.751004 1.0 \n", - "3 0.070939 0.749020 0.9 \n", - "4 0.071775 0.749399 1.0 " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "result_fp = mc.get_output_dataset(\"failure_probability\")\n", - "df_fp = result_fp.get_dataframe_from_csv()\n", - "df_fp.head()" - ] - } - ], - "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.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/mc_limit_state_prob.ipynb b/notebooks/mc_limit_state_prob.ipynb new file mode 100644 index 00000000..4727624a --- /dev/null +++ b/notebooks/mc_limit_state_prob.ipynb @@ -0,0 +1,256 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from pyincore import IncoreClient, FragilityService, MappingSet\n", + "from pyincore.analyses.montecarlolimitstateprobability import MonteCarloLimitStateProbability\n", + "from pyincore.analyses.buildingdamage import BuildingDamage\n", + "from pyincore.analyses.waterfacilitydamage import WaterFacilityDamage" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Monte Carlo limit state probability analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client = IncoreClient()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Chaining with Building damage analysis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "bldg_dmg = BuildingDamage(client)\n", + "# Memphis hospitals\n", + "bldg_dmg.load_remote_input_dataset(\"buildings\", \"5a284f0bc7d30d13bc081a28\")\n", + "\n", + "# Load fragility mapping\n", + "fragility_service = FragilityService(client)\n", + "mapping_set = MappingSet(fragility_service.get_mapping(\"5b47b350337d4a3629076f2c\"))\n", + "bldg_dmg.set_input_dataset(\"dfr3_mapping_set\", mapping_set)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "bldg_dmg.set_parameter(\"hazard_type\", \"earthquake\")\n", + "# Memphis 7.9 AB-95, New madrid Atkinson and Boore 1995 model based hazard\n", + "bldg_dmg.set_parameter(\"hazard_id\", \"5b902cb273c3371e1236b36b\")\n", + "bldg_dmg.set_parameter(\"num_cpu\", 1)\n", + "\n", + "bldg_dmg.set_parameter(\"result_name\", \"memphis_hospitals_damage\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "bldg_dmg.run_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "building_dmg_result = bldg_dmg.get_output_dataset('ds_result')\n", + "\n", + "mc = MonteCarloLimitStateProbability(client)\n", + "mc.set_input_dataset(\"damage\", building_dmg_result)\n", + "mc.set_parameter(\"result_name\", \"bldg_mc\")\n", + "mc.set_parameter(\"num_cpu\", 8)\n", + "mc.set_parameter(\"num_samples\", 10)\n", + "mc.set_parameter(\"damage_interval_keys\", [\"DS_0\", \"DS_1\", \"DS_2\", \"DS_3\"])\n", + "mc.set_parameter(\"failure_state_keys\", [\"DS_1\", \"DS_2\", \"DS_3\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mc.run_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result_fs = mc.get_output_dataset(\"sample_failure_state\").get_dataframe_from_csv()\n", + "result_fs.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Chaining with water facility damage" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "wf_dmg = WaterFacilityDamage(client)\n", + "# Memphis water facility\n", + "wf_dmg.load_remote_input_dataset(\"water_facilities\", \"5a284f2ac7d30d13bc081e52\")\n", + "\n", + "# Load fragility mapping\n", + "mapping_set = MappingSet(fragility_service.get_mapping(\"5b47c383337d4a387669d592\"))\n", + "wf_dmg.set_input_dataset(\"dfr3_mapping_set\", mapping_set)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "wf_dmg.set_parameter(\"hazard_type\", \"earthquake\")\n", + "# Memphis 7.9 AB-95, New madrid Atkinson and Boore 1995 model based hazard\n", + "wf_dmg.set_parameter(\"hazard_id\", \"5b902cb273c3371e1236b36b\")\n", + "wf_dmg.set_parameter(\"fragility_key\", \"pga\")\n", + "wf_dmg.set_parameter(\"use_liquefaction\", True)\n", + "wf_dmg.set_parameter(\"liquefaction_geology_dataset_id\", \"5a284f53c7d30d13bc08249c\")\n", + "wf_dmg.set_parameter(\"liquefaction_fragility_key\", \"pgd\")\n", + "wf_dmg.set_parameter(\"use_hazard_uncertainty\", False)\n", + "wf_dmg.set_parameter(\"num_cpu\", 1)\n", + "\n", + "wf_dmg.set_parameter(\"result_name\", \"wf_dmg_results\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "wf_dmg.run_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "water_facility_dmg_result = wf_dmg.get_output_dataset('result')\n", + "\n", + "mc = MonteCarloLimitStateProbability(client)\n", + "mc.set_input_dataset(\"damage\", water_facility_dmg_result)\n", + "mc.set_parameter(\"num_cpu\", 8)\n", + "mc.set_parameter(\"num_samples\", 10)\n", + "mc.set_parameter(\"damage_interval_keys\", [\"DS_0\", \"DS_1\", \"DS_2\", \"DS_3\", \"DS_4\"])\n", + "mc.set_parameter(\"failure_state_keys\", [\"DS_1\", \"DS_2\", \"DS_3\", \"DS_4\"])\n", + "\n", + "mc.set_parameter(\"result_name\", \"water_mc\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "mc.run_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result_fs = mc.get_output_dataset(\"sample_failure_state\")\n", + "df_fs = result_fs.get_dataframe_from_csv()\n", + "df_fs.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "result_fp = mc.get_output_dataset(\"failure_probability\")\n", + "df_fp = result_fp.get_dataframe_from_csv()\n", + "df_fp.head()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}