Skip to content

Commit 9dff711

Browse files
Coerce intParameters with ValueEnums to their enum values
1 parent 1058d7d commit 9dff711

File tree

8 files changed

+61
-13
lines changed

8 files changed

+61
-13
lines changed

src/geophires_x/Economics.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import numpy_financial as npf
66
import geophires_x.Model as Model
77
from geophires_x.OptionList import Configuration, WellDrillingCostCorrelation, EconomicModel, EndUseOptions, PlantType
8-
from geophires_x.Parameter import intParameter, floatParameter, OutputParameter, ReadParameter, boolParameter
8+
from geophires_x.Parameter import intParameter, floatParameter, OutputParameter, ReadParameter, boolParameter, \
9+
coerce_int_params_to_enum_values
910
from geophires_x.Units import *
1011

1112

@@ -2223,6 +2224,8 @@ def read_parameters(self, model: Model) -> None:
22232224
self.DoSDACGTCalculations.value = True
22242225
break
22252226

2227+
coerce_int_params_to_enum_values(self.ParameterDict)
2228+
22262229
model.logger.info(f'complete {__class__!s}: {sys._getframe().f_code.co_name}')
22272230

22282231
def Calculate(self, model: Model) -> None:

src/geophires_x/GeoPHIRESUtils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,3 +619,4 @@ def static_pressure_MPa(rho_kg_per_m3: float, depth_m: float) -> float:
619619
pressure_mpa = quantity(pressure_Pa, 'Pa').to('MPa').magnitude
620620

621621
return pressure_mpa
622+

src/geophires_x/OptionList.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# copyright, 2023, Malcolm I Ross
2+
23
from enum import Enum
34

45

@@ -41,6 +42,12 @@ def get_end_use_option_from_input_string(input_string:str):
4142

4243
raise ValueError(f'Unknown End-Use Option input value: {input_string}')
4344

45+
@staticmethod
46+
def from_int(int_val):
47+
for member in __class__:
48+
if member.int_value == int_val:
49+
return member
50+
4451

4552
class PlantType(GeophiresInputEnum):
4653
SUB_CRITICAL_ORC = 1, "Subcritical ORC"
@@ -65,6 +72,12 @@ def get_plant_type_from_input_string(input_string:str):
6572

6673
raise ValueError(f'Unknown Power Plant Type input value: {input_string}')
6774

75+
@staticmethod
76+
def from_int(int_val):
77+
for member in __class__:
78+
if member.int_value == int_val:
79+
return member
80+
6881

6982
class EconomicModel(str, Enum):
7083
CLGS = "Simple (CLGS)"
@@ -95,6 +108,12 @@ def get_reservoir_model_from_input_string(input_string:str):
95108

96109
raise ValueError(f'Unknown Reservoir Model input value: {input_string}')
97110

111+
@staticmethod
112+
def from_int(int_val):
113+
for member in __class__:
114+
if member.int_value == int_val:
115+
return member
116+
98117

99118
class ReservoirVolume(str, Enum):
100119
FRAC_NUM_SEP = "Specify number of fractures and fracture separation"

src/geophires_x/Parameter.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# copyright, 2023, Malcolm I Ross
2+
from __future__ import annotations
3+
24
import copy
35
import dataclasses
46

@@ -12,6 +14,8 @@
1214
from abc import ABC
1315

1416
from pint.facets.plain import PlainQuantity
17+
18+
from geophires_x.OptionList import GeophiresInputEnum
1519
from geophires_x.Units import *
1620

1721
_ureg = get_unit_registry()
@@ -119,13 +123,12 @@ def UnitsMatch(self) -> bool:
119123

120124
parameter_category: str = None
121125

122-
ValuesEnum:Enum = None
126+
ValuesEnum:GeophiresInputEnum = None
123127

124128
def __post_init__(self):
125129
if self.PreferredUnits is None:
126130
self.PreferredUnits = self.CurrentUnits
127131

