Skip to content

Commit 54a5b7d

Browse files
committed
Store all *args and *kwargs as deep copies in the preparemethod2arguments dictionary of class TargetParameterUpdater of module importtools.
This change must be considered a bug fix that potentially impacts simulation results. Only those projects that use a main model that defines a "prepare method", a submodel that does not define this method, and a sub-submodel that uses the information provided by this method could be affected. Such combinations can only occur with HydPy-Evap and should be rare. Hence, it is unclear if any real projects have been affected by this bug.
1 parent d661e9b commit 54a5b7d

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

hydpy/core/importtools.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,17 +1064,19 @@ def __get__(
10641064

10651065
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> None:
10661066
assert (model := self._model) is not None
1067+
args = copy.deepcopy(args)
1068+
kwargs = copy.deepcopy(kwargs)
10671069
model.preparemethod2arguments[self._wrapped.__name__] = args, kwargs
10681070
control = model.parameters.control
10691071
if self.testmode:
10701072
if (name := self.targetparameter.name) in control.names:
10711073
par = control[name]
1072-
self.values_test[model] = copy.deepcopy(((args, kwargs), par.value))
1074+
self.values_test[model] = ((args, kwargs), copy.deepcopy(par.value))
10731075
else:
10741076
if (name := self.targetparameter.name) in control.names:
10751077
self._wrapped(model, *args, **kwargs)
10761078
par = control[name]
1077-
self.values_orig[model] = copy.deepcopy(((args, kwargs), par.value))
1079+
self.values_orig[model] = ((args, kwargs), copy.deepcopy(par.value))
10781080

10791081

10801082
def simulationstep(timestep: timetools.PeriodConstrArg) -> None:

hydpy/models/hland/hland_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4567,7 +4567,7 @@ def add_aetmodel_v1(
45674567
prepare_elevations: [300. 300. 300. 300. 300.]
45684568
prepare_maxsoilwater: [200. 200. 200. 200. 200.]
45694569
prepare_water: [False False True False False]
4570-
prepare_interception: [ True True False False False]
4570+
prepare_interception: [ True True False False True]
45714571
prepare_plant: [ True True False False False]
45724572
prepare_soil: [ True True False False False]
45734573
@@ -4596,8 +4596,8 @@ def add_aetmodel_v1(
45964596
sel = ~sel
45974597
sel[zonetype == GLACIER] = False
45984598
aetmodel.prepare_interception(sel)
4599-
aetmodel.prepare_plant(sel)
46004599
sel[zonetype == SEALED] = False
4600+
aetmodel.prepare_plant(sel)
46014601
aetmodel.prepare_soil(sel)
46024602

46034603

hydpy/models/lland/lland_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7531,11 +7531,11 @@ def add_aetmodel_v1(
75317531
prepare_leafareaindex: [[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
75327532
...
75337533
prepare_maxsoilwater: [50. 50. 50. 50. 50. 50. 50. 50. 50.]
7534-
prepare_water: [False False False True True True True True True]
7534+
prepare_water: [False False False False True True True False False]
75357535
prepare_interception: [ True True True True False False False True True]
75367536
prepare_soil: [ True True True False False False False True True]
75377537
prepare_plant: [ True True True False False False False False False]
7538-
prepare_conifer: [False True True False False False False False False]
7538+
prepare_conifer: [False False True False False False False False False]
75397539
prepare_tree: [False True True False False False False False False]
75407540
75417541
>>> model.aetmodel.parameters.control.leafareaindex.acker_jan

hydpy/models/wland/wland_model.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3466,8 +3466,13 @@ def add_petmodel_v1(
34663466
... nmbhru
34673467
... hruarea
34683468
... evapotranspirationfactor(field=1.0, trees=2.0, water=1.5)
3469+
... for method, arguments in model.preparemethod2arguments.items():
3470+
... print(method, arguments[0][0], sep=": ")
34693471
nmbhru(3)
34703472
hruarea(5.0, 3.0, 2.0)
3473+
prepare_nmbzones: 3
3474+
prepare_zonetypes: [13 19 23]
3475+
prepare_subareas: [5. 3. 2.]
34713476
34723477
>>> etf = model.petmodel.parameters.control.evapotranspirationfactor
34733478
>>> etf
@@ -3545,6 +3550,8 @@ def add_petmodel_v2(
35453550
... groundalbedo(conifer=0.05, decidious=0.1, field=0.15, mixed=0.2,
35463551
... orchard=0.25, pasture=0.3, sealed=0.35, soil=0.4,
35473552
... trees=0.45, water=0.5, wetland=0.55, wine=0.6)
3553+
... for method, arguments in model.preparemethod2arguments.items():
3554+
... print(method, arguments[0][0], sep=": ") # doctest: +ELLIPSIS
35483555
nmbhru(12)
35493556
hrutype(SEALED, FIELD, WINE, ORCHARD, SOIL, PASTURE, WETLAND, TREES,
35503557
CONIFER, DECIDIOUS, MIXED, WATER)
@@ -3564,6 +3571,21 @@ def add_petmodel_v2(
35643571
((12,), {})
35653572
((array([0.06, 0.2 , 0.34, 0.48, 0.62, 0.76, 0.9 , 1.04, 1.18, 1.32, 1.46,
35663573
1.64]),), {})
3574+
prepare_nmbzones: 12
3575+
prepare_zonetypes: [12 13 14 15 16 17 18 19 20 21 22 23]
3576+
prepare_subareas: [0.06 0.2 0.34 0.48 0.62 0.76 0.9 1.04 1.18 1.32 1.46 1.64]
3577+
prepare_leafareaindex: [[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
3578+
...
3579+
prepare_water: [False False False False False False False False False False \
3580+
False True]
3581+
prepare_interception: [ True True True True True True True True True \
3582+
True True False]
3583+
prepare_soil: [False True True True True True True True True True \
3584+
True False]
3585+
prepare_plant: [False True True True False True True True True True \
3586+
True False]
3587+
prepare_tree: [False False False False False False False False True True \
3588+
True False]
35673589
35683590
>>> assert model is model.petmodel.tempmodel
35693591
>>> assert model is model.petmodel.precipmodel

0 commit comments

Comments
 (0)