HydPy-Conv-NN (nearest neighbour interpolation)¶
conv_nn
performs simple nearest-neighbour interpolations between an arbitrary number
of models (or data files) providing output and an arbitrary number of models requiring
input.
Integration tests¶
Note
When new to HydPy, consider reading section Integration Tests first.
We perform the following examples over a simulation period of 3 days:
>>> from hydpy import Element, Node, pub
>>> pub.timegrids = "2000-01-01", "2000-01-04", "1d"
conv_nn
implements no parameter with values depending on the simulation step size,
which is why we can pass anything (or nothing) to function parameterstep()
without
changing the following results:
>>> from hydpy.models.conv_nn import *
>>> parameterstep()
Due to the following configuration, conv_nn
queries its input from the inlet nodes
in1 and in2 and passes the interpolation results to the outlet nodes out1,
out2, out3, and out4:
>>> in1, in2 = Node("in1"), Node("in2")
>>> element = Element("conv",
... inlets=(in1, in2),
... outlets=["out1", "out2", "out3", "out4"])
The following coordinate definitions contain the particular case of outlet node out4, being in the middle of inlet nodes in1 and in2 exactly:
>>> inputcoordinates(
... in1=(0.0, 3.0),
... in2=(2.0, -1.0))
>>> outputcoordinates(
... out1=(0.0, 3.0),
... out2=(3.0, -2.0),
... out3=(1.0, 2.0),
... out4=(1.0, 1.0))
In the first example, we perform a strict nearest-neighbour interpolation, where we always take only one input location into account, even in case of missing data:
>>> maxnmbinputs(1)
conv_nn
does not implement any state or log sequences and thus has no memory at all,
making finalising the test setup quite easy. We only need to define time series for
both inlet nodes. Note that we set some numpy
nan
values to demonstrate how
conv_nn
deals with missing values:
>>> element.model = model
>>> from hydpy.core.testtools import IntegrationTest
>>> test = IntegrationTest(element)
>>> test.dateformat = "%Y-%m-%d"
>>> with pub.options.checkseries(False):
... in1.sequences.sim.series = 1.0, 2.0, nan
... in2.sequences.sim.series = 4.0, nan, nan
The calculated results provide no surprises. However, outlet node out4 receives the
output of node in1 instead of the equidistant node in2, which is due to their
definition order when preparing parameter InputCoordinates
above:
>>> test()
| date | inputs | outputs | in1 | in2 | out1 | out2 | out3 | out4 |
---------------------------------------------------------------------------------------------
| 2000-01-01 | 1.0 4.0 | 1.0 4.0 1.0 1.0 | 1.0 | 4.0 | 1.0 | 4.0 | 1.0 | 1.0 |
| 2000-01-02 | 2.0 nan | 2.0 nan 2.0 2.0 | 2.0 | nan | 2.0 | nan | 2.0 | 2.0 |
| 2000-01-03 | nan nan | nan nan nan nan | nan | nan | nan | nan | nan | nan |
For the last timestep, where no input values are available at all, there is nothing we can do. However, by using the second nearest location as an alternative, we at least achieve complete output for the second timestep:
>>> maxnmbinputs(2)
>>> test()
| date | inputs | outputs | in1 | in2 | out1 | out2 | out3 | out4 |
---------------------------------------------------------------------------------------------
| 2000-01-01 | 1.0 4.0 | 1.0 4.0 1.0 1.0 | 1.0 | 4.0 | 1.0 | 4.0 | 1.0 | 1.0 |
| 2000-01-02 | 2.0 nan | 2.0 2.0 2.0 2.0 | 2.0 | nan | 2.0 | 2.0 | 2.0 | 2.0 |
| 2000-01-03 | nan nan | nan nan nan nan | nan | nan | nan | nan | nan | nan |
- class hydpy.models.conv_nn.Model[source]¶
Bases:
BaseModel
HydPy-Conv-NN (nearest neighbour interpolation).
- The following “inlet update methods” are called in the given sequence at the beginning of each simulation step:
Pick_Inputs_V1
Pick the input from all inlet nodes.
- The following “run methods” are called in the given sequence during each simulation step:
Calc_Outputs_V1
Perform a simple proximity-based interpolation.
- The following “outlet update methods” are called in the given sequence at the end of each simulation step:
Pass_Outputs_V1
Pass the output to all outlet nodes.
- REUSABLE_METHODS: ClassVar[tuple[type[ReusableMethod], ...]] = ()¶
- class hydpy.models.conv_nn.ControlParameters(master: Parameters, cls_fastaccess: type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)¶
Bases:
SubParameters
Control parameters of model conv_nn.
- The following classes are selected:
InputCoordinates()
Coordinates of the inlet nodes [?].OutputCoordinates()
Coordinates of the outlet nodes [?].MaxNmbInputs()
The maximum number of input locations to be taken into account for interpolating the values of a specific output location [-].
- class hydpy.models.conv_nn.DerivedParameters(master: Parameters, cls_fastaccess: type[FastAccessParameter] | None = None, cymodel: CyModelProtocol | None = None)¶
Bases:
SubParameters
Derived parameters of model conv_nn.
- The following classes are selected:
NmbInputs()
The number of inlet nodes [-]NmbOutputs()
The number of outlet nodes [-]Distances()
Distances of the inlet nodes to each outlet node [?].ProximityOrder()
Indices of the inlet nodes in the order of their proximity to each outlet node [-].
- class hydpy.models.conv_nn.FluxSequences(master: Sequences, cls_fastaccess: type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)¶
Bases:
FluxSequences
Flux sequences of model conv_nn.
- class hydpy.models.conv_nn.InletSequences(master: Sequences, cls_fastaccess: type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)¶
Bases:
InletSequences
Inlet sequences of model conv_nn.
- The following classes are selected:
Inputs()
Inputs [?].
- class hydpy.models.conv_nn.OutletSequences(master: Sequences, cls_fastaccess: type[TypeFastAccess_co] | None = None, cymodel: CyModelProtocol | None = None)¶
Bases:
OutletSequences
Outlet sequences of model conv_nn.
- The following classes are selected:
Outputs()
Outputs [?].