Skip to content

Instantly share code, notes, and snippets.

@N-Coder
Last active June 10, 2022 10:46
Show Gist options
  • Save N-Coder/42204b3f21e877b1e81938f8043083d9 to your computer and use it in GitHub Desktop.
Save N-Coder/42204b3f21e877b1e81938f8043083d9 to your computer and use it in GitHub Desktop.
ogdf-python-widget Notebook for simulating a Kami Graph
# Docker container for running OGDF Jupyter notebooks on mybinder.org
# based on https://mybinder.readthedocs.io/en/latest/tutorials/dockerfile.html
FROM ncoder/ogdf:2022.02-dogwood
RUN pip install -U --no-cache-dir notebook jupyterhub jupyterlab ogdf-python-widget==0.1.0a0 git+https://github.com/N-Coder/ogdf-python.git
ARG NB_USER=jovyan
ARG NB_UID=1000
ENV USER ${NB_USER}
ENV NB_UID ${NB_UID}
ENV HOME /home/${NB_USER}
RUN adduser --disabled-password \
--gecos "Default user" \
--uid ${NB_UID} \
${NB_USER}
COPY . ${HOME}
USER root
RUN chown -R ${NB_UID} ${HOME}
USER ${NB_USER}
WORKDIR ${HOME}
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "e5931e0d",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from ogdf_python import ogdf, cppinclude\n",
"from ogdf_python_widget.widget import Widget\n",
"import ogdf_python_widget\n",
"import ipywidgets as widgets\n",
"\n",
"cppinclude(\"ogdf/basic/simple_graph_alg.h\")\n",
"cppinclude(\"ogdf/basic/graph_generators/randomized.h\")\n",
"cppinclude(\"ogdf/planarlayout/FPPLayout.h\")\n",
"ogdf.Color.__str__ = lambda self: self.toString().decode(\"ascii\")\n",
"ogdf.Color.__repr__ = lambda self: \"ogdf.Color.fromString(%r)\" % self.toString().decode(\"ascii\")\n",
"\n",
"G = ogdf.Graph()\n",
"ogdf.setSeed(1)\n",
"ogdf.randomPlanarTriconnectedGraph(G, 20, 40)\n",
"ogdf.makeSimpleUndirected(G)\n",
"GA = ogdf.GraphAttributes(G, ogdf.GraphAttributes.all)\n",
"\n",
"COLORS = [ogdf.Color(0,0,255), ogdf.Color(0,255,0), ogdf.Color(255,0,0)]\n",
"\n",
"for n in G.nodes:\n",
" GA.label[n] = \"N%s\" % n.index()\n",
" GA.fillColor[n] = COLORS[n.index() % len(COLORS)]\n",
"\n",
"L = ogdf.FPPLayout()\n",
"L.call(GA)\n",
"\n",
"dropdown = widgets.Dropdown(options=COLORS)\n",
"w = Widget(GA, debug=True)\n",
"\n",
"PREVIEW_FMT = \"\"\"<div id=\"color-preview\" style=\"border: 1px solid black; outline: 1px solid white; width: 20px; height: 20px; background-color: %s\">&nbsp;</div>\"\"\"\n",
"preview = widgets.HTML(PREVIEW_FMT % \"red\")\n",
"def color_changed(event):\n",
" preview.value = PREVIEW_FMT % str(event[\"new\"])\n",
"dropdown.observe(color_changed, \"value\")\n",
"dropdown.index = 1\n",
"\n",
"def node_clicked(node, alt, ctrl):\n",
" w.stop_force_directed()\n",
" GA.fillColor[node] = dropdown.value\n",
" while True:\n",
" for adj in node.adjEntries:\n",
" if GA.fillColor[adj.twinNode()] == dropdown.value:\n",
" e = adj.theEdge()\n",
" if not adj.isSource():\n",
" G.reverseEdge(e)\n",
" G.contract(e)\n",
" break\n",
" else:\n",
" break\n",
" ogdf.makeSimpleUndirected(G)\n",
" w.update_all_nodes()\n",
" w.update_all_links()\n",
"\n",
"w.on_node_click_callback = node_clicked\n",
"\n",
"widgets.VBox([widgets.HBox([dropdown, preview]), w])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d5f87a4c-e636-4e4b-9573-83097930f20b",
"metadata": {},
"outputs": [],
"source": [
"w.refresh_graph()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "f483177e-946f-4ea3-9a87-48d937026629",
"metadata": {},
"outputs": [],
"source": [
"#w.start_force_directed()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment