Ejemplo n.º 1
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='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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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',
        }
Ejemplo n.º 4
0
    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')
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
    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)
Ejemplo n.º 7
0
    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')
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
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)
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
    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')
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
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='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)
Ejemplo n.º 15
0
    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)
Ejemplo n.º 16
0
    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')
Ejemplo n.º 17
0
    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'],
            },
        })
Ejemplo n.º 18
0
    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()
Ejemplo n.º 19
0
    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()
Ejemplo n.º 20
0
    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()
Ejemplo n.º 21
0
    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)
Ejemplo n.º 22
0
    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)
Ejemplo n.º 23
0
    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')
Ejemplo n.º 24
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='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)
Ejemplo n.º 25
0
    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')