Skip to content
This repository was archived by the owner on Jan 14, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions src/badger/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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')

Expand All @@ -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')
Expand Down Expand Up @@ -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')

Expand Down Expand Up @@ -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)


Expand All @@ -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)
67 changes: 48 additions & 19 deletions src/badger/gui/default/components/filter_cbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,35 @@
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):

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()
Expand All @@ -21,7 +40,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)
Expand All @@ -35,15 +54,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)
Expand All @@ -57,16 +68,34 @@ 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)
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('')
19 changes: 17 additions & 2 deletions src/badger/gui/default/components/routine_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 = ''
Expand Down Expand Up @@ -73,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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down
16 changes: 15 additions & 1 deletion src/badger/gui/default/pages/home_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = '''
Expand All @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down