hestia-earth-models 0.64.12__py3-none-any.whl → 0.64.14__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.
Potentially problematic release.
This version of hestia-earth-models might be problematic. Click here for more details.
- hestia_earth/models/aware/scarcityWeightedWaterUse.py +1 -1
- hestia_earth/models/chaudharyBrooks2018/damageToTerrestrialEcosystemsLandOccupation.py +1 -1
- hestia_earth/models/chaudharyBrooks2018/damageToTerrestrialEcosystemsLandTransformation.py +1 -1
- hestia_earth/models/chaudharyBrooks2018/damageToTerrestrialEcosystemsTotalLandUseEffects.py +3 -2
- hestia_earth/models/cml2001Baseline/eutrophicationPotentialExcludingFate.py +2 -2
- hestia_earth/models/cml2001Baseline/terrestrialAcidificationPotentialIncludingFateAverageEurope.py +2 -2
- hestia_earth/models/cml2001NonBaseline/eutrophicationPotentialIncludingFateAverageEurope.py +2 -2
- hestia_earth/models/cml2001NonBaseline/terrestrialAcidificationPotentialExcludingFate.py +2 -2
- hestia_earth/models/cycle/completeness/seed.py +6 -4
- hestia_earth/models/cycle/concentrateFeed.py +9 -4
- hestia_earth/models/cycle/endDate.py +10 -1
- hestia_earth/models/cycle/materialAndSubstrate.py +158 -0
- hestia_earth/models/cycle/milkYield.py +6 -5
- hestia_earth/models/cycle/startDate.py +6 -4
- hestia_earth/models/edip2003/ozoneDepletionPotential.py +2 -2
- hestia_earth/models/emissionNotRelevant/__init__.py +3 -2
- hestia_earth/models/environmentalFootprintV3/freshwaterEcotoxicityPotentialCtue.py +2 -3
- hestia_earth/models/hestia/landCover.py +28 -26
- hestia_earth/models/ipcc2013ExcludingFeedbacks/gwp100.py +2 -2
- hestia_earth/models/ipcc2013IncludingFeedbacks/gwp100.py +2 -2
- hestia_earth/models/ipcc2019/aboveGroundBiomass.py +4 -8
- hestia_earth/models/ipcc2019/animal/milkYieldPerAnimal.py +2 -2
- hestia_earth/models/ipcc2019/belowGroundBiomass.py +4 -8
- hestia_earth/models/ipcc2019/biomass_utils.py +11 -0
- hestia_earth/models/ipcc2019/ch4ToAirEntericFermentation.py +3 -3
- hestia_earth/models/ipcc2019/ch4ToAirExcreta.py +1 -2
- hestia_earth/models/ipcc2019/co2ToAirCarbonStockChange_utils.py +7 -3
- hestia_earth/models/ipcc2019/n2OToAirExcretaDirect.py +14 -9
- hestia_earth/models/ipcc2019/organicCarbonPerHa_tier_1_utils.py +9 -3
- hestia_earth/models/ipcc2019/organicCarbonPerHa_tier_2_utils.py +1 -2
- hestia_earth/models/koble2014/aboveGroundCropResidue.py +5 -1
- hestia_earth/models/lcImpactAllEffects100Years/damageToFreshwaterEcosystemsClimateChange.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactAllEffects100Years/damageToFreshwaterEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToHumanHealth.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToHumanHealthClimateChange.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToHumanHealthHumanToxicityCancerogenic.py +2 -3
- hestia_earth/models/lcImpactAllEffects100Years/damageToHumanHealthHumanToxicityNonCancerogenic.py +2 -3
- hestia_earth/models/lcImpactAllEffects100Years/damageToHumanHealthStratosphericOzoneDepletion.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToMarineEcosystemsMarineEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactAllEffects100Years/damageToMarineEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToTerrestrialEcosystemsClimateChange.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToTerrestrialEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactAllEffects100Years/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToFreshwaterEcosystemsClimateChange.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToFreshwaterEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToHumanHealth.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToHumanHealthClimateChange.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToHumanHealthHumanToxicityCancerogenic.py +2 -3
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToHumanHealthHumanToxicityNonCancerogenic.py +2 -3
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToHumanHealthStratosphericOzoneDepletion.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToMarineEcosystemsMarineEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToMarineEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToTerrestrialEcosystemsClimateChange.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToTerrestrialEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactAllEffectsInfinite/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactCertainEffects100Years/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactCertainEffects100Years/damageToFreshwaterEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactCertainEffects100Years/damageToHumanHealth.py +2 -2
- hestia_earth/models/lcImpactCertainEffects100Years/damageToHumanHealthClimateChange.py +2 -2
- hestia_earth/models/lcImpactCertainEffects100Years/damageToHumanHealthHumanToxicityCancerogenic.py +2 -3
- hestia_earth/models/lcImpactCertainEffects100Years/damageToHumanHealthHumanToxicityNonCancerogenic.py +2 -3
- hestia_earth/models/lcImpactCertainEffects100Years/damageToHumanHealthStratosphericOzoneDepletion.py +2 -2
- hestia_earth/models/lcImpactCertainEffects100Years/damageToMarineEcosystemsMarineEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactCertainEffects100Years/damageToMarineEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactCertainEffects100Years/damageToTerrestrialEcosystemsClimateChange.py +2 -2
- hestia_earth/models/lcImpactCertainEffects100Years/damageToTerrestrialEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactCertainEffects100Years/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToFreshwaterEcosystemsFreshwaterEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToFreshwaterEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToHumanHealth.py +2 -2
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToHumanHealthClimateChange.py +2 -2
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToHumanHealthHumanToxicityCancerogenic.py +2 -3
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToHumanHealthHumanToxicityNonCancerogenic.py +2 -3
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToHumanHealthStratosphericOzoneDepletion.py +2 -2
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToMarineEcosystemsMarineEcotoxicity.py +2 -3
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToMarineEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToTerrestrialEcosystemsClimateChange.py +2 -2
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToTerrestrialEcosystemsPdfYear.py +2 -2
- hestia_earth/models/lcImpactCertainEffectsInfinite/damageToTerrestrialEcosystemsTerrestrialEcotoxicity.py +2 -3
- hestia_earth/models/linkedImpactAssessment/emissions.py +3 -0
- hestia_earth/models/log.py +4 -3
- hestia_earth/models/mocking/__init__.py +1 -1
- hestia_earth/models/mocking/search-results.json +1021 -1021
- hestia_earth/models/pooreNemecek2018/excretaKgN.py +4 -4
- hestia_earth/models/pooreNemecek2018/excretaKgVs.py +4 -4
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterCropResidueDecomposition.py +1 -1
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterExcreta.py +1 -1
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterInorganicFertiliser.py +1 -1
- hestia_earth/models/pooreNemecek2018/no3ToGroundwaterOrganicFertiliser.py +1 -1
- hestia_earth/models/pooreNemecek2018/{saplings.py → saplingsDepreciatedAmountPerCycle.py} +1 -1
- hestia_earth/models/pooreNemecek2018/utils.py +7 -1
- hestia_earth/models/preload_requests.py +24 -4
- hestia_earth/models/recipe2016Egalitarian/damageToFreshwaterEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/damageToHumanHealth.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/damageToMarineEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/damageToTerrestrialEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/freshwaterAquaticEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Egalitarian/freshwaterEutrophicationPotential.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/humanCarcinogenicToxicity.py +2 -3
- hestia_earth/models/recipe2016Egalitarian/humanNonCarcinogenicToxicity.py +2 -3
- hestia_earth/models/recipe2016Egalitarian/marineAquaticEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Egalitarian/marineEutrophicationPotential.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/ozoneDepletionPotential.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/terrestrialAcidificationPotential.py +2 -2
- hestia_earth/models/recipe2016Egalitarian/terrestrialEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Hierarchist/damageToFreshwaterEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/damageToHumanHealth.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/damageToMarineEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/damageToTerrestrialEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/freshwaterAquaticEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Hierarchist/freshwaterEutrophicationPotential.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/humanCarcinogenicToxicity.py +2 -3
- hestia_earth/models/recipe2016Hierarchist/humanNonCarcinogenicToxicity.py +2 -3
- hestia_earth/models/recipe2016Hierarchist/marineAquaticEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Hierarchist/marineEutrophicationPotential.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/ozoneDepletionPotential.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/terrestrialAcidificationPotential.py +2 -2
- hestia_earth/models/recipe2016Hierarchist/terrestrialEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Individualist/damageToFreshwaterEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Individualist/damageToHumanHealth.py +2 -2
- hestia_earth/models/recipe2016Individualist/damageToMarineEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Individualist/damageToTerrestrialEcosystemsSpeciesYear.py +2 -2
- hestia_earth/models/recipe2016Individualist/freshwaterAquaticEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Individualist/freshwaterEutrophicationPotential.py +2 -2
- hestia_earth/models/recipe2016Individualist/humanCarcinogenicToxicity.py +2 -3
- hestia_earth/models/recipe2016Individualist/humanNonCarcinogenicToxicity.py +2 -3
- hestia_earth/models/recipe2016Individualist/marineAquaticEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/recipe2016Individualist/marineEutrophicationPotential.py +2 -2
- hestia_earth/models/recipe2016Individualist/ozoneDepletionPotential.py +2 -2
- hestia_earth/models/recipe2016Individualist/terrestrialAcidificationPotential.py +2 -2
- hestia_earth/models/recipe2016Individualist/terrestrialEcotoxicityPotential14Dcbeq.py +2 -3
- hestia_earth/models/site/management.py +142 -144
- hestia_earth/models/stehfestBouwman2006/n2OToAirCropResidueDecompositionDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirExcretaDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirInorganicFertiliserDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/n2OToAirOrganicFertiliserDirect.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirCropResidueDecomposition.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirExcreta.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirInorganicFertiliser.py +1 -1
- hestia_earth/models/stehfestBouwman2006/noxToAirOrganicFertiliser.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirCropResidueDecomposition.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirExcreta.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirInorganicFertiliser.py +1 -1
- hestia_earth/models/stehfestBouwman2006GisImplementation/noxToAirOrganicFertiliser.py +1 -1
- hestia_earth/models/usetoxV2/freshwaterEcotoxicityPotentialCtue.py +2 -3
- hestia_earth/models/utils/__init__.py +4 -1
- hestia_earth/models/utils/blank_node.py +34 -14
- hestia_earth/models/utils/constant.py +3 -0
- hestia_earth/models/utils/emission.py +1 -8
- hestia_earth/models/utils/management.py +11 -0
- hestia_earth/models/utils/pesticideAI.py +11 -17
- hestia_earth/models/utils/term.py +2 -1
- hestia_earth/models/version.py +1 -1
- {hestia_earth_models-0.64.12.dist-info → hestia_earth_models-0.64.14.dist-info}/METADATA +4 -4
- {hestia_earth_models-0.64.12.dist-info → hestia_earth_models-0.64.14.dist-info}/RECORD +186 -187
- {hestia_earth_models-0.64.12.dist-info → hestia_earth_models-0.64.14.dist-info}/WHEEL +1 -1
- tests/models/cycle/completeness/test_seed.py +1 -1
- tests/models/cycle/test_endDate.py +18 -2
- tests/models/cycle/test_materialsAndSubstrate.py +49 -0
- tests/models/cycle/test_startDate.py +21 -3
- tests/models/hestia/test_landCover.py +3 -2
- tests/models/ipcc2019/test_aboveGroundBiomass.py +2 -1
- tests/models/ipcc2019/test_belowGroundBiomass.py +2 -1
- tests/models/ipcc2019/test_co2ToAirAboveGroundBiomassStockChange.py +4 -3
- tests/models/ipcc2019/test_co2ToAirBelowGroundBiomassStockChange.py +3 -3
- tests/models/ipcc2019/test_co2ToAirSoilOrganicCarbonStockChange.py +1 -1
- tests/models/ipcc2019/test_n2OToAirExcretaDirect.py +12 -0
- tests/models/ipcc2019/test_organicCarbonPerHa.py +1 -0
- tests/models/koble2014/test_aboveGroundCropResidue.py +13 -0
- tests/models/pooreNemecek2018/test_no3ToGroundwaterCropResidueDecomposition.py +3 -2
- tests/models/pooreNemecek2018/test_no3ToGroundwaterExcreta.py +3 -2
- tests/models/pooreNemecek2018/test_no3ToGroundwaterInorganicFertiliser.py +3 -2
- tests/models/pooreNemecek2018/test_no3ToGroundwaterOrganicFertiliser.py +3 -2
- tests/models/pooreNemecek2018/{test_saplings.py → test_saplingsDepreciatedAmountPerCycle.py} +1 -1
- tests/models/site/test_management.py +18 -151
- tests/models/utils/test_blank_node.py +57 -1
- tests/models/utils/test_emission.py +1 -6
- tests/models/utils/test_site.py +33 -2
- tests/models/pooreNemecek2018/test_no3ToGroundwaterSoilFlux.py +0 -90
- tests/models/stehfestBouwman2006/test_n2OToAirSoilFlux.py +0 -41
- tests/models/stehfestBouwman2006/test_noxToAirSoilFlux.py +0 -40
- tests/models/stehfestBouwman2006GisImplementation/test_noxToAirSoilFlux.py +0 -33
- /hestia_earth/models/pooreNemecek2018/{no3ToGroundwaterSoilFlux.py → no3ToGroundwaterSoilFlux_utils.py} +0 -0
- /hestia_earth/models/stehfestBouwman2006/{n2OToAirSoilFlux.py → n2OToAirSoilFlux_utils.py} +0 -0
- /hestia_earth/models/stehfestBouwman2006/{noxToAirSoilFlux.py → noxToAirSoilFlux_utils.py} +0 -0
- /hestia_earth/models/stehfestBouwman2006GisImplementation/{noxToAirSoilFlux.py → noxToAirSoilFlux_utils.py} +0 -0
- {hestia_earth_models-0.64.12.dist-info → hestia_earth_models-0.64.14.dist-info}/LICENSE +0 -0
- {hestia_earth_models-0.64.12.dist-info → hestia_earth_models-0.64.14.dist-info}/top_level.txt +0 -0
|
@@ -59,8 +59,9 @@ def run(impact_assessment: dict):
|
|
|
59
59
|
inputs_value = convert_value_from_cycle(
|
|
60
60
|
product, sum_input_impacts(cycle.get('inputs', []), TERM_ID), model=MODEL, term_id=TERM_ID
|
|
61
61
|
)
|
|
62
|
+
value = sum_values([landUseEffects, inputs_value])
|
|
62
63
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
63
64
|
landUseEffects=landUseEffects,
|
|
64
65
|
inputs_value=inputs_value)
|
|
65
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
66
|
-
return _indicator(
|
|
66
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
67
|
+
return _indicator(value) if value is not None else None
|
|
@@ -29,5 +29,5 @@ def run(impact_assessment: dict):
|
|
|
29
29
|
value = impact_emission_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['emission'])
|
|
30
30
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
31
31
|
value=value)
|
|
32
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
33
|
-
return _indicator(value)
|
|
32
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
33
|
+
return _indicator(value) if value is not None else None
|
hestia_earth/models/cml2001Baseline/terrestrialAcidificationPotentialIncludingFateAverageEurope.py
CHANGED
|
@@ -29,5 +29,5 @@ def run(impact_assessment: dict):
|
|
|
29
29
|
value = impact_emission_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['emission'])
|
|
30
30
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
31
31
|
value=value)
|
|
32
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
33
|
-
return _indicator(value)
|
|
32
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
33
|
+
return _indicator(value) if value is not None else None
|
|
@@ -29,5 +29,5 @@ def run(impact_assessment: dict):
|
|
|
29
29
|
value = impact_emission_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['emission'])
|
|
30
30
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
31
31
|
value=value)
|
|
32
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
33
|
-
return _indicator(value)
|
|
32
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
33
|
+
return _indicator(value) if value is not None else None
|
|
@@ -29,5 +29,5 @@ def run(impact_assessment: dict):
|
|
|
29
29
|
value = impact_emission_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['emission'])
|
|
30
30
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
31
31
|
value=value)
|
|
32
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
33
|
-
return _indicator(value)
|
|
32
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
33
|
+
return _indicator(value) if value is not None else None
|
|
@@ -15,7 +15,7 @@ REQUIREMENTS = {
|
|
|
15
15
|
"Cycle": {
|
|
16
16
|
"completeness.seed": "False",
|
|
17
17
|
"inputs": [
|
|
18
|
-
{"@type": "Input", "value": "", "term.@id": ["seed", "
|
|
18
|
+
{"@type": "Input", "value": "", "term.@id": ["seed", "saplingsDepreciatedAmountPerCycle"]}
|
|
19
19
|
],
|
|
20
20
|
"site": {
|
|
21
21
|
"@type": "Site",
|
|
@@ -46,11 +46,13 @@ def run(cycle: dict):
|
|
|
46
46
|
|
|
47
47
|
product = find_primary_product(cycle) or {}
|
|
48
48
|
term_id = product.get('term', {}).get('@id')
|
|
49
|
-
|
|
49
|
+
has_saplingsDepreciatedAmountPerCycle = find_term_match(cycle.get('inputs', []),
|
|
50
|
+
'saplingsDepreciatedAmountPerCycle',
|
|
51
|
+
None) and is_plantation(MODEL, None, term_id)
|
|
50
52
|
|
|
51
53
|
logRequirements(cycle, model=MODEL, term=None, key=MODEL_KEY,
|
|
52
54
|
site_type_allowed=site_type_allowed,
|
|
53
55
|
has_seed=has_seed,
|
|
54
|
-
|
|
56
|
+
has_saplingsDepreciatedAmountPerCycle=has_saplingsDepreciatedAmountPerCycle)
|
|
55
57
|
|
|
56
|
-
return all([site_type_allowed, has_seed or
|
|
58
|
+
return all([site_type_allowed, has_seed or has_saplingsDepreciatedAmountPerCycle])
|
|
@@ -72,7 +72,7 @@ def _calculate_value(cycle: dict, product: dict, inputs: list, property_id: str,
|
|
|
72
72
|
valid_values = [
|
|
73
73
|
(value.get('property-value'), value.get('input-value'))
|
|
74
74
|
for value in values
|
|
75
|
-
if all([value.get('property-value'), value.get('input-value')])
|
|
75
|
+
if all([value.get('property-value') is not None, value.get('input-value') is not None])
|
|
76
76
|
]
|
|
77
77
|
ratio_inputs_with_props = len(valid_values) / len(inputs) if len(inputs) and len(valid_values) else 0
|
|
78
78
|
min_ratio = _min_ratio(property_id)
|
|
@@ -106,15 +106,20 @@ def _calculate_default_value(cycle: dict, product: dict, inputs: list, property_
|
|
|
106
106
|
|
|
107
107
|
def _calculate_N_value(cycle: dict, product: dict, inputs: list, property_id: str):
|
|
108
108
|
term_id = product.get('term', {}).get('@id')
|
|
109
|
+
|
|
110
|
+
def fallback_value(input: dict):
|
|
111
|
+
value = get_node_property_value(
|
|
112
|
+
MODEL, input, 'crudeProteinContent', handle_percents=False, term=term_id, property=property_id
|
|
113
|
+
)
|
|
114
|
+
return value * 0.16 if value is not None else None
|
|
115
|
+
|
|
109
116
|
values = [{
|
|
110
117
|
'input-id': i.get('term', {}).get('@id'),
|
|
111
118
|
'input-value': list_sum(i.get('value', [])),
|
|
112
119
|
'property-id': property_id,
|
|
113
120
|
'property-value': get_node_property_value(
|
|
114
121
|
MODEL, i, property_id, handle_percents=False, term=term_id, property=property_id
|
|
115
|
-
) or
|
|
116
|
-
MODEL, i, 'crudeProteinContent', default=0, handle_percents=False, term=term_id, property=property_id
|
|
117
|
-
) * 0.16
|
|
122
|
+
) or fallback_value(input=i)
|
|
118
123
|
} for i in inputs]
|
|
119
124
|
return _calculate_value(cycle, product, inputs, property_id, values)
|
|
120
125
|
|
|
@@ -8,6 +8,7 @@ assumed it ended on the 14th of the month.
|
|
|
8
8
|
from hestia_earth.utils.date import is_in_months
|
|
9
9
|
|
|
10
10
|
from hestia_earth.models.log import logRequirements, logShouldRun
|
|
11
|
+
from hestia_earth.models.utils import last_day_of_month
|
|
11
12
|
from . import MODEL
|
|
12
13
|
|
|
13
14
|
REQUIREMENTS = {
|
|
@@ -24,9 +25,17 @@ RETURNS = {
|
|
|
24
25
|
MODEL_KEY = 'endDate'
|
|
25
26
|
|
|
26
27
|
|
|
28
|
+
def _end_of_month(date: str):
|
|
29
|
+
year = int(date[0:4])
|
|
30
|
+
month = int(date[5:7])
|
|
31
|
+
return last_day_of_month(year, month).strftime('%Y-%m-%d')
|
|
32
|
+
|
|
33
|
+
|
|
27
34
|
def _run(cycle: dict):
|
|
28
35
|
endDate = cycle.get('endDate')
|
|
29
|
-
|
|
36
|
+
is_same_month = endDate[0:7] == cycle.get('startDate', '')[0:7]
|
|
37
|
+
# end of the month if same month as startDate
|
|
38
|
+
return _end_of_month(endDate) if is_same_month else f"{endDate}-14"
|
|
30
39
|
|
|
31
40
|
|
|
32
41
|
def _should_run(cycle: dict):
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Material and Substrate
|
|
3
|
+
|
|
4
|
+
This model gap-fills depreciated amount per Cycle from Site Infrastructure node.
|
|
5
|
+
"""
|
|
6
|
+
from typing import Union
|
|
7
|
+
from hestia_earth.schema import TermTermType
|
|
8
|
+
from hestia_earth.utils.lookup import download_lookup
|
|
9
|
+
from hestia_earth.utils.tools import to_precision, flatten, list_sum
|
|
10
|
+
from hestia_earth.utils.model import filter_list_term_type
|
|
11
|
+
|
|
12
|
+
from hestia_earth.models.log import logShouldRun, logRequirements
|
|
13
|
+
from hestia_earth.models.utils.constant import DAYS_IN_YEAR
|
|
14
|
+
from hestia_earth.models.utils.input import _new_input
|
|
15
|
+
from hestia_earth.models.utils.completeness import _is_term_type_incomplete
|
|
16
|
+
from .import MODEL
|
|
17
|
+
|
|
18
|
+
REQUIREMENTS = {
|
|
19
|
+
"Cycle": {
|
|
20
|
+
"completeness.material": "False",
|
|
21
|
+
"cycleDuration": "",
|
|
22
|
+
"site": {
|
|
23
|
+
"@type": "Site",
|
|
24
|
+
"infrastructure": [
|
|
25
|
+
{
|
|
26
|
+
"@type": "Infrastructure",
|
|
27
|
+
"defaultLifespan": "",
|
|
28
|
+
"inputs": [
|
|
29
|
+
{
|
|
30
|
+
"@type": "Input",
|
|
31
|
+
"term.termType": ["material", "substrate"],
|
|
32
|
+
"value": "",
|
|
33
|
+
"lifespan": ""
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
RETURNS = {
|
|
42
|
+
"Input": [{
|
|
43
|
+
"value": "",
|
|
44
|
+
"min": "",
|
|
45
|
+
"max": "",
|
|
46
|
+
"sd": "",
|
|
47
|
+
"statsDefinition": ""
|
|
48
|
+
}]
|
|
49
|
+
}
|
|
50
|
+
LOOKUPS = {
|
|
51
|
+
"material": ""
|
|
52
|
+
}
|
|
53
|
+
MODEL_KEY = 'materialAndSubstrate'
|
|
54
|
+
|
|
55
|
+
_ID_SUFFIX = "DepreciatedAmountPerCycle"
|
|
56
|
+
_OPTIONAL_VALUES = ["min", "max", "sd"]
|
|
57
|
+
_SIGNIFICANT_DIGITS = 5
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _input(term_id: str, value: float, stats: dict) -> dict:
|
|
61
|
+
node = _new_input(term_id + _ID_SUFFIX)
|
|
62
|
+
node['value'] = [value]
|
|
63
|
+
return node | stats
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _get_value(node: dict, field_name: str) -> float:
|
|
67
|
+
value = node.get(field_name)
|
|
68
|
+
return list_sum(value) if isinstance(value, list) else value
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def calculate_value(input_node: dict, field_name: str, cycle_duration: float) -> Union[float, None]:
|
|
72
|
+
lifespan = input_node.get("lifespan")
|
|
73
|
+
value = _get_value(node=input_node, field_name=field_name)
|
|
74
|
+
return (
|
|
75
|
+
to_precision(number=(value / (lifespan * DAYS_IN_YEAR)) * cycle_duration, digits=_SIGNIFICANT_DIGITS)
|
|
76
|
+
if value else None
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _run_input(cycle: dict, input_node: dict) -> dict:
|
|
81
|
+
cycle_duration = cycle.get("cycleDuration")
|
|
82
|
+
|
|
83
|
+
value = calculate_value(
|
|
84
|
+
input_node=input_node,
|
|
85
|
+
field_name="value",
|
|
86
|
+
cycle_duration=cycle_duration
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
optional_gap_filled_values = {
|
|
90
|
+
field_name: [
|
|
91
|
+
calculate_value(input_node=input_node, field_name=field_name, cycle_duration=cycle_duration)
|
|
92
|
+
]
|
|
93
|
+
for field_name in _OPTIONAL_VALUES if field_name in input_node
|
|
94
|
+
}
|
|
95
|
+
if "statsDefinition" in input_node:
|
|
96
|
+
optional_gap_filled_values["statsDefinition"] = input_node["statsDefinition"]
|
|
97
|
+
|
|
98
|
+
return _input(input_node.get('term', {}).get('@id'), value, optional_gap_filled_values)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _has_depreciated_term(term: dict):
|
|
102
|
+
lookup = download_lookup(f"{term.get('termType')}.csv")
|
|
103
|
+
return term.get('@id') + _ID_SUFFIX in list(lookup.termid)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _should_run_input(cycle: dict, input_node: dict) -> bool:
|
|
107
|
+
term = input_node.get('term', {})
|
|
108
|
+
term_id = term.get('@id')
|
|
109
|
+
has_lifespan = input_node.get('lifespan', 0) > 0
|
|
110
|
+
has_valid_value = _get_value(input_node, 'value') > 0
|
|
111
|
+
has_depreciated_term = _has_depreciated_term(term)
|
|
112
|
+
|
|
113
|
+
should_run = all([
|
|
114
|
+
has_depreciated_term,
|
|
115
|
+
has_valid_value,
|
|
116
|
+
has_lifespan
|
|
117
|
+
])
|
|
118
|
+
|
|
119
|
+
logRequirements(cycle, model=MODEL, term=term_id, model_key=MODEL_KEY,
|
|
120
|
+
has_valid_value=has_valid_value,
|
|
121
|
+
has_lifespan=has_lifespan,
|
|
122
|
+
has_depreciated_term=has_depreciated_term)
|
|
123
|
+
logShouldRun(input_node, MODEL, term_id, should_run, model_key=MODEL_KEY)
|
|
124
|
+
return should_run
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def _should_run_infrastructure(cycle: dict, infra_node: dict) -> tuple[bool, list]:
|
|
128
|
+
inputs = filter_list_term_type(infra_node.get('inputs', []), [TermTermType.MATERIAL, TermTermType.SUBSTRATE])
|
|
129
|
+
inputs = [
|
|
130
|
+
i | {
|
|
131
|
+
'lifespan': i.get('lifespan') or infra_node.get('defaultLifespan')
|
|
132
|
+
}
|
|
133
|
+
for i in inputs
|
|
134
|
+
]
|
|
135
|
+
return [i for i in inputs if _should_run_input(cycle, i)]
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def _should_run(cycle: dict) -> tuple[bool, list]:
|
|
139
|
+
inputs = flatten([
|
|
140
|
+
_should_run_infrastructure(cycle, i)
|
|
141
|
+
for i in cycle.get('site', {}).get('infrastructure', [])
|
|
142
|
+
])
|
|
143
|
+
has_material_inputs = len(inputs) > 0
|
|
144
|
+
cycle_duration = cycle.get('cycleDuration')
|
|
145
|
+
is_incomplete = _is_term_type_incomplete(cycle, TermTermType.MATERIAL)
|
|
146
|
+
|
|
147
|
+
logRequirements(cycle, model=MODEL, term=None, model_key=MODEL_KEY,
|
|
148
|
+
term_type_material_incomplete=is_incomplete,
|
|
149
|
+
has_material_inputs=has_material_inputs)
|
|
150
|
+
|
|
151
|
+
should_run = all([is_incomplete, has_material_inputs, cycle_duration])
|
|
152
|
+
logShouldRun(cycle, MODEL, None, should_run, model_key=MODEL_KEY)
|
|
153
|
+
return should_run, inputs
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def run(cycle: dict):
|
|
157
|
+
should_run, inputs = _should_run(cycle)
|
|
158
|
+
return [_run_input(cycle, i) for i in inputs] if should_run else []
|
|
@@ -87,15 +87,16 @@ def _run(cycle: dict, product: dict):
|
|
|
87
87
|
|
|
88
88
|
live_animal_term_id = get_liveAnimal_term_id(product, model_key=MODEL_KEY)
|
|
89
89
|
live_animal_node = find_term_match(cycle.get('animals', []), live_animal_term_id)
|
|
90
|
+
animal_value = live_animal_node.get('value', 0)
|
|
90
91
|
|
|
91
|
-
value = list_sum(product.get('value')) / cycleDuration /
|
|
92
|
-
sd = list_sum(product.get('sd')) / cycleDuration /
|
|
92
|
+
value = list_sum(product.get('value')) / cycleDuration / animal_value
|
|
93
|
+
sd = list_sum(product.get('sd')) / cycleDuration / animal_value if all([
|
|
93
94
|
list_sum(product.get('sd', [])) > 0
|
|
94
95
|
]) else None
|
|
95
|
-
min = list_sum(product.get('min')) / cycleDuration /
|
|
96
|
+
min = list_sum(product.get('min')) / cycleDuration / animal_value if all([
|
|
96
97
|
list_sum(product.get('min', [])) > 0
|
|
97
98
|
]) else None
|
|
98
|
-
max = list_sum(product.get('max')) / cycleDuration /
|
|
99
|
+
max = list_sum(product.get('max')) / cycleDuration / animal_value if all([
|
|
99
100
|
list_sum(product.get('max', [])) > 0
|
|
100
101
|
]) else None
|
|
101
102
|
|
|
@@ -136,7 +137,7 @@ def _should_run_product(cycle: dict, product: dict):
|
|
|
136
137
|
missing_milkYield_practice=missing_milkYield_practice)
|
|
137
138
|
|
|
138
139
|
should_run = all([
|
|
139
|
-
has_product_value, has_live_animal_node_value, practice_id, missing_milkYield_practice
|
|
140
|
+
cycleDuration, has_product_value, has_live_animal_node_value, practice_id, missing_milkYield_practice
|
|
140
141
|
])
|
|
141
142
|
logShouldRun(cycle, MODEL, term_id, should_run, model_key=MODEL_KEY)
|
|
142
143
|
return should_run
|
|
@@ -36,22 +36,24 @@ def _run_by_cycleDuration(cycle: dict):
|
|
|
36
36
|
|
|
37
37
|
def _should_run_by_cycleDuration(cycle: dict):
|
|
38
38
|
has_endDate = cycle.get('endDate') is not None
|
|
39
|
-
|
|
39
|
+
has_endDate_day_precision = has_endDate and is_in_days(cycle.get('endDate'))
|
|
40
40
|
has_cycleDuration = cycle.get('cycleDuration') is not None
|
|
41
41
|
|
|
42
42
|
logRequirements(cycle, model=MODEL, key=MODEL_KEY, by='cycleDuration',
|
|
43
43
|
has_endDate=has_endDate,
|
|
44
|
-
|
|
44
|
+
has_endDate_day_precision=has_endDate_day_precision,
|
|
45
45
|
has_cycleDuration=has_cycleDuration)
|
|
46
46
|
|
|
47
|
-
should_run = all([has_endDate,
|
|
47
|
+
should_run = all([has_endDate, has_endDate_day_precision, has_cycleDuration])
|
|
48
48
|
logShouldRun(cycle, MODEL, None, should_run, key=MODEL_KEY, by='cycleDuration')
|
|
49
49
|
return should_run
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
def _run_by_startDate(cycle: dict):
|
|
53
53
|
startDate = cycle.get('startDate')
|
|
54
|
-
|
|
54
|
+
is_same_month = startDate[0:7] == cycle.get('endDate', '')[0:7]
|
|
55
|
+
# start of the month if same month as end date
|
|
56
|
+
return f"{startDate}-01" if is_same_month else f"{startDate}-15"
|
|
55
57
|
|
|
56
58
|
|
|
57
59
|
def _should_run_by_startDate(cycle: dict):
|
|
@@ -30,5 +30,5 @@ def run(impact_assessment: dict):
|
|
|
30
30
|
value = impact_emission_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['emission'])
|
|
31
31
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
32
32
|
value=value)
|
|
33
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
34
|
-
return _indicator(value)
|
|
33
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
34
|
+
return _indicator(value) if value is not None else None
|
|
@@ -4,9 +4,10 @@ Emission not relevant
|
|
|
4
4
|
The emission is not relevant for this Site, Cycle, or Product.
|
|
5
5
|
"""
|
|
6
6
|
from hestia_earth.schema import NodeType, TermTermType, EmissionMethodTier
|
|
7
|
+
from hestia_earth.utils.emission import emission_is_in_system_boundary
|
|
7
8
|
|
|
8
9
|
from hestia_earth.models.log import logRequirements, logShouldRun
|
|
9
|
-
from hestia_earth.models.utils.emission import _new_emission
|
|
10
|
+
from hestia_earth.models.utils.emission import _new_emission
|
|
10
11
|
from hestia_earth.models.utils.blank_node import _run_required
|
|
11
12
|
from hestia_earth.models.utils.term import get_all_emission_terms
|
|
12
13
|
|
|
@@ -38,7 +39,7 @@ def _emission(term_id: str):
|
|
|
38
39
|
def _should_run_emission(cycle: dict):
|
|
39
40
|
def run(term_id: str):
|
|
40
41
|
is_not_relevant = not _run_required(MODEL, {'@id': term_id, 'termType': TermTermType.EMISSION.value}, cycle)
|
|
41
|
-
in_system_boundary =
|
|
42
|
+
in_system_boundary = emission_is_in_system_boundary(term_id)
|
|
42
43
|
|
|
43
44
|
should_run = all([is_not_relevant, in_system_boundary])
|
|
44
45
|
if should_run:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from hestia_earth.models.utils.indicator import _new_indicator
|
|
2
|
-
from hestia_earth.models.utils.pesticideAI import impact_lookup_value
|
|
2
|
+
from hestia_earth.models.utils.pesticideAI import impact_lookup_value
|
|
3
3
|
from . import MODEL
|
|
4
4
|
|
|
5
5
|
REQUIREMENTS = {
|
|
@@ -30,5 +30,4 @@ def _indicator(value: float):
|
|
|
30
30
|
|
|
31
31
|
def run(impact_assessment: dict):
|
|
32
32
|
value = impact_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['pesticideAI'])
|
|
33
|
-
|
|
34
|
-
return _indicator(value) if should_run else None
|
|
33
|
+
return _indicator(value) if value is not None else None
|
|
@@ -6,17 +6,18 @@ functionality of the Blonk model.
|
|
|
6
6
|
"""
|
|
7
7
|
import math
|
|
8
8
|
from collections import defaultdict
|
|
9
|
-
|
|
10
9
|
from hestia_earth.schema import SiteSiteType, TermTermType
|
|
11
|
-
from hestia_earth.utils.lookup import (
|
|
12
|
-
|
|
10
|
+
from hestia_earth.utils.lookup import (
|
|
11
|
+
download_lookup, get_table_value, column_name,
|
|
12
|
+
extract_grouped_data_closest_date, _is_missing_value, extract_grouped_data
|
|
13
|
+
)
|
|
13
14
|
from hestia_earth.utils.model import filter_list_term_type
|
|
14
15
|
from hestia_earth.utils.tools import safe_parse_float, to_precision, non_empty_value
|
|
15
16
|
|
|
16
|
-
from hestia_earth.models.cycle.input.hestiaAggregatedData import MODEL_ID
|
|
17
17
|
from hestia_earth.models.log import logRequirements, log_as_table, logShouldRun
|
|
18
|
+
from hestia_earth.models.utils.management import _new_management
|
|
18
19
|
from hestia_earth.models.utils.term import get_lookup_value
|
|
19
|
-
from
|
|
20
|
+
from . import MODEL
|
|
20
21
|
|
|
21
22
|
REQUIREMENTS = {
|
|
22
23
|
"Site": {
|
|
@@ -46,9 +47,7 @@ RETURNS = {
|
|
|
46
47
|
],
|
|
47
48
|
"value": "",
|
|
48
49
|
"endDate": "",
|
|
49
|
-
"startDate": ""
|
|
50
|
-
"methodModel": "HESTIA",
|
|
51
|
-
"methodClassification": ["modelled using other measurements", "expert opinion"]
|
|
50
|
+
"startDate": ""
|
|
52
51
|
}]
|
|
53
52
|
}
|
|
54
53
|
LOOKUPS = {
|
|
@@ -67,7 +66,8 @@ LOOKUPS = {
|
|
|
67
66
|
"crop": ["cropGroupingFaostatArea", "IPCC_LAND_USE_CATEGORY"],
|
|
68
67
|
"landCover": ["cropGroupingFaostatProduction", "FAOSTAT_LAND_AREA_CATEGORY"]
|
|
69
68
|
}
|
|
70
|
-
MODEL_KEY =
|
|
69
|
+
MODEL_KEY = 'landCover'
|
|
70
|
+
|
|
71
71
|
LAND_AREA = LOOKUPS["region-faostatArea"][3]
|
|
72
72
|
TOTAL_CROPLAND = "Cropland"
|
|
73
73
|
ANNUAL_CROPLAND = "Arable land"
|
|
@@ -105,12 +105,20 @@ IPCC_LAND_USE_CATEGORY_PERENNIAL = "Perennial crops"
|
|
|
105
105
|
OUTPUT_SIGNIFICANT_DIGITS = 3
|
|
106
106
|
|
|
107
107
|
|
|
108
|
+
def _management(term_id: str, value: float, start_date: str, end_date: str):
|
|
109
|
+
node = _new_management(term_id, MODEL)
|
|
110
|
+
node['value'] = value
|
|
111
|
+
node['startDate'] = start_date
|
|
112
|
+
node['endDate'] = end_date
|
|
113
|
+
return node
|
|
114
|
+
|
|
115
|
+
|
|
108
116
|
def _is_missing_or_none(value) -> bool:
|
|
109
117
|
return value is None or _is_missing_value(value)
|
|
110
118
|
|
|
111
119
|
|
|
112
120
|
def _safe_divide(numerator, denominator, default=0) -> float:
|
|
113
|
-
return default if denominator
|
|
121
|
+
return default if not denominator else numerator / denominator
|
|
114
122
|
|
|
115
123
|
|
|
116
124
|
def site_area_sum_to_100(dict_of_percentages: dict):
|
|
@@ -432,22 +440,16 @@ def _run_make_management_nodes(existing_nodes: list, percentage_transformed_from
|
|
|
432
440
|
for land_type, ratio in percentage_transformed_from.items()
|
|
433
441
|
]
|
|
434
442
|
values = [v for v in values if v.get("land_management_key") not in existing_nodes_set]
|
|
435
|
-
nodes = [
|
|
436
|
-
{
|
|
437
|
-
"term": {
|
|
438
|
-
"@type": "Term",
|
|
439
|
-
"@id": LAND_USE_TERMS_FOR_TRANSFORMATION[value.get("land_type")][0],
|
|
440
|
-
"name": LAND_USE_TERMS_FOR_TRANSFORMATION[value.get("land_type")][1],
|
|
441
|
-
"termType": TermTermType.LANDCOVER.value
|
|
442
|
-
},
|
|
443
|
-
"value": value.get("percentage"),
|
|
444
|
-
"startDate": value.get("land_management_key")[1],
|
|
445
|
-
"endDate": value.get("land_management_key")[2],
|
|
446
|
-
"@type": "Management"
|
|
447
|
-
} for value in values
|
|
448
|
-
]
|
|
449
443
|
|
|
450
|
-
return
|
|
444
|
+
return [
|
|
445
|
+
_management(
|
|
446
|
+
term_id=LAND_USE_TERMS_FOR_TRANSFORMATION[value.get("land_type")][0],
|
|
447
|
+
value=value.get("percentage"),
|
|
448
|
+
start_date=value.get("land_management_key")[1],
|
|
449
|
+
end_date=value.get("land_management_key")[2]
|
|
450
|
+
)
|
|
451
|
+
for value in values
|
|
452
|
+
]
|
|
451
453
|
|
|
452
454
|
|
|
453
455
|
def get_ratio_of_expanded_area(country_id: str, fao_name: str, end_year: int) -> float:
|
|
@@ -696,7 +698,7 @@ def _should_run_historical_land_use_change_single_crop(
|
|
|
696
698
|
sum_of_site_areas_is_100
|
|
697
699
|
]
|
|
698
700
|
)
|
|
699
|
-
logShouldRun(site,
|
|
701
|
+
logShouldRun(site, MODEL, term=term.get("@id"), should_run=should_run, key=MODEL_KEY)
|
|
700
702
|
|
|
701
703
|
return should_run, site_area
|
|
702
704
|
|
|
@@ -29,5 +29,5 @@ def run(impact_assessment: dict):
|
|
|
29
29
|
value = impact_emission_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['emission'])
|
|
30
30
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
31
31
|
value=value)
|
|
32
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
33
|
-
return _indicator(value)
|
|
32
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
33
|
+
return _indicator(value) if value is not None else None
|
|
@@ -29,5 +29,5 @@ def run(impact_assessment: dict):
|
|
|
29
29
|
value = impact_emission_lookup_value(MODEL, TERM_ID, impact_assessment, LOOKUPS['emission'])
|
|
30
30
|
logRequirements(impact_assessment, model=MODEL, term=TERM_ID,
|
|
31
31
|
value=value)
|
|
32
|
-
logShouldRun(impact_assessment, MODEL, TERM_ID,
|
|
33
|
-
return _indicator(value)
|
|
32
|
+
logShouldRun(impact_assessment, MODEL, TERM_ID, value is not None)
|
|
33
|
+
return _indicator(value) if value is not None else None
|
|
@@ -7,11 +7,9 @@ from typing import Optional, Union
|
|
|
7
7
|
from hestia_earth.schema import (
|
|
8
8
|
MeasurementMethodClassification,
|
|
9
9
|
MeasurementStatsDefinition,
|
|
10
|
-
SiteSiteType
|
|
11
|
-
TermTermType
|
|
10
|
+
SiteSiteType
|
|
12
11
|
)
|
|
13
12
|
|
|
14
|
-
from hestia_earth.utils.model import filter_list_term_type
|
|
15
13
|
from hestia_earth.utils.tools import non_empty_list
|
|
16
14
|
|
|
17
15
|
from hestia_earth.models.log import log_as_table, logRequirements, logShouldRun
|
|
@@ -24,8 +22,8 @@ from hestia_earth.models.utils.measurement import _new_measurement
|
|
|
24
22
|
|
|
25
23
|
from . import MODEL
|
|
26
24
|
from .biomass_utils import (
|
|
27
|
-
BiomassCategory, detect_land_cover_change, group_by_biomass_category, group_by_term_id,
|
|
28
|
-
summarise_land_cover_nodes
|
|
25
|
+
BiomassCategory, get_valid_land_cover_terms, detect_land_cover_change, group_by_biomass_category, group_by_term_id,
|
|
26
|
+
sample_biomass_equilibrium, summarise_land_cover_nodes
|
|
29
27
|
)
|
|
30
28
|
|
|
31
29
|
|
|
@@ -94,8 +92,6 @@ _ITERATIONS = 10000
|
|
|
94
92
|
_METHOD_CLASSIFICATION = MeasurementMethodClassification.TIER_1_MODEL.value
|
|
95
93
|
_STATS_DEFINITION = MeasurementStatsDefinition.SIMULATED.value
|
|
96
94
|
|
|
97
|
-
_LAND_COVER_TERM_TYPE = TermTermType.LANDCOVER
|
|
98
|
-
|
|
99
95
|
_EQUILIBRIUM_TRANSITION_PERIOD = 20
|
|
100
96
|
_EXCLUDED_ECO_CLIMATE_ZONES = {EcoClimateZone.POLAR_MOIST, EcoClimateZone.POLAR_DRY}
|
|
101
97
|
_EXCLUDED_SITE_TYPES = {
|
|
@@ -156,7 +152,7 @@ def _should_run(site: dict) -> tuple[bool, dict, dict]:
|
|
|
156
152
|
site_type = site.get("siteType")
|
|
157
153
|
eco_climate_zone = get_eco_climate_zone_value(site, as_enum=True)
|
|
158
154
|
|
|
159
|
-
land_cover =
|
|
155
|
+
land_cover = get_valid_land_cover_terms(site)
|
|
160
156
|
|
|
161
157
|
has_valid_site_type = site_type not in _EXCLUDED_SITE_TYPES
|
|
162
158
|
has_valid_eco_climate_zone = all([
|
|
@@ -51,9 +51,9 @@ def _run_animal(data: dict):
|
|
|
51
51
|
animal = data.get('animal')
|
|
52
52
|
value = data.get('value')
|
|
53
53
|
practice_id = get_lookup_value(animal.get('term'), LOOKUPS['liveAnimal'][1])
|
|
54
|
-
return animal | {
|
|
54
|
+
return animal | ({
|
|
55
55
|
'practices': merge_blank_nodes(animal.get('practices', []), [_practice(practice_id, value)])
|
|
56
|
-
}
|
|
56
|
+
} if practice_id else {})
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
def _should_run(cycle: dict):
|
|
@@ -7,11 +7,9 @@ from typing import Optional, Union
|
|
|
7
7
|
from hestia_earth.schema import (
|
|
8
8
|
MeasurementMethodClassification,
|
|
9
9
|
MeasurementStatsDefinition,
|
|
10
|
-
SiteSiteType
|
|
11
|
-
TermTermType
|
|
10
|
+
SiteSiteType
|
|
12
11
|
)
|
|
13
12
|
|
|
14
|
-
from hestia_earth.utils.model import filter_list_term_type
|
|
15
13
|
from hestia_earth.utils.tools import non_empty_list
|
|
16
14
|
|
|
17
15
|
from hestia_earth.models.log import log_as_table, logRequirements, logShouldRun
|
|
@@ -24,8 +22,8 @@ from hestia_earth.models.utils.measurement import _new_measurement
|
|
|
24
22
|
|
|
25
23
|
from . import MODEL
|
|
26
24
|
from .biomass_utils import (
|
|
27
|
-
BiomassCategory, detect_land_cover_change, group_by_biomass_category,
|
|
28
|
-
summarise_land_cover_nodes
|
|
25
|
+
BiomassCategory, get_valid_land_cover_terms, detect_land_cover_change, group_by_biomass_category,
|
|
26
|
+
sample_biomass_equilibrium, summarise_land_cover_nodes
|
|
29
27
|
)
|
|
30
28
|
|
|
31
29
|
|
|
@@ -81,8 +79,6 @@ _ITERATIONS = 10000
|
|
|
81
79
|
_METHOD_CLASSIFICATION = MeasurementMethodClassification.TIER_1_MODEL.value
|
|
82
80
|
_STATS_DEFINITION = MeasurementStatsDefinition.SIMULATED.value
|
|
83
81
|
|
|
84
|
-
_LAND_COVER_TERM_TYPE = TermTermType.LANDCOVER
|
|
85
|
-
|
|
86
82
|
_EQUILIBRIUM_TRANSITION_PERIOD = 20
|
|
87
83
|
_EXCLUDED_ECO_CLIMATE_ZONES = {EcoClimateZone.POLAR_MOIST, EcoClimateZone.POLAR_DRY}
|
|
88
84
|
_EXCLUDED_SITE_TYPES = {
|
|
@@ -149,7 +145,7 @@ def _should_run(site: dict) -> tuple[bool, dict, dict]:
|
|
|
149
145
|
site_type = site.get("siteType")
|
|
150
146
|
eco_climate_zone = get_eco_climate_zone_value(site, as_enum=True)
|
|
151
147
|
|
|
152
|
-
land_cover =
|
|
148
|
+
land_cover = get_valid_land_cover_terms(site)
|
|
153
149
|
|
|
154
150
|
has_valid_site_type = site_type not in _EXCLUDED_SITE_TYPES
|
|
155
151
|
has_valid_eco_climate_zone = all([
|