diff --git a/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio b/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio
index fc8828ed4..cef55e612 100644
--- a/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio
+++ b/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio
@@ -1 +1,100 @@
-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
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio.png b/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio.png
index 869d1069e..2095c70ca 100644
Binary files a/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio.png and b/doc/rtd/content/99_appendices/appendix2/sub/pool/mlpro_bf/bf_streams/tasks/images/MLPro-BF-Streams-Tasks-Deriver_class_diagram.drawio.png differ
diff --git a/src/mlpro/bf/streams/tasks/deriver.py b/src/mlpro/bf/streams/tasks/deriver.py
index c4cf43d31..5c575f7e0 100644
--- a/src/mlpro/bf/streams/tasks/deriver.py
+++ b/src/mlpro/bf/streams/tasks/deriver.py
@@ -9,10 +9,12 @@
## -- 2023-02-05 1.0.0 SY First version release
## -- 2024-05-10 1.0.1 DA/SY Bugfix in Deriver.__init__()
## -- 2024-05-22 1.1.0 DA Refactoring
+## -- 2024-07-17 1.1.1 SY Method Deriver._prepare_derivation(): takeover of feature
+## -- and label space from first instance
## -------------------------------------------------------------------------------------------------
"""
-Ver. 1.1.0 (2024-05-22)
+Ver. 1.1.1 (2024-07-17)
This module provides a stream task class Deriver to derive the data of instances.
"""
@@ -21,7 +23,7 @@
from mlpro.bf.exceptions import *
from mlpro.bf.various import Log
from mlpro.bf.mt import Task
-from mlpro.bf.math import Set, Element
+from mlpro.bf.math import Element
from mlpro.bf.streams import Instance, InstDict, StreamTask, Feature, Label
from mlpro.bf.physics import TransferFunction
import numpy as np
@@ -47,11 +49,7 @@ class Deriver(StreamTask):
p_visualize : bool
Boolean switch for visualisation. Default = False.
p_logging
- Log level (see constants of class Log). Default: Log.C_LOG_ALL
- p_features : list
- The list of current features in the stream. Default = None.
- p_labels : list
- The list of current labels in the stream. Default = None.
+ Log level (see constants of class Log). Default: Log.C_LOG_ALL.
p_derived_feature : Feature
A pre-selected feature that would like to be derived. Default = None.
p_derived_label : Feature
@@ -71,9 +69,7 @@ def __init__( self,
p_range_max = Task.C_RANGE_THREAD,
p_duplicate_data:bool = False,
p_visualize:bool = False,
- p_logging = Log.C_LOG_ALL,
- p_features:list = None,
- p_labels:list = None,
+ p_logging = Log.C_LOG_ALL,
p_derived_feature:Feature = None,
p_derived_label:Label = None,
p_order_derivative:int = 1,
@@ -92,29 +88,16 @@ def __init__( self,
if not isinstance(p_derived_feature, Feature):
raise ParamError('Please provide a feature to be derived')
- self._idx_feature = p_features.index(p_derived_feature)
- self._feature_space = Set()
- self._order_derivative = p_order_derivative
- self._tic = 0
- self._mem_values = []
- self._mem_time_stamp = []
-
- for feature in p_features:
- self._feature_space.add_dim(p_dim=feature)
- feature = p_derived_feature.copy()
- feature._name_short = feature._name_short + ' OD-' + str(self._order_derivative)
- feature._name_long = feature._name_long + ' OD-' + str(self._order_derivative)
- self._feature_space.add_dim(p_dim=feature)
-
- if (p_labels is not None) and (not isinstance(p_derived_label, Label)):
- self._idx_label = p_labels.index(p_derived_label)
- self._label_space = Set()
- for label in p_labels:
- self._label_space.add_dim(p_dim=label)
- label = p_derived_label.copy()
- label._name_short = label._name_short + ' OD-' + str(self._order_derivative)
- label._name_long = label._name_long + ' OD-' + str(self._order_derivative)
- self._label_space.add_dim(p_dim=label)
+ self._order_derivative = p_order_derivative
+ self._tic = 0
+ self._mem_values = []
+ self._mem_time_stamp = []
+
+ self._derived_feature = p_derived_feature
+ self._derived_label = p_derived_label
+ self._feature_space = None
+ self._label_space = None
+ self._prepared = False
self._derivative_func = DerivativeFunction(p_name='derivative_func',
p_type=TransferFunction.C_TRF_FUNC_CUSTOM,
@@ -123,6 +106,39 @@ def __init__( self,
order=self._order_derivative)
+## -------------------------------------------------------------------------------------------------
+ def _prepare_derivation(self, p_inst:Instance):
+
+ # 1 Feature space
+ features = p_inst.get_feature_data().get_dim_ids()
+ self._feature_space = type(p_inst.get_feature_data().get_related_set())()
+ self._idx_feature = features.index(self._derived_feature.get_id())
+
+ for feature in p_inst.get_feature_data().get_related_set().get_dims():
+ self._feature_space.add_dim(p_dim=feature)
+
+ feature = self._derived_feature.copy()
+ feature._name_short = feature._name_short + ' OD-' + str(self._order_derivative)
+ feature._name_long = feature._name_long + ' OD-' + str(self._order_derivative)
+ self._feature_space.add_dim(p_dim=feature)
+
+ # 2 Label space
+ try:
+ labels = p_inst.get_label_data().get_dim_ids()
+ self._label_space = type(p_inst.get_label_data().get_related_set())()
+ self._idx_label = labels.index(self._derived_label.get_id())
+
+ for label in p_inst.get_label_data().get_related_set().get_dims():
+ self._label_space.add_dim(p_dim=label)
+
+ label = self._derived_label.copy()
+ label._name_short = label._name_short + ' OD-' + str(self._order_derivative)
+ label._name_long = label._name_long + ' OD-' + str(self._order_derivative)
+ self._label_space.add_dim(p_dim=label)
+ except:
+ labels = []
+
+
## -------------------------------------------------------------------------------------------------
def _derive_data(self, p_inst:Instance):
@@ -175,7 +191,15 @@ def _derive_data(self, p_inst:Instance):
## -------------------------------------------------------------------------------------------------
- def _run(self, p_inst : InstDict ):
+ def _run(self, p_inst:InstDict):
+
+ if not self._prepared:
+ try:
+ (inst_type, inst) = next(iter(p_inst.values()))
+ self._prepare_derivation(p_inst=inst)
+ self._prepared = True
+ except:
+ return
for (inst_type,inst) in sorted(p_inst.values()):
self._derive_data(p_inst=inst)
diff --git a/test/howtos/bf/howto_bf_streams_131_stream_task_deriver.py b/test/howtos/bf/howto_bf_streams_131_stream_task_deriver.py
index eaff4c741..0f22f540b 100644
--- a/test/howtos/bf/howto_bf_streams_131_stream_task_deriver.py
+++ b/test/howtos/bf/howto_bf_streams_131_stream_task_deriver.py
@@ -9,10 +9,11 @@
## -- 2023-02-05 1.0.0 SY First version release
## -- 2023-02-07 1.1.0 SY Change the dataset to doublespiral2d
## -- 2023-02-12 1.2.0 DA New plot parameter p_view_autoselect
+## -- 2024-07-17 1.2.1 SY Refactoring due to method Deriver._prepare_derivation()
## -------------------------------------------------------------------------------------------------
"""
-Ver. 1.2.0 (2023-02-12)
+Ver. 1.2.1 (2024-07-17)
This module demonstrates the principles of stream processing with MLPro. To this regard, a stream of
a stream provider is combined with a stream workflow to a stream scenario. The workflow consists of
@@ -91,34 +92,30 @@ def _setup(self, p_mode, p_visualize: bool, p_logging):
workflow.add_task( p_task=task_rearranger )
# 2.2 Set up and add a deriver task to extend the feature and label space (1st derivative)
- features = task_rearranger._feature_space.get_dims()
derived_feature = features[0]
+ order_derivative = 1
task_deriver_1 = Deriver( p_name='T2 - Deriver 1',
p_range_max=Task.C_RANGE_THREAD,
p_visualize=p_visualize,
p_logging=p_logging,
- p_features=features,
- p_label=None,
p_derived_feature=derived_feature,
p_derived_label=None,
- p_order_derivative=1 )
+ p_order_derivative=order_derivative )
workflow.add_task( p_task=task_deriver_1, p_pred_tasks=[task_rearranger] )
# 2.3 Set up and add a deriver task to extend the feature and label space (2nd derivative)
- features = task_deriver_1._feature_space.get_dims()
derived_feature = features[0]
+ order_derivative = 2
task_deriver_2 = Deriver( p_name='T3 - Deriver 2',
p_range_max=Task.C_RANGE_THREAD,
p_visualize=p_visualize,
p_logging=p_logging,
- p_features=features,
- p_label=None,
p_derived_feature=derived_feature,
p_derived_label=None,
- p_order_derivative=2 )
+ p_order_derivative=order_derivative )
workflow.add_task( p_task=task_deriver_2, p_pred_tasks=[task_rearranger, task_deriver_1] )
diff --git a/test/howtos/oa/howto_oa_streams_pp_121_complex_preprocessing.py b/test/howtos/oa/howto_oa_streams_pp_121_complex_preprocessing.py
index 1bc91e18f..718083ebb 100644
--- a/test/howtos/oa/howto_oa_streams_pp_121_complex_preprocessing.py
+++ b/test/howtos/oa/howto_oa_streams_pp_121_complex_preprocessing.py
@@ -8,10 +8,11 @@
## -- 2023-07-27 1.0.0 LSB Creation/Release
## -- 2024-05-02 1.1.0 DA Review/minor adjustments
## -- 2024-05-12 1.2.0 DA Event-based adaption Window->BoundaryDetector added
+## -- 2024-07-19 1.2.1 SY Refactoring due to method Deriver._prepare_derivation()
## -------------------------------------------------------------------------------------------------
"""
-Ver. 1.2.0 (2024-05-12)
+Ver. 1.2.1 (2024-07-19)
This howto shows an example of complex preprocessing with parallel tasks. It addresses several
problems like feature rearanging, numerical feature derivation, data windowing, and self-adapting
@@ -86,7 +87,6 @@ def _setup(self, p_mode, p_ada: bool, p_visualize: bool, p_logging):
# 2.2 Set up and add a deriver task to extend the feature and label space (1st derivative)
- features = task1_rearranger._feature_space.get_dims()
derived_feature = features[0]
task2_deriver1 = Deriver( p_name = '2 - Deriver #1',
@@ -104,7 +104,6 @@ def _setup(self, p_mode, p_ada: bool, p_visualize: bool, p_logging):
# 2.3 Set up and add a deriver task to extend the feature and label space (2nd derivative)
- features = task2_deriver1._feature_space.get_dims()
derived_feature = features[0]
task3_deriver2 = Deriver( p_name = '3 - Deriver #2',