def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Remove Experiment') self.widget = {} self.widget['exp_name'] = create_widget('labeled_combobox', master=self.window, row=0, column=0, columnspan=2, text='Experiment name', required=True) self.widget['remove'] = create_widget('button', master=self.window, row=1, column=0, text='Remove') self.widget['cancel'] = create_widget('button', master=self.window, row=1, column=1, text='Cancel') center(self.window, self.master_window)
def create_constraint_widget(self): ''' ''' self.widget['constraint']['n_constr'] = create_widget( 'labeled_spinbox', master=self.frame['constraint'], row=0, column=0, text='Number of constraints', from_=0, to=int(1e10)) self.widget['constraint']['browse_constr_func'], self.widget[ 'constraint']['disp_constr_func'] = create_widget( 'labeled_button_entry', master=self.frame['constraint'], row=1, column=0, label_text='Path to constraint function', button_text='Browse', width=30) def _set_constr_func(): ''' ''' filename = tk.filedialog.askopenfilename(parent=self.window) if not isinstance(filename, str) or filename == '': return self.widget['constraint']['disp_constr_func'].set(filename) self.widget['constraint']['disp_constr_func'].widget.xview_moveto( 1) self.widget['constraint']['browse_constr_func'].configure( command=_set_constr_func)
def __init__(self, root_view, module): self.root_view = root_view.module_frames[module] self.module = module self.widget = {} self.label = {} self.frame = create_widget('frame', master=self.root_view, row=0, column=0) grid_configure(self.frame, None, 0) self.widget['name'] = create_widget('labeled_combobox', master=self.frame, row=0, column=0, width=20, text='Name', values=get_hp_class_names(module), required=True) self._create_param_frame() self.curr_name = None self.class_map = { bool: None, int: 'int', float: 'float', str: 'string', }
def __init__(self, root_view): self.root_view = root_view self.widget = {} frame_log = create_widget('labeled_frame', master=self.root_view.root, row=2, column=1, text='Log') grid_configure(frame_log, 0, 0) # log display self.widget['log'] = create_widget('text', master=frame_log, row=0, column=0) self.widget['log'].disable() self.widget['clear'] = create_widget('button', master=frame_log, row=1, column=0, text='Clear')
def activate(self, module_class): row_num = 0 for param_name, param_dict in get_hp_params(self.module, module_class).items(): if param_name == '__name__': continue assert 'dtype' in param_dict, f'Data type of parameter {param_name} is not specified' class_type = self.class_map[param_dict['dtype']] assert 'default' in param_dict, f'Default value of parameter {param_name} is not specified' if 'choices' in param_dict: self.label[param_name], self.widget[ param_name] = create_widget('labeled_combobox', master=self.frame_param, row=row_num, column=0, width=5, text=param_name, class_type=class_type, values=param_dict['choices'], default=param_dict['default'], return_label=True) elif param_dict['dtype'] == bool: self.label[param_name], self.widget[ param_name] = create_widget('checkbutton', master=self.frame_param, row=row_num, column=0, text=param_name, default=param_dict['default'], return_label=True) elif param_dict['dtype'] in [int, float]: valid_check = param_dict[ 'constr'] if 'constr' in param_dict else None self.label[param_name], self.widget[ param_name] = create_widget('labeled_entry', master=self.frame_param, row=row_num, column=0, text=param_name, class_type=class_type, default=param_dict['default'], valid_check=valid_check, return_label=True) else: raise Exception( f'Hyperparameter setting for {param_name} is not supported' ) row_num += 1
def __init__(self, root_view, n_obj): self.root_view = root_view self.master_window = self.root_view.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Export Figures') self.widget = {} if n_obj == 1: text_list = [ 'Performance Space', 'Selected Design', 'Optimum', 'Model Error' ] else: text_list = [ 'Performance Space', 'Selected Design', 'Hypervolume', 'Model Error' ] self.widget['choice'] = create_widget('radiobutton', master=self.window, row=0, column=0, text_list=text_list, default='Performance Space', orientation='vertical') frame_action = create_widget('frame', master=self.window, row=1, column=0, padx=0, pady=0, sticky=None) self.widget['export'] = create_widget('button', master=frame_action, row=0, column=0, text='Export') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window)
def __init__(self, root): self.root = root frame_init = create_widget('frame', master=self.root, row=0, column=0) create_widget('logo', master=frame_init, row=0, column=0, rowspan=4) self.widget = {} self.widget['manage_problem'] = create_widget('button', master=frame_init, row=0, column=1, text='Manage Problem') self.widget['create_experiment'] = create_widget( 'button', master=frame_init, row=1, column=1, text='Create Experiment') self.widget['load_experiment'] = create_widget('button', master=frame_init, row=2, column=1, text='Load Experiment') self.widget['remove_experiment'] = create_widget( 'button', master=frame_init, row=3, column=1, text='Remove Experiment')
def __init__(self, root_view, obj_name): self.root_view = root_view self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Enter Performance') n_obj = len(obj_name) self.widget = {} frame_n_row = create_widget('frame', master=self.window, row=0, column=0, sticky=None, pady=0) self.widget['disp_n_row'] = create_widget('labeled_spinbox', master=frame_n_row, row=0, column=0, text='Number of rows', from_=1, to=int(1e10)) self.widget['set_n_row'] = create_widget('button', master=frame_n_row, row=0, column=1, text='Update') self.widget['performance_excel'] = Excel(master=self.window, rows=1, columns=n_obj + 1, width=10, title=['Row number'] + list(obj_name), dtype=[int] + [float] * n_obj, default=None, required=[True] * (n_obj + 1), required_mark=False) self.widget['performance_excel'].grid(row=1, column=0) frame_action = create_widget('frame', master=self.window, row=2, column=0, sticky=None, pady=0) self.widget['save'] = create_widget('button', master=frame_action, row=0, column=0, text='Save') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window)
def _create_param_frame(self): self.frame_param = create_widget('frame', master=self.frame, row=1, column=0, padx=0, pady=0, sticky='NSEW') grid_configure(self.frame_param, None, 0)
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Start Evaluation') self.widget = {} frame_n_row = create_widget('frame', master=self.window, row=0, column=0, sticky=None, pady=0) self.widget['disp_n_row'] = create_widget('labeled_spinbox', master=frame_n_row, row=0, column=0, text='Number of rows', from_=1, to=int(1e10)) self.widget['set_n_row'] = create_widget('button', master=frame_n_row, row=0, column=1, text='Update') self.widget['rowid_excel'] = Excel(master=self.window, rows=1, columns=1, width=10, title=['Row number'], dtype=[int], default=None, required=[True], required_mark=False) self.widget['rowid_excel'].grid(row=1, column=0) frame_action = create_widget('frame', master=self.window, row=2, column=0, sticky=None, pady=0) self.widget['start'] = create_widget('button', master=frame_action, row=0, column=0, text='Start') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window)
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.window self.window = create_widget('toplevel', master=self.master_window, title='Advanced Settings') self.widget = {} self.cfg_widget = {} # parameter section frame_param_algo = create_widget('frame', master=self.window, row=0, column=0) self.nb_param = ttk.Notebook(master=frame_param_algo) self.nb_param.grid(row=0, column=0, sticky='NSEW') self.module_frames = {} for module in ['surrogate', 'acquisition', 'solver', 'selection']: frame = tk.Frame(master=self.nb_param) self.nb_param.add(child=frame, text=module.capitalize()) grid_configure(frame, None, 0) self.module_frames[module] = frame self.nb_param.bind("<<NotebookTabChanged>>", self._change_tab) # action section frame_action = tk.Frame(master=self.window) frame_action.grid(row=1, column=0) self.widget['save'] = create_widget('button', master=frame_action, row=0, column=0, text='Save') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window)
def __init__(self, root_view, exp_name, problem_name): self.root_view = root_view self.widget = {} frame_info = create_widget('labeled_frame', master=self.root_view.root, row=0, column=1, text='Experiment') grid_configure(frame_info, 0, 0) create_widget('label', master=frame_info, row=0, column=0, text=f'Name: {exp_name}') create_widget('label', master=frame_info, row=1, column=0, text=f'Problem: {problem_name}') self.widget['update'] = create_widget('button', master=frame_info, row=2, column=0, text='Update Config')
def create_general_widget(self): ''' ''' self.widget['general']['name'] = create_widget( 'labeled_entry', master=self.frame['general'], row=0, column=0, text='Problem name', class_type='string', width=10, required=True, valid_check=lambda x: not x.startswith('"'), error_msg='problem name cannot start with "') self.widget['general']['type'] = create_widget( 'labeled_combobox', master=self.frame['general'], row=1, column=0, text='Problem type', values=['continuous', 'integer', 'binary', 'categorical', 'mixed'], required=True)
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Display Settings') frame_settings = create_widget('frame', master=self.window, row=0, column=0, padx=0, pady=0) grid_configure(frame_settings, 1, 0) self.widget = {} self.widget['cellwidth'] = create_widget('labeled_spinbox', master=frame_settings, row=0, column=0, text='Cell width:', from_=50, to=300, sticky='NSEW') self.widget['precision'] = create_widget('labeled_spinbox', master=frame_settings, row=1, column=0, text='Float precision:', from_=0, to=100, sticky='NSEW') frame_action = create_widget('frame', master=frame_settings, row=2, column=0, padx=0, pady=0) grid_configure(frame_action, 0, 1) self.widget['update'] = create_widget('button', master=frame_action, row=0, column=0, text='Update') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window)
def __init__(self, root_view, n_obj): self.root_view = root_view self.master_window = self.root_view.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Export Statistics') self.widget = {} if n_obj == 1: self.widget['choice'] = create_widget( 'radiobutton', master=self.window, row=0, column=0, text_list=['Optimum', 'Model Error'], default='Optimum') else: self.widget['choice'] = create_widget( 'radiobutton', master=self.window, row=0, column=0, text_list=['Hypervolume', 'Model Error'], default='Hypervolume') frame_action = create_widget('frame', master=self.window, row=1, column=0, padx=0, pady=0, sticky=None) self.widget['export'] = create_widget('button', master=frame_action, row=0, column=0, text='Export') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window)
def __init__(self, root_view): self.root_view = root_view # control overall frame frame_control = create_widget('labeled_frame', master=self.root_view.root, row=1, column=1, text='Optimization') grid_configure(frame_control, 2, 0) self.widget = {} self.widget['mode'] = create_widget('radiobutton', master=frame_control, row=0, column=0, text_list=['Manual', 'Auto'], default='Manual') self.widget['batch_size'] = create_widget('labeled_spinbox', master=frame_control, row=1, column=0, text='Batch size', from_=1, to=int(1e10), required=True, required_mark=False) frame_manual = create_widget('frame', master=frame_control, row=2, column=0, padx=0, pady=0) frame_auto = create_widget('frame', master=frame_control, row=2, column=0, padx=0, pady=0) grid_configure(frame_manual, 0, 0) grid_configure(frame_auto, 1, 0) frame_auto.grid_remove() def set_manual(): frame_auto.grid_remove() frame_manual.grid() def set_auto(): frame_manual.grid_remove() frame_auto.grid() for text, button in self.widget['mode'].widget.items(): if text == 'Manual': button.configure(command=set_manual) elif text == 'Auto': button.configure(command=set_auto) else: raise Exception() self.widget['set_stop_cri'] = create_widget('button', master=frame_auto, row=0, column=0, text='Set Stopping Criterion', pady=5, sticky='EW') self.widget['set_stop_cri'].disable() # manual command frame_manual_action = create_widget('frame', master=frame_manual, row=0, column=0, padx=0, pady=0, sticky='EW') grid_configure(frame_manual_action, 0, 1) self.widget['optimize_manual'] = create_widget('button', master=frame_manual_action, row=0, column=0, text='Optimize') self.widget['stop_manual'] = create_widget('button', master=frame_manual_action, row=0, column=1, text='Stop') # auto command frame_auto_action = create_widget('frame', master=frame_auto, row=1, column=0, padx=0, pady=0, sticky='EW') grid_configure(frame_auto_action, 0, 1) self.widget['optimize_auto'] = create_widget('button', master=frame_auto_action, row=0, column=0, text='Optimize') self.widget['stop_auto'] = create_widget('button', master=frame_auto_action, row=0, column=1, text='Stop')
def __init__(self, root_view, first_time): self.root_view = root_view title = 'Create Experiment' if first_time else 'Update Config' self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, title=title) self.frame = {} self.widget = {} if first_time: # experiment section self.frame['exp'] = create_widget('frame', master=self.window, row=0, column=0, padx=2 * PADX) grid_configure(self.frame['exp'], 0, 0) self.widget['exp_name'] = create_widget( 'labeled_entry', master=self.frame['exp'], row=0, column=0, text='Experiment name', class_type='string', width=10, required=True, valid_check=lambda x: not x.startswith('sqlite_'), error_msg='experiment name cannot start with sqlite_') self.widget['cfg_input_type'] = create_widget( 'labeled_radiobutton', master=self.frame['exp'], row=1, column=0, label_text='Create config by', button_text_list=['User interface', 'Loading from file']) # enter config section self.frame['enter'] = tk.Frame(master=self.window) self.frame['enter'].grid(row=1 if first_time else 0, column=0, sticky='NSEW') grid_configure(self.frame['enter'], 0, 0) nb_cfg = ttk.Notebook(self.frame['enter']) nb_cfg.grid(row=0, column=0, sticky='NSEW') if first_time: # problem subsection frame_problem = tk.Frame(master=nb_cfg) grid_configure(frame_problem, 0, 0) nb_cfg.add(child=frame_problem, text='Problem') self.widget['problem_name'] = create_widget( 'labeled_combobox', master=frame_problem, row=0, column=0, text=config_map['problem']['name'], values=get_problem_list(), width=15, required=True) self.widget['init_type'] = create_widget( 'labeled_radiobutton', master=frame_problem, row=1, column=0, label_text='Initialization', button_text_list=['Random', 'From file'], default='Random') frame_random_init = create_widget('frame', master=frame_problem, row=2, column=0, padx=0, pady=0) frame_provided_init = create_widget('frame', master=frame_problem, row=2, column=0, padx=0, pady=0) grid_configure(frame_random_init, 0, 0) grid_configure(frame_provided_init, 0, 0) self.widget['n_init'] = create_widget( 'labeled_spinbox', master=frame_random_init, row=0, column=0, text=config_map['experiment']['n_random_sample'], from_=2, to=int(1e10), required=True) self.widget['set_x_init'], self.widget[ 'disp_x_init'] = create_widget( 'labeled_button_entry', master=frame_provided_init, row=0, column=0, label_text='Path of initial design variables', button_text='Browse', width=30, required=True, valid_check=lambda x: os.path.exists(x), error_msg='file of initial design variables does not exist' ) self.widget['set_y_init'], self.widget[ 'disp_y_init'] = create_widget( 'labeled_button_entry', master=frame_provided_init, row=1, column=0, label_text='Path of initial performance values', button_text='Browse', width=30, valid_check=lambda x: os.path.exists(x), error_msg= 'file of initial performance values does not exist') def set_random_init(): frame_provided_init.grid_remove() frame_random_init.grid() def set_provided_init(): frame_random_init.grid_remove() frame_provided_init.grid() for text, button in self.widget['init_type'].widget.items(): if text == 'Random': button.configure(command=set_random_init) elif text == 'From file': button.configure(command=set_provided_init) else: raise NotImplementedError set_random_init() # optimization subsection frame_opt = tk.Frame(master=nb_cfg) grid_configure(frame_opt, 0, 0) nb_cfg.add(child=frame_opt, text='Optimization') self.widget['algo_name'] = create_widget( 'labeled_combobox', master=frame_opt, row=0, column=0, text=config_map['algorithm']['name'], values=get_algorithm_list(), required=True) self.widget['n_process'] = create_widget( 'labeled_spinbox', master=frame_opt, row=1, column=0, text=config_map['algorithm']['n_process'], from_=1, to=int(1e10), default=cpu_count()) self.widget['async'] = create_widget( 'labeled_combobox', master=frame_opt, row=2, column=0, text=config_map['algorithm']['async'], default='None', values=get_hp_class_names('async')) self.widget['set_advanced'] = create_widget('button', master=frame_opt, row=3, column=0, text='Advanced Settings', sticky=None) # evaluation subsection frame_eval = tk.Frame(master=nb_cfg) grid_configure(frame_eval, 0, 0) nb_cfg.add(child=frame_eval, text='Evaluation') self.widget['n_worker'] = create_widget( 'labeled_spinbox', master=frame_eval, row=0, column=0, text=config_map['experiment']['n_worker'], from_=1, to=int(1e10)) # load config section if first_time: self.frame['load'] = create_widget('frame', master=self.window, row=1, column=0, padx=2 * PADX) grid_configure(self.frame['load'], 0, 0) self.widget['set_cfg_path'], self.widget[ 'disp_cfg_path'] = create_widget( 'labeled_button_entry', master=self.frame['load'], row=0, column=0, label_text='Path of config file', button_text='Browse', width=30, required=True, valid_check=lambda x: os.path.exists(x), error_msg='config file does not exist') def set_enter_input(): self.frame['load'].grid_remove() self.frame['enter'].grid() self.widget['save'].enable() def set_load_input(): self.frame['enter'].grid_remove() self.frame['load'].grid() self.widget['save'].enable() for text, button in self.widget['cfg_input_type'].widget.items(): if text == 'User interface': button.configure(command=set_enter_input) elif text == 'Loading from file': button.configure(command=set_load_input) else: raise NotImplementedError self.frame['enter'].grid_remove() self.frame['load'].grid_remove() # action section frame_action = tk.Frame(master=self.window) frame_action.grid(row=2 if first_time else 1, column=0, columnspan=3) self.widget['save'] = create_widget( 'button', master=frame_action, row=0, column=0, text='Create' if first_time else 'Update') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window) self.cfg_widget = {} if first_time: self.cfg_widget.update({ 'problem': { 'name': self.widget['problem_name'], }, }) self.cfg_widget.update({ 'algorithm': { 'name': self.widget['algo_name'], 'n_process': self.widget['n_process'], 'async': self.widget['async'], }, 'experiment': { 'n_worker': self.widget['n_worker'], }, })
def create_performance_widget(self): ''' ''' frame_n_obj = create_widget('frame', master=self.frame['performance'], row=0, column=0) frame_excel = create_widget('frame', master=self.frame['performance'], row=1, column=0) frame_obj_func = create_widget('frame', master=self.frame['performance'], row=2, column=0) self.widget['performance']['disp_n_obj'] = create_widget( 'labeled_spinbox', master=frame_n_obj, row=0, column=0, text='Number of objectives', from_=1, to=int(1e10), required=True) self.widget['performance']['set_n_obj'] = create_widget( 'button', master=frame_n_obj, row=0, column=1, text='Set') self.widget['performance']['browse_obj_func'], self.widget[ 'performance']['disp_obj_func'] = create_widget( 'labeled_button_entry', master=frame_obj_func, row=0, column=0, label_text='Path to objective function', button_text='Browse', width=30) def _set_n_obj(): ''' ''' n_obj, success = self._try_get_val( self.widget['performance']['disp_n_obj'], 'Number of objectives') if not success: return if 'excel' in self.widget['performance']: self.widget['performance']['excel'].grid_remove() self.widget['performance']['excel'] = Excel( master=frame_excel, rows=n_obj, columns=2, width=15, title=['Name', 'Type'], dtype=[str, str], required=[True, True], valid_check=[ lambda x: not (x.startswith('_') or x.startswith('"')), lambda x: x in ['min', 'max'] ]) self.widget['performance']['excel'].grid(row=0, column=0) self.widget['performance']['excel'].set_column( 0, [f'f{i}' for i in range(1, n_obj + 1)]) self.widget['performance']['excel'].set_column(1, ['min'] * n_obj) self.widget['next'].enable() def _set_obj_func(): ''' ''' filename = tk.filedialog.askopenfilename(parent=self.window) if not isinstance(filename, str) or filename == '': return self.widget['performance']['disp_obj_func'].set(filename) self.widget['performance']['disp_obj_func'].widget.xview_moveto(1) self.widget['performance']['set_n_obj'].configure(command=_set_n_obj) self.widget['performance']['browse_obj_func'].configure( command=_set_obj_func) self.widget['next'].disable()
def create_unified_design_widget(self, problem_type): ''' ''' frame_n_var = create_widget('frame', master=self.frame['design_unified'], row=0, column=0, padx=0, pady=0, sticky=None) frame_excel = create_widget('frame', master=self.frame['design_unified'], row=1, column=0) self.widget['design_unified']['disp_n_var'] = create_widget( 'labeled_spinbox', master=frame_n_var, row=0, column=0, text='Number of variables', from_=1, to=int(1e10), required=True) self.widget['design_unified']['set_n_var'] = create_widget( 'button', master=frame_n_var, row=0, column=1, text='Set') def _set_n_var(): ''' ''' n_var, success = self._try_get_val( self.widget['design_unified']['disp_n_var'], 'Number of variables') if not success: return if 'excel' in self.widget['design_unified']: self.widget['design_unified']['excel'].grid_remove() valid_naming_cond = lambda x: not (x.startswith('_') or x. startswith('"')) if problem_type == 'continuous': self.widget['design_unified']['excel'] = Excel( master=frame_excel, rows=n_var, columns=3, width=15, title=['Name', 'Lower bound', 'Upper bound'], dtype=[str, float, float], required=[True] * 3, valid_check=[valid_naming_cond, None, None]) elif problem_type == 'integer': self.widget['design_unified']['excel'] = Excel( master=frame_excel, rows=n_var, columns=3, width=15, title=['Name', 'Lower bound', 'Upper bound'], dtype=[str, int, int], required=[True] * 3, valid_check=[valid_naming_cond, None, None]) elif problem_type == 'binary': self.widget['design_unified']['excel'] = Excel( master=frame_excel, rows=n_var, columns=1, width=15, title=['Name'], dtype=[str], required=[True], valid_check=[valid_naming_cond]) elif problem_type == 'categorical': self.widget['design_unified']['excel'] = Excel( master=frame_excel, rows=n_var, columns=2, width=15, title=['Name', 'Choices'], dtype=[str, str], required=[True] * 2, valid_check=[valid_naming_cond, None]) else: raise Exception(f'invalid problem type {problem_type}') self.widget['design_unified']['excel'].grid(row=1, column=0) self.widget['design_unified']['excel'].set_column( 0, [f'x{i}' for i in range(1, n_var + 1)]) self.widget['next'].enable() self.widget['design_unified']['set_n_var'].configure( command=_set_n_var) self.widget['next'].disable()
def create_mixed_design_widget(self): ''' ''' frame_list = create_widget('labeled_frame', master=self.frame['design_mixed'], row=0, column=0, text='Variable list') frame_list_display = create_widget('frame', master=frame_list, row=0, column=0, sticky='N') frame_list_action = create_widget('frame', master=frame_list, row=1, column=0, padx=0, pady=0, sticky=None) frame_config = create_widget('labeled_frame', master=self.frame['design_mixed'], row=0, column=1, text='Variable Config') frame_config_display = create_widget('frame', master=frame_config, row=0, column=0, padx=0, pady=0, sticky='N') frame_config_action = create_widget('frame', master=frame_config, row=1, column=0, padx=0, pady=0, sticky=None) grid_configure(frame_list, 0, 0) grid_configure(frame_config, 0, 0) self.widget['design_mixed']['list'] = Listbox( master=frame_list_display) self.widget['design_mixed']['list'].grid() self.widget['design_mixed']['create'] = create_widget( 'button', master=frame_list_action, row=0, column=0, text='Create') self.widget['design_mixed']['delete'] = create_widget( 'button', master=frame_list_action, row=0, column=1, text='Delete') self.widget['design_mixed']['name'] = create_widget( 'labeled_entry', master=frame_config_display, row=0, column=0, text='Variable name', class_type='string', required=True) self.widget['design_mixed']['type'] = create_widget( 'labeled_combobox', master=frame_config_display, row=1, column=0, text='Variable type', values=['continuous', 'integer', 'binary', 'categorical'], required=True) frame_config_display_type = {} for key in ['continuous', 'integer', 'categorical']: frame_config_display_type[key] = create_widget( 'frame', master=frame_config_display, row=2, column=0, padx=0, pady=0, sticky=None) frame_config_display_type[key].grid_remove() self.widget['design_mixed']['lb_float'] = create_widget( 'labeled_entry', master=frame_config_display_type['continuous'], row=0, column=0, text='Lower bound', class_type='float', required=True) self.widget['design_mixed']['ub_float'] = create_widget( 'labeled_entry', master=frame_config_display_type['continuous'], row=1, column=0, text='Upper bound', class_type='float', required=True) self.widget['design_mixed']['lb_int'] = create_widget( 'labeled_entry', master=frame_config_display_type['integer'], row=0, column=0, text='Lower bound', class_type='int', required=True) self.widget['design_mixed']['ub_int'] = create_widget( 'labeled_entry', master=frame_config_display_type['integer'], row=1, column=0, text='Upper bound', class_type='int', required=True) self.widget['design_mixed']['choices'] = create_widget( 'labeled_entry', master=frame_config_display_type['categorical'], row=0, column=0, text='Choices', class_type='stringlist', required=True) def _clear_type_frame(var_type): ''' ''' if var_type == 'continuous': self.widget['design_mixed']['lb_float'].set(None) self.widget['design_mixed']['ub_float'].set(None) elif var_type == 'integer': self.widget['design_mixed']['lb_int'].set(None) self.widget['design_mixed']['ub_int'].set(None) elif var_type == 'categorical': self.widget['design_mixed']['choices'].set(None) def _enable_config_type_frame(var_type): ''' ''' for key in frame_config_display_type.keys(): if key == var_type: frame_config_display_type[key].grid() else: frame_config_display_type[key].grid_remove() _clear_type_frame(key) def _disable_config_type_frame(): ''' ''' for key in frame_config_display_type.keys(): frame_config_display_type[key].grid_remove() _clear_type_frame(key) def _select_var_type(event): ''' ''' var_type = event.widget.get() _enable_config_type_frame(var_type) self.widget['design_mixed']['type'].widget.bind( '<<ComboboxSelected>>', _select_var_type) def _enable_config_widgets(): ''' ''' for key in ['save', 'cancel', 'name', 'type']: self.widget['design_mixed'][key].enable() for key in ['name', 'type']: self.widget['design_mixed'][key].set(None) _disable_config_type_frame() def _disable_config_widgets(): ''' ''' for key in ['name', 'type']: self.widget['design_mixed'][key].set(None) for key in ['save', 'cancel', 'name', 'type']: self.widget['design_mixed'][key].disable() _disable_config_type_frame() def _load_widget_values(var_name, config): ''' ''' self.widget['design_mixed']['name'].set(var_name) self.widget['design_mixed']['type'].set(config['type']) self.widget['design_mixed']['type'].select() if config['type'] == 'continuous': self.widget['design_mixed']['lb_float'].set(config['lb']) self.widget['design_mixed']['ub_float'].set(config['ub']) elif config['type'] == 'integer': self.widget['design_mixed']['lb_int'].set(config['lb']) self.widget['design_mixed']['ub_int'].set(config['ub']) elif config['type'] == 'binary': pass elif config['type'] == 'categorical': self.widget['design_mixed']['choices'].set(config['choices']) else: raise Exception(f'invalid variable type {config["type"]}') def _create_var(): ''' ''' self.in_creating_var = True self.widget['design_mixed']['list'].insert(tk.END, '') self.widget['design_mixed']['list'].select_clear(0, tk.END) self.widget['design_mixed']['list'].select_set(tk.END) _enable_config_widgets() self.widget['design_mixed']['create'].disable() self.widget['design_mixed']['delete'].disable() def _exit_creating_var(): ''' ''' self.in_creating_var = False self.widget['design_mixed']['create'].enable() self.widget['design_mixed']['list'].delete(tk.END) def _select_var(event): ''' ''' try: index = int(event.widget.curselection()[0]) except: return var_name = event.widget.get(index) if var_name == '': return elif self.in_creating_var: _exit_creating_var() _enable_config_widgets() _load_widget_values(var_name, self.var_cfg[var_name]) self.widget['design_mixed']['delete'].enable() def _delete_var(): ''' ''' index = int(self.widget['design_mixed']['list'].curselection()[0]) var_name = self.widget['design_mixed']['list'].get(index) if_delete = tk.messagebox.askquestion( 'Delete Variable', f'Are you sure to delete variable "{var_name}"?', parent=self.window) if if_delete == 'yes': self.widget['design_mixed']['list'].delete(index) listbox_size = self.widget['design_mixed']['list'].size() if listbox_size == 0: self.widget['design_mixed']['delete'].disable() _disable_config_widgets() else: self.widget['design_mixed']['list'].select_set( min(index, listbox_size - 1)) self.widget['design_mixed']['list'].select_event() self.var_cfg.pop(var_name) else: return def _save_var(): ''' ''' var_name, success = self._try_get_val( self.widget['design_mixed']['name'], 'Variable name') if not success: return var_type, success = self._try_get_val( self.widget['design_mixed']['type'], 'Variable type') if not success: return if var_type == 'continuous': var_lb, success = self._try_get_val( self.widget['design_mixed']['lb_float'], 'Lower bound') if not success: return var_ub, success = self._try_get_val( self.widget['design_mixed']['ub_float'], 'Upper bound') if not success: return if var_lb >= var_ub: tk.messagebox.showinfo( 'Error', 'Lower bound is no less than upper bound', parent=self.window) return self.var_cfg[var_name] = { 'type': var_type, 'lb': float(var_lb), 'ub': float(var_ub) } elif var_type == 'integer': var_lb, success = self._try_get_val( self.widget['design_mixed']['lb_int'], 'Lower bound') if not success: return var_ub, success = self._try_get_val( self.widget['design_mixed']['ub_int'], 'Upper bound') if not success: return if var_lb >= var_ub: tk.messagebox.showinfo( 'Error', 'Lower bound is no less than upper bound', parent=self.window) return self.var_cfg[var_name] = { 'type': var_type, 'lb': int(var_lb), 'ub': int(var_ub) } elif var_type == 'binary': self.var_cfg[var_name] = {'type': var_type} elif var_type == 'categorical': var_choices, success = self._try_get_val( self.widget['design_mixed']['choices'], 'Choices') if not success: return self.var_cfg[var_name] = { 'type': var_type, 'choices': list(var_choices) } else: raise Exception(f'invalid variable type {var_type}') tk.messagebox.showinfo('Success', f'Variable {var_name} saved', parent=self.window) if self.in_creating_var: _exit_creating_var() self.widget['design_mixed']['list'].reload() self.widget['design_mixed']['list'].select(var_name) def _cancel_var(): ''' ''' if self.in_creating_var: _exit_creating_var() _disable_config_widgets() self.widget['design_mixed']['list'].select_event() def _reload_var(): ''' ''' var_list = list(self.var_cfg.keys()) if len(var_list) == 0: self.widget['design_mixed']['delete'].disable() else: self.widget['design_mixed']['delete'].enable() return var_list self.widget['design_mixed']['list'].bind_cmd(reload_cmd=_reload_var, select_cmd=_select_var) self.widget['design_mixed']['list'].reload() self.widget['design_mixed']['create'].configure(command=_create_var) self.widget['design_mixed']['delete'].configure(command=_delete_var) self.widget['design_mixed']['save'] = create_widget( 'button', master=frame_config_action, row=0, column=0, text='Save') self.widget['design_mixed']['cancel'] = create_widget( 'button', master=frame_config_action, row=0, column=1, text='Cancel') self.widget['design_mixed']['save'].configure(command=_save_var) self.widget['design_mixed']['cancel'].configure(command=_cancel_var) _disable_config_widgets()
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.window self.window = create_widget('toplevel', master=self.master_window, title='Create Problem') grid_configure(self.window, 0, 0) self.frame = {} for config_type, config_text in zip([ 'general', 'design_mixed', 'design_unified', 'performance', 'constraint' ], [ 'General Config', 'Design Config', 'Design Config', 'Performance Config', 'Constraint Config' ]): self.frame[config_type] = create_widget('labeled_frame', master=self.window, row=0, column=0, text=config_text, sticky='NSEW') self.frame[config_type].grid_remove() grid_configure(self.frame[config_type], 0, 0) self.curr_frame = 0 self.max_frame = len(self.frame) self.in_creating_var = False self.var_cfg = {} self.widget = { 'general': {}, 'design_mixed': {}, 'design_unified': {}, 'performance': {}, 'constraint': {}, } frame_control = create_widget('frame', master=self.window, row=1, column=0, sticky='WE', padx=0, pady=0) grid_configure(frame_control, 0, 0) self.widget['cancel'] = create_widget('button', master=frame_control, row=0, column=0, text='Cancel', sticky='W') self.widget['back'] = create_widget('button', master=frame_control, row=0, column=1, text='Back', sticky='E') self.widget['next'] = create_widget('button', master=frame_control, row=0, column=2, text='Next', sticky='E') self.widget['finish'] = create_widget('button', master=frame_control, row=0, column=2, text='Finish', sticky='E') center(self.window, self.master_window)
def __init__(self, root_view, n_obj): self.root_view = root_view self.master_window = self.root_view.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Stopping Criterion') self.widget = { 'var': {}, 'entry': {}, } frame_options = create_widget('frame', master=self.window, row=0, column=0, padx=0, pady=0) self.name_options = { 'time': 'Time', 'n_iter': 'Number of iterations', 'n_sample': 'Number of samples' } if n_obj == 1: self.name_options.update({ 'opt': 'Optimum value', 'opt_conv': 'Convergence' }) else: self.name_options.update({'hv_conv': 'Convergence'}) def check(var, entry): if var.get() == 1: entry.enable() else: entry.disable() frame_time = create_widget('frame', master=frame_options, row=0, column=0) self.widget['var']['time'] = tk.IntVar() cb_time = tk.Checkbutton(master=frame_time, variable=self.widget['var']['time'], highlightthickness=0, bd=0) cb_time.grid(row=0, column=0, sticky='W') tk.Label(master=frame_time, text=self.name_options['time'] + ': stop after').grid( row=0, column=1, sticky='W') self.widget['entry']['time'] = create_widget( 'entry', master=frame_time, row=0, column=2, class_type='float', required=True, valid_check=lambda x: x > 0, error_msg='time limit must be positive', pady=0) tk.Label(master=frame_time, text='seconds').grid(row=0, column=3, sticky='W') cb_time.configure(command=lambda: check(self.widget['var']['time'], self.widget['entry']['time'])) frame_n_iter = create_widget('frame', master=frame_options, row=1, column=0) self.widget['var']['n_iter'] = tk.IntVar() cb_n_iter = tk.Checkbutton(master=frame_n_iter, variable=self.widget['var']['n_iter'], highlightthickness=0, bd=0) cb_n_iter.grid(row=0, column=0, sticky='W') tk.Label(master=frame_n_iter, text=self.name_options['n_iter'] + ': stop after').grid( row=0, column=1, sticky='W') self.widget['entry']['n_iter'] = create_widget( 'entry', master=frame_n_iter, row=0, column=2, class_type='int', required=True, valid_check=lambda x: x > 0, error_msg='number of iterations must be positive', pady=0) tk.Label(master=frame_n_iter, text='iterations').grid(row=0, column=3, sticky='W') cb_n_iter.configure(command=lambda: check( self.widget['var']['n_iter'], self.widget['entry']['n_iter'])) frame_n_sample = create_widget('frame', master=frame_options, row=2, column=0) self.widget['var']['n_sample'] = tk.IntVar() cb_n_sample = tk.Checkbutton(master=frame_n_sample, variable=self.widget['var']['n_sample'], highlightthickness=0, bd=0) cb_n_sample.grid(row=0, column=0, sticky='W') tk.Label(master=frame_n_sample, text=self.name_options['n_sample'] + ': stop when number of samples reaches').grid(row=0, column=1, sticky='W') self.widget['entry']['n_sample'] = create_widget( 'entry', master=frame_n_sample, row=0, column=2, class_type='int', required=True, valid_check=lambda x: x > 0, error_msg='number of samples must be positive', pady=0) cb_n_sample.configure(command=lambda: check( self.widget['var']['n_sample'], self.widget['entry']['n_sample'])) if n_obj == 1: frame_opt = create_widget('frame', master=frame_options, row=3, column=0) self.widget['var']['opt'] = tk.IntVar() cb_opt = tk.Checkbutton(master=frame_opt, variable=self.widget['var']['opt'], highlightthickness=0, bd=0) cb_opt.grid(row=0, column=0, sticky='W') tk.Label(master=frame_opt, text=self.name_options['opt'] + ': stop when optimum reaches').grid(row=0, column=1, sticky='W') self.widget['entry']['opt'] = create_widget( 'entry', master=frame_opt, row=0, column=2, class_type='float', required=True, valid_check=lambda x: x > 0, error_msg='optimum value must be positive', pady=0) cb_opt.configure(command=lambda: check(self.widget['var'][ 'opt'], self.widget['entry']['opt'])) frame_opt_conv = create_widget('frame', master=frame_options, row=4, column=0) self.widget['var']['opt_conv'] = tk.IntVar() cb_opt_conv = tk.Checkbutton( master=frame_opt_conv, variable=self.widget['var']['opt_conv'], highlightthickness=0, bd=0) cb_opt_conv.grid(row=0, column=0, sticky='W') tk.Label(master=frame_opt_conv, text=self.name_options['opt_conv'] + ': stop when optimum stops to improve over past').grid( row=0, column=1, sticky='W') self.widget['entry']['opt_conv'] = create_widget( 'entry', master=frame_opt_conv, row=0, column=2, class_type='int', required=True, valid_check=lambda x: x > 0, error_msg= 'number of iterations for determining convergence must be positive', pady=0) tk.Label(master=frame_opt_conv, text='iterations').grid(row=0, column=3, sticky='W') cb_opt_conv.configure( command=lambda: check(self.widget['var']['opt_conv'], self. widget['entry']['opt_conv'])) else: frame_hv_conv = create_widget('frame', master=frame_options, row=3, column=0) self.widget['var']['hv_conv'] = tk.IntVar() cb_hv_conv = tk.Checkbutton(master=frame_hv_conv, variable=self.widget['var']['hv_conv'], highlightthickness=0, bd=0) cb_hv_conv.grid(row=0, column=0, sticky='W') tk.Label( master=frame_hv_conv, text=self.name_options['hv_conv'] + ': stop when hypervolume stops to improve over past').grid( row=0, column=1, sticky='W') self.widget['entry']['hv_conv'] = create_widget( 'entry', master=frame_hv_conv, row=0, column=2, class_type='int', required=True, valid_check=lambda x: x > 0, error_msg= 'number of iterations for determining convergence must be positive', pady=0) tk.Label(master=frame_hv_conv, text='iterations').grid(row=0, column=3, sticky='W') cb_hv_conv.configure( command=lambda: check(self.widget['var']['hv_conv'], self. widget['entry']['hv_conv'])) for key in self.name_options: self.widget['entry'][key].disable() frame_action = create_widget('frame', master=self.window, row=1, column=0, pady=0, sticky=None) self.widget['save'] = create_widget('button', master=frame_action, row=0, column=0, text='Save') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window)
def __init__(self, root_view, problem_cfg): self.root_view = root_view self.n_var, self.n_obj = problem_cfg['n_var'], problem_cfg['n_obj'] self.var_name, self.obj_name = problem_cfg['var_name'], problem_cfg[ 'obj_name'] var_type = problem_cfg['type'] # compute lower and upper bound for design space radar plot if var_type in ['continuous', 'integer']: var_lb, var_ub = problem_cfg['var_lb'], problem_cfg['var_ub'] if type(var_lb) in [int, float]: var_lb = [var_lb] * self.n_var if type(var_ub) in [int, float]: var_ub = [var_ub] * self.n_var elif var_type == 'binary': var_lb, var_ub = [0] * self.n_var, [1] * self.n_var elif var_type == 'categorical': var_lb = [0] * self.n_var if 'var' in problem_cfg: var_ub = [] for var_info in problem_cfg['var'].values(): var_ub.append(len(var_info['choices'])) else: var_ub = [len(problem_cfg['var_choices'])] * self.n_var elif var_type == 'mixed': var_lb, var_ub = [], [] var_type_list = [] for var_info in problem_cfg['var'].values(): var_type_list.append(var_info['type']) if var_info['type'] in ['continuous', 'integer']: var_lb.append(var_info['lb']) var_ub.append(var_info['ub']) elif var_info['type'] == 'binary': var_lb.append(0) var_ub.append(1) elif var_info['type'] == 'categorical': var_lb.append(0) var_ub.append(len(var_info['choices'])) else: raise Exception( f'invalid variable type {var_info["type"]}') else: raise Exception(f'invalid problem type {problem_cfg["type"]}') self.var_lb, self.var_ub = np.array(var_lb), np.array(var_ub) # figure placeholder in GUI self.fig = plt.figure(dpi=FIGURE_DPI) self.gs = GridSpec(1, 2, figure=self.fig, width_ratios=[3, 2]) # connect matplotlib figure with tkinter GUI embed_figure(self.fig, self.root_view.frame_plot) # performance space figure if self.n_obj == 1 or self.n_obj == 2 or self.n_obj > 3: self.ax1 = self.fig.add_subplot(self.gs[0]) elif self.n_obj == 3: self.ax1 = self.fig.add_subplot(self.gs[0], projection='3d') else: raise NotImplementedError self.ax1.set_title('Performance Space') if self.n_obj == 1: self.ax1.set_xlabel(self.obj_name[0]) elif self.n_obj == 2: self.ax1.set_xlabel(self.obj_name[0]) self.ax1.set_ylabel(self.obj_name[1]) elif self.n_obj == 3: self.ax1.set_xlabel(self.obj_name[0]) self.ax1.set_ylabel(self.obj_name[1]) self.ax1.set_zlabel(self.obj_name[2]) elif self.n_obj > 3: self.ax1.set_xticks(np.arange(self.n_obj, dtype=int)) self.ax1.set_xticklabels(self.obj_name) else: raise NotImplementedError # design space figure if self.n_var > 2: self.theta = radar_factory(self.n_var) self.ax2 = self.fig.add_subplot(self.gs[1], projection='radar') self.ax2.set_xticks(self.theta) self.ax2.set_varlabels(self.var_name) self.ax2.set_yticklabels([]) self.ax2.set_title('Selected Design', position=(0.5, 1.1)) self.ax2.set_ylim(0, 1) else: self.ax2 = self.fig.add_subplot(self.gs[1]) for spine in self.ax2.spines.values(): spine.set_visible(False) self.ax2.get_xaxis().set_ticks([]) self.ax2.get_yaxis().set_ticks([]) self.xticks = [0] if self.n_var == 1 else [-1, 1] self.ax2.bar(self.xticks, [1] * self.n_var, color='g', alpha=0.2) self.ax2.set_xticks(self.xticks) self.text_lb = [None] * self.n_var self.text_ub = [None] * self.n_var for i in range(self.n_var): if var_type in [ 'continuous', 'integer' ] or (var_type == 'mixed' and var_type_list[i] in ['continuous', 'integer']): self.text_lb[i] = self.ax2.text( self.xticks[i] - 0.5, 0, f'{self.var_lb[i]:.4g}', horizontalalignment='right', verticalalignment='center') self.text_ub[i] = self.ax2.text( self.xticks[i] - 0.5, 1, f'{self.var_ub[i]:.4g}', horizontalalignment='right', verticalalignment='center') self.ax2.set_xticklabels(self.var_name) self.ax2.set_title('Selected Design') self.ax2.set_xlim(-3, 3) self.ax2.set_ylim(0, 1.04) # configure slider widget frame_slider = create_widget('frame', master=self.root_view.frame_plot, row=2, column=0) grid_configure(frame_slider, [0], [1]) self.label_iter = tk.Label(master=frame_slider, text='Iteration') self.label_iter.grid(row=0, column=0, sticky='EW') self.curr_iter = tk.IntVar() self.scale_iter = ttk.Scale(master=frame_slider, orient=tk.HORIZONTAL, variable=self.curr_iter, from_=0, to=0) self.scale_iter.grid(row=0, column=1, sticky='EW')
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, title='Manage Problem') grid_configure(self.window, 0, 0) self.widget = {} frame_list = create_widget('labeled_frame', master=self.window, row=0, column=0, text='Problem List') frame_list_display = create_widget('frame', master=frame_list, row=0, column=0, sticky='NS') frame_list_action = create_widget('frame', master=frame_list, row=1, column=0, padx=0, pady=0, sticky=None) frame_config = create_widget('labeled_frame', master=self.window, row=0, column=1, text='Problem Info') frame_config_display = create_widget('frame', master=frame_config, row=0, column=0, sticky='NS') frame_config_action = create_widget('frame', master=frame_config, row=1, column=0, padx=0, pady=0, sticky=None) grid_configure(frame_list, 0, 0) grid_configure(frame_config, 0, 0) self.widget['list'] = Listbox(master=frame_list_display) self.widget['list'].grid() self.widget['create'] = create_widget('button', master=frame_list_action, row=0, column=0, text='Create') self.desc = { 'name': 'Name', 'type': 'Variable type', 'n_var': 'Number of variables', 'n_obj': 'Number of objectives', 'n_constr': 'Number of constraints', 'obj_type': 'Type of objectives', } self.widget['info'] = {} for row, key in enumerate(self.desc.keys()): self.widget['info'][key] = create_widget( 'label', master=frame_config_display, row=row, column=0, text=f'{self.desc[key]}:') self.widget['update'] = create_widget('button', master=frame_config_action, row=0, column=0, text='Update') self.widget['delete'] = create_widget('button', master=frame_config_action, row=0, column=1, text='Delete') self.widget['update'].disable() self.widget['delete'].disable() center(self.window, self.master_window)
def __init__(self, root_view, columns, can_eval): self.root_view = root_view self.root = self.root_view.root frame_db = self.root_view.frame_db self.widget = {} frame_table = create_widget('frame', master=frame_db, row=0, column=0, padx=0, pady=0) self.widget['table'] = Table(master=frame_table, columns=columns) frame_action = create_widget('frame', master=frame_db, row=1, column=0, padx=0, pady=0) if can_eval: grid_configure(frame_action, 0, [2]) else: grid_configure(frame_action, 0, [1]) frame_enter = create_widget('frame', master=frame_action, row=0, column=0, padx=0, pady=0) self.widget['enter_design'] = create_widget('button', master=frame_enter, row=0, column=0, text='Enter Design') self.widget['enter_performance'] = create_widget( 'button', master=frame_enter, row=0, column=1, text='Enter Performance') if can_eval: frame_eval = create_widget('frame', master=frame_action, row=0, column=1, padx=0, pady=0) self.widget['start_eval'] = create_widget('button', master=frame_eval, row=0, column=0, text='Start Evaluation') self.widget['stop_eval'] = create_widget('button', master=frame_eval, row=0, column=1, text='Stop Evaluation') self.widget['set_display'] = create_widget('button', master=frame_action, row=0, column=2 if can_eval else 1, sticky='E', text='Display Settings')