Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/francy/notebooks/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 17.3.2023 mit Größe 24 kB image not shown  

Quelle  ICMS_2018.ipynb   Sprache: unbekannt

 
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0; margin-left: 5%\">\n",
    "<h1 style=\"text-align: left;\">Francy - An Interactive Discrete Mathematics Framework for GAP</h1>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0\">\n",
    "    <div style=\"text-align: left; float: left;\">\n",
    "        <h2>Manuel Martins</h2>\n",
    "        <h3>Universidade Aberta, Lisbon - Portugal</h3>\n",
    "        <h4>manuelmachadomartins@gmail.com</h4>\n",
    "    </div>\n",
    "    <div style=\"text-align: left; float: right;\">\n",
    "        <h2>Markus Pfeiffer</h2>\n",
    "        <h3>University of St Andrews, St Andrews - Scotland</h3>\n",
    "        <h4>markus.pfeiffer@morphism.de</h4>\n",
    "    </div>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0\">\n",
    "<h1 style=\"text-align: center\">Agenda</h1>\n",
    "\n",
    "<h3>\n",
    "    <ol type=\"1\">\n",
    "    <li>Motivation</li>\n",
    "    <li>Solution</li>\n",
    "    <li>Features</li>\n",
    "    <li>Hands-on</li>\n",
    "    <li>Future</li>\n",
    "    </ol>\n",
    "</h3>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0\">\n",
    "<h1 style=\"text-align: center\">1. Motivation</h1>\n",
    "\n",
    "<h3><ul><li>Francy arose from the necessity of having a lightweight framework for building interactive graphics, generated from GAP, running primarily on the web, primarily in a Jupyter Notebook.</li></ul></h3>\n",
    "\n",
    "<h2 style=\"text-align: left; margin-left: 10%\">1.1 What is Francy?</h2>\n",
    "\n",
    "<h3>\n",
    "<ul>\n",
    "    <li>an interface to draw graphics using objects;</li>\n",
    "    <li>based on simple concepts of drawing and graph theory;</li>\n",
    "    <li>2 components:</li>\n",
    "    <ol type=\"1\">\n",
    "        <li>a GAP package that is responsible for the semantic representation of graphics;</li>\n",
    "        <li>a GUI library that is responsible for generating the actual interactive graphical representation.</li>\n",
    "    </ol>\n",
    "</ul>\n",
    "</h3>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0\">\n",
    "<h1 style=\"text-align: center\">2. Solution</h1>\n",
    "\n",
    "<h2 style=\"text-align: left; margin-left: 10%\">2.1 GAP Package</h2>\n",
    "\n",
    "<h3>\n",
    "<ul>\n",
    "    <li>provides a semantic representation of graphics is provided by a thin layer.</li>\n",
    "    <li>uses JSON, a lightweight, text-based, language-independent data interchange format.</li>\n",
    "    <li>follows a JSON Schema, and is identified with the application/vnd.francy+json MIME type.</li>\n",
    "</ul>\n",
    "</h3>\n",
    "\n",
    "<h2 style=\"text-align: left; margin-left: 10%\">2.2 GUI Library - Javascript</h2>\n",
    "\n",
    "<h3>\n",
    "<ul>\n",
    "    <li>based on d3.js, for rendering the semantic representation produced by the GAP package;</li>\n",
    "    <li>this library is distributed both as a browser module and as a Jupyter extension.</li>\n",
    "</ul>\n",
    "</h3>\n",
    "\n",
    "<h2 style=\"text-align: left; margin-left: 10%\">2.3 Jupyter GAP Kernel</h2>\n",
    "\n",
    "<h3>\n",
    "<ul>\n",
    "    <li>pure GAP package that implements the Jupyter Kernel specification;</li>\n",
    "    <li>\"glues\" everything together.</li>\n",
    "</ul>\n",
    "</h3>\n",
    "\n",
    "<h3>\n",
    "The Jupyter extension can be used in Jupyter Notebooks or Jupyter Lab, using the Jupyter GAP Kernel and the MIME type application/vnd.francy+json to render the document.\n",
    "</h3>\n",
    "<h3>\n",
    "This creates an abstraction and allows the development of new GUI libraries, \n",
    "using different data rendering dependencies or even different programming languages, independently of the GAP package.\n",
    "</h3>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 0 0\">\n",
    "<h1 style=\"text-align: center\">3. Features</h1>\n",
    "\n",
    "<h3>\n",
    "<ul>\n",
    "    <li>allows the creation of directed and undirected graphs, trees, line charts, bar charts and scatter charts;</li>\n",
    "    <li>enables interaction with graphical objects by clicking, selecting, dragging and zooming;</li>\n",
    "</ul>\n",
    "</h3>\n",
    "<h2 style=\"text-align: left; margin-left: 10%\">3.1 How to install</h2>\n",
    "</div>\n",
    "\n",
    "### 1. download latest release and extract the GAP package to GAP packages directory\n",
    "\n",
    "```bash\n",
    "user@local:~$ wget https://github.com/mcmartins/francy/archive/v0.8.2.tar.gz && \\\n",
    "    mkdir -p $GAPROOT/pkg/francy && \\\n",
    "    tar xzvf v0.8.2.tar.gz -C $GAPROOT/pkg/francy francy-0.8.2/gap\n",
    "```\n",
    "\n",
    "### 2. install latest jupyter extension using pip and install on Jupyter lab and/or notebook\n",
    "\n",
    "```bash\n",
    "user@local:~$ pip install jupyter_francy\n",
    "user@local:~$ jupyter lab build # for JupyterLab\n",
    "user@local:~$ jupyter nbextension enable --py --sys-prefix jupyter_francy # for Notebook\n",
    "```\n",
    "<div style=\"display: block; margin: 0 0 50px 0\"/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0\">\n",
    "<h1 style=\"text-align: center\">4. Hands-on</h1>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 1,
     "metadata": {
      "text/plain": ""
     },
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "true"
      ]
     },
     "execution_count": 2,
     "metadata": {
      "text/plain": ""
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LoadPackage(\"francy\");\n",
    "LoadPackage(\"digraph\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "function( G ) ... end"
      ]
     },
     "execution_count": 3,
     "metadata": {
      "text/plain": ""
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FrancyDigraphs := function(G)\n",
    "    local as, d, v, e, graph, nodes, m, IsGroupSimple, canvas, i, graphviz;\n",
    "\n",
    "    as := AllSubgroups(G);\n",
    "\n",
    "    d := Digraph(as, {H, K} -> IsSubgroup(H, K));;\n",
    "    v := DigraphVertices(d);;\n",
    "    e := DigraphEdges(d);;\n",
    "\n",
    "    graph := Graph(GraphType.DIRECTED);;\n",
    "    canvas := Canvas(Concatenation(\"Subgroups Digraph of \", String(G)));;\n",
    "    Add(canvas, graph);;\n",
    "\n",
    "    nodes := [];;\n",
    "\n",
    "    m := FrancyMessage(FrancyMessageType.INFO, \"Simple Groups\", \n",
    "        \"A group is simple if it is nontrivial and has no nontrivial normal subgroups.\");;\n",
    "    \n",
    "    IsGroupSimple := function(i)\n",
    "        Add(canvas, m);;\n",
    "        if IsSimpleGroup(as[i]) then\n",
    "            Add(canvas, FrancyMessage(\"Simple\", Concatenation(\"The vertex \", \n",
    "                String(i), \", representing the subgroup \", String(as[i]), \", is simple.\")));;\n",
    "        else\n",
    "            Add(canvas, FrancyMessage(\"Not Simple\", Concatenation(\"The vertex \", \n",
    "                String(i), \", representing the subgroup \", String(as[i]), \", is not simple.\")));;\n",
    "        fi;;\n",
    "        return Draw(canvas);\n",
    "    end;;\n",
    "\n",
    "    for i in v do\n",
    "        nodes[i] := Shape(ShapeType.CIRCLE, String(i));;\n",
    "        Add(nodes[i], Menu(\"Simple\", Callback(IsGroupSimple, [i])));;\n",
    "        Add(graph, nodes[i]);;\n",
    "    od;;\n",
    "\n",
    "    for i in e do\n",
    "        Add(graph, Link(nodes[i[1]], nodes[i[2]]));;\n",
    "    od;;\n",
    "    \n",
    "    graphviz := FrancyRenderer(FrancyRendererType.GRAPHVIZ_DOT);\n",
    "    Add(canvas, graphviz);\n",
    "\n",
    "    return Draw(canvas);\n",
    "end;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pc group of size 4 with 2 generators>"
      ]
     },
     "execution_count": 4,
     "metadata": {
      "text/plain": ""
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "G := DihedralGroup(4);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.43.0 (0)\n",
       " -->\n",
       "<!-- Title: hgn Pages: 1 -->\n",
       "<svg width=\"220pt\" height=\"188pt\"\n",
       " viewBox=\"0.00 0.00 220.06 188.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 184)\">\n",
       "<title>hgn</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-184 216.06,-184 216.06,4 -4,4\"/>\n",
       "<!-- 1 -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>1</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"68.06\" cy=\"-18\" rx=\"18\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"68.06\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n",
       "</g>\n",
       "<!-- 1->1 -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>1->1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M82.11,-29.76C92.98,-34.15 104.06,-30.23 104.06,-18 104.06,-9.59 98.82,-5.11 92.02,-4.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.38,-1.12 82.11,-6.24 92.55,-8.02 91.38,-1.12\"/>\n",
       "</g>\n",
       "<!-- 2 -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>2</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"32.06\" cy=\"-90\" rx=\"18\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"32.06\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n",
       "</g>\n",
       "<!-- 2->1 -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>2->1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M40.05,-73.46C44.58,-64.67 50.33,-53.48 55.45,-43.53\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"58.64,-44.99 60.1,-34.49 52.41,-41.78 58.64,-44.99\"/>\n",
       "</g>\n",
       "<!-- 2->2 -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>2->2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M46.11,-101.76C56.98,-106.15 68.06,-102.23 68.06,-90 68.06,-81.59 62.82,-77.11 56.02,-76.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"55.38,-73.12 46.11,-78.24 56.55,-80.02 55.38,-73.12\"/>\n",
       "</g>\n",
       "<!-- 3 -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>3</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"104.06\" cy=\"-90\" rx=\"18\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"104.06\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n",
       "</g>\n",
       "<!-- 3->1 -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>3->1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M96.07,-73.46C91.55,-64.67 85.8,-53.48 80.68,-43.53\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"83.72,-41.78 76.03,-34.49 77.49,-44.99 83.72,-41.78\"/>\n",
       "</g>\n",
       "<!-- 3->3 -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>3->3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M118.11,-101.76C128.98,-106.15 140.06,-102.23 140.06,-90 140.06,-81.59 134.82,-77.11 128.02,-76.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"127.38,-73.12 118.11,-78.24 128.55,-80.02 127.38,-73.12\"/>\n",
       "</g>\n",
       "<!-- 4 -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>4</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"176.06\" cy=\"-90\" rx=\"18\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"176.06\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">4</text>\n",
       "</g>\n",
       "<!-- 4->1 -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>4->1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M161.05,-79.27C142.99,-67.56 112.49,-47.79 91.37,-34.1\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"93.25,-31.15 82.95,-28.65 89.44,-37.03 93.25,-31.15\"/>\n",
       "</g>\n",
       "<!-- 4->4 -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>4->4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M190.11,-101.76C200.98,-106.15 212.06,-102.23 212.06,-90 212.06,-81.59 206.82,-77.11 200.02,-76.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"199.38,-73.12 190.11,-78.24 200.55,-80.02 199.38,-73.12\"/>\n",
       "</g>\n",
       "<!-- 5 -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>5</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"68.06\" cy=\"-162\" rx=\"18\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"68.06\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n",
       "</g>\n",
       "<!-- 5->1 -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>5->1</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M52.2,-152.98C36.91,-144.25 14.72,-128.73 5.06,-108 -1.69,-93.49 -1.69,-86.51 5.06,-72 12.98,-54.99 29.34,-41.49 43.4,-32.38\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"45.48,-35.21 52.2,-27.02 41.84,-29.23 45.48,-35.21\"/>\n",
       "</g>\n",
       "<!-- 5->2 -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>5->2</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M60.07,-145.46C55.55,-136.67 49.8,-125.48 44.68,-115.53\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"47.72,-113.78 40.03,-106.49 41.49,-116.99 47.72,-113.78\"/>\n",
       "</g>\n",
       "<!-- 5->3 -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>5->3</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M76.05,-145.46C80.58,-136.67 86.33,-125.48 91.45,-115.53\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"94.64,-116.99 96.1,-106.49 88.41,-113.78 94.64,-116.99\"/>\n",
       "</g>\n",
       "<!-- 5->4 -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>5->4</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M83.08,-151.27C101.14,-139.56 131.64,-119.79 152.76,-106.1\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"154.69,-109.03 161.18,-100.65 150.88,-103.15 154.69,-109.03\"/>\n",
       "</g>\n",
       "<!-- 5->5 -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>5->5</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M82.11,-173.76C92.98,-178.15 104.06,-174.23 104.06,-162 104.06,-153.59 98.82,-149.11 92.02,-148.56\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"91.38,-145.12 82.11,-150.24 92.55,-152.02 91.38,-145.12\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ]
     },
     "execution_count": 5,
     "metadata": {
      "image/svg+xml": {
       "height": 500,
       "width": 500
      }
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "JupyterSplashDot(DotDigraph(Digraph(AllSubgroups(G), {H, K} -> IsSubgroup(H, K))));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.francy+json": "{\"canvas\" : {\"graph\" : {\"collapsed\" : true,\"id\" : \"FC957E285E0B14173EC9381C00B082970\",\"links\" : {\"F12AC5E185BB641038431E4B4C3456293\" : {\"color\" : \"\",\"id\" : \"F12AC5E185BB641038431E4B4C3456293\",\"invisible\" : false,\"length\" : 0,\"source\" : \"FEF76FDF6550246224C26BEBD124862CC\",\"target\" : \"F1AB14F00715746C17C7A051F4C4D50D1\",\"weight\" : 0},\"F18FE4D8176C446357C71A0CC5EE3A37F\" : {\"color\" : \"\",\"id\" : \"F18FE4D8176C446357C71A0CC5EE3A37F\",\"invisible\" : false,\"length\" : 0,\"source\" : \"FBC3E1C907D124ABCB4D37AFC978D49C0\",\"target\" : \"F793F564DFC7C41AD0C70B2CB648370C1\",\"weight\" : 0},\"F366688A254054F9AFC43A6EA5008CAD2\" : {\"color\" : \"\",\"id\" : \"F366688A254054F9AFC43A6EA5008CAD2\",\"invisible\" : false,\"length\" : 0,\"source\" : \"F1AB14F00715746C17C7A051F4C4D50D1\",\"target\" : \"F1AB14F00715746C17C7A051F4C4D50D1\",\"weight\" : 0},\"F4509A7188928455C64B962BCBF295BF1\" : {\"color\" : \"\",\"id\" : \"F4509A7188928455C64B962BCBF295BF1\",\"invisible\" : false,\"length\" : 0,\"source\" : \"FEF76FDF6550246224C26BEBD124862CC\",\"target\" : \"FEF76FDF6550246224C26BEBD124862CC\",\"weight\" : 0},\"F682E684B60AC4F4CCCEED7EAB57AE7DA\" : {\"color\" : \"\",\"id\" : \"F682E684B60AC4F4CCCEED7EAB57AE7DA\",\"invisible\" : false,\"length\" : 0,\"source\" : \"F793F564DFC7C41AD0C70B2CB648370C1\",\"target\" : \"F1AB14F00715746C17C7A051F4C4D50D1\",\"weight\" : 0},\"F70650600519E474F5465932AD7970059\" : {\"color\" : \"\",\"id\" : \"F70650600519E474F5465932AD7970059\",\"invisible\" : false,\"length\" : 0,\"source\" : \"FBC3E1C907D124ABCB4D37AFC978D49C0\",\"target\" : \"F1AB14F00715746C17C7A051F4C4D50D1\",\"weight\" : 0},\"F893471BC9EC94849B42DB8268A9D1AB6\" : {\"color\" : \"\",\"id\" : \"F893471BC9EC94849B42DB8268A9D1AB6\",\"invisible\" : false,\"length\" : 0,\"source\" : \"FBC3E1C907D124ABCB4D37AFC978D49C0\",\"target\" : \"F36D7D8C8024E4D9B34DBDCE35F39E797\",\"weight\" : 0},\"F8C1F96C773474A8154A4C46BB113E35E\" : {\"color\" : \"\",\"id\" : \"F8C1F96C773474A8154A4C46BB113E35E\",\"invisible\" : false,\"length\" : 0,\"source\" : \"F36D7D8C8024E4D9B34DBDCE35F39E797\",\"target\" : \"F1AB14F00715746C17C7A051F4C4D50D1\",\"weight\" : 0},\"F98C36F7AB1D945CC9C7DE79A8C6E8CC7\" : {\"color\" : \"\",\"id\" : \"F98C36F7AB1D945CC9C7DE79A8C6E8CC7\",\"invisible\" : false,\"length\" : 0,\"source\" : \"F36D7D8C8024E4D9B34DBDCE35F39E797\",\"target\" : \"F36D7D8C8024E4D9B34DBDCE35F39E797\",\"weight\" : 0},\"FAC5309F8108F4A06F49F78E45EF88986\" : {\"color\" : \"\",\"id\" : \"FAC5309F8108F4A06F49F78E45EF88986\",\"invisible\" : false,\"length\" : 0,\"source\" : \"FBC3E1C907D124ABCB4D37AFC978D49C0\",\"target\" : \"FEF76FDF6550246224C26BEBD124862CC\",\"weight\" : 0},\"FE3F02797F57E4022DCE98F0FCF04CBA8\" : {\"color\" : \"\",\"id\" : \"FE3F02797F57E4022DCE98F0FCF04CBA8\",\"invisible\" : false,\"length\" : 0,\"source\" : \"F793F564DFC7C41AD0C70B2CB648370C1\",\"target\" : \"F793F564DFC7C41AD0C70B2CB648370C1\",\"weight\" : 0},\"FEE444EE1F5F64CD1BC9BD25BD64986EE\" : {\"color\" : \"\",\"id\" : \"FEE444EE1F5F64CD1BC9BD25BD64986EE\",\"invisible\" : false,\"length\" : 0,\"source\" : \"FBC3E1C907D124ABCB4D37AFC978D49C0\",\"target\" : \"FBC3E1C907D124ABCB4D37AFC978D49C0\",\"weight\" : 0}},\"nodes\" : {\"F1AB14F00715746C17C7A051F4C4D50D1\" : {\"callbacks\" : {},\"color\" : \"\",\"id\" : \"F1AB14F00715746C17C7A051F4C4D50D1\",\"layer\" : 0,\"menus\" : {\"F0868DA228962428204E306E7BA02C0BF\" : {\"callback\" : {\"func\" : \"unknown\",\"id\" : \"FCC126CDF1E5242146C0BCE666332E9C4\",\"knownArgs\" : [\"1\"],\"requiredArgs\" : {},\"trigger\" : \"click\"},\"id\" : \"F0868DA228962428204E306E7BA02C0BF\",\"menus\" : {},\"title\" : \"Simple\"}},\"messages\" : {},\"parent\" : \"\",\"size\" : 10,\"title\" : \"1\",\"type\" : \"circle\",\"x\" : 0,\"y\" : 0},\"F36D7D8C8024E4D9B34DBDCE35F39E797\" : {\"callbacks\" : {},\"color\" : \"\",\"id\" : \"F36D7D8C8024E4D9B34DBDCE35F39E797\",\"layer\" : 0,\"menus\" : {\"FBADFB1FBB15143125C5771BF1E49AAAC\" : {\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F4F18DC8FBC08428664203B7254BEDCFC\",\"knownArgs\" : [\"4\"],\"requiredArgs\" : {},\"trigger\" : \"click\"},\"id\" : \"FBADFB1FBB15143125C5771BF1E49AAAC\",\"menus\" : {},\"title\" : \"Simple\"}},\"messages\" : {},\"parent\" : \"\",\"size\" : 10,\"title\" : \"4\",\"type\" : \"circle\",\"x\" : 0,\"y\" : 0},\"F793F564DFC7C41AD0C70B2CB648370C1\" : {\"callbacks\" : {},\"color\" : \"\",\"id\" : \"F793F564DFC7C41AD0C70B2CB648370C1\",\"layer\" : 0,\"menus\" : {\"F3A62027A90C14B2E64ADFBE598DCAB1F\" : {\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F40528265F01D48195C823DDF5A14D7CF\",\"knownArgs\" : [\"3\"],\"requiredArgs\" : {},\"trigger\" : \"click\"},\"id\" : \"F3A62027A90C14B2E64ADFBE598DCAB1F\",\"menus\" : {},\"title\" : \"Simple\"}},\"messages\" : {},\"parent\" : \"\",\"size\" : 10,\"title\" : \"3\",\"type\" : \"circle\",\"x\" : 0,\"y\" : 0},\"FBC3E1C907D124ABCB4D37AFC978D49C0\" : {\"callbacks\" : {},\"color\" : \"\",\"id\" : \"FBC3E1C907D124ABCB4D37AFC978D49C0\",\"layer\" : 0,\"menus\" : {\"F8F794C1FA828467404CA41218DCFC68D\" : {\"callback\" : {\"func\" : \"unknown\",\"id\" : \"F9A4E435F8A234BBD34DD34C838182A5C\",\"knownArgs\" : [\"5\"],\"requiredArgs\" : {},\"trigger\" : \"click\"},\"id\" : \"F8F794C1FA828467404CA41218DCFC68D\",\"menus\" : {},\"title\" : \"Simple\"}},\"messages\" : {},\"parent\" : \"\",\"size\" : 10,\"title\" : \"5\",\"type\" : \"circle\",\"x\" : 0,\"y\" : 0},\"FEF76FDF6550246224C26BEBD124862CC\" : {\"callbacks\" : {},\"color\" : \"\",\"id\" : \"FEF76FDF6550246224C26BEBD124862CC\",\"layer\" : 0,\"menus\" : {\"F2ED844CBF82047CA8C0E59ECD1D25F6A\" : {\"callback\" : {\"func\" : \"unknown\",\"id\" : \"FB9F3D102AF6942D1348022740EF8E8ED\",\"knownArgs\" : [\"2\"],\"requiredArgs\" : {},\"trigger\" : \"click\"},\"id\" : \"F2ED844CBF82047CA8C0E59ECD1D25F6A\",\"menus\" : {},\"title\" : \"Simple\"}},\"messages\" : {},\"parent\" : \"\",\"size\" : 10,\"title\" : \"2\",\"type\" : \"circle\",\"x\" : 0,\"y\" : 0}},\"simulation\" : true,\"type\" : \"directed\"},\"height\" : 600,\"id\" : \"F78F966D29C48478A349E56140B0752E8\",\"menus\" : {},\"messages\" : {},\"renderer\" : \"GraphViz-Renderer.dot\",\"texTypesetting\" : true,\"title\" : \"Subgroups Digraph of Group( [ f1, f2 ] )\",\"width\" : 800,\"zoomToFit\" : true},\"mime\" : \"application\\/vnd.francy+json\",\"version\" : \"1.2.4\"}"
     },
     "execution_count": 6,
     "metadata": {
      "application/vnd.francy+json": {}
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "FrancyDigraphs(G);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2 style=\"text-align: left; margin-left: 10%\">4.1 More examples</h2>\n",
    "\n",
    "<h3>Try these notebooks:</h3>\n",
    "\n",
    "1. [Francy Features](francy-features.ipynb)\n",
    "2. [Subgroup Lattice](subgroup-lattice.ipynb)\n",
    "3. [Francy Monoids](francy-monoids.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0\">\n",
    "<h1 style=\"text-align: center\">5. Future</h1>\n",
    "\n",
    "<h3>\n",
    "<ul>\n",
    "    <li>rendering multiple topological graphs on the same canvas.</li>\n",
    "    <li>allow the creation of \"free graphics\" using lines and text.</li>\n",
    "    <li>introduce new concepts like tables for matrices representations.</li>\n",
    "    <li>validate the JSON against its JSON Schema between GAP and GUI.</li>\n",
    "    <li>rendering is done on SVG which might be \"heavy\" when loading huge graphs.</li>\n",
    "<ul>\n",
    "</h3>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<hr/>\n",
    "<div style=\"display: block; margin: 50px 0 50px 0\">\n",
    "<h1 style=\"text-align: center\">Questions?</h1>\n",
    "<br/>\n",
    "<h1 style=\"margin-left: 10%\">Thanks!</h1>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "GAP 4",
   "language": "gap",
   "name": "gap-4"
  },
  "language_info": {
   "codemirror_mode": "gap",
   "file_extension": ".g",
   "mimetype": "text/x-gap",
   "name": "GAP 4",
   "nbconvert_exporter": "",
   "pygments_lexer": "gap",
   "version": "4.13dev"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}

[ Dauer der Verarbeitung: 0.20 Sekunden  (vorverarbeitet)  ]