{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Musing on implementing semigroup representation theory and software integration\n", "$\\newcommand{\\K}{\\mathbb{K}}$\n", "\n", "\n", "Nicolas M. Thiéry
\n", "LRI, Université Paris Sud\n", "\n", "View the live slides on binder: https://tinyurl.com/swavl3h\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "heading_collapsed": true, "slideshow": { "slide_type": "notes" } }, "source": [ "## Abstract\n", "\n", "Extending representation theory from finite groups to finite\n", "semigroups brings interesting challenges, combinatorics, and\n", "applications. Almost a decade ago, I proposed an algorithm to compute\n", "the Cartan Matrix of a semigroup algebra -- a combinatorial invariant\n", "that contains information on how projective modules are built from\n", "simple modules. It boils down to computing with finite semigroups,\n", "characters of groups, and combinatorics. Despite this relative\n", "simplicity, and much to my embarrassment, a full production-grade\n", "implementation is only finally in reach.\n", "\n", "In this talk, I will report on ongoing joint work with my PhD student\n", "Balthazar Charles to implement this algorithm and adapt it to modular representations,\n", "and use this occasion to illustrate the evolution of our computational\n", "landscape toward an ecosystem of interoperable software, thanks to large\n", "scale collaborations." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Red line of the talk\n", "\n", "Balthazar is starting a PhD in modular representation theory of semigroups" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### Mathematical landscape" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Representation theory of groups: a grand old topic; 10k+ papers in a century \n", "- Representation theory of the symmetric group $\\mathfrak{S}_n$: beautiful combinatorics" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Modular representation theory of groups: 1k+ papers in the past 50 years" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Representation theory of semigroups: dozens of papers in the last decades" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Motto of semigroup theory: reduce to **group theory** and **combinatorics**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### Strategy" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Implement an algorithm of 2010 in full generality
\n", " Computing the Cartan invariants matrix of a semigroup\n", "- Adapt this algorithm to the modular case\n", "- Explore the representation theory of the transformation semigroup $T_n$: beautiful combinatorics?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## The mathematical landscape" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "### Semigroup theory perspective\n", "- Groups as perfect circles" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- The imperfection of semigroups: what happens when you can't always run in circle?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Irreversible steps, **ideals** (left and right)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Invertibility lost. All hopes for structure lost?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- May the Associativity be with you: **J-classes**, **eggbox picture**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Why bother?\n", "\n", "- Representation theory: also a tool for studying processes
\n", " Example: Splitting the state space of a large discrete Markov chain\n", "\n", "- Life is imperfect: many processes have irreversible steps!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Example:** the Tsetlin library\n", "\n", "\n", "\n", "- Beautiful eigenvalues!\n", "- Explanation: very irreversible process
$\\Longrightarrow$ basic representation theory" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### There are other angels\n", "\n", "\n", "\n", "**Motto**: reduce to the angels: group theory, combinatorics, linear algebra" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Representation theory of semigroups, in a nutshell" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Not semi-simple: simple ≠ indecomposable" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Composition factors**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Construction of simple modules: induced from the simple modules of the groupes" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Character theory: trace of the action of conjugacy class representatives
\n", " $\\Longrightarrow$ tool to recover composition factors" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Projective indecomposable modules**: “the largest indecomposable modules”" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **The Cartan invariants matrix**: composition factors of projective indecomposable modules
\n", " $\\Longrightarrow$ a nice source of combinatorics" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Computing the Cartan Invariant matrix?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Algorithm from finite dimensional algebras:**\n", "- Decompose the center of the semisimple quotient (MeatAxe-style)\n", "- Recover idempotents\n", "- Compute projective modules\n", "- Recover composition factors\n", "\n", "$\\Longrightarrow$ Linear algebra on $\\K S$, if not $End(\\K S)$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Intractable for $\\#S = 31103$ (bihecke monoid of type $A_5$)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Basic insight (T. 2010):**\n", "- Realize that the Cartan invariant matrix is the character of $\\K S$ as $S$-mod-$S$ bimodule\n", "- Computation by characters!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "**Algorithm:**\n", "- Compute semigroup structure, conjugacy class representatives $CC$\n", "- Compute the character table of $S$ from character table of $G$
\n", " Probable bottleneck: computing the radical of $\\K R$: $O\\left(\\sum\\#R_J^3\\right)$\n", "- Count two sided fixed points for each pair in $CC$ acting on $S$
\n", " Complexity: $O\\left(\\#CC^2\\sum_J n_J+ m_J\\right)$ group operations (Charles, Mitchell, T. '20)\n", "- Recover the composition factors" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Pros:**\n", "- Embarassingly parallel!\n", "- Amenable to modular representations: use Brauer characters" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**Implementation:**\n", "- Good: handles my semigroup of size 31k in one hour\n", "- Bad: aperiodic case only so far!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Musing on our computational landscape" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Available building blocks for semigroup representation theory" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Group computations: GAP, Magma\n", "- Semigroup computations: GAP, Semigroups (GAP), KBMag (C), Semigroupe (C), libsemigroups (C++), Sage\n", "- (Modular) representation theory of groups: GAP (but also GAP3+Specht)\n", "- Algebraic Combinatorics: Sage, Symmetrica (C), lrcalc (C), ...\n", "- Linear algebra: MeatAxe, Linbox, Sage, ...\n", "- Coxeter groups: GAP3+Chevie, GAP, Sage, Coxeter3, ...\n", "- Markov chains: Mathematica, ..." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Question: How to proceed?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### The Unicorn way: “There can be only one”" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "That's what happens in the tech industry: a single player takes it all (Amazon, AirBnB, Uber, ...) \n", "\n", "Why not for us?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Let's reimplement everything in ~~C++~~, ~~Magma~~, ~~GAP~~, ~~Sage~~, ~~Julia~~, ~~Mathematica~~ your favorite system" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Ok for a quick focused result
\n", " Maybe that's what I should have done, actually, to get my paper out" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Does not scale, due to time scale and man power:
\n", " Our software are the result of decades of hard work and deep expertise" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Promotes competition between systems, at the wrong scale" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Honestly, we don't know what will a good system in 10-20 years
\n", " we need to explore many approaches" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Balthazar's tool box" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import sage_annotations\n", "from mygap import mygap\n", "mygap.LoadPackage(\"Semigroups\");\n", "\n", "import sage_semigroups\n", "import sage_combinat_widgets\n", "\n", "from sage_explorer import explore\n", "from sage_explorer.sage_explorer import Settings\n", "Settings.add_property('cardinality', predicate=Groups().Finite().__contains__)\n", "Settings.add_property('conjugacy_classes', predicate=Groups().Finite().__contains__)\n", "Settings.add_property('multiplication_table', predicate=Groups().Finite().__contains__)\n", "#Partitions.options.convention=\"French\"\n", "%display unicode_art\n", "tensor.symbol = \" ⊗ \"\n", "%run style/odk.py" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Semigroup theory" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "T3 = mygap.FullTransformationSemigroup(3)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "graph = T3.cayley_graph()\n", "graph.set_latex_options(format=\"dot2tex\")\n", "view(graph)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "application/vnd.francy+json": "{\"version\": \"1.1.3\", \"mime\": \"application/vnd.francy+json\", \"canvas\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d\", \"title\": \"\", \"width\": 800.0, \"height\": 100.0, \"zoomToFit\": true, \"texTypesetting\": false, \"graph\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_graph2\", \"simulation\": true, \"collapsed\": true, \"drag\": false, \"showNeighbours\": false, \"nodes\": {\"32bb90e8976aab5298d5da10fe66f21d_node3\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node3\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"IdentityTransformation\", \"color\": \"\", \"highlight\": true, \"layer\": 3, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node4\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 2, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 4, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node5\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node5\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 3, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 5, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node6\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node6\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 6, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node7\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node7\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 1, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 7, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node8\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node8\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 2, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 8, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node9\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 1, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 9, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node10\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 1, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 10, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node11\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node11\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 3, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 11, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node12\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 2, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 12, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node13\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 1, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 13, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node14\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node14\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 3, 3 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 14, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node15\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node15\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 3, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 15, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node16\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node16\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 3, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 16, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node17\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node17\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 3, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 17, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node18\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node18\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 18, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node19\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 1, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 19, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node20\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 2, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 20, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node21\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node21\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 21, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node22\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node22\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 2, 2, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 22, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node23\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node23\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 3, 3 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 23, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node24\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node24\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 2, 3 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 24, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node25\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node25\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 1, 3 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 25, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node26\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node26\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 3, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 26, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node27\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node27\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 2, 2 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 27, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node28\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node28\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 3, 1, 1 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 28, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}, \"32bb90e8976aab5298d5da10fe66f21d_node29\": {\"id\": \"32bb90e8976aab5298d5da10fe66f21d_node29\", \"x\": 0, \"y\": 0, \"type\": \"circle\", \"size\": 10, \"title\": \"Transformation( [ 1, 3, 3 ] )\", \"color\": \"\", \"highlight\": true, \"layer\": 29, \"parent\": \"\", \"menus\": {}, \"messages\": {}, \"callbacks\": {}}}, \"links\": {\"32bb90e8976aab5298d5da10fe66f21d_edge30\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node3\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge30\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge31\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node3\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node5\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge31\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge32\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node3\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node6\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge32\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge33\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge33\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge34\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge34\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge35\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node11\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge35\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge36\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node5\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node7\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge36\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge37\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node5\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node15\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge37\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge38\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node5\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge38\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge39\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node6\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node3\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge39\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge40\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node6\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node8\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge40\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge41\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node6\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge41\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge42\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node7\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node3\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge42\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge43\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node7\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node8\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge43\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge44\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node7\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge44\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge45\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node8\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node7\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge45\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge46\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node8\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge46\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge47\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node8\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node15\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge47\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge48\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge48\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge49\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node21\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge49\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge50\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge50\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge51\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge51\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge52\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node24\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge52\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge53\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge53\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge54\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node11\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node25\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge54\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge55\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node11\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge55\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge56\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node11\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node26\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge56\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge57\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge57\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge58\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge58\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge59\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node14\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge59\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge60\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge60\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge61\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge61\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge62\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node27\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge62\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge63\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node14\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge63\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge64\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node14\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node28\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge64\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge65\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node14\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node29\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge65\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge66\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node15\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node5\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge66\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge67\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node15\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node6\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge67\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge68\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node15\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge68\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge69\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node16\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node17\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge69\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge70\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node16\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node18\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge70\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge71\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node16\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge71\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge72\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node17\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node16\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge72\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge73\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node17\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge73\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge74\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node17\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge74\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge75\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node18\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge75\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge76\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node18\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node21\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge76\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge77\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node18\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge77\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge78\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge78\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge79\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node22\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge79\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge80\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node16\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge80\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge81\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge81\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge82\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node9\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge82\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge83\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node21\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node17\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge83\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge84\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node21\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node20\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge84\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge85\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node21\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node18\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge85\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge86\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node22\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge86\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge87\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node22\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node22\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge87\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge88\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node22\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node23\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge88\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge89\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node23\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge89\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge90\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node23\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node23\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge90\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge91\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node24\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge91\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge92\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node24\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node25\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge92\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge93\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node24\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node26\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge93\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge94\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node25\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node4\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge94\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge95\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node25\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge95\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge96\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node25\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node24\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge96\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge97\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node26\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge97\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge98\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node26\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node10\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge98\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge99\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node26\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node11\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge99\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge100\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node27\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge100\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge101\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node27\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node28\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge101\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge102\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node27\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node29\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge102\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge103\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node28\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node12\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge103\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge104\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node28\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge104\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge105\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node28\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node27\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge105\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge106\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node29\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node19\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge106\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge107\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node29\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node13\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge107\"}, \"32bb90e8976aab5298d5da10fe66f21d_edge108\": {\"source\": \"32bb90e8976aab5298d5da10fe66f21d_node29\", \"weight\": 1, \"color\": \"\", \"target\": \"32bb90e8976aab5298d5da10fe66f21d_node14\", \"id\": \"32bb90e8976aab5298d5da10fe66f21d_edge108\"}}, \"type\": \"undirected\"}, \"menus\": {}, \"messages\": {}}}", "text/plain": [ "FrancyWidget(value=)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from francy_widget import FrancyWidget\n", "from networkx import DiGraph\n", "g = DiGraph()\n", "g.add_edges_from([(e[0], e[1]) for e in graph.edges()])\n", "FrancyWidget(g)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "T5 = mygap.FullTransformationSemigroup(5)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "3125" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "T5.cardinality()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n", "\n", "\n" ] } ], "source": [ "d_classes = T5.d_classes()\n", "for d_class in d_classes:\n", " print(d_class)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "Group([ (1,2,3,4), (1,2) ])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = d_classes[1].schutzenberger_group()\n", "G" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "Group([ (1,2,3,4), (1,2) ])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "G = d_classes[1].schutzenberger_group()\n", "G" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Modular representation of groups" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "[ (2), (2) ]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[ (1), (1) ]" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "⎡ ⎛2 2 0⎞ ⎛2 0 0⎞ ⎤\n", "⎢ ⎜2 1 0⎟ ⎜0 2 2⎟ ⎥\n", "⎣ ⎝0 1 1⎠, ⎝0 0 1⎠ ⎦" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "⎡ ⎛0 1 2⎞ ⎛2 2 0⎞ ⎤\n", "⎢ ⎜2 2 1⎟ ⎜0 1 0⎟ ⎥\n", "⎣ ⎝2 2 0⎠, ⎝0 0 1⎠ ⎦" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "reps = G.irreducible_representations(GF(3))\n", "for rho in reps:\n", " display([matrix(rho(g).gap()) for g in G.group_generators()])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all( [ rho(g)*rho(h) == rho(g*h) for g in G for h in G ] )" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Sage-GAP lightweight Math-in-the-Middle interface" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "Algebra of over Rational Field" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = T5.algebra(QQ); A" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "58*B + 72*\n", " Transformation( [ 4, 5, 1, 2, 3 ] ) \n", "\n", "B + 76*1 + 63*\n", " Transformation( [ 2, 3, 4, 5, 1 ] ) \n", "\n", "B + 74*B\n", " Transformation( [ 5, 1, 2, 3, 4 ] ) Transformation( [ 3, 4, 5, 1, 2 ] )" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.an_element() ^ 3" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "##### How it works\n", "- Enriched libgap handles with\n", "- Semantic carried over using\n", "- Alignments provided as annotations\n", "```python\n", " @semantic(gap=\"Group\", variant=\"multiplicative\")\n", " class Groups:\n", "\n", " class ParentMethods:\n", "\n", " @semantic(gap=\"GeneratorsOfGroup\", codomain=Family[Self])\n", " @abstract_method\n", " def group_generators(self):\n", " pass\n", "```" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Exploring" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "70a8fc9d33d540f2ae53cdc73e696478", "version_major": 2, "version_minor": 0 }, "text/plain": [ "SageExplorer(children=(VBox(children=(ExplorerTitle(children=(MathTitle(value='Exploring: Group([ (1,2,3,4), (…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "explore(G)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Combinatorial Representation Theory of $\\mathfrak S_n$" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "┌───┬────┬───┬───┐\n", "│ 1 │ 4 │ 5 │ 9 │\n", "├───┼────┼───┴───┘\n", "│ 2 │ 7 │\n", "├───┼────┤\n", "│ 3 │ 10 │\n", "├───┼────┘\n", "│ 6 │\n", "├───┤\n", "│ 8 │\n", "└───┘" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "StandardTableaux(10).random_element()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "Sym = SymmetricFunctions(QQ['t']);\n", "s = Sym.s()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "1 ⊗ s + s ⊗ s + s ⊗ s + s ⊗ s + s ⊗ s + s ⊗ s + \n", " ┌┬┬┐ ┌┐ ┌┬┐ ┌┐ ┌┬┬┐ ┌┐ ┌┬┐ ┌┬┐ ┌┐ ┌┬┐ ┌┬┐ \n", " ├┼┴┘ └┘ ├┼┘ └┘ └┴┴┘ ├┤ └┴┘ └┴┘ ├┤ └┴┘ └┴┘ \n", " └┘ └┘ └┘ └┘ \n", "\n", "s ⊗ s + s ⊗ s + s ⊗ 1\n", " ┌┬┐ ┌┐ ┌┬┬┐ ┌┐ ┌┬┬┐ \n", " ├┼┘ └┘ └┴┴┘ └┘ ├┼┴┘ \n", " └┘ └┘ " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[3,1].coproduct()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c15d92f8caa64a1d9ce72e60c5f49ecc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Interactive function with 1 widget\n", " p1: GridViewWidget(value=[2, 1], children=…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "@interact\n", "def f(p1 = Partition([2,1])._widget_()):\n", " return s[p1].coproduct()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Modular combinatorial representation theory of $\\mathfrak S_n$" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "⎡ . . 0 0 0 . . 1 0 0 . . 0 0 0 ⎤\n", "⎢ . 0 0 2 . 0 0 0 . 1 0 1 ⎥\n", "⎣ 1 0 1 , 1 0 2 , 2 0 0 ⎦" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(RibbonTableaux([[5,4,3],[2,1]], [2,1], 3))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "level 3 LLT polynomials over Univariate Polynomial Ring in t over Rational Field" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Sym.llt(3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Reproducible environment" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Complete description of the environment:\n", "\n", " FROM registry.gitlab.com/sagemath/sage/sagemath-dev:9.0-py3\n", "\n", " RUN sudo apt-get update && sudo apt-get -qy install graphviz build-essential git g++ && sudo apt-get clean\n", " RUN sage -i gap_packages && rm -rf /home/sage/sage/upstream\n", " RUN sudo apt-get update && sudo apt-get -qq install -y curl \\\n", " && curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - \\\n", " && sudo apt-get install -yq nodejs && sudo npm install npm@latest -g\n", " RUN sage -pip install --no-cache-dir --upgrade ipywidgets\n", " RUN sage -pip install --no-cache-dir dot2tex\n", " RUN sage -pip install --no-cache-dir RISE\n", " RUN sage -pip install --no-cache-dir nbdime\n", " #RUN sage -pip install --no-cache-dir cppyy\n", " RUN sage -pip install --no-cache-dir git+https://github.com/nthiery/sage-gap-semantic-interface/\n", " RUN sage -pip install --no-cache-dir git+https://github.com/nthiery/sage-semigroups/\n", " RUN sage -pip install --no-cache-dir git+https://github.com/zerline/francy-widget/\n", " RUN sage -pip install --no-cache-dir git+https://github.com/sagemath/sage-combinat-widgets/@develop\n", " #RUN sage -pip install --no-cache-dir git+https://github.com/sagemath/sage-combinat-widgets/@master\n", " RUN sage -pip install --no-cache-dir git+https://github.com/sagemath/sage-explorer/@develop" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### What it took to get there; lessons learned the hard way" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Sage interface to GAP\n", "\n", "- **Once upon a time:** no interface from my favorite system (MuPAD)\n", "- **2008:** Sage, with it's text interface to GAP!
\n", " Caveats:\n", " - too slow for low-granularity computation\n", " - monolithic adapters: only groups can be used as native groups\n", "- **2012:** Sage's libgap: C-level interface to calling GAP! (Volker Braun et al.)
\n", " Caveat: a patched version of GAP\n", " - hard to maintain\n", " - hard to package\n", " - binary incompatible: $\\Longrightarrow$ no kernel modules $\\Longrightarrow$ no Semigroups\n", "- **2017-2019:** GAP's libgap (Markus Pfeiffer, Sebastian Gutsche, Max Horn, ...)
\n", " Integration in Sage (Erik Bray, ...)
\n", "- **2018** OSCAR: fast bidirectional calls between GAP and Julia (Sebastian Gutsche et al.)\n", "- **2015-:** Semantic interface to GAP (T. et al.)
\n", " Prototype; needs maturation and users to expand its scope" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Example: Interface to Semigroupe / libsemigroups\n", "- **Once upon a time**: Semigroupe by Jean-Éric Pin\n", "- **2010**: Cython bindings (T. et al.)
\n", " Caveats:\n", " - Semigroupe designed as standalone system. Global variable and single semigroup
\n", " $\\Longrightarrow$ Never made its way into Sage\n", "- **2016-**: libsemigroups ( et al.)\n", "- **2017**: Cython bindings (James Mitchell et T.)
\n", " Caveat: too much work to maintain\n", "- **2018**: cppyy bindings
\n", " Caveat: cppyy not yet mature enough\n", "- **2017-2020**: libsemigroups maturation (James Mitchel with help from Florent Hivert, T.):
\n", " API, build system, packaging, ...\n", "- **2019**: libsemigroups+Semigroups packaged in Sage (Dima Pasechnik)\n", "- **2020**: libsemigroups directly usable in Sage via cppyy!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- **Challenge**: how to push features down the stack?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Take home messages" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "###### Main challenge of computational semigroup representation theory?\n", "Combining many different building blocks" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "##### Major evolution of the last decade: we are building an ecosystem of interoperable software\n", "- A place where software pieces can emerge, live, compete, and die when they are superseded or not used anymore, without drowning down years of work\n", "- A place that fosters new ideas, and healthy competition at the granularity of ideas only\n", "\n", "**Hard** but **Doable**" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "**What it takes**\n", "- Large scale collaboration, across communities\n", "- Elaborating and following best practices; exploit emerging technologies\n", "- Research Software Engineers; funding? people? career paths?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "##### Opportunity: European funding\n", "- **Takes:** lots of work and luck; **Gives:** lot of resources\n", "- EOSC, Cost Networks" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Appendices" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Best practices" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### (Re)Designing our systems to be good citizens of the ecosystem\n", "- Free Software\n", "- Tests and continuous integration\n", "- Mainstream build and installation system\n", "- Mainstream development workflow\n", "- Packaging (conda, linux packages, ...)\n", "- Reduced coupling with dependencies\n", "- Well defined low level API to interact with the system\n", "- Modularity\n", "- Exposing the semantic" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "#### Interfaces\n", "\n", "- Language-level interface:\n", " - Fast comprehensive access to the other system via remote function calls and handles\n", "- Aligning the semantic:\n", " - Automatic conversion of objects\n", " - Adapting" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Externalize and share solutions to common needs\n", "- Reusable specialized high performance libraries\n", "- Development tools\n", "- User interface / interactive environment (Jupyter)\n", "- Interactive widgets (Francy, ...)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Shameless plug:\n", "- Session: **The Jupyter environment for interactive computational mathematics**?
\n", " International Congress for Mathematical Software
\n", " Braunschweig, 13-16 July, 2020
\n", " Call for speakers!" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### Research Software Engineers\n", "- We need software for our research\n", "- It's our job as researcher to implement the maths we need\n", "- We are killing ourselves with the maintenance and technical work" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Can we do something about it?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Lesson learned from OpenDreamKit:
\n", " A few **Research Software Engineers** can make a major impact\n", "\n", "- We need to do something to secure funding and career paths" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "#### Large scale collaboration\n", "- Constantly coordinating efforts\n", "- Regular joint workshops\n", "- Joint projects?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Cost network?: European Cooperation in Science and Technology" ] } ], "metadata": { "celltoolbar": "Diaporama", "kernelspec": { "display_name": "SageMath 9.0", "language": "sage", "name": "sagemath" }, "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.7.3" }, "rise": { "auto_select": "first", "autolaunch": true, "background-image": "linear-gradient(rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.9)), url(../../../public/images/banner.png);", "scroll": true, "start_slideshow_at": "selected", "transition": "none" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }