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 @@ -7Vxbc+K4Ev41qc1sVShfwJhHLmEmWSZnTpKd2bMvLmHL4I1teWQ5gfn1pyXLN2xuAbKZXUiKoLasvn3daskiF/owWHykKJp/Jg72LzTFWVzoowtN08xeG/5wyjKlqJpupJQZ9RxJKwgP3g8siYqkJp6D40pHRojPvKhKtEkYYptVaIhS8lLt5hK/yjVCM1wjPNjIr1O/eQ6bS8X0TA1+4RP2ZvOMtdGRKgco6y1ViefIIS8lkn59oQ8pISz9FCyG2Ofmywzz7Wb5zZ88GR9v/xt/R78Pfnu8+3qVDjbe55ZcB4pD9uqhXfv261T/dH8979492M/9YIG/y1uUZ+Qn0mBSV7bMLDijJIl2lEBK+owpw4sm/6JpNmxhQQAfJgFmdAn95F1tKdiy2nwpXNjuSdq85L3cV0jCZpaPXFgGPkjj7GEotcFQhg9sBy4Bk3AFfULFFeN7wiExuNB0RbzKJCXOQiSjqeXLxkz+FUNPK57IenGGV+kwfeigtqNFfYgJnuHQET3kWHR1dLDDtIGW6rMiSO3mXSjbLOO6Vcts09RoUnSjfk26xBEKG7lJOTknOptegtvgF9CilD59WC+A1HarFo3ugr8oiOBDOI2j1Bx10jq1Kt1uuHIRJTOK43inYY9KEuwhSjwHMY+EbyzAPUbOUkwx8JbEuGSz1O37AbQauus8tSf+9ouKY8RhhVIRHjFGvWnCsLDlmM96mM2Jc/nhmF66wy8ck8nU92yemwum45Rd5rEpl8MLIh8HMM9gZ++sdEyHvtJ9TSw2mrmUlDJOynrcHscpwiNjL5xj6gk7b/POHHGlvXjVPzD7UrzeH8cNgYoKVs2oR3VjkwjWfsEhYU8Jg8JHGCuz57gs+/tBft2kymtUruKqpP57gNYaOxwru+4q7EqNDdUyp89ZAEXpSOUpw/dmIXz2scuv8Irag1VNX5IZ4RZ/mYOVHyJk82FeYAUHNKjWQwfzUlaR5hjmtgALGIbC6TGj5AlXrgjbwJVslcOlcD3fL3VyxStXoLwc2Li6WF0O1Mv+cmFv9lq98qv9lnW+VqvzRziCSprDk5czK46DK32+SoXW1Cf2U9WJPppi/wuJPVEK6SOaapB7c7JyPfAch4+8zft5P2A/9vyMHXe2XIGr2t5ewk5lJb12aXalGpreUmEBlr3MylrtSlPN+nKto7aUtmoUrwavdjY4VYrzhXgivjM0KS1NMRVN75nip1eRRNWUlqLoitoxu/BuKGp1/Jgk1MZyyPLKeYVLpwOAVMyOpnX5j9pt78WGITrDbDubzI7ZfcR1Y1y5BaCGlqUeER8gXm8eXWkZJT/1esaq4CvxkjIooif3/usDSq8F1E06PfCIcikJ3m9MKeeYqseUrrV0s20oOoQBvLdPE1KbuewbUcuSDzbF17Ew396+qxa/eIGPQpxBTF7RS0C1eSFE107+9tzznQlakoS7OmbIfspagzmh3g8YFmVRA5dphmPNqPR44HdKtFPM9ym+ZOhWc9IExUz2gdLKR1HspTt5vEsA7vDCAWEMolkOVKlCKjVFWnpkm7FNVYZpY9tuKlKmZqfd4QPOKHI8XClt8toks+z4rWqXStzoxUvbuoWptMr9db0evqvIbwjfe76tGs58XIgCib8K/AbmME811FVGlR3yAYEhYnjA/RmfIlY622PF90SclCaBOoZ2ze6wnLa9cPbIQ2h0pRaUibhRBKCk3Eu76ALPDGWb18qGWUjOyCB2Z3DRGQkKBZiGIDHyBOAwhNILjtnuUGzvDMVl1Y37Yc1cD7WDSmrjnA0PyYauqzVnQ8eYGh3jvWZDVWtpvXJxcs6GO8RK95wNt0HR2BmK7zIbmudseEA2dBA23cZsaNgmnrrvNBtCzmnp3dJKvHvOhjvESu+cDbdB0dwZin93NozDBza+fgiwypTo9+ubZai3r8x6cTjC1AN1gHj5wChGwSOKnz6ck+SGJLktrR0liY7FqxGZe50FWn/mZ+XQj27UM5OuNGUmc/sm18+TCZvjpF4YDq27/ufri6F20RcHVDhR+UVGzy+1eJGPmHZ6rlRNe+162uMkAve6vkDlHDIoDhtSYTXlDfgpGqXV4clPG0JbLdqvyIebE8ohCbEZZcZ6kB2WA3coCf9F09yR3NrRdnPrEWa2324H1AlM5c+HL973m6/LP2+fvzY897AsL/SYZV2mMRtZIQrEk3ZxLAysk0fxHQFv8wNnoLWucmMXYX7Ah8iikAKxFaBFzopPrq2hdd+/+3htPUJx0R81cj7Be2Q5SeQDRBm2HIBWboopIX4u4Bj5sTDGMSxwfIs+e3ECgfcDb5H+6Ix9MoOaYZZzmpAZ+HHyn49WfzJ5Oxe6GLEESpxcfd+L2XYgH/6urQgi0tG+YhzqBEfMtk5mhZz7uNR+EwGE9jn7Sd46KXNCgX0qAmIgRs4/fQiXcldPwPrXXyPr6QWKZu7v+tLgZy91aod25NGck82VuxbaeTV89Nmy/hTIokl4ydWFWVOGMofWDTRGns3+8Y53sIsS/7SVr7aj37Xu4W5P9OdeQlEc6FEQhMawt7jtNjwakhlNFASF++GtggAU2jhNBf9sELxJ9Gvt7o4w0E8U/eu/XJN/QaXviCN4bkLZXGwOlQoPcYIWyAWVI0Ici4RyjGsaJgHACtzv85aAWFo74QXUCenHYsCmr8esgKzYnuHrp6ZzmOvPclZBp21aqh3+LDAkYuFY2UA61QZON8snyxUQlTdU2g3A6h5hWgl95ykcPfUWmuUOjLtvn42bTw1fbxvl1co4CW35FZWsOLmcuq1ovow9O249wlopdjHNur2rHci2ct6BPAGATaUK4HZn18JI2YDgn24HsjGUtPMmVQlvG7PNzjNvg7tPtUfVKHD9nKIVY2a5MuVZoDECTpjGaSmWr7hKGx3/2urrSBAw364Eb5S4YeVlJzFMAzkMsjI84vNSP91YGQoavIkdxZycQSNtnaFxEDS6nbcryxslNmou5OfZszoHLDUnMxIi/7qgrlQNRZ8JEZmcJ/K/MGNLWcigBIr3ypQBFTn7o/T5f3wo8FDaGi3kyKKxzBohqPtHuVG6izeL20Qru293j26qL9Iz7xuWN9I/6an17QjZ+qUBiv10v63otJf3oVn814q0Pij++4d+/X8= \ 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',