flood-adapt 0.3.8__py3-none-any.whl → 0.3.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flood_adapt/__init__.py +26 -22
- flood_adapt/adapter/__init__.py +9 -9
- flood_adapt/adapter/fiat_adapter.py +1541 -1536
- flood_adapt/adapter/interface/hazard_adapter.py +70 -70
- flood_adapt/adapter/interface/impact_adapter.py +36 -36
- flood_adapt/adapter/interface/model_adapter.py +89 -89
- flood_adapt/adapter/interface/offshore.py +19 -19
- flood_adapt/adapter/sfincs_adapter.py +1848 -1846
- flood_adapt/adapter/sfincs_offshore.py +193 -193
- flood_adapt/config/config.py +248 -290
- flood_adapt/config/fiat.py +219 -219
- flood_adapt/config/gui.py +331 -331
- flood_adapt/config/sfincs.py +481 -336
- flood_adapt/config/site.py +129 -129
- flood_adapt/database_builder/database_builder.py +2210 -2210
- flood_adapt/database_builder/templates/default_units/imperial.toml +9 -9
- flood_adapt/database_builder/templates/default_units/metric.toml +9 -9
- flood_adapt/database_builder/templates/green_infra_table/green_infra_lookup_table.csv +10 -10
- flood_adapt/database_builder/templates/infographics/OSM/config_charts.toml +90 -90
- flood_adapt/database_builder/templates/infographics/OSM/config_people.toml +57 -57
- flood_adapt/database_builder/templates/infographics/OSM/config_risk_charts.toml +121 -121
- flood_adapt/database_builder/templates/infographics/OSM/config_roads.toml +65 -65
- flood_adapt/database_builder/templates/infographics/OSM/styles.css +45 -45
- flood_adapt/database_builder/templates/infographics/US_NSI/config_charts.toml +126 -126
- flood_adapt/database_builder/templates/infographics/US_NSI/config_people.toml +60 -60
- flood_adapt/database_builder/templates/infographics/US_NSI/config_risk_charts.toml +121 -121
- flood_adapt/database_builder/templates/infographics/US_NSI/config_roads.toml +65 -65
- flood_adapt/database_builder/templates/infographics/US_NSI/styles.css +45 -45
- flood_adapt/database_builder/templates/infometrics/OSM/metrics_additional_risk_configs.toml +4 -4
- flood_adapt/database_builder/templates/infometrics/OSM/with_SVI/infographic_metrics_config.toml +143 -143
- flood_adapt/database_builder/templates/infometrics/OSM/with_SVI/infographic_metrics_config_risk.toml +153 -153
- flood_adapt/database_builder/templates/infometrics/OSM/without_SVI/infographic_metrics_config.toml +127 -127
- flood_adapt/database_builder/templates/infometrics/OSM/without_SVI/infographic_metrics_config_risk.toml +57 -57
- flood_adapt/database_builder/templates/infometrics/US_NSI/metrics_additional_risk_configs.toml +4 -4
- flood_adapt/database_builder/templates/infometrics/US_NSI/with_SVI/infographic_metrics_config.toml +191 -191
- flood_adapt/database_builder/templates/infometrics/US_NSI/with_SVI/infographic_metrics_config_risk.toml +153 -153
- flood_adapt/database_builder/templates/infometrics/US_NSI/without_SVI/infographic_metrics_config.toml +178 -178
- flood_adapt/database_builder/templates/infometrics/US_NSI/without_SVI/infographic_metrics_config_risk.toml +57 -57
- flood_adapt/database_builder/templates/infometrics/mandatory_metrics_config.toml +9 -9
- flood_adapt/database_builder/templates/infometrics/mandatory_metrics_config_risk.toml +65 -65
- flood_adapt/database_builder/templates/output_layers/bin_colors.toml +5 -5
- flood_adapt/database_builder.py +16 -16
- flood_adapt/dbs_classes/__init__.py +21 -21
- flood_adapt/dbs_classes/database.py +495 -688
- flood_adapt/dbs_classes/dbs_benefit.py +77 -76
- flood_adapt/dbs_classes/dbs_event.py +61 -59
- flood_adapt/dbs_classes/dbs_measure.py +112 -111
- flood_adapt/dbs_classes/dbs_projection.py +34 -34
- flood_adapt/dbs_classes/dbs_scenario.py +137 -137
- flood_adapt/dbs_classes/dbs_static.py +274 -273
- flood_adapt/dbs_classes/dbs_strategy.py +130 -129
- flood_adapt/dbs_classes/dbs_template.py +279 -278
- flood_adapt/dbs_classes/interface/database.py +107 -139
- flood_adapt/dbs_classes/interface/element.py +121 -121
- flood_adapt/dbs_classes/interface/static.py +47 -47
- flood_adapt/flood_adapt.py +1207 -1178
- flood_adapt/misc/database_user.py +16 -16
- flood_adapt/misc/exceptions.py +22 -0
- flood_adapt/misc/log.py +183 -183
- flood_adapt/misc/path_builder.py +54 -54
- flood_adapt/misc/utils.py +185 -185
- flood_adapt/objects/__init__.py +82 -82
- flood_adapt/objects/benefits/benefits.py +61 -61
- flood_adapt/objects/events/event_factory.py +135 -135
- flood_adapt/objects/events/event_set.py +88 -84
- flood_adapt/objects/events/events.py +234 -234
- flood_adapt/objects/events/historical.py +58 -58
- flood_adapt/objects/events/hurricane.py +68 -67
- flood_adapt/objects/events/synthetic.py +46 -50
- flood_adapt/objects/forcing/__init__.py +92 -92
- flood_adapt/objects/forcing/csv.py +68 -68
- flood_adapt/objects/forcing/discharge.py +66 -66
- flood_adapt/objects/forcing/forcing.py +150 -150
- flood_adapt/objects/forcing/forcing_factory.py +182 -182
- flood_adapt/objects/forcing/meteo_handler.py +93 -93
- flood_adapt/objects/forcing/netcdf.py +40 -40
- flood_adapt/objects/forcing/plotting.py +453 -429
- flood_adapt/objects/forcing/rainfall.py +98 -98
- flood_adapt/objects/forcing/tide_gauge.py +191 -191
- flood_adapt/objects/forcing/time_frame.py +90 -90
- flood_adapt/objects/forcing/timeseries.py +564 -564
- flood_adapt/objects/forcing/unit_system.py +580 -580
- flood_adapt/objects/forcing/waterlevels.py +108 -108
- flood_adapt/objects/forcing/wind.py +124 -124
- flood_adapt/objects/measures/measure_factory.py +92 -92
- flood_adapt/objects/measures/measures.py +529 -529
- flood_adapt/objects/object_model.py +74 -68
- flood_adapt/objects/projections/projections.py +103 -89
- flood_adapt/objects/scenarios/scenarios.py +22 -22
- flood_adapt/objects/strategies/strategies.py +89 -89
- flood_adapt/workflows/benefit_runner.py +579 -544
- flood_adapt/workflows/floodmap.py +85 -85
- flood_adapt/workflows/impacts_integrator.py +85 -82
- flood_adapt/workflows/scenario_runner.py +70 -70
- {flood_adapt-0.3.8.dist-info → flood_adapt-0.3.10.dist-info}/LICENSE +674 -674
- {flood_adapt-0.3.8.dist-info → flood_adapt-0.3.10.dist-info}/METADATA +866 -860
- flood_adapt-0.3.10.dist-info/RECORD +140 -0
- flood_adapt-0.3.8.dist-info/RECORD +0 -139
- {flood_adapt-0.3.8.dist-info → flood_adapt-0.3.10.dist-info}/WHEEL +0 -0
- {flood_adapt-0.3.8.dist-info → flood_adapt-0.3.10.dist-info}/top_level.txt +0 -0
|
@@ -1,129 +1,130 @@
|
|
|
1
|
-
from itertools import combinations
|
|
2
|
-
|
|
3
|
-
from flood_adapt.dbs_classes.dbs_template import DbsTemplate
|
|
4
|
-
from flood_adapt.
|
|
5
|
-
from flood_adapt.objects.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
#
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
overlapping
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
impact_measures[comb[
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
1
|
+
from itertools import combinations
|
|
2
|
+
|
|
3
|
+
from flood_adapt.dbs_classes.dbs_template import DbsTemplate
|
|
4
|
+
from flood_adapt.misc.exceptions import DatabaseError
|
|
5
|
+
from flood_adapt.objects.measures.measures import MeasureType
|
|
6
|
+
from flood_adapt.objects.strategies.strategies import Strategy
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class DbsStrategy(DbsTemplate[Strategy]):
|
|
10
|
+
dir_name = "strategies"
|
|
11
|
+
display_name = "Strategy"
|
|
12
|
+
_object_class = Strategy
|
|
13
|
+
|
|
14
|
+
def get(self, name: str) -> Strategy:
|
|
15
|
+
strategy = super().get(name)
|
|
16
|
+
measures = [
|
|
17
|
+
self._database.measures.get(measure) for measure in strategy.measures
|
|
18
|
+
]
|
|
19
|
+
strategy.initialize_measure_objects(measures)
|
|
20
|
+
return strategy
|
|
21
|
+
|
|
22
|
+
def save(
|
|
23
|
+
self,
|
|
24
|
+
object_model: Strategy,
|
|
25
|
+
overwrite: bool = False,
|
|
26
|
+
):
|
|
27
|
+
"""Save an object in the database and all associated files.
|
|
28
|
+
|
|
29
|
+
This saves the toml file and any additional files attached to the object.
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
object_model : Object
|
|
34
|
+
object to be saved in the database
|
|
35
|
+
overwrite : bool, optional
|
|
36
|
+
whether to overwrite the object if it already exists in the
|
|
37
|
+
database, by default False
|
|
38
|
+
|
|
39
|
+
Raises
|
|
40
|
+
------
|
|
41
|
+
DatabaseError
|
|
42
|
+
Raise error if name is already in use.
|
|
43
|
+
"""
|
|
44
|
+
object_exists = object_model.name in self.summarize_objects()["name"]
|
|
45
|
+
|
|
46
|
+
# If you want to overwrite the object, and the object already exists, first delete it. If it exists and you
|
|
47
|
+
# don't want to overwrite, raise an error.
|
|
48
|
+
if overwrite and object_exists:
|
|
49
|
+
self.delete(object_model.name, toml_only=True)
|
|
50
|
+
elif not overwrite and object_exists:
|
|
51
|
+
raise DatabaseError(
|
|
52
|
+
f"'{object_model.name}' name is already used by another {self.display_name}. Choose a different name"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# Check if any measures overlap
|
|
56
|
+
self._check_overlapping_measures(object_model.measures)
|
|
57
|
+
|
|
58
|
+
# If the folder doesnt exist yet, make the folder and save the object
|
|
59
|
+
if not (self.input_path / object_model.name).exists():
|
|
60
|
+
(self.input_path / object_model.name).mkdir()
|
|
61
|
+
|
|
62
|
+
# Save the object and any additional files
|
|
63
|
+
object_model.save(
|
|
64
|
+
self.input_path / object_model.name / f"{object_model.name}.toml",
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def _check_overlapping_measures(self, measures: list[str]):
|
|
68
|
+
"""Validate if the combination of impact measures can happen, since impact measures cannot affect the same properties.
|
|
69
|
+
|
|
70
|
+
Raises
|
|
71
|
+
------
|
|
72
|
+
DatabaseError
|
|
73
|
+
information on which combinations of measures have overlapping properties
|
|
74
|
+
"""
|
|
75
|
+
measure_objects = [self._database.measures.get(measure) for measure in measures]
|
|
76
|
+
impact_measures = [
|
|
77
|
+
measure
|
|
78
|
+
for measure in measure_objects
|
|
79
|
+
if MeasureType.is_impact(measure.type)
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
adapter = self._database.static.get_fiat_model()
|
|
83
|
+
|
|
84
|
+
ids = [adapter.get_object_ids(measure) for measure in impact_measures]
|
|
85
|
+
|
|
86
|
+
# Get all possible pairs of measures and check overlapping buildings for each measure
|
|
87
|
+
combs = list(combinations(enumerate(ids), 2))
|
|
88
|
+
common_elements = []
|
|
89
|
+
for comb in combs:
|
|
90
|
+
common_elements.append(list(set(comb[0][1]).intersection(comb[1][1])))
|
|
91
|
+
# If there is any combination with overlapping buildings raise Error and do not allow for Strategy object creation
|
|
92
|
+
overlapping = [len(k) > 0 for k in common_elements]
|
|
93
|
+
|
|
94
|
+
if any(overlapping):
|
|
95
|
+
msg = "Cannot create strategy! There are overlapping buildings for which measures are proposed"
|
|
96
|
+
counter = 0
|
|
97
|
+
for i, comb in enumerate(combs):
|
|
98
|
+
if overlapping[i]:
|
|
99
|
+
if counter > 0:
|
|
100
|
+
msg += " and"
|
|
101
|
+
msg += " between '{}' and '{}'".format(
|
|
102
|
+
impact_measures[comb[0][0]].name,
|
|
103
|
+
impact_measures[comb[1][0]].name,
|
|
104
|
+
)
|
|
105
|
+
counter += 1
|
|
106
|
+
raise DatabaseError(msg)
|
|
107
|
+
|
|
108
|
+
def check_higher_level_usage(self, name: str) -> list[str]:
|
|
109
|
+
"""Check if a strategy is used in a scenario.
|
|
110
|
+
|
|
111
|
+
Parameters
|
|
112
|
+
----------
|
|
113
|
+
name : str
|
|
114
|
+
name of the strategy to be checked
|
|
115
|
+
|
|
116
|
+
Returns
|
|
117
|
+
-------
|
|
118
|
+
list[str]
|
|
119
|
+
list of scenarios that use the strategy
|
|
120
|
+
"""
|
|
121
|
+
scenarios = [
|
|
122
|
+
self._database.scenarios.get(scn)
|
|
123
|
+
for scn in self._database.scenarios.summarize_objects()["name"]
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
used_in_scenario = [
|
|
127
|
+
scenario.name for scenario in scenarios if name == scenario.strategy
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
return used_in_scenario
|