def __init_menu__(self): self.menu_bar = gtk.MenuBar() self.vbox_main.pack_start(self.menu_bar, False, False, 0) def menu(title, parent=None): if not parent: parent = self.menu_bar def decorator(callback): menu = gtk.Menu() menu_item = gtk.MenuItem(title) menu_item.set_submenu(menu) parent.append(menu_item) return menu return decorator def button(menu, title): def decorator(callback): b = gtk.MenuItem(title) b.connect('activate', callback) menu.append(b) return b return decorator # Model menu: @menu('Model') def menu_model(): pass @button(menu_model, 'New …') def button_new(entry): d = NewHMMDialog(title='Create new Hidden Markov Model', buttons=(gtk.STOCK_CANCEL, \ gtk.RESPONSE_CANCEL, \ gtk.STOCK_OK, \ gtk.RESPONSE_OK), parent=self) response = d.run() if response == gtk.RESPONSE_OK: self.state_list = d.state_list self.emission_list = d.emission_list d.destroy() else: d.destroy() return #generate default values for tables states_iter = self.state_list.get_iter_root() states = [] while states_iter: states.append(self.state_list.get(states_iter, 0)[0]) states_iter = self.state_list.iter_next(states_iter) emissions_iter = self.emission_list.get_iter_root() observations = [] while emissions_iter: observations.append(self.emission_list.get(emissions_iter, 0)[0]) emissions_iter = self.emission_list.iter_next(emissions_iter) N = len(states) M = len(observations) emissions = [x[:] for x in [[0] * M] * N] for i in xrange(N): emissions[i][i%M] = 1 self.hmm = HiddenMarkovModel(states=states, observations=observations, transitions=[x[:] for x in [[1.0/N]*N]*N], emissions=emissions, initial=[1] + [0]*(N-1)) @button(menu_model, 'Open …') def button_open(entry): d = gtk.FileChooserDialog(title='Open Hidden Markov Model', action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL, \ gtk.RESPONSE_CANCEL, \ gtk.STOCK_OPEN, \ gtk.RESPONSE_OK), parent=self) d.set_select_multiple(False) d.set_default_response(gtk.RESPONSE_OK) filter = gtk.FileFilter() filter.set_name('Hidden Markov Model') #filter.add_mime_type('text/*') for ext1 in ('.txt', '.hmm'): for ext2 in ('', '.gz', '.bz2'): filter.add_pattern('*' + ext1 + ext2) d.add_filter(filter) filter = gtk.FileFilter() filter.set_name('All files') filter.add_mime_type('*/*') filter.add_pattern('*') d.add_filter(filter) response = d.run() if response != gtk.RESPONSE_OK: d.destroy() return file_name = d.get_filename() self.hmm = HiddenMarkovModel.load(open(file_name, 'rb')) d.destroy() @button(menu_model, 'Save') def button_save(entry): pass @button(menu_model, 'Save as …') def button_save_as(entry): d = gtk.FileChooserDialog(title=None, action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, \ gtk.RESPONSE_CANCEL, \ gtk.STOCK_SAVE, \ gtk.RESPONSE_OK), parent=self) d.set_select_multiple(False) d.set_default_response(gtk.RESPONSE_OK) response = d.run() if response != gtk.RESPONSE_OK: d.destroy() return file_name = d.get_filename() self.hmm.dump(fp=open(file_name, 'wb'), indent=2) d.destroy() menu_model.append(gtk.SeparatorMenuItem()) @button(menu_model, 'Close') def button_save_as(entry): self.destroy(self, entry) # Settings menu: @menu('Settings') def menu_settings(): pass @button(menu_settings, None) def button_use_matlab(entry): algorithm.use_next_backend() self.button_use_matlab.set_label("Use backend %s (currently %s)" % algorithm.get_cur_backend()[::-1]) self.button_use_matlab = button_use_matlab self.button_use_matlab.set_label("Use backend %s (currently %s)" % algorithm.get_cur_backend()[::-1]) # Operations menu: @menu('Operations') def menu_operations(): pass def button_with_seq(title): def decorator(callback): def calc(file_name, seq): tlv = { 'status_id': self.statusbar.push(0, "Calculating %s" % title) } def status_cb(status): if type(status) is float: self.statusbar.set_fraction(status) new_status_id = self.statusbar.push(0, "Calculating %s: %s" % (title, "%.2f%%" % (status*100) if type(status) is float else status)) self.statusbar.remove_message(0, tlv['status_id']) tlv['status_id'] = new_status_id callback(file_name, seq, status_cb) self.statusbar.remove_message(0, tlv['status_id']) self.statusbar.set_fraction(0) def action(entry): result = load_sequence(self, self.hmm.observations) if result: thread.start_new_thread(calc, result) return button(menu_operations, title)(action) return decorator @button_with_seq('Probability of an Observed Sequence') def menu_operations_prob_of_obs_seq(file_name, sequence, status_cb): result = backend.prob_of_observed_seq(self.hmm, sequence, status_cb) dialog = gtk.MessageDialog( parent = self, buttons = gtk.BUTTONS_OK, message_format = "Probability of this sequence: %s" % (result), ) dialog.format_secondary_text("Input Sequence: %s" % abspath(file_name.split("/")[-1])) dialog.connect('response', lambda dialog, response: dialog.destroy()) dialog.run() @button_with_seq('Viterbi') def menu_operations_viterbi(file_name, sequence, status_cb): (result,f_name) = backend.viterbi(self.hmm, sequence, status_cb) dialog = gtk.MessageDialog( parent = self, buttons = gtk.BUTTONS_OK, message_format = "Wrote file: %s" % abspath(f_name), ) dialog.format_secondary_text("Input Sequence: %s\n\nSample of Result (first 10 states): %s" % (abspath(file_name.split("/")[-1]), str(result).strip('[').strip(']'))) dialog.connect('response', lambda dialog, response: dialog.destroy()) dialog.run() @button_with_seq('Baum-Welch') def button_baum_welch_from_seq_file(file_name, sequence, status_cb): backend.baum_welch(self.hmm, sequence, status_cb) self.emit('hmm_changed', self._hmm) # TODO: some dialog # Help menu: @menu('Help') def menu_help(): pass @button(menu_help, 'About') def button_save_as(entry): dialog = gtk.AboutDialog() pic = gtk.gdk.pixbuf_new_from_file(join(dirname(abspath(__file__)), 'about-icon.png')) dialog.set_logo(pic) dialog.set_name('Telematik Hidden Markov Tool') dialog.set_version('1.0') dialog.set_copyright("Copyright © 2012 René Kijewski\nCopyright © 2012 Stefan Friesel\nCopyright © 2012 Simon Putzke\nCopyright © 2012 Daniel Snider") dialog.set_comments("A tool for analyses of hidden Markov models\n\nSummer Semester 2012, Prof. Dr. Katinka Wolter") dialog.set_website("http://kijewski.github.com/swp-telematik-2012-hidden-markov/") dialog.set_website_label("Development Website") dialog.run() dialog.destroy()
def button_use_matlab(entry): algorithm.use_next_backend() self.button_use_matlab.set_label("Use backend %s (currently %s)" % algorithm.get_cur_backend()[::-1])