def solve(G): """ Args: G: networkx.Graph Returns: T: networkx.Graph """ g = GraphSolver(G) start = g.find_leaf_path() T = g.dijkstra_solve_graph(start, calculate_heuristic, first_heuristic) optimize_sorted(g, T) rebuilder = Rebuilder(g) min_T = T.copy() min_cost = average_pairwise_distance(T) # print('*', min_cost) for _ in range(50): if rebuilder.rebuild(): g = GraphSolver(G) for v in min_T.nodes: g.visit(v) for e in min_T.edges: g.add_edge(e) # print('reset') g.dijkstra_solve_graph(start, calculate_heuristic, first_heuristic) optimize_sorted(g, g.T) cost = average_pairwise_distance(g.T) # print(cost) if cost < min_cost: min_cost = cost min_T = g.T.copy() return min_T
def __init__(self): Gtk.Window.__init__(self) self.filename = os.path.realpath(sys.argv[1]) self.loaded = False base, _ = os.path.splitext(self.filename) # FIXME: make this a dotfile? delete it on quit? self.html_file = "%s.html" % base self.set_default_size(1000, 600) paned = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL) self.add(paned) sw = Gtk.ScrolledWindow() self.b = MarkdownBuffer(self.filename) view = MarkdownSourceView(self.b) sw.add(view) overlay = Gtk.Overlay() overlay.add(sw) self.spinner = Pips() self.spinner.set_halign(Gtk.Align.END) self.spinner.set_valign(Gtk.Align.END) overlay.add_overlay(self.spinner) paned.add1(overlay) self.markdownview = MarkdownView(url=('file://' + self.html_file)) self.markdownview.connect('title_changed', self.title_changed_cb) paned.add2(self.markdownview) paned.set_position(600) self.show_all() self.rebuilder = Rebuilder(self.filename, self.html_file) self.rebuilder.connect('rebuilt', lambda *args: self.markdownview.refresh()) self.rebuilder.rebuild() self.b.connect('modified-changed', lambda args: self.check_modified()) self.check_modified() self.connect('delete-event', self.__check_save)
def set_filename(self, md_filename): assert self.filename is None self.filename = md_filename self.hb.set_subtitle(self.filename) self.html_file = tempfile.NamedTemporaryFile( prefix=os.path.basename(md_filename), suffix='.html') self.connect('destroy', ViewerWindow.__destroy_cb) self.rebuilder = Rebuilder(self.filename, self.html_file.name, 'mediawiki' if 'mediawiki' in self.filename else 'markdown') self.rebuilder.connect('rebuilt', self.__rebuilt_cb) self.rebuilder.rebuild() self.web_view.load_uri('file://' + self.html_file.name) self.export_button.set_sensitive(True) self.edit_button.set_sensitive(True)
class ViewerWindow(Gtk.ApplicationWindow): def __init__(self, md_filename): Gtk.ApplicationWindow.__init__(self) self.set_default_size(768, 600) self.hb = Gtk.HeaderBar() self.hb.set_show_close_button(True) self.set_titlebar(self.hb) open_button = Gtk.Button.new_from_icon_name( "document-open-symbolic", Gtk.IconSize.BUTTON) open_button.connect('clicked', self.__open_clicked_cb) open_button.set_tooltip_text("Open a file") self.hb.pack_start(open_button) # TODO: neither of these next two icons are quite right self.export_button = Gtk.Button.new_from_icon_name( "document-send-symbolic", Gtk.IconSize.BUTTON) self.export_button.connect('clicked', self.__export_clicked_cb) self.export_button.set_sensitive(False) self.export_button.set_tooltip_text("Export HTML") self.hb.pack_end(self.export_button) self.text_plain_app_infos = Gio.AppInfo.get_all_for_type('text/plain') self.edit_button = Gtk.Button.new_from_icon_name( "send-to-symbolic", Gtk.IconSize.BUTTON) self.edit_button.connect('clicked', self.__edit_clicked_cb) self.edit_button.set_sensitive(False) self.edit_button.set_tooltip_text("Edit file in {}".format( self.text_plain_app_infos[0].get_display_name())) self.hb.pack_end(self.edit_button) self.web_view = WebKit2.WebView() self.web_view.connect('notify::title', self.__title_changed_cb) sw = Gtk.ScrolledWindow() sw.add(self.web_view) self.add(sw) self.filename = None if md_filename is not None: self.set_filename(md_filename) self.show_all() self.__title_changed_cb() def set_filename(self, md_filename): assert self.filename is None self.filename = md_filename self.hb.set_subtitle(self.filename) self.html_file = tempfile.NamedTemporaryFile( prefix=os.path.basename(md_filename), suffix='.html') self.connect('destroy', ViewerWindow.__destroy_cb) self.rebuilder = Rebuilder(self.filename, self.html_file.name, 'mediawiki' if 'mediawiki' in self.filename else 'markdown') self.rebuilder.connect('rebuilt', self.__rebuilt_cb) self.rebuilder.rebuild() self.web_view.load_uri('file://' + self.html_file.name) self.export_button.set_sensitive(True) self.edit_button.set_sensitive(True) def __destroy_cb(self): self.html_file.close() def __rebuilt_cb(self, rebuilder): self.web_view.reload() def __title_changed_cb(self, *args): title = self.web_view.get_title() if not title: basename = os.path.basename(self.filename) root, _ = os.path.splitext(basename) self.hb.set_title(root) else: self.hb.set_title(title) def __open_clicked_cb(self, open_button): d = Gtk.FileChooserDialog( "Open", self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) d.set_local_only(True) d.set_select_multiple(True) d.add_filter(ff_for_globs("Markdown", [ "*.md", "*.mkd", "*.mdwn", ])) d.add_filter(ff_for_globs("MediaWiki", [ "*.mediawiki.txt", ])) ff = Gtk.FileFilter() ff.set_name("Text files (let Pandoc guess the format)") ff.add_mime_type("text/plain") d.add_filter(ff) if d.run() == Gtk.ResponseType.OK: g_files = d.get_files() if self.filename is None and g_files: self.set_filename(g_files[0].get_path()) g_files = g_files[1:] for g_file in g_files: self.get_application().open(g_file) d.destroy() def __edit_clicked_cb(self, edit_button): self.text_plain_app_infos[0].launch_uris(['file://' + self.filename]) def __export_clicked_cb(self, export_button): d = Gtk.FileChooserDialog( "Export as HTML", self, Gtk.FileChooserAction.SAVE, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK)) d.set_local_only(True) suggested = os.path.splitext(self.filename)[0] + '.html' if os.path.exists(suggested): d.set_filename(suggested) else: directory, filename = os.path.split(suggested) d.set_current_folder(directory) d.set_current_name(filename) if d.run() == Gtk.ResponseType.OK: self.rebuilder.build(d.get_filename(), self_contained=True) d.destroy()
class MarkgownWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self) self.filename = os.path.realpath(sys.argv[1]) self.loaded = False base, _ = os.path.splitext(self.filename) # FIXME: make this a dotfile? delete it on quit? self.html_file = "%s.html" % base self.set_default_size(1000, 600) paned = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL) self.add(paned) sw = Gtk.ScrolledWindow() self.b = MarkdownBuffer(self.filename) view = MarkdownSourceView(self.b) sw.add(view) overlay = Gtk.Overlay() overlay.add(sw) self.spinner = Pips() self.spinner.set_halign(Gtk.Align.END) self.spinner.set_valign(Gtk.Align.END) overlay.add_overlay(self.spinner) paned.add1(overlay) self.markdownview = MarkdownView(url=('file://' + self.html_file)) self.markdownview.connect('title_changed', self.title_changed_cb) paned.add2(self.markdownview) paned.set_position(600) self.show_all() self.rebuilder = Rebuilder(self.filename, self.html_file) self.rebuilder.connect('rebuilt', lambda *args: self.markdownview.refresh()) self.rebuilder.rebuild() self.b.connect('modified-changed', lambda args: self.check_modified()) self.check_modified() self.connect('delete-event', self.__check_save) def __check_save(self, *args): if self.b.get_modified(): self.save() return False def save(self): self.b.save() return False def check_modified(self): if self.b.get_modified(): GLib.timeout_add_seconds(5, self.save) self.spinner.count_down_from(5) self.spinner.show() else: self.spinner.hide() def title_changed_cb(self, view, title): if title is None: title = self.filename else: title = '%s (%s)' % (title, self.filename) self.set_title(title)