128-
129132
@dataclass
130133
class boolParameter(Parameter):
131134
"""
@@ -167,6 +170,11 @@ def __post_init__(self):
167170
AllowableRange: List[int] = field(default_factory=list)
168171
json_parameter_type: str = 'integer'
169172

173+
def coerce_value_to_enum(self):
174+
if self.ValuesEnum is not None:
175+
if not isinstance(self.value, self.ValuesEnum):
176+
self.value = self.ValuesEnum.from_int(self.value)
177+
170178

171179
@dataclass
172180
class floatParameter(Parameter):
@@ -1040,3 +1048,16 @@ def ConvertOutputUnits(oparam: OutputParameter, newUnit: Units, model):
10401048
oparam.value = Factor * conv_rate * float(oparam.value)
10411049
oparam.CurrentUnits = DefUnit
10421050
model.logger.info(f'Complete {str(__name__)}: {sys._getframe().f_code.co_name}')
1051+
1052+
1053+
def coerce_int_params_to_enum_values(parameter_dict:dict[str,Parameter]) -> None:
1054+
"""
1055+
Some modules have intParameters with an int default value whose working value gets set to an
1056+
enum when the parameter is read. If the parameter is not provided as an input, the default int value needs to
1057+
be coerced into the corresponding enum value.
1058+
TODO: resolve these enum/int value discrepancies so this workaround can be removed
1059+
"""
1060+
1061+
for param_name, param in parameter_dict.items():
1062+
if isinstance(param, intParameter):
1063+
parameter_dict[param_name].coerce_value_to_enum()

src/geophires_x/Reservoir.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from pint.facets.plain import PlainQuantity
77

88
from .OptionList import ReservoirModel, FractureShape, ReservoirVolume
9-
from .Parameter import intParameter, floatParameter, listParameter, OutputParameter, ReadParameter
9+
from .Parameter import intParameter, floatParameter, listParameter, OutputParameter, ReadParameter, \
10+
coerce_int_params_to_enum_values
1011
from .Units import *
1112
import geophires_x.Model as Model
1213

@@ -638,11 +639,7 @@ def read_parameters(self, model: Model) -> None:
638639
else:
639640
model.logger.info("No parameters read because no content provided")
640641

641-
if not isinstance(self.resoption.value, ReservoirModel):
642-
# resoption is an intParameter with an int default value whose working value gets set to a ReservoirModel
643-
# enum when the parameter is read, so convert to the enum from the default if it's not read as a parameter.
644-
# (TODO: resolve the enum/int value discrepancy so this workaround can be removed)
645-
self.resoption.value = ReservoirModel.get_reservoir_model_from_input_string(str(self.resoption.value))
642+
coerce_int_params_to_enum_values(self.ParameterDict)
646643

647644
model.logger.info(f'complete {str(__class__)}: {sys._getframe().f_code.co_name}')
648645

src/geophires_x/SurfacePlant.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import sys
22
import os
33
import numpy as np
4+
45
from .OptionList import EndUseOptions, PlantType
5-
from .Parameter import floatParameter, intParameter, strParameter, OutputParameter, ReadParameter
6+
from .Parameter import floatParameter, intParameter, strParameter, OutputParameter, ReadParameter, \
7+
coerce_int_params_to_enum_values
68
from .Units import *
79
import geophires_x.Model as Model
810
import pandas as pd
@@ -232,7 +234,7 @@ def __init__(self, model: Model):
232234

233235
self.enduse_option = self.ParameterDict[self.enduse_option.Name] = intParameter(
234236
"End-Use Option",
235-
value=EndUseOptions.ELECTRICITY,
237+
value=EndUseOptions.ELECTRICITY, # TODO should be DefaultValue instead
236238
AllowableRange=[1, 2, 31, 32, 41, 42, 51, 52],
237239
ValuesEnum=EndUseOptions,
238240
UnitType=Units.NONE,
@@ -242,7 +244,7 @@ def __init__(self, model: Model):
242244
)
243245
self.plant_type = self.ParameterDict[self.plant_type.Name] = intParameter(
244246
"Power Plant Type",
245-
DefaultValue=PlantType.SUB_CRITICAL_ORC,
247+
DefaultValue=PlantType.SUB_CRITICAL_ORC.int_value,
246248
AllowableRange=[1, 2, 3, 4, 5, 6, 7, 8, 9],
247249
ValuesEnum=PlantType,
248250
UnitType=Units.NONE,
@@ -577,6 +579,8 @@ def read_parameters(self, model:Model) -> None:
577579
else:
578580
model.logger.info('No parameters read because no content provided')
579581

582+
coerce_int_params_to_enum_values(self.ParameterDict)
583+
580584
model.logger.info(f'Complete {self.__class__.__name__}: {__name__}')
581585

582586
def Calculate(self, model: Model) -> None:

src/geophires_x_schema_generator/geophires-request.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@
789789
"type": "integer",
790790
"units": null,
791791
"category": "Surface Plant",
792-
"default": "",
792+
"default": 1,
793793
"minimum": 1,
794794
"maximum": 9,
795795
"enum_values": [

tests/geophires_x_tests/test_options_list.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ def test_get_end_use_option_from_input_string(self):
1111
with self.assertRaises(ValueError):
1212
EndUseOptions.get_end_use_option_from_input_string('2034982309')
1313

14+
def test_get_end_use_option_from_int_val(self):
15+
self.assertEqual(EndUseOptions.from_int(1), EndUseOptions.ELECTRICITY)
16+
1417
def test_cast_from_name_string(self):
1518
self.assertIs(EndUseOptions('Electricity'), EndUseOptions.ELECTRICITY)
1619
self.assertIs(EndUseOptions('Direct-Use Heat'), EndUseOptions.HEAT)

0 commit comments

Comments
 (0)