From 3c178f27db6a3b97164b51a7c70db05199660e79 Mon Sep 17 00:00:00 2001 From: Jannik Woehnert Date: Thu, 7 Dec 2023 12:57:50 +0100 Subject: [PATCH 1/5] adapt module loading from plugins for tags --- src/badger/factory.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/badger/factory.py b/src/badger/factory.py index e2c9fc6..a8b4967 100644 --- a/src/badger/factory.py +++ b/src/badger/factory.py @@ -39,9 +39,9 @@ def scan_plugins(root): # Do not scan local algorithms if option disabled if LOAD_LOCAL_ALGO: - ptype_list = ['algorithm', 'interface', 'environment'] + ptype_list = ['algorithm', 'interface', 'environment', 'tag'] else: - ptype_list = ['interface', 'environment'] + ptype_list = ['interface', 'environment', 'tag'] factory['algorithm'] = {} for ptype in ptype_list: @@ -65,7 +65,7 @@ def scan_plugins(root): def load_plugin(root, pname, ptype): assert ptype in ['algorithm', 'interface', - 'environment'], f'Invalid plugin type {ptype}' + 'environment', 'tag'], f'Invalid plugin type {ptype}' proot = os.path.join(root, f'{ptype}s') @@ -89,6 +89,8 @@ def load_plugin(root, pname, ptype): if ptype == 'algorithm': plugin = [module.optimize, configs] + if ptype == 'tag': + plugin = [module.machine_tags, configs] elif ptype == 'interface': params = module.Interface.model_json_schema()['properties'] params = {name: get_value_or_none(info, 'default') @@ -135,7 +137,7 @@ def load_plugin(root, pname, ptype): def load_docs(root, pname, ptype): assert ptype in ['algorithm', 'interface', - 'environment'], f'Invalid plugin type {ptype}' + 'environment', 'tag'], f'Invalid plugin type {ptype}' proot = os.path.join(root, f'{ptype}s') @@ -237,10 +239,12 @@ def get_intf(name): def get_env(name): return get_plug(BADGER_PLUGIN_ROOT, name, 'environment') +def get_tag(name): + return get_plug(BADGER_PLUGIN_ROOT, name, 'tag') + def list_algo(): algos = list(generators.keys()) - return sorted(algos) @@ -251,6 +255,9 @@ def list_intf(): def list_env(): return sorted(BADGER_FACTORY['environment']) +def list_tag(): + return sorted(BADGER_FACTORY['tag']) + BADGER_FACTORY = scan_plugins(BADGER_PLUGIN_ROOT) BADGER_EXTENSIONS = scan_extensions(BADGER_PLUGIN_ROOT) From 933c89049413c45bc13b037e710229dd50ce9bdc Mon Sep 17 00:00:00 2001 From: Jannik Woehnert Date: Thu, 7 Dec 2023 13:19:36 +0100 Subject: [PATCH 2/5] adapt filter widget --- .../gui/default/components/filter_cbox.py | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/badger/gui/default/components/filter_cbox.py b/src/badger/gui/default/components/filter_cbox.py index 3f0505f..ff172b9 100644 --- a/src/badger/gui/default/components/filter_cbox.py +++ b/src/badger/gui/default/components/filter_cbox.py @@ -5,13 +5,29 @@ class BadgerFilterBox(CollapsibleBox): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + def __init__(self, parent=None, title="", tags = []): + super().__init__(parent, title) + + self.tags = tags self.init_ui() def init_ui(self): vbox = QVBoxLayout() + + # Machine filter + mach = QWidget() + hbox_mach = QHBoxLayout(mach) + hbox_mach.setContentsMargins(0, 0, 0, 0) + lbl = QLabel('Machine') + lbl.setFixedWidth(64) + self.cb_mach = cb_mach = QComboBox() + cb_mach.setItemDelegate(QStyledItemDelegate()) + cb_mach.addItems(['']+self.tags) + cb_mach.setCurrentIndex(-1) + hbox_mach.addWidget(lbl) + hbox_mach.addWidget(cb_mach, 1) + vbox.addWidget(mach) # Obj filter obj = QWidget() @@ -21,7 +37,7 @@ def init_ui(self): lbl.setFixedWidth(64) self.cb_obj = cb_obj = QComboBox() cb_obj.setItemDelegate(QStyledItemDelegate()) - cb_obj.addItems(['', 'HXR', 'SXR']) + cb_obj.addItems(['']) cb_obj.setCurrentIndex(-1) hbox_obj.addWidget(lbl) hbox_obj.addWidget(cb_obj, 1) @@ -35,15 +51,7 @@ def init_ui(self): lbl.setFixedWidth(64) self.cb_reg = cb_reg = QComboBox() cb_reg.setItemDelegate(QStyledItemDelegate()) - cb_reg.addItems([ - '', - 'LI21:201, 211, 271, 278', - 'LI26:201, 301, 401, 501', - 'LI26:601, 701, 801, 901', - 'IN20:361, 371, 425, 441, 511, 525', - 'LTUH:620, 640, 660, 680', - 'LTUS:620, 640, 660, 680', - ]) + cb_reg.addItems(['']) cb_reg.setCurrentIndex(-1) hbox_reg.addWidget(lbl) hbox_reg.addWidget(cb_reg, 1) @@ -57,13 +65,7 @@ def init_ui(self): lbl.setFixedWidth(64) self.cb_gain = cb_gain = QComboBox() cb_gain.setItemDelegate(QStyledItemDelegate()) - cb_gain.addItems([ - '', - '1', - '2', - '4', - '8', - ]) + cb_gain.addItems(['']) cb_gain.setCurrentIndex(-1) hbox_gain.addWidget(lbl) hbox_gain.addWidget(cb_gain, 1) From 4777ccbf39a28541373e8aa3470bbd5c44f4220d Mon Sep 17 00:00:00 2001 From: Jannik Woehnert Date: Thu, 7 Dec 2023 15:28:41 +0100 Subject: [PATCH 3/5] prepare Tags Widget for routine_page - create action for change of machine tag (other tags choice change) - adapt refresh_ui to also update machine tag - outsource machine tag change to GUI Widget bc. home_page.py needs same functionality (debatable choice) --- .../gui/default/components/filter_cbox.py | 27 +++++++++++++++++++ .../gui/default/components/routine_page.py | 17 +++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/badger/gui/default/components/filter_cbox.py b/src/badger/gui/default/components/filter_cbox.py index ff172b9..41107f6 100644 --- a/src/badger/gui/default/components/filter_cbox.py +++ b/src/badger/gui/default/components/filter_cbox.py @@ -2,6 +2,9 @@ from PyQt5.QtWidgets import QComboBox, QStyledItemDelegate, QLabel from .collapsible_box import CollapsibleBox +#TODO: verify import structur. Should get_tag function be called from routine_page.py/home_page.py? +from ....factory import get_tag + class BadgerFilterBox(CollapsibleBox): @@ -72,3 +75,27 @@ def init_ui(self): vbox.addWidget(gain) self.setContentLayout(vbox) + + def select_machine(self, machine: str): + if machine == "": + self.reset_tags() + self.cb_obj.setCurrentIndex(-1) + self.cb_reg.setCurrentIndex(-1) + self.cb_gain.setCurrentIndex(-1) + else: + tag_dict = get_tag(machine) + self.reset_tags() + + self.cb_obj.addItems(tag_dict['objective']) + self.cb_reg.addItems(tag_dict['region']) + self.cb_gain.addItems(tag_dict['gain']) + + + def reset_tags(self): + self.cb_obj.clear() + self.cb_reg.clear() + self.cb_gain.clear() + + self.cb_obj.addItem('') + self.cb_reg.addItem('') + self.cb_gain.addItem('') diff --git a/src/badger/gui/default/components/routine_page.py b/src/badger/gui/default/components/routine_page.py index 931a3c2..9b3aa5a 100644 --- a/src/badger/gui/default/components/routine_page.py +++ b/src/badger/gui/default/components/routine_page.py @@ -6,7 +6,7 @@ import numpy as np import pandas as pd from coolname import generate_slug -from ....factory import list_algo, list_env, get_algo, get_env +from ....factory import list_algo, list_env, list_tag, get_algo, get_env, get_tag from ....utils import ystring, load_config, config_list_to_dict, strtobool from ....core import normalize_routine, instantiate_env, list_scaling_func, get_scaling_default_params from ....db import save_routine, remove_routine @@ -38,6 +38,7 @@ def __init__(self): self.algos = list_algo() self.envs = list_env() + self.machine_tags = list_tag() self.env = None self.routine = None self.script = '' @@ -108,6 +109,8 @@ def config_logic(self): self.env_box.btn_add_curr.clicked.connect(self.fill_curr_in_init_table) self.env_box.btn_clear.clicked.connect(self.clear_init_table) self.env_box.btn_add_row.clicked.connect(self.add_row_to_init_table) + self.cbox_tags.cb_mach.currentIndexChanged.connect(self.select_machine_tag) + def refresh_ui(self, routine): self.routine = routine # save routine for future reference @@ -210,6 +213,11 @@ def refresh_ui(self, routine): tags = routine['config']['tags'] except: tags = {} + try: + self.cbox_tags.cb_mach.setCurrentIndex(tags['machine']) + self.select_machine_tag(self.machine_tags.index(tags['machine'])) + except: + self.cbox_tags.cb_mach.setCurrentIndex(0) try: self.cbox_tags.cb_obj.setCurrentText(tags['objective']) except: @@ -431,6 +439,13 @@ def add_row_to_init_table(self): for col in range(table.columnCount()): item = QTableWidgetItem('') table.setItem(row_position, col, item) + + def select_machine_tag(self, i): + if i <= 0: + machine_tag = "" + else: + machine_tag = self.machine_tags[i-1] # empty string from Combobox not in machine_tags + self.cbox_tags.select_machine(machine_tag) def open_playground(self): pass From d65bdbfcced4ede82d76e5a4629f8c0e38d31087 Mon Sep 17 00:00:00 2001 From: Jannik Woehnert Date: Fri, 8 Dec 2023 10:25:23 +0100 Subject: [PATCH 4/5] adjust parameters of filter_cbox object initialisation --- src/badger/gui/default/components/routine_page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/badger/gui/default/components/routine_page.py b/src/badger/gui/default/components/routine_page.py index 9b3aa5a..0f53191 100644 --- a/src/badger/gui/default/components/routine_page.py +++ b/src/badger/gui/default/components/routine_page.py @@ -74,7 +74,7 @@ def init_ui(self): vbox_meta.addWidget(name, alignment=Qt.AlignTop) # Tags - self.cbox_tags = cbox_tags = BadgerFilterBox(title=' Tags') + self.cbox_tags = cbox_tags = BadgerFilterBox(parent=None, title=" Tags", tags = self.machine_tags) if not strtobool(read_value('BADGER_ENABLE_ADVANCED')): cbox_tags.hide() vbox_meta.addWidget(cbox_tags, alignment=Qt.AlignTop) From 5515d21cf3fb83cd9cefea9bcb20d94f0ed9668a Mon Sep 17 00:00:00 2001 From: Jannik Woehnert Date: Fri, 8 Dec 2023 10:35:28 +0100 Subject: [PATCH 5/5] Adjust home_page.py - connect signal of machine Combobox - update filters when machine changes - add filter to get_current_routines --- src/badger/gui/default/pages/home_page.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/badger/gui/default/pages/home_page.py b/src/badger/gui/default/pages/home_page.py index 93e6c87..016a167 100644 --- a/src/badger/gui/default/pages/home_page.py +++ b/src/badger/gui/default/pages/home_page.py @@ -18,6 +18,7 @@ from ....archive import load_run, delete_run from ....utils import get_header, strtobool from ....settings import read_value +from ....factory import get_tag, list_tag stylesheet = ''' @@ -44,6 +45,8 @@ def __init__(self): self.mode = 'regular' # home page mode self.splitter_state = None # store the run splitter state self.tab_state = None # store the tabs state before creating new routine + + self.machine_tags = list_tag() self.init_ui() self.config_logic() @@ -100,7 +103,7 @@ def init_ui(self): vbox_routine.addWidget(panel_search) # Filters - self.filter_box = filter_box = BadgerFilterBox(self, title=' Filters') + self.filter_box = filter_box = BadgerFilterBox(self, parent=None, title=" Filters", tags = self.machine_tags) if not strtobool(read_value('BADGER_ENABLE_ADVANCED')): filter_box.hide() vbox_routine.addWidget(filter_box) @@ -211,6 +214,8 @@ def config_logic(self): self.run_table.cellClicked.connect(self.solution_selected) self.run_table.itemSelectionChanged.connect(self.table_selection_changed) + self.filter_box.cb_mach.currentIndexChanged.connect(self.select_machine_tag) + self.filter_box.cb_mach.currentIndexChanged.connect(self.refresh_routine_list) self.filter_box.cb_obj.currentIndexChanged.connect(self.refresh_routine_list) self.filter_box.cb_reg.currentIndexChanged.connect(self.refresh_routine_list) self.filter_box.cb_gain.currentIndexChanged.connect(self.refresh_routine_list) @@ -304,12 +309,21 @@ def build_routine_list(self, routines, timestamps): _item.activate() self.prev_routine = item + def select_machine_tag(self, i): + if i <= 0: + machine_tag = "" + else: + machine_tag = self.machine_tags[i-1] # empty string from Combobox not in machine_tags + self.filter_box.select_machine(machine_tag) + def get_current_routines(self): keyword = self.sbar.text() + tag_mach = self.filter_box.cb_mach.currentText() tag_obj = self.filter_box.cb_obj.currentText() tag_reg = self.filter_box.cb_reg.currentText() tag_gain = self.filter_box.cb_gain.currentText() tags = {} + if tag_mach: tags['machine'] = tag_mach if tag_obj: tags['objective'] = tag_obj if tag_reg: tags['region'] = tag_reg if tag_gain: tags['gain'] = tag_gain