From 51037917f92301725b6b353dd90dde8abfdb7062 Mon Sep 17 00:00:00 2001 From: MatthiasHauthDeltares <113418841+MatthiasHauthDeltares@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:01:38 +0100 Subject: [PATCH] Feat/601 create sandbox example input for adaptation run (#645) * chore: extend config and reader * chore: add/correct attributes of config data * chore: extend reader with options * Folder structure with input files * Removing adaptation option input and changing the config file * Changes to input structure * Putting input data in the correct location and changes to folder names * chore: add adaptation property and extend test * chore: first changes * chore: add adaptation to enum * chore: extend classes * chore: put adaptation in separate enum * chore: add get_analysis * chore: remove no_intervention from config * chore: rename no_intervention to no_adaptation * Delete ra2ce/analysis/adaptation/adaptation_option_collection.py * chore: restore no_adaptation_option * chore: expand logic and add tests * chore: add losses analysis name to config * chore: take losses_analysis from config * chore: fix test * test: add tests * chore: fix logic for paths * chore: small changes * test: add test data * chore: small change of folders * chore: small changes to paths * chore: small ini change * chore: typo * chore: create class and extend factory * test: fix failing tests * chore: remove VAT * chore: add cost calculation * chore: process review comments * chore: process review comments * merge master * chore: fix issues * chore: fix test * updated example, output_graph folder updated * test: add output_graph files * test: remove test * Changes to the notebook * chore: process review comments * chore: add base_network in the factory * chore: add cost calculation * chore: rename collection attribute * chore: small changes * chore: add calculate to collectino * chore: add root_path * test: extend conftest * test: move test input * chore: add path properties to adaptation_option * chore: first damages setup * test: fix/extend tests * chore: add aggregate_wl to config * chore: add losses (start) * chore: big overhaul of the creation of adaptation options * chore: add docstring * chore: remove unused imports * test: fix losses input paths * chore: fix losses run * chore: small cleanup * chore: small changes, add docstring * chore: fix tests * chore: small changes * test: adapt losses configs * chore: restore graph_file_hazard * chore: copy static folder as well for avg_speed * chore: add hazard section with wl_aggregate * Changes to notebook and input folder structure * test: correct name of resilience_curve csv * updated network in test data * change in naming * added parameters in the lossess section * Folder structure revised * chore: calculate benefit for options * chore: final changes * chore: add TODOs * chore: change readers into dataclasses * chore: add expected total cost (for now based on unit cost only) * chore: process rework * chore/add input files for notebook * chore/git add ini file * chore/git add ini file * chore/add all data for example adaptation * chore/update notebook and data * chore/update notebook * chore/apply review suggestions * commit notebook again * chore/remove output test file * add files to run analysis and losses * add output_path to Adaptation class * clear output * chore/fix notebook --------- Co-authored-by: Ardt Klapwijk Co-authored-by: Cham8920 Co-authored-by: Ardt Klapwijk <59741981+ArdtK@users.noreply.github.com> --- .../hazard_severity_damage_fraction.csv | 8 + .../all_road_types/max_damage_road_types.csv | 8 + .../adaptation/input/resilience_curve.csv | 25 ++ .../adaptation/input/traffic_intensities.csv | 273 +++++++++++++++ .../data/adaptation/input/values_of_time.csv | 5 + examples/example_adaptation.ipynb | 330 ++++++++++++++++++ ra2ce/analysis/adaptation/adaptation.py | 1 + 7 files changed, 650 insertions(+) create mode 100644 examples/data/adaptation/input/damage_functions/all_road_types/hazard_severity_damage_fraction.csv create mode 100644 examples/data/adaptation/input/damage_functions/all_road_types/max_damage_road_types.csv create mode 100644 examples/data/adaptation/input/resilience_curve.csv create mode 100644 examples/data/adaptation/input/traffic_intensities.csv create mode 100644 examples/data/adaptation/input/values_of_time.csv create mode 100644 examples/example_adaptation.ipynb diff --git a/examples/data/adaptation/input/damage_functions/all_road_types/hazard_severity_damage_fraction.csv b/examples/data/adaptation/input/damage_functions/all_road_types/hazard_severity_damage_fraction.csv new file mode 100644 index 000000000..2f76479ca --- /dev/null +++ b/examples/data/adaptation/input/damage_functions/all_road_types/hazard_severity_damage_fraction.csv @@ -0,0 +1,8 @@ +depth;damage +cm;% of total construction costs +0;0 +100;0.1 +200;0.2 +400;0.4 +800;0.8 +12000;1 diff --git a/examples/data/adaptation/input/damage_functions/all_road_types/max_damage_road_types.csv b/examples/data/adaptation/input/damage_functions/all_road_types/max_damage_road_types.csv new file mode 100644 index 000000000..6ba62f534 --- /dev/null +++ b/examples/data/adaptation/input/damage_functions/all_road_types/max_damage_road_types.csv @@ -0,0 +1,8 @@ +Road_type \ lanes;1;2;3;4;5 +unit;euro/m;euro/m;euro/m;euro/m;euro/m +tertiary_link;110;120;130;140;150 +tertiary;110;120;130;140;150 +secondary_link;11;12;13;14;15 +secondary;11;12;13;14;15 +residential;1100;1200;1300;1400;1500 +['tertiary', 'residential'];510;520;530;540;550 diff --git a/examples/data/adaptation/input/resilience_curve.csv b/examples/data/adaptation/input/resilience_curve.csv new file mode 100644 index 000000000..ff3039770 --- /dev/null +++ b/examples/data/adaptation/input/resilience_curve.csv @@ -0,0 +1,25 @@ +link_type_hazard_intensity;duration_steps;functionality_loss_ratio +secondary_0.0-0.2;[1.0];[0.05] +secondary_0.2-0.5;[1, 2.5];[0.125, 0.05] +secondary_0.5-1.5;[2.5, 5, 7.5];[0.375, 0.25, 0.125] +secondary_1.5-9999.0;[7.5, 9, 10];[0.5, 0.45, 0.375] +secondary_link_0.0-0.2;[1.0];[0.05] +secondary_link_0.2-0.5;[1, 2.5];[0.125, 0.05] +secondary_link_0.5-1.5;[2.5, 5, 7.5];[0.375, 0.25, 0.125] +secondary_link_1.5-9999.0;[7.5, 9, 10];[0.5, 0.45, 0.375] +tertiary_0.0-0.2;[2.0];[0.1] +tertiary_0.2-0.5;[2, 5];[0.25, 0.1] +tertiary_0.5-1.5;[5, 10, 15];[0.75, 0.5, 0.25] +tertiary_1.5-9999.0;[15, 18, 20];[1, 0.9, 0.75] +tertiary_link_0.0-0.2;[2.0];[0.1] +tertiary_link_0.2-0.5;[2, 5];[0.25, 0.1] +tertiary_link_0.5-1.5;[5, 10, 15];[0.75, 0.5, 0.25] +tertiary_link_1.5-9999.0;[15, 18, 20];[1, 0.9, 0.75] +trunk_0.0-0.2;[3.0];[0.2] +trunk_0.2-0.5;[3, 7.5];[0.5, 0.2] +trunk_0.5-1.5;[7.5, 15, 22.5];[0.7, 0.6, 0.5] +trunk_1.5-9999.0;[22.5, 27, 30];[1, 0.95, 0.7] +trunk_link_0.0-0.2;[3.0];[0.2] +trunk_link_0.2-0.5;[3, 7.5];[0.5, 0.2] +trunk_link_0.5-1.5;[7.5, 15, 22.5];[0.7, 0.6, 0.5] +trunk_link_1.5-9999.0;[22.5, 27, 30];[1, 0.95, 0.7] diff --git a/examples/data/adaptation/input/traffic_intensities.csv b/examples/data/adaptation/input/traffic_intensities.csv new file mode 100644 index 000000000..b4f419451 --- /dev/null +++ b/examples/data/adaptation/input/traffic_intensities.csv @@ -0,0 +1,273 @@ +ID,evening_peak_total,evening_peak_freight,evening_peak_commute,evening_peak_business,evening_peak_other,day_freight,day_commute,day_business,day_other,day_total +0,0,0,0,0,0,15,31,66,44,156 +1,0,0,0,0,0,90,22,95,98,305 +2,0,0,0,0,0,28,29,18,13,88 +3,0,0,0,0,0,41,92,64,52,249 +4,0,0,0,0,0,93,31,17,14,155 +5,0,0,0,0,0,47,53,39,49,188 +6,0,0,0,0,0,33,97,31,48,209 +7,0,0,0,0,0,40,98,82,41,261 +8,0,0,0,0,0,37,70,70,47,224 +9,0,0,0,0,0,18,24,93,54,189 +10,0,0,0,0,0,35,58,89,40,222 +11,0,0,0,0,0,58,67,80,31,236 +12,0,0,0,0,0,57,76,73,85,291 +13,0,0,0,0,0,30,94,98,51,273 +14,0,0,0,0,0,24,14,53,16,107 +15,0,0,0,0,0,74,66,21,24,185 +16,0,0,0,0,0,30,97,57,30,214 +17,0,0,0,0,0,69,30,99,19,217 +18,0,0,0,0,0,88,94,58,65,305 +19,0,0,0,0,0,22,71,85,80,258 +20,0,0,0,0,0,78,19,51,71,219 +21,0,0,0,0,0,88,83,76,100,347 +22,0,0,0,0,0,43,90,26,43,202 +23,0,0,0,0,0,34,89,15,52,190 +24,0,0,0,0,0,73,67,30,39,209 +25,0,0,0,0,0,32,22,29,67,150 +26,0,0,0,0,0,19,42,35,90,186 +27,0,0,0,0,0,82,17,76,93,268 +28,0,0,0,0,0,28,63,42,100,233 +29,0,0,0,0,0,76,27,57,88,248 +30,0,0,0,0,0,12,90,55,86,243 +31,0,0,0,0,0,17,15,63,45,140 +32,0,0,0,0,0,60,76,43,21,200 +33,0,0,0,0,0,77,26,34,26,163 +34,0,0,0,0,0,34,35,85,94,248 +35,0,0,0,0,0,72,22,34,49,177 +36,0,0,0,0,0,84,11,57,15,167 +37,0,0,0,0,0,59,53,19,34,165 +38,0,0,0,0,0,48,11,80,24,163 +39,0,0,0,0,0,38,77,47,40,202 +40,0,0,0,0,0,56,10,50,81,197 +41,0,0,0,0,0,36,64,44,89,233 +42,0,0,0,0,0,89,49,75,35,248 +43,0,0,0,0,0,73,12,39,75,199 +44,0,0,0,0,0,64,62,49,27,202 +45,0,0,0,0,0,38,29,10,38,115 +46,0,0,0,0,0,46,71,54,31,202 +47,0,0,0,0,0,54,35,56,11,156 +48,0,0,0,0,0,34,81,94,31,240 +49,0,0,0,0,0,31,89,30,51,201 +50,0,0,0,0,0,64,28,63,11,166 +51,0,0,0,0,0,85,86,45,24,240 +52,0,0,0,0,0,14,49,84,40,187 +53,0,0,0,0,0,42,39,45,38,164 +54,0,0,0,0,0,48,68,83,22,221 +55,0,0,0,0,0,77,77,82,73,309 +56,0,0,0,0,0,10,26,12,67,115 +57,0,0,0,0,0,37,73,54,80,244 +58,0,0,0,0,0,27,86,88,60,261 +59,0,0,0,0,0,36,51,38,69,194 +60,0,0,0,0,0,67,74,93,67,301 +61,0,0,0,0,0,53,96,45,26,220 +62,0,0,0,0,0,64,96,17,21,198 +63,0,0,0,0,0,31,22,84,94,231 +64,0,0,0,0,0,22,72,28,80,202 +65,0,0,0,0,0,72,51,86,89,298 +66,0,0,0,0,0,91,22,94,53,260 +67,0,0,0,0,0,95,23,92,99,309 +68,0,0,0,0,0,10,100,40,19,169 +69,0,0,0,0,0,82,56,49,99,286 +70,0,0,0,0,0,85,59,46,45,235 +71,0,0,0,0,0,22,63,12,90,187 +72,0,0,0,0,0,36,65,30,41,172 +73,0,0,0,0,0,38,33,93,64,228 +74,0,0,0,0,0,55,62,52,57,226 +75,0,0,0,0,0,36,99,18,48,201 +76,0,0,0,0,0,79,59,43,18,199 +77,0,0,0,0,0,19,51,99,25,194 +78,0,0,0,0,0,73,84,73,12,242 +79,0,0,0,0,0,20,96,36,65,217 +80,0,0,0,0,0,84,94,86,30,294 +81,0,0,0,0,0,62,43,17,92,214 +82,0,0,0,0,0,55,23,87,65,230 +83,0,0,0,0,0,37,62,53,39,191 +84,0,0,0,0,0,85,65,66,78,294 +85,0,0,0,0,0,56,39,53,48,196 +86,0,0,0,0,0,99,52,33,88,272 +87,0,0,0,0,0,64,94,29,76,263 +88,0,0,0,0,0,61,80,63,21,225 +89,0,0,0,0,0,85,85,61,63,294 +90,0,0,0,0,0,54,85,48,90,277 +91,0,0,0,0,0,70,16,74,78,238 +92,0,0,0,0,0,17,45,15,55,132 +93,0,0,0,0,0,90,95,26,75,286 +94,0,0,0,0,0,80,55,12,78,225 +95,0,0,0,0,0,38,71,48,87,244 +96,0,0,0,0,0,56,40,19,35,150 +97,0,0,0,0,0,63,21,81,74,239 +98,0,0,0,0,0,44,47,84,12,187 +99,0,0,0,0,0,78,24,97,52,251 +100,0,0,0,0,0,26,59,58,34,177 +101,0,0,0,0,0,73,48,33,46,200 +102,0,0,0,0,0,62,100,39,78,279 +103,0,0,0,0,0,63,78,39,51,231 +104,0,0,0,0,0,19,49,84,10,162 +105,0,0,0,0,0,44,65,28,52,189 +106,0,0,0,0,0,35,92,23,74,224 +107,0,0,0,0,0,48,56,71,66,241 +108,0,0,0,0,0,31,35,80,96,242 +109,0,0,0,0,0,39,26,79,77,221 +110,0,0,0,0,0,90,76,49,90,305 +111,0,0,0,0,0,35,68,36,79,218 +112,0,0,0,0,0,23,61,62,92,238 +113,0,0,0,0,0,49,36,32,96,213 +114,0,0,0,0,0,79,16,61,55,211 +115,0,0,0,0,0,35,17,28,61,141 +116,0,0,0,0,0,86,99,54,28,267 +117,0,0,0,0,0,87,99,80,50,316 +118,0,0,0,0,0,37,16,47,49,149 +119,0,0,0,0,0,80,63,43,30,216 +120,0,0,0,0,0,97,90,74,29,290 +121,0,0,0,0,0,89,83,13,41,226 +122,0,0,0,0,0,52,96,32,100,280 +123,0,0,0,0,0,11,86,39,98,234 +124,0,0,0,0,0,32,79,45,79,235 +125,0,0,0,0,0,39,37,56,99,231 +126,0,0,0,0,0,34,59,50,32,175 +127,0,0,0,0,0,34,63,30,45,172 +128,0,0,0,0,0,80,69,17,51,217 +129,0,0,0,0,0,60,73,71,94,298 +130,0,0,0,0,0,77,69,91,29,266 +131,0,0,0,0,0,40,60,13,47,160 +132,0,0,0,0,0,78,85,31,36,230 +133,0,0,0,0,0,14,65,68,30,177 +134,0,0,0,0,0,71,47,97,29,244 +135,0,0,0,0,0,26,96,78,31,231 +136,0,0,0,0,0,27,19,48,49,143 +137,0,0,0,0,0,18,36,34,80,168 +138,0,0,0,0,0,76,95,28,20,219 +139,0,0,0,0,0,14,81,66,88,249 +140,0,0,0,0,0,13,83,18,83,197 +141,0,0,0,0,0,53,83,23,96,255 +142,0,0,0,0,0,56,87,32,96,271 +143,0,0,0,0,0,30,79,69,89,267 +144,0,0,0,0,0,45,77,81,44,247 +145,0,0,0,0,0,23,73,84,20,200 +146,0,0,0,0,0,14,94,89,91,288 +147,0,0,0,0,0,10,90,18,38,156 +148,0,0,0,0,0,81,67,37,40,225 +149,0,0,0,0,0,32,31,44,15,122 +150,0,0,0,0,0,97,31,26,37,191 +151,0,0,0,0,0,31,21,25,42,119 +152,0,0,0,0,0,83,20,11,21,135 +153,0,0,0,0,0,44,11,82,94,231 +154,0,0,0,0,0,20,73,100,38,231 +155,0,0,0,0,0,61,36,53,93,243 +156,0,0,0,0,0,98,50,90,45,283 +157,0,0,0,0,0,79,36,38,15,168 +158,0,0,0,0,0,19,37,82,75,213 +159,0,0,0,0,0,100,84,30,41,255 +160,0,0,0,0,0,38,83,78,55,254 +161,0,0,0,0,0,41,40,65,52,198 +162,0,0,0,0,0,70,82,65,14,231 +163,0,0,0,0,0,94,23,28,96,241 +164,0,0,0,0,0,19,59,93,11,182 +165,0,0,0,0,0,54,81,72,94,301 +166,0,0,0,0,0,81,98,49,28,256 +167,0,0,0,0,0,28,71,86,94,279 +168,0,0,0,0,0,13,100,83,99,295 +169,0,0,0,0,0,37,52,64,16,169 +170,0,0,0,0,0,40,43,87,52,222 +171,0,0,0,0,0,33,55,36,70,194 +172,0,0,0,0,0,59,47,48,78,232 +173,0,0,0,0,0,70,57,26,26,179 +174,0,0,0,0,0,63,44,40,67,214 +175,0,0,0,0,0,14,25,28,87,154 +176,0,0,0,0,0,39,15,69,68,191 +177,0,0,0,0,0,14,21,100,38,173 +178,0,0,0,0,0,23,85,30,92,230 +179,0,0,0,0,0,48,16,12,67,143 +180,0,0,0,0,0,97,93,74,60,324 +181,0,0,0,0,0,53,17,86,94,250 +182,0,0,0,0,0,36,28,12,71,147 +183,0,0,0,0,0,86,11,89,28,214 +184,0,0,0,0,0,15,72,35,95,217 +185,0,0,0,0,0,21,100,37,58,216 +186,0,0,0,0,0,38,74,54,56,222 +187,0,0,0,0,0,87,63,70,97,317 +188,0,0,0,0,0,80,56,60,92,288 +189,0,0,0,0,0,54,77,76,15,222 +190,0,0,0,0,0,90,51,26,84,251 +191,0,0,0,0,0,55,44,49,31,179 +192,0,0,0,0,0,42,44,44,59,189 +193,0,0,0,0,0,90,88,93,33,304 +194,0,0,0,0,0,35,34,45,88,202 +195,0,0,0,0,0,38,60,15,36,149 +196,0,0,0,0,0,29,31,83,54,197 +197,0,0,0,0,0,67,62,70,40,239 +198,0,0,0,0,0,93,10,51,30,184 +199,0,0,0,0,0,73,61,94,38,266 +200,0,0,0,0,0,47,25,87,52,211 +201,0,0,0,0,0,27,34,71,22,154 +202,0,0,0,0,0,32,45,70,97,244 +203,0,0,0,0,0,47,62,29,58,196 +204,0,0,0,0,0,25,89,30,35,179 +205,0,0,0,0,0,37,12,39,69,157 +206,0,0,0,0,0,72,31,29,73,205 +207,0,0,0,0,0,62,99,13,31,205 +208,0,0,0,0,0,82,13,77,15,187 +209,0,0,0,0,0,66,98,34,53,251 +210,0,0,0,0,0,36,43,30,64,173 +211,0,0,0,0,0,61,86,47,85,279 +212,0,0,0,0,0,18,98,59,45,220 +213,0,0,0,0,0,95,83,52,26,256 +214,0,0,0,0,0,45,93,60,15,213 +215,0,0,0,0,0,87,17,40,57,201 +216,0,0,0,0,0,59,84,77,29,249 +217,0,0,0,0,0,10,92,47,59,208 +218,0,0,0,0,0,64,32,89,21,206 +219,0,0,0,0,0,92,23,61,38,214 +220,0,0,0,0,0,25,78,40,18,161 +221,0,0,0,0,0,81,85,86,62,314 +222,0,0,0,0,0,10,52,15,23,100 +223,0,0,0,0,0,78,33,15,81,207 +224,0,0,0,0,0,16,95,85,82,278 +225,0,0,0,0,0,100,18,40,27,185 +226,0,0,0,0,0,74,15,24,53,166 +227,0,0,0,0,0,29,23,15,39,106 +228,0,0,0,0,0,55,45,44,23,167 +229,0,0,0,0,0,31,69,56,28,184 +230,0,0,0,0,0,14,57,56,59,186 +231,0,0,0,0,0,61,62,51,37,211 +232,0,0,0,0,0,81,70,98,32,281 +233,0,0,0,0,0,42,90,68,24,224 +234,0,0,0,0,0,68,19,69,35,191 +235,0,0,0,0,0,59,100,34,44,237 +236,0,0,0,0,0,52,32,62,29,175 +237,0,0,0,0,0,68,97,31,40,236 +238,0,0,0,0,0,79,21,89,60,249 +239,0,0,0,0,0,72,53,81,76,282 +240,0,0,0,0,0,68,16,22,42,148 +241,0,0,0,0,0,38,19,15,11,83 +242,0,0,0,0,0,81,78,63,99,321 +243,0,0,0,0,0,50,95,85,17,247 +244,0,0,0,0,0,90,18,95,57,260 +245,0,0,0,0,0,64,48,35,85,232 +246,0,0,0,0,0,83,10,65,43,201 +247,0,0,0,0,0,59,58,48,14,179 +248,0,0,0,0,0,36,27,98,25,186 +249,0,0,0,0,0,25,61,52,62,200 +250,0,0,0,0,0,68,43,92,22,225 +251,0,0,0,0,0,44,85,54,42,225 +252,0,0,0,0,0,31,66,27,24,148 +253,0,0,0,0,0,63,34,45,89,231 +254,0,0,0,0,0,69,76,24,81,250 +255,0,0,0,0,0,83,73,72,28,256 +256,0,0,0,0,0,32,82,29,61,204 +257,0,0,0,0,0,10,54,92,73,229 +258,0,0,0,0,0,86,66,82,95,329 +259,0,0,0,0,0,43,43,59,31,176 +260,0,0,0,0,0,64,71,85,61,281 +261,0,0,0,0,0,43,50,10,79,182 +262,0,0,0,0,0,38,14,67,63,182 +263,0,0,0,0,0,42,77,83,35,237 +264,0,0,0,0,0,44,72,97,38,251 +265,0,0,0,0,0,74,26,90,96,286 +266,0,0,0,0,0,55,16,12,50,133 +267,0,0,0,0,0,53,99,76,42,270 +268,0,0,0,0,0,88,81,15,64,248 +269,0,0,0,0,0,46,70,37,37,190 +270,0,0,0,0,0,33,37,87,34,191 +271,0,0,0,0,0,30,40,90,30,190 diff --git a/examples/data/adaptation/input/values_of_time.csv b/examples/data/adaptation/input/values_of_time.csv new file mode 100644 index 000000000..a6d7cd6c1 --- /dev/null +++ b/examples/data/adaptation/input/values_of_time.csv @@ -0,0 +1,5 @@ +trip_types;value_of_time;occupants +business;20;2 +commute;10;3 +freight;200;1 +other;100;20 diff --git a/examples/example_adaptation.ipynb b/examples/example_adaptation.ipynb new file mode 100644 index 000000000..662f79341 --- /dev/null +++ b/examples/example_adaptation.ipynb @@ -0,0 +1,330 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RA2CE Feature: adaptation measures" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook explains how users can create different adaptation options that will influence the calculated damages and losses on roads. It also performs a Cost-Benefit Analysis (CBA) for each of the adaptation option to explore the cost effectiveness of these options." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from ra2ce.analysis.analysis_config_wrapper import AnalysisConfigWrapper\n", + "from ra2ce.analysis.analysis_input_wrapper import AnalysisInputWrapper\n", + "from ra2ce.ra2ce_handler import Ra2ceHandler\n", + "from ra2ce.network.network_config_data.enums.aggregate_wl_enum import AggregateWlEnum\n", + "from ra2ce.network.network_config_data.enums.source_enum import SourceEnum\n", + "from ra2ce.analysis.analysis_config_data.analysis_config_data import (\n", + " AnalysisConfigData,\n", + " AnalysisSectionAdaptation,\n", + " AnalysisSectionAdaptationOption,\n", + " AnalysisSectionDamages,\n", + " AnalysisSectionLosses,\n", + ")\n", + "from ra2ce.analysis.analysis_config_data.enums.analysis_damages_enum import (\n", + " AnalysisDamagesEnum,\n", + ")\n", + "from ra2ce.analysis.analysis_config_data.enums.analysis_enum import AnalysisEnum\n", + "from ra2ce.analysis.analysis_config_data.enums.analysis_losses_enum import (\n", + " AnalysisLossesEnum,\n", + ")\n", + "from ra2ce.analysis.analysis_config_data.enums.damage_curve_enum import DamageCurveEnum\n", + "from ra2ce.analysis.analysis_config_data.enums.event_type_enum import EventTypeEnum\n", + "from ra2ce.analysis.analysis_config_data.enums.traffic_period_enum import (\n", + " TrafficPeriodEnum,\n", + ")\n", + "from ra2ce.analysis.analysis_config_data.enums.trip_purpose_enum import TripPurposeEnum\n", + "from ra2ce.analysis.analysis_config_data.enums.weighing_enum import WeighingEnum\n", + "from ra2ce.analysis.analysis_config_wrapper import AnalysisConfigWrapper\n", + "from ra2ce.analysis.analysis_input_wrapper import AnalysisInputWrapper\n", + "from ra2ce.network.network_config_data.enums.aggregate_wl_enum import AggregateWlEnum\n", + "from ra2ce.network.network_config_data.network_config_data import (\n", + " HazardSection,\n", + " NetworkConfigData,\n", + " NetworkSection,\n", + ")\n", + "from ra2ce.network.network_config_wrapper import NetworkConfigWrapper\n", + "from ra2ce.analysis.adaptation.adaptation import Adaptation\n", + "from ra2ce.analysis.analysis_config_wrapper import AnalysisConfigWrapper\n", + "from ra2ce.analysis.analysis_input_wrapper import AnalysisInputWrapper\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "root_dir = Path(\"data\", \"adaptation\")\n", + "\n", + "static_path = root_dir.joinpath(\"static\")\n", + "hazard_path =static_path.joinpath(\"hazard\")\n", + "network_path = static_path.joinpath(\"network\")\n", + "output_path=root_dir.joinpath(\"output\")\n", + "\n", + "input_path = root_dir.joinpath(\"input\") # path of the data files for all adaptation options and reference option" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Network config\n", + "\n", + "The network must first be configured and overlaid with a hazard map. The current workflow only supports the following configurations:\n", + "\n", + "- AggregateWlENum: only MEAN \n", + "- SourceEnum must be set to SHAPEFILE. This is because we are running Losses which requires information about the traffic intensities, \n", + "- Adaptation is for now only event-based for a single hazard map. Therefore the name of the hazard map should not start with \"RP\" and should start the risk-based damage workflow will be triggered. The hazard name shoud start with a letter." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "_network_section = NetworkSection(\n", + " source= SourceEnum.SHAPEFILE, \n", + " primary_file = [network_path.joinpath(\"network.shp\")], \n", + " file_id = \"ID\",\n", + " link_type_column=\"highway\",\n", + " save_gpkg=True\n", + ")\n", + "\n", + "_hazard = HazardSection(\n", + " hazard_map=[Path(file) for file in hazard_path.glob(\"*.tif\")],\n", + " hazard_field_name= [\"waterdepth\"],\n", + " aggregate_wl = AggregateWlEnum.MEAN,\n", + " hazard_crs = \"EPSG:4326\",\n", + ")\n", + "\n", + "\n", + "_network_config_data = NetworkConfigData(\n", + " root_path=root_dir,\n", + " static_path=static_path,\n", + " output_path=output_path,\n", + " network=_network_section,\n", + " hazard=_hazard\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "handler = Ra2ceHandler.from_config(_network_config_data, None)\n", + "\n", + "handler.configure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Losses and Damages configuration\n", + "\n", + "The configuration for the losses and damages analysis must be defined here. The general configurations of losses and damages are shared for all adaptation options! The only difference between the options are the \n", + "input files used: resilience_curve.csv, traffic_intensities.csv, values_of_time.csv, damage_curves.csv and max_damage_road_type.csv\n", + "\n", + "For example, it is (currenlty) NOT possible for Adaptation option 1 to have `production_loss_per_capita_per_hour=42` and for option 2: `production_loss_per_capita_per_hour=20`\n", + "\n", + "### Damages:\n", + "\n", + "- Since we are simulating the adaptation effects by modifying the hazard curves, only the Manual damage curve type is allowed: `DamageCurveEnum.MAN`\n", + "- `EventTypeEnum.EVENT` is mandatory since we are dealing with an event-base adaptation.\n", + "\n", + "### Losses:\n", + "\n", + "- Both single link and multi link losses are accepted: `AnalysisLossesEnum`\n", + "- `EventTypeEnum.EVENT` is mandatory since we are dealing with an event-base adaptation.\n", + "- All the other arguments can be modified " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "_damages_section = AnalysisSectionDamages(\n", + " analysis=AnalysisDamagesEnum.DAMAGES,\n", + " event_type=EventTypeEnum.EVENT,\n", + " damage_curve=DamageCurveEnum.MAN,\n", + " save_gpkg=True,\n", + " save_csv=True,\n", + " )\n", + "\n", + " # - losses\n", + "_multi_link_losses_section = AnalysisSectionLosses(\n", + " analysis=AnalysisLossesEnum.MULTI_LINK_LOSSES,\n", + " event_type=EventTypeEnum.EVENT,\n", + " weighing=WeighingEnum.TIME,\n", + " threshold=0,\n", + " production_loss_per_capita_per_hour=42,\n", + " hours_per_traffic_period=8,\n", + " traffic_period=TrafficPeriodEnum.DAY,\n", + " trip_purposes=[\n", + " TripPurposeEnum.BUSINESS,\n", + " TripPurposeEnum.COMMUTE,\n", + " TripPurposeEnum.FREIGHT,\n", + " TripPurposeEnum.OTHER,\n", + " ],\n", + " resilience_curves_file=input_path.joinpath(\"resilience_curve.csv\"),\n", + " traffic_intensities_file=input_path.joinpath(\"traffic_intensities.csv\"),\n", + " values_of_time_file=input_path.joinpath(\"values_of_time.csv\"),\n", + " save_gpkg=True,\n", + " save_csv=True,\n", + " )\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Adaptation options:\n", + "\n", + "The adaptation options can now be defined. \n", + "\n", + "1. The `AnalysisSectionAdaptation` must be filled with general inputs applicable to all adaptation options:\n", + " - type of losses analysis: single link or multi link\n", + " - discount rate: to account for inflation\n", + " - initial_frequency: this the frequency of occurence of the considered hazard map at year 0\n", + " - climate factor: accounting for the increase of likelihood over time fo the hazard map\n", + " - time horizon: numbers of years for the CBA\n", + "2. A collection of adaptation options is to be specified:\n", + " - Each adaptation option has an `id` which must match the input data structure in order to assign the input files correctly\n", + " - The first adaptation option represents the initial situation (Business As Usual) and only requires a `name` and `id`.\n", + " - The following adaptation options have extra required attributes to calculate the cost: `construction_cost`, `construction_interval`, 'maintenance_cost', 'maintenance_interval'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# - adaptation\n", + "_adaptation_options = [\n", + " AnalysisSectionAdaptationOption(\n", + " id=\"AO0\",\n", + " name=\"No adaptation\",\n", + " ),\n", + " AnalysisSectionAdaptationOption(\n", + " id=\"AO1\",\n", + " name=\"Cheap construction, expensive maintenance\",\n", + " construction_cost=1000.0,\n", + " construction_interval=10.0,\n", + " maintenance_cost=200.0,\n", + " maintenance_interval=3.0,\n", + " ),\n", + " AnalysisSectionAdaptationOption(\n", + " id=\"AO2\",\n", + " name=\"Expensive construction, cheap maintenance\",\n", + " construction_cost=5000.0,\n", + " construction_interval=100.0,\n", + " maintenance_cost=50.0,\n", + " maintenance_interval=3.0,\n", + " ),\n", + "]\n", + "_adaptation_section = AnalysisSectionAdaptation(\n", + " analysis=AnalysisEnum.ADAPTATION,\n", + " losses_analysis=AnalysisLossesEnum.MULTI_LINK_LOSSES,\n", + " adaptation_options=_adaptation_options,\n", + " discount_rate=0.025, # correcting inflation 0.025 = 2.5%\n", + " initial_frequency=0.001, # yearly frequency of occurrence of the event (hazard map)\n", + " climate_factor=0.000235, # factor to correct for the positive increase of the frequency of occurrence of the event\n", + " time_horizon=20, # time horizon in years for the CBA analysis\n", + " )\n", + "\n", + "_analysis_config_data = AnalysisConfigData(\n", + " root_path=root_dir,\n", + " input_path=input_path,\n", + " static_path=static_path,\n", + " output_path=output_path,\n", + " analyses=[\n", + " _damages_section,\n", + " _multi_link_losses_section,\n", + " _adaptation_section,\n", + " ],\n", + " aggregate_wl=AggregateWlEnum.MEAN,\n", + " )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For this example. There are 2 adaptation options defined `AO1` and `AO2`, in addition to the reference case 'AO0'. The corresponding files structure should then be the following (assuming MultiLinkLosses and damages based on all road types)" + ] + }, + { + "attachments": { + "image-2.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![image-2.png](attachment:image-2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "handler = Ra2ceHandler.from_config(_network_config_data, _analysis_config_data)\n", + "\n", + "handler.configure()\n", + "handler.run_analysis()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ra2ce_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", + "version": "3.11.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/ra2ce/analysis/adaptation/adaptation.py b/ra2ce/analysis/adaptation/adaptation.py index b2de15af9..08d274530 100644 --- a/ra2ce/analysis/adaptation/adaptation.py +++ b/ra2ce/analysis/adaptation/adaptation.py @@ -58,6 +58,7 @@ def __init__( self.adaptation_collection = AdaptationOptionCollection.from_config( analysis_config ) + self.output_path=analysis_input.output_path def execute(self) -> AnalysisResultWrapper: """