From 2046f5236575a65621545832e2a93fb8dcf65235 Mon Sep 17 00:00:00 2001 From: Joe Moorhouse <5102656+joemoorhouse@users.noreply.github.com> Date: Mon, 18 Mar 2024 12:46:23 +0000 Subject: [PATCH] Add plug-and-playness of vulnerability models to dependency injection. Signed-off-by: Joe Moorhouse <5102656+joemoorhouse@users.noreply.github.com> --- src/physrisk/container.py | 14 +++++++ src/physrisk/kernel/impact.py | 13 ++++-- src/physrisk/kernel/risk.py | 6 +-- src/physrisk/kernel/vulnerability_model.py | 32 ++++++++++++++- src/physrisk/requests.py | 17 ++++++-- src/physrisk/risk_models/loss_model.py | 8 ++-- tests/api/container_test.py | 1 + tests/api/impact_requests_test.py | 41 +++++++++++-------- tests/kernel/chronic_asset_impact_test.py | 4 +- tests/kernel/exposure_test.py | 1 + tests/kernel/hazard_models_test.py | 3 +- tests/models/example_models_test.py | 4 +- tests/models/real_estate_models_test.py | 47 ++++++++++++---------- tests/models/wbgt_model_test.py | 3 +- tests/models/wind_models_test.py | 3 +- tests/risk_models/risk_models_test.py | 7 +++- 16 files changed, 141 insertions(+), 63 deletions(-) diff --git a/src/physrisk/container.py b/src/physrisk/container.py index e1773004..b08396d9 100644 --- a/src/physrisk/container.py +++ b/src/physrisk/container.py @@ -7,7 +7,13 @@ from physrisk.data.inventory_reader import InventoryReader from physrisk.data.pregenerated_hazard_model import ZarrHazardModel from physrisk.data.zarr_reader import ZarrReader +from physrisk.kernel import calculation as calc from physrisk.kernel.hazard_model import HazardModelFactory +from physrisk.kernel.vulnerability_model import ( + DictBasedVulnerabilityModels, + VulnerabilityModels, + VulnerabilityModelsFactory, +) from physrisk.requests import Requester, _create_inventory, create_source_paths @@ -30,6 +36,11 @@ def hazard_model(self, interpolation: str = "floor"): ) +class DictBasedVulnerabilityModelsFactory(VulnerabilityModelsFactory): + def vulnerability_models(self) -> VulnerabilityModels: + return DictBasedVulnerabilityModels(calc.get_default_vulnerability_models()) + + class Container(containers.DeclarativeContainer): config = providers.Configuration(default={"zarr_sources": ["embedded", "hazard"]}) @@ -47,9 +58,12 @@ class Container(containers.DeclarativeContainer): hazard_model_factory = providers.Factory(ZarrHazardModelFactory, reader=zarr_reader, source_paths=source_paths) + vulnerability_models_factory = providers.Factory(DictBasedVulnerabilityModelsFactory) + requester = providers.Singleton( Requester, hazard_model_factory=hazard_model_factory, + vulnerability_models_factory=vulnerability_models_factory, inventory=inventory, inventory_reader=inventory_reader, reader=zarr_reader, diff --git a/src/physrisk/kernel/impact.py b/src/physrisk/kernel/impact.py index dfde3153..bcf22e73 100644 --- a/src/physrisk/kernel/impact.py +++ b/src/physrisk/kernel/impact.py @@ -1,14 +1,19 @@ import logging from collections import defaultdict from dataclasses import dataclass -from typing import Dict, Iterable, List, NamedTuple, Optional, Sequence, Tuple, Union +from typing import Dict, Iterable, List, NamedTuple, Optional, Tuple, Union from physrisk.kernel.assets import Asset from physrisk.kernel.hazard_event_distrib import HazardEventDistrib from physrisk.kernel.hazard_model import HazardDataFailedResponse, HazardDataRequest, HazardDataResponse, HazardModel from physrisk.kernel.impact_distrib import EmptyImpactDistrib, ImpactDistrib from physrisk.kernel.vulnerability_distrib import VulnerabilityDistrib -from physrisk.kernel.vulnerability_model import DataRequester, VulnerabilityModelAcuteBase, VulnerabilityModelBase +from physrisk.kernel.vulnerability_model import ( + DataRequester, + VulnerabilityModelAcuteBase, + VulnerabilityModelBase, + VulnerabilityModels, +) from physrisk.utils.helpers import get_iterable logger = logging.getLogger(__name__) @@ -35,7 +40,7 @@ class AssetImpactResult: def calculate_impacts( # noqa: C901 assets: Iterable[Asset], hazard_model: HazardModel, - vulnerability_models: Dict[type, Sequence[VulnerabilityModelBase]], + vulnerability_models: VulnerabilityModels, *, scenario: str, year: int, @@ -48,7 +53,7 @@ def calculate_impacts( # noqa: C901 for asset in assets: asset_type = type(asset) - mappings = vulnerability_models[asset_type] + mappings = vulnerability_models.vuln_model_for_asset_of_type(asset_type) for mapping in mappings: model_assets[mapping].append(asset) results = {} diff --git a/src/physrisk/kernel/risk.py b/src/physrisk/kernel/risk.py index 50f40cde..26855a32 100644 --- a/src/physrisk/kernel/risk.py +++ b/src/physrisk/kernel/risk.py @@ -8,7 +8,7 @@ from physrisk.kernel.hazards import Hazard, all_hazards from physrisk.kernel.impact import AssetImpactResult, ImpactKey, calculate_impacts from physrisk.kernel.impact_distrib import EmptyImpactDistrib, ImpactDistrib -from physrisk.kernel.vulnerability_model import VulnerabilityModelBase +from physrisk.kernel.vulnerability_model import VulnerabilityModels # from asyncio import ALL_COMPLETED # import concurrent.futures @@ -26,7 +26,7 @@ class RiskModel: """Base class for a risk model (i.e. a calculation of risk that makes use of hazard and vulnerability models).""" - def __init__(self, hazard_model: HazardModel, vulnerability_models: Dict[type, Sequence[VulnerabilityModelBase]]): + def __init__(self, hazard_model: HazardModel, vulnerability_models: VulnerabilityModels): self._hazard_model = hazard_model self._vulnerability_models = vulnerability_models @@ -98,7 +98,7 @@ class AssetLevelRiskModel(RiskModel): def __init__( self, hazard_model: HazardModel, - vulnerability_models: Dict[type, Sequence[VulnerabilityModelBase]], + vulnerability_models: VulnerabilityModels, measure_calculators: Dict[type, RiskMeasureCalculator], ): """Risk model that calculates risk measures at the asset level for a sequence diff --git a/src/physrisk/kernel/vulnerability_model.py b/src/physrisk/kernel/vulnerability_model.py index a6cc8feb..b763a6db 100644 --- a/src/physrisk/kernel/vulnerability_model.py +++ b/src/physrisk/kernel/vulnerability_model.py @@ -1,7 +1,7 @@ import importlib.resources import json from abc import ABC, abstractmethod -from typing import Iterable, List, Optional, Protocol, Sequence, Tuple, Union +from typing import Dict, Iterable, List, Optional, Protocol, Sequence, Tuple, Type, Union import numpy as np from scipy import stats @@ -98,6 +98,36 @@ def get_data_requests( def get_impact(self, asset: Asset, event_data: List[HazardDataResponse]) -> ImpactDistrib: ... +class VulnerabilityModels(Protocol): + def vuln_model_for_asset_of_type(self, type: Type[Asset]) -> Sequence[VulnerabilityModelBase]: + """Returns for a given asset type the vulnerability models for each hazard required. + + Returns: + Dict[type, Sequence[VulnerabilityModelBase]]: Vulnerability models.s + """ + ... + + +class VulnerabilityModelsFactory(Protocol): + def vulnerability_models(self) -> VulnerabilityModels: + """Create a VulnerabilityModels instance, that can based on a number of options. + Although no options used at present, implemented this way in order to add in future + (e.g. to allow a request to specify preferred methodology). + + Returns: + VulnerabilityModels: Instance that provides vulnerability models for asset types. + """ + ... + + +class DictBasedVulnerabilityModels(VulnerabilityModels): + def __init__(self, models: Dict[Type[Asset], Sequence[VulnerabilityModelBase]]): + self.models = models + + def vuln_model_for_asset_of_type(self, type: Type[Asset]): + return self.models[type] + + class VulnerabilityModelAcuteBase(VulnerabilityModelBase): """Models generate the VulnerabilityDistrib and HazardEventDistrib of an Asset. diff --git a/src/physrisk/requests.py b/src/physrisk/requests.py index 8421bdd6..393f2b4c 100644 --- a/src/physrisk/requests.py +++ b/src/physrisk/requests.py @@ -19,7 +19,11 @@ from physrisk.kernel.hazards import all_hazards from physrisk.kernel.impact_distrib import EmptyImpactDistrib from physrisk.kernel.risk import AssetLevelRiskModel, Measure, MeasureKey -from physrisk.kernel.vulnerability_model import VulnerabilityModelBase +from physrisk.kernel.vulnerability_model import ( + DictBasedVulnerabilityModels, + VulnerabilityModels, + VulnerabilityModelsFactory, +) from .api.v1.hazard_data import ( HazardAvailabilityRequest, @@ -62,6 +66,7 @@ class Requester: def __init__( self, hazard_model_factory: HazardModelFactory, + vulnerability_models_factory: VulnerabilityModelsFactory, inventory: Inventory, inventory_reader: InventoryReader, reader: ZarrReader, @@ -69,6 +74,7 @@ def __init__( ): self.colormaps = colormaps self.hazard_model_factory = hazard_model_factory + self.vulnerability_models_factory = vulnerability_models_factory self.inventory = inventory self.inventory_reader = inventory_reader self.zarr_reader = reader @@ -93,7 +99,8 @@ def get(self, *, request_id, request_dict): elif request_id == "get_asset_impact": request = AssetImpactRequest(**request_dict) hazard_model = self.hazard_model_factory.hazard_model(interpolation=request.calc_settings.hazard_interp) - return dumps(_get_asset_impacts(request, hazard_model).model_dump()) + vulnerability_models = self.vulnerability_models_factory.vulnerability_models() + return dumps(_get_asset_impacts(request, hazard_model).model_dump(), vulnerability_models) elif request_id == "get_example_portfolios": return dumps(_get_example_portfolios()) else: @@ -288,10 +295,12 @@ def _get_asset_exposures(request: AssetExposureRequest, hazard_model: HazardMode def _get_asset_impacts( request: AssetImpactRequest, hazard_model: HazardModel, - vulnerability_models: Optional[Dict[Type[Asset], Sequence[VulnerabilityModelBase]]] = None, + vulnerability_models: Optional[VulnerabilityModels] = None, ): vulnerability_models = ( - calc.get_default_vulnerability_models() if vulnerability_models is None else vulnerability_models + DictBasedVulnerabilityModels(calc.get_default_vulnerability_models()) + if vulnerability_models is None + else vulnerability_models ) # we keep API definition of asset separate from internal Asset class; convert by reflection # based on asset_class: diff --git a/src/physrisk/risk_models/loss_model.py b/src/physrisk/risk_models/loss_model.py index f9874f3f..87c72ef6 100644 --- a/src/physrisk/risk_models/loss_model.py +++ b/src/physrisk/risk_models/loss_model.py @@ -10,7 +10,7 @@ from ..kernel.financial_model import FinancialModelBase from ..kernel.hazard_model import HazardModel from ..kernel.impact import calculate_impacts -from ..kernel.vulnerability_model import VulnerabilityModelBase +from ..kernel.vulnerability_model import DictBasedVulnerabilityModels, VulnerabilityModels class Aggregator(ABC): @@ -27,11 +27,13 @@ class LossModel: def __init__( self, hazard_model: Optional[HazardModel] = None, - vulnerability_models: Optional[Dict[type, Sequence[VulnerabilityModelBase]]] = None, + vulnerability_models: Optional[VulnerabilityModels] = None, ): self.hazard_model = get_default_hazard_model() if hazard_model is None else hazard_model self.vulnerability_models = ( - get_default_vulnerability_models() if vulnerability_models is None else vulnerability_models + DictBasedVulnerabilityModels(get_default_vulnerability_models()) + if vulnerability_models is None + else vulnerability_models ) """Calculates the financial impact on a list of assets.""" diff --git a/tests/api/container_test.py b/tests/api/container_test.py index 45807b69..dfa657f5 100644 --- a/tests/api/container_test.py +++ b/tests/api/container_test.py @@ -1,6 +1,7 @@ import fsspec.implementations.local as local from dependency_injector import containers, providers +from physrisk.container import Container from physrisk.data.inventory_reader import InventoryReader from tests.data.hazard_model_store_test import mock_hazard_model_store_heat diff --git a/tests/api/impact_requests_test.py b/tests/api/impact_requests_test.py index 6bb884af..1fe2013b 100644 --- a/tests/api/impact_requests_test.py +++ b/tests/api/impact_requests_test.py @@ -13,6 +13,7 @@ from physrisk.data.zarr_reader import ZarrReader from physrisk.hazard_models.core_hazards import get_default_source_paths from physrisk.kernel.assets import PowerGeneratingAsset, RealEstateAsset, ThermalPowerGeneratingAsset +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels from physrisk.vulnerability_models.power_generating_asset_models import InundationModel from physrisk.vulnerability_models.real_estate_models import ( RealEstateCoastalInundationModel, @@ -98,10 +99,12 @@ def test_impact_request(self): store = mock_hazard_model_store_inundation(TestData.longitudes, TestData.latitudes, curve) source_paths = get_default_source_paths(EmbeddedInventory()) - vulnerability_models = { - PowerGeneratingAsset: [InundationModel()], - RealEstateAsset: [RealEstateCoastalInundationModel(), RealEstateRiverineInundationModel()], - } + vulnerability_models = DictBasedVulnerabilityModels( + { + PowerGeneratingAsset: [InundationModel()], + RealEstateAsset: [RealEstateCoastalInundationModel(), RealEstateRiverineInundationModel()], + } + ) response = requests._get_asset_impacts( request, @@ -148,10 +151,12 @@ def test_risk_model_impact_request(self): store = mock_hazard_model_store_inundation(TestData.longitudes, TestData.latitudes, curve) source_paths = get_default_source_paths(EmbeddedInventory()) - vulnerability_models = { - PowerGeneratingAsset: [InundationModel()], - RealEstateAsset: [RealEstateCoastalInundationModel(), RealEstateRiverineInundationModel()], - } + vulnerability_models = DictBasedVulnerabilityModels( + { + PowerGeneratingAsset: [InundationModel()], + RealEstateAsset: [RealEstateCoastalInundationModel(), RealEstateRiverineInundationModel()], + } + ) response = requests._get_asset_impacts( request, @@ -563,15 +568,17 @@ def test_thermal_power_generation(self): ) source_paths = get_default_source_paths(EmbeddedInventory()) - vulnerability_models = { - ThermalPowerGeneratingAsset: [ - ThermalPowerGenerationAirTemperatureModel(), - ThermalPowerGenerationDroughtModel(), - ThermalPowerGenerationRiverineInundationModel(), - ThermalPowerGenerationWaterStressModel(), - ThermalPowerGenerationWaterTemperatureModel(), - ] - } + vulnerability_models = DictBasedVulnerabilityModels( + { + ThermalPowerGeneratingAsset: [ + ThermalPowerGenerationAirTemperatureModel(), + ThermalPowerGenerationDroughtModel(), + ThermalPowerGenerationRiverineInundationModel(), + ThermalPowerGenerationWaterStressModel(), + ThermalPowerGenerationWaterTemperatureModel(), + ] + } + ) response = requests._get_asset_impacts( request, diff --git a/tests/kernel/chronic_asset_impact_test.py b/tests/kernel/chronic_asset_impact_test.py index 43d2fb90..e15b21b9 100644 --- a/tests/kernel/chronic_asset_impact_test.py +++ b/tests/kernel/chronic_asset_impact_test.py @@ -11,7 +11,7 @@ from physrisk.kernel.hazards import ChronicHeat from physrisk.kernel.impact import calculate_impacts from physrisk.kernel.impact_distrib import ImpactDistrib, ImpactType -from physrisk.kernel.vulnerability_model import VulnerabilityModelBase +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels, VulnerabilityModelBase from physrisk.vulnerability_models.chronic_heat_models import ChronicHeatGZNModel from tests.data.hazard_model_store_test import TestData, mock_hazard_model_store_heat @@ -157,7 +157,7 @@ def test_chronic_vulnerability_model(self): scenario = "ssp585" year = 2050 - vulnerability_models = {IndustrialActivity: [ChronicHeatGZNModel()]} + vulnerability_models = DictBasedVulnerabilityModels({IndustrialActivity: [ChronicHeatGZNModel()]}) assets = [ IndustrialActivity(lat, lon, type="Construction") diff --git a/tests/kernel/exposure_test.py b/tests/kernel/exposure_test.py index f63c908e..98bb3e5d 100644 --- a/tests/kernel/exposure_test.py +++ b/tests/kernel/exposure_test.py @@ -24,6 +24,7 @@ def test_jupiter_exposure_service(self): inventory = EmbeddedInventory() requester = Requester( hazard_model_factory=hazard_model_factory, + vulnerability_models_factory=None, inventory=inventory, inventory_reader=InventoryReader(fs=local.LocalFileSystem(), base_path=""), reader=ZarrReader(store=store), diff --git a/tests/kernel/hazard_models_test.py b/tests/kernel/hazard_models_test.py index 6c7340c4..18558759 100644 --- a/tests/kernel/hazard_models_test.py +++ b/tests/kernel/hazard_models_test.py @@ -14,6 +14,7 @@ ) from physrisk.kernel.hazards import ChronicHeat, Wind from physrisk.kernel.impact import calculate_impacts +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels from physrisk.vulnerability_models.real_estate_models import GenericTropicalCycloneModel @@ -88,7 +89,7 @@ def test_using_point_based_hazard_model(): ) hazard_model = PointBasedHazardModel([point]) - vulnerability_models = {RealEstateAsset: [GenericTropicalCycloneModel()]} + vulnerability_models = DictBasedVulnerabilityModels({RealEstateAsset: [GenericTropicalCycloneModel()]}) results = calculate_impacts(assets, hazard_model, vulnerability_models, scenario=scenario, year=year) impact_distrib = results[(assets[0], Wind, None, None)].impact mean_impact = impact_distrib.mean_impact() diff --git a/tests/models/example_models_test.py b/tests/models/example_models_test.py index d784d53a..9bf29ebc 100644 --- a/tests/models/example_models_test.py +++ b/tests/models/example_models_test.py @@ -11,7 +11,7 @@ from physrisk.kernel.impact import calculate_impacts from physrisk.kernel.impact_distrib import ImpactType from physrisk.kernel.vulnerability_matrix_provider import VulnMatrixProvider -from physrisk.kernel.vulnerability_model import VulnerabilityModel +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels, VulnerabilityModel from physrisk.vulnerability_models.example_models import ExampleCdfBasedVulnerabilityModel from tests.data.hazard_model_store_test import TestData, mock_hazard_model_store_inundation @@ -84,7 +84,7 @@ def test_user_supplied_model(self): scenario = "rcp8p5" year = 2080 - vulnerability_models = {RealEstateAsset: [ExampleRealEstateInundationModel()]} + vulnerability_models = DictBasedVulnerabilityModels({RealEstateAsset: [ExampleRealEstateInundationModel()]}) assets = [ RealEstateAsset(lat, lon, location="Asia", type="Building/Industrial") diff --git a/tests/models/real_estate_models_test.py b/tests/models/real_estate_models_test.py index 07dc00e1..c0264478 100644 --- a/tests/models/real_estate_models_test.py +++ b/tests/models/real_estate_models_test.py @@ -9,6 +9,7 @@ from physrisk.kernel.assets import RealEstateAsset from physrisk.kernel.hazards import CoastalInundation, RiverineInundation from physrisk.kernel.impact import ImpactKey, calculate_impacts +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels from physrisk.vulnerability_models.real_estate_models import ( RealEstateCoastalInundationModel, RealEstateRiverineInundationModel, @@ -33,7 +34,7 @@ def test_real_estate_model_details(self): scenario = "rcp8p5" year = 2080 - vulnerability_models = {RealEstateAsset: [RealEstateRiverineInundationModel()]} + vulnerability_models = DictBasedVulnerabilityModels({RealEstateAsset: [RealEstateRiverineInundationModel()]}) results = calculate_impacts(assets, hazard_model, vulnerability_models, scenario=scenario, year=year) @@ -102,7 +103,7 @@ def test_coastal_real_estate_model(self): scenario = "rcp8p5" year = 2080 - vulnerability_models = {RealEstateAsset: [RealEstateCoastalInundationModel()]} + vulnerability_models = DictBasedVulnerabilityModels({RealEstateAsset: [RealEstateCoastalInundationModel()]}) results = calculate_impacts(assets, hazard_model, vulnerability_models, scenario=scenario, year=year) @@ -144,27 +145,29 @@ def test_commercial_real_estate_model_details(self): # impact bin edges are calibrated so that hazard_bin_probs == impact_bin_probs # when the impact standard deviation is negligible: - vulnerability_models = { - RealEstateAsset: [ - RealEstateRiverineInundationModel( - impact_bin_edges=np.array( - [ - 0, - 0.030545039098059, - 0.125953058445539, - 0.322702019487674, - 0.566880882840096, - 0.731980974578735, - 0.823993215529066, - 0.884544511664047, - 0.922115133960502, - 0.969169745946688, - 1.0, - ] + vulnerability_models = DictBasedVulnerabilityModels( + { + RealEstateAsset: [ + RealEstateRiverineInundationModel( + impact_bin_edges=np.array( + [ + 0, + 0.030545039098059, + 0.125953058445539, + 0.322702019487674, + 0.566880882840096, + 0.731980974578735, + 0.823993215529066, + 0.884544511664047, + 0.922115133960502, + 0.969169745946688, + 1.0, + ] + ) ) - ) - ] - } + ] + } + ) results = calculate_impacts(assets, hazard_model, vulnerability_models, scenario=scenario, year=year) diff --git a/tests/models/wbgt_model_test.py b/tests/models/wbgt_model_test.py index 56984cb4..d56ce0c7 100644 --- a/tests/models/wbgt_model_test.py +++ b/tests/models/wbgt_model_test.py @@ -10,6 +10,7 @@ from physrisk.kernel.hazards import ChronicHeat from physrisk.kernel.impact import calculate_impacts from physrisk.kernel.impact_distrib import ImpactDistrib, ImpactType +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels from physrisk.vulnerability_models.chronic_heat_models import ChronicHeatGZNModel, get_impact_distrib from tests.data.hazard_model_store_test import TestData, mock_hazard_model_store_heat_wbgt @@ -182,7 +183,7 @@ def test_wbgt_vulnerability(self): scenario = "ssp585" year = 2050 - vulnerability_models = {IndustrialActivity: [ExampleWBGTGZNJointModel()]} + vulnerability_models = DictBasedVulnerabilityModels({IndustrialActivity: [ExampleWBGTGZNJointModel()]}) assets = [ IndustrialActivity(lat, lon, type="high") for lon, lat in zip(TestData.longitudes, TestData.latitudes) diff --git a/tests/models/wind_models_test.py b/tests/models/wind_models_test.py index 63d25a57..921c5cc0 100644 --- a/tests/models/wind_models_test.py +++ b/tests/models/wind_models_test.py @@ -6,6 +6,7 @@ from physrisk.kernel.assets import RealEstateAsset from physrisk.kernel.hazards import Wind from physrisk.kernel.impact import calculate_impacts +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels from physrisk.vulnerability_models.real_estate_models import GenericTropicalCycloneModel @@ -37,7 +38,7 @@ def select_iris_osc(candidates: ResourceSubset, scenario: str, year: int, hint=N RealEstateAsset(lat, lon, location="Asia", type="Buildings/Industrial") for lon, lat in zip(hms.TestData.longitudes[0:1], hms.TestData.latitudes[0:1]) ] - vulnerability_models = {RealEstateAsset: [GenericTropicalCycloneModel()]} + vulnerability_models = DictBasedVulnerabilityModels({RealEstateAsset: [GenericTropicalCycloneModel()]}) results = calculate_impacts(assets, hazard_model, vulnerability_models, scenario=scenario, year=year) # check calculation cum_probs = 1.0 / np.array(return_periods) diff --git a/tests/risk_models/risk_models_test.py b/tests/risk_models/risk_models_test.py index 39a18993..80daf359 100644 --- a/tests/risk_models/risk_models_test.py +++ b/tests/risk_models/risk_models_test.py @@ -13,6 +13,7 @@ from physrisk.kernel.calculation import get_default_vulnerability_models from physrisk.kernel.hazards import ChronicHeat, CoastalInundation, RiverineInundation, Wind from physrisk.kernel.risk import AssetLevelRiskModel, MeasureKey +from physrisk.kernel.vulnerability_model import DictBasedVulnerabilityModels from physrisk.requests import _create_risk_measures from physrisk.risk_models.risk_models import RealEstateToyRiskMeasures from tests.base_test import TestWithCredentials @@ -28,7 +29,9 @@ def test_risk_indicator_model(self): hazard_model = self._create_hazard_model(scenarios, years) model = AssetLevelRiskModel( - hazard_model, get_default_vulnerability_models(), {RealEstateAsset: RealEstateToyRiskMeasures()} + hazard_model, + DictBasedVulnerabilityModels(get_default_vulnerability_models()), + {RealEstateAsset: RealEstateToyRiskMeasures()}, ) measure_ids_for_asset, definitions = model.populate_measure_definitions(assets) _, measures = model.calculate_risk_measures(assets, prosp_scens=scenarios, years=years) @@ -161,7 +164,7 @@ def test_via_requests(self): response = requests._get_asset_impacts( request, hazard_model, - vulnerability_models=get_default_vulnerability_models(), + vulnerability_models=DictBasedVulnerabilityModels(get_default_vulnerability_models()), ) res = next( ma for ma in response.risk_measures.measures_for_assets if ma.key.hazard_type == "RiverineInundation"