Source code for foxes.models.turbine_models.calculator
from foxes.core import TurbineModel
[docs]
class Calculator(TurbineModel):
"""
Calculates variables based on given functions.
Attributes
----------
in_vars: list of str
The input farm variables
out_vars: list of str
The output variables
func: Function
The function: f(in0, in1, ..., stsel) -> (out0, out1, ...)
where inX and outY are numpy.ndarrays and
st_sel is the state-turbine selection slice or array.
All arrays have shape (n_states, n_turbines).
:group: models.turbine_models
"""
[docs]
def __init__(self, in_vars, out_vars, func, **kwargs):
"""
Constructor.
Parameters
----------
in_vars: list of str
The input farm variables
out_vars: list of str
The output variables
func: Function
The function: f(in0, in1, ..., stsel) -> (out0, out1, ...)
where inX and outY are numpy.ndarrays and
st_sel is the state-turbine selection slice or array.
All arrays have shape (n_states, n_turbines).
kwargs: dict, optional
Additional arguments for TurbineModel
"""
super().__init__(**kwargs)
self.in_vars = in_vars
self.out_vars = out_vars
self.func = func
[docs]
def __repr__(self):
a = f"{self.in_vars}, {self.out_vars}"
return f"{type(self).__name__}({a})"
[docs]
def output_farm_vars(self, algo):
"""
The variables which are being modified by the model.
Parameters
----------
algo: foxes.core.Algorithm
The calculation algorithm
Returns
-------
output_vars: list of str
The output variable names
"""
return self.out_vars
[docs]
def calculate(self, algo, mdata, fdata, st_sel):
"""
The main model calculation.
This function is executed on a single chunk of data,
all computations should be based on numpy arrays.
Parameters
----------
algo: foxes.core.Algorithm
The calculation algorithm
mdata: foxes.core.MData
The model data
fdata: foxes.core.FData
The farm data
st_sel: slice or numpy.ndarray of bool
The state-turbine selection,
for shape: (n_states, n_turbines)
Returns
-------
results: dict
The resulting data, keys: output variable str.
Values: numpy.ndarray with shape (n_states, n_turbines)
"""
ins = [fdata[v] if v in fdata else mdata[v] for v in self.in_vars]
outs = self.func(*ins, st_sel=st_sel)
return {v: outs[vi] for vi, v in enumerate(self.out_vars)}