{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# GAP packages overview" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this demonstration, we will visualise some information about the GAP packages ecosystem, using the [JupyterViz package](https://nathancarter.github.io/jupyterviz/) by Nathan Carter. First, we need to load this package." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "true" ] }, "execution_count": 1, "metadata": { "text/plain": "" }, "output_type": "execute_result" } ], "source": [ "LoadPackage(\"jupyterviz\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, we read metadata for all GAP packages available in this GAP installation (145 packages are redistributed with GAP 4.10.2; the number you will see below may differ dependently on your installation)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "145" ] }, "execution_count": 3, "metadata": { "text/plain": "" }, "output_type": "execute_result" } ], "source": [ "pkgnames := SortedList(RecNames(GAPInfo.PackagesInfo));;\n", "Length(pkgnames);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we read an auxliary file with the necessary GAP code." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true, "scrolled": false }, "outputs": [], "source": [ "Read(\"../gap/packages.g\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is the list of packages in this GAP installation, ordered by their release date." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "*** Releases in chronological order:\n", "22/12/2012 : ToricVarieties 2012.12.22\n", "07/03/2013 : CTblLib 1.2.2\n", "27/10/2013 : HAPcryst 0.1.11\n", "02/12/2014 : CoReLG 1.20\n", "08/03/2016 : GBNP 1.0.3\n", "11/03/2016 : ACE 5.2\n", "20/03/2016 : CRISP 1.4.4\n", "28/02/2017 : OpenMath 11.4.2\n", "07/03/2017 : Toric 1.9.4\n", "26/04/2017 : Smallsemi 0.6.11\n", "03/08/2017 : IRREDSOL 1.4\n", "10/09/2017 : SCO 2017.09.10\n", "12/09/2017 : Nilmat 1.3\n", "14/09/2017 : IntPic 0.2.3\n", "25/09/2017 : Circle 1.6.1\n", "21/11/2017 : genss 1.6.5\n", "29/11/2017 : Polenta 1.3.8\n", "03/12/2017 : NormalizInterface 1.0.2\n", "30/01/2018 : EDIM 1.3.3\n", "04/02/2018 : LocalizeRingForHomalg 2018.02.04\n", "18/02/2018 : FactInt 1.6.2\n", "08/03/2018 : fwtree 1.1\n", "08/03/2018 : SglPPow 2.1\n", "20/03/2018 : SymbCompCC 1.3\n", "23/03/2018 : FGA 1.4.0\n", "24/03/2018 : GUAVA 3.14\n", "31/03/2018 : FinInG 1.4.1\n", "09/04/2018 : SmallGrp 1.3\n", "09/04/2018 : Sophus 1.24\n", "09/04/2018 : Unipot 1.4\n", "09/04/2018 : LieAlgDB 2.2\n", "15/04/2018 : recog 1.3.2\n", "23/04/2018 : RadiRoot 2.8\n", "01/05/2018 : UnitLib 4.0.0\n", "12/05/2018 : Polycyclic 2.14\n", "08/06/2018 : json 2.0.0\n", "08/06/2018 : Browse 1.8.8\n", "11/06/2018 : Cubefree 1.17\n", "13/06/2018 : ITC 1.5\n", "14/06/2018 : float 0.9.1\n", "06/07/2018 : 4ti2Interface 2018.07.06\n", "18/07/2018 : Example 4.1.1\n", "24/07/2018 : PatternClass 2.4.2\n", "30/07/2018 : AutPGrp 1.10\n", "09/08/2018 : GrpConst 2.6.1\n", "19/08/2018 : permut 2.0.3\n", "30/08/2018 : XModAlg 1.17\n", "31/08/2018 : TransGrp 2.0.4\n", "08/09/2018 : Gauss 2018.09.08\n", "13/09/2018 : DeepThought 1.0.2\n", "14/09/2018 : cohomolo 1.6.7\n", "22/09/2018 : uuid 0.6\n", "22/09/2018 : crypting 0.9\n", "26/09/2018 : Automata 1.14\n", "27/09/2018 : Forms 1.2.5\n", "30/09/2018 : AutomGrp 1.3.1\n", "07/10/2018 : SONATA 2.9.1\n", "10/10/2018 : QPA 1.29\n", "11/10/2018 : LiePRing 1.9.2\n", "11/10/2018 : AClib 1.3.1\n", "11/10/2018 : CRIME 1.5\n", "17/10/2018 : GAPDoc 1.6.2\n", "26/10/2018 : curlInterface 2.1.1\n", "27/10/2018 : PrimGrp 3.3.2\n", "29/10/2018 : SgpViz 0.999.4\n", "01/11/2018 : ZeroMQInterface 0.11\n", "03/11/2018 : FR 2.4.6\n", "04/11/2018 : Carat 2.2.3\n", "06/11/2018 : loops 3.4.1\n", "14/11/2018 : lpres 1.0.1\n", "15/11/2018 : Guarana 0.96.2\n", "20/11/2018 : HeLP 3.4\n", "30/11/2018 : Wedderga 4.9.5\n", "02/12/2018 : MapClass 1.4.4\n", "06/12/2018 : MajoranaAlgebras 1.4\n", "18/12/2018 : datastructures 0.2.3\n", "01/01/2019 : IO_ForHomalg 2019.01.01\n", "05/01/2019 : GradedModules 2019.01.05\n", "07/01/2019 : ExamplesForHomalg 2019.01.07\n", "16/01/2019 : GeneralizedMorphismsForCAP 2019.01.16\n", "16/01/2019 : LinearAlgebraForCAP 2019.01.16\n", "16/01/2019 : ModulePresentationsForCAP 2019.01.16\n", "01/02/2019 : GaussForHomalg 2019.02.01\n", "01/02/2019 : HomalgToCAS 2019.02.01\n", "01/02/2019 : RingsForHomalg 2019.02.01\n", "03/02/2019 : homalg 2019.02.03\n", "03/02/2019 : Modules 2019.02.03\n", "05/02/2019 : HAP 1.19\n", "06/02/2019 : hecke 1.5.2\n", "06/02/2019 : Thelma 1.02\n", "15/02/2019 : nq 2.5.4\n", "17/02/2019 : ToolsForHomalg 2019.02.17\n", "19/02/2019 : walrus 0.99\n", "19/02/2019 : kbmag 1.5.8\n", "19/02/2019 : ModIsom 2.5.0\n", "21/02/2019 : QuaGroup 1.8.1\n", "22/02/2019 : singular 2019.02.22\n", "22/02/2019 : Repsn 3.1.0\n", "23/02/2019 : orb 4.8.2\n", "23/02/2019 : LieRing 2.4.1\n", "23/02/2019 : JupyterKernel 1.3\n", "23/02/2019 : polymaking 0.8.2\n", "23/02/2019 : YangBaxter 0.7.0\n", "23/02/2019 : RDS 1.7\n", "02/03/2019 : SpinSym 1.5.1\n", "04/03/2019 : XMod 2.73\n", "08/03/2019 : MatricesForHomalg 2019.03.08\n", "15/03/2019 : profiling 2.2.1\n", "15/03/2019 : FORMAT 1.4.1\n", "18/03/2019 : IO 4.6.0\n", "18/03/2019 : DESIGN 1.7\n", "20/03/2019 : cvec 2.7.2\n", "20/03/2019 : GRAPE 4.8.2\n", "24/03/2019 : RCWA 4.6.4\n", "24/03/2019 : ResClasses 4.7.2\n", "26/03/2019 : PolymakeInterface 2019.03.26\n", "28/03/2019 : JupyterViz 1.5.1\n", "29/03/2019 : SLA 1.5.2\n", "02/04/2019 : GradedRingForHomalg 2019.04.02\n", "16/04/2019 : XGAP 4.30\n", "17/04/2019 : Digraphs 0.15.2\n", "18/04/2019 : ANUPQ 3.2.1\n", "18/04/2019 : matgrp 0.62\n", "25/04/2019 : NumericalSgps 1.2.0\n", "01/05/2019 : Convex 2019.05.01\n", "01/05/2019 : TomLib 1.2.8\n", "10/05/2019 : PackageManager 0.4\n", "10/05/2019 : AtlasRep 2.1.0\n", "17/05/2019 : Francy 1.2.4\n", "19/05/2019 : SCSCP 2.3.0\n", "19/05/2019 : Congruence 1.2.3\n", "19/05/2019 : LAGUNA 3.9.3\n", "20/05/2019 : AutoDoc 2019.05.20\n", "28/05/2019 : CrystCat 1.1.9\n", "28/05/2019 : Cryst 4.1.19\n", "29/05/2019 : groupoids 1.66\n", "29/05/2019 : utils 0.63\n", "29/05/2019 : kan 1.29\n", "29/05/2019 : idrel 2.43\n", "31/05/2019 : FPLSA 1.2.3\n", "03/06/2019 : simpcomp 2.1.10\n", "04/06/2019 : Alnuth 3.1.1\n", "07/06/2019 : CAP 2019.06.07\n", "07/06/2019 : Semigroups 3.1.3\n", "07/06/2019 : MonoidalCategories 2019.06.07\n", "\n" ] } ], "source": [ "reldates:=PackageReleaseDates();;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The majority of packages has been updated within the last two years" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "*** Number of packages last updated in specified year:\n", "2012 : 1\n", "2013 : 2\n", "2014 : 1\n", "2016 : 3\n", "2017 : 11\n", "2018 : 58\n", "2019 : 69\n", "\n" ] } ], "source": [ "PackageReleaseDatesSummary(reldates);;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will now illustrate this with a bar chart, produced with the help of the JupyterViz package." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "( function ( element ) {\n", "if(!window.hasOwnProperty(\"runGAP\")){window.runGAP=function(code,callback){if(!Jupyter||!Jupyter.notebook||!Jupyter.notebook.kernel)return callback(null,\"JavaScript-based output must be re-evaluated when the notebook\"+\" is reloaded. (Re-run the cell to clear this problem.)\");var errorMessages=[];var timeout=null;Jupyter.notebook.kernel.execute(code,{iopub:{output:function(message){if(\"data\"in message.content)return callback(message.content.data,null);if(!(\"text\"in message.content))return callback(null,message.content);errorMessages.push(message.content.text);if(timeout!==null)clearTimeout(timeout);timeout=setTimeout(function(){callback(null,errorMessages.join(\"\\n\"))},200)},clear_output:function(message){}},shell:{reply:function(message){}},input:function(message){}},{})}}if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){window.createVisualization(element,{\"data\" : {\"data\" : [{\"x\" : [2012,2013,2014,2016,2017,2018,2019],\"y\" : [1,2,1,3,11,58,69],\"type\" : \"bar\"}],\"layout\" : {\"height\" : 400}},\"tool\" : \"plotly\"}\n", ",function(element,visualization){\n", "});\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"viz-tool-plotly\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"viz-tool-plotly\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"viz-tool-plotly\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"main\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"main\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"main\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", ";\n", "} )( element.get( 0 ) )" ] }, "execution_count": 7, "metadata": { "application/javascript": "" }, "output_type": "execute_result" } ], "source": [ "Plot(reldates,rec(type:=\"bar\"));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "GAP 4.11 will introduce new field in the package metadata to specify its license using SPDX identfiers. Some packages already include this information, and even more will contain it after the next GAP release." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "*** 61 packages have SPDX license identifier in PackageInfo.g\n", "*** 84 packages have no SPDX license identifier in PackageInfo.g\n", "\n", "*** Licence types, when SPDX license identifier provided:\n", "84 : Not specified\n", "50 : GPL-2.0-or-later\n", "6 : GPL-3.0-or-later\n", "1 : none\n", "1 : MIT\n", "1 : GPL-3.0\n", "1 : GPL-2.0 OR GPL-3.0\n", "1 : BSD-3-Clause\n", "\n" ] } ], "source": [ "licinfo:=PackagesByLicenseType();;" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "( function ( element ) {\n", "if(!window.hasOwnProperty(\"runGAP\")){window.runGAP=function(code,callback){if(!Jupyter||!Jupyter.notebook||!Jupyter.notebook.kernel)return callback(null,\"JavaScript-based output must be re-evaluated when the notebook\"+\" is reloaded. (Re-run the cell to clear this problem.)\");var errorMessages=[];var timeout=null;Jupyter.notebook.kernel.execute(code,{iopub:{output:function(message){if(\"data\"in message.content)return callback(message.content.data,null);if(!(\"text\"in message.content))return callback(null,message.content);errorMessages.push(message.content.text);if(timeout!==null)clearTimeout(timeout);timeout=setTimeout(function(){callback(null,errorMessages.join(\"\\n\"))},200)},clear_output:function(message){}},shell:{reply:function(message){}},input:function(message){}},{})}}if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){window.createVisualization(element,{\"data\" : {\"data\" : [{\"values\" : [84,50,6,1,1,1,1,1],\"type\" : \"pie\",\"labels\" : [\"Not specified\",\"GPL-2.0-or-later\",\"GPL-3.0-or-later\",\"none\",\"MIT\",\"GPL-3.0\",\"GPL-2.0 OR GPL-3.0\",\"BSD-3-Clause\"]}],\"layout\" : {\"height\" : 400}},\"tool\" : \"plotly\"}\n", ",function(element,visualization){\n", "});\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"viz-tool-plotly\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"viz-tool-plotly\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"viz-tool-plotly\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"main\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"main\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"main\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", ";\n", "} )( element.get( 0 ) )" ] }, "execution_count": 9, "metadata": { "application/javascript": "" }, "output_type": "execute_result" } ], "source": [ "Plot(licinfo, rec(type:=\"pie\"));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we look at the number of packages providing a standard test." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "*** 113 packages have standard test in PackageInfo.g\n", "*** 32 packages have no standard test in PackageInfo.g\n", "\n", "For packages with tests, use the list below for Travis CI tests:\n", "- PKG_NAME=ace\n", "- PKG_NAME=aclib\n", "- PKG_NAME=alnuth\n", "- PKG_NAME=anupq\n", "- PKG_NAME=atlasrep\n", "- PKG_NAME=autodoc\n", "- PKG_NAME=automata\n", "- PKG_NAME=automgrp\n", "- PKG_NAME=autpgrp\n", "- PKG_NAME=carat\n", "- PKG_NAME=circle\n", "- PKG_NAME=cohomolo\n", "- PKG_NAME=congruence\n", "- PKG_NAME=crime\n", "- PKG_NAME=crisp\n", "- PKG_NAME=crypting\n", "- PKG_NAME=cryst\n", "- PKG_NAME=crystcat\n", "- PKG_NAME=ctbllib\n", "- PKG_NAME=cubefree\n", "- PKG_NAME=curlinterface\n", "- PKG_NAME=cvec\n", "- PKG_NAME=datastructures\n", "- PKG_NAME=deepthought\n", "- PKG_NAME=design\n", "- PKG_NAME=digraphs\n", "- PKG_NAME=example\n", "- PKG_NAME=factint\n", "- PKG_NAME=fga\n", "- PKG_NAME=fining\n", "- PKG_NAME=float\n", "- PKG_NAME=format\n", "- PKG_NAME=forms\n", "- PKG_NAME=fplsa\n", "- PKG_NAME=fr\n", "- PKG_NAME=francy\n", "- PKG_NAME=gbnp\n", "- PKG_NAME=genss\n", "- PKG_NAME=grape\n", "- PKG_NAME=groupoids\n", "- PKG_NAME=grpconst\n", "- PKG_NAME=guarana\n", "- PKG_NAME=guava\n", "- PKG_NAME=hap\n", "- PKG_NAME=hapcryst\n", "- PKG_NAME=hecke\n", "- PKG_NAME=help\n", "- PKG_NAME=idrel\n", "- PKG_NAME=intpic\n", "- PKG_NAME=io\n", "- PKG_NAME=irredsol\n", "- PKG_NAME=json\n", "- PKG_NAME=jupyterkernel\n", "- PKG_NAME=jupyterviz\n", "- PKG_NAME=kan\n", "- PKG_NAME=kbmag\n", "- PKG_NAME=laguna\n", "- PKG_NAME=liealgdb\n", "- PKG_NAME=liepring\n", "- PKG_NAME=liering\n", "- PKG_NAME=loops\n", "- PKG_NAME=lpres\n", "- PKG_NAME=majoranaalgebras\n", "- PKG_NAME=mapclass\n", "- PKG_NAME=matgrp\n", "- PKG_NAME=modisom\n", "- PKG_NAME=monoidalcategories\n", "- PKG_NAME=normalizinterface\n", "- PKG_NAME=nq\n", "- PKG_NAME=numericalsgps\n", "- PKG_NAME=openmath\n", "- PKG_NAME=orb\n", "- PKG_NAME=packagemanager\n", "- PKG_NAME=patternclass\n", "- PKG_NAME=permut\n", "- PKG_NAME=polenta\n", "- PKG_NAME=polycyclic\n", "- PKG_NAME=polymaking\n", "- PKG_NAME=primgrp\n", "- PKG_NAME=profiling\n", "- PKG_NAME=qpa\n", "- PKG_NAME=radiroot\n", "- PKG_NAME=rcwa\n", "- PKG_NAME=rds\n", "- PKG_NAME=recog\n", "- PKG_NAME=repsn\n", "- PKG_NAME=resclasses\n", "- PKG_NAME=scscp\n", "- PKG_NAME=semigroups\n", "- PKG_NAME=sglppow\n", "- PKG_NAME=sgpviz\n", "- PKG_NAME=simpcomp\n", "- PKG_NAME=singular\n", "- PKG_NAME=sla\n", "- PKG_NAME=smallgrp\n", "- PKG_NAME=smallsemi\n", "- PKG_NAME=sonata\n", "- PKG_NAME=sophus\n", "- PKG_NAME=spinsym\n", "- PKG_NAME=thelma\n", "- PKG_NAME=tomlib\n", "- PKG_NAME=toric\n", "- PKG_NAME=transgrp\n", "- PKG_NAME=unipot\n", "- PKG_NAME=unitlib\n", "- PKG_NAME=utils\n", "- PKG_NAME=uuid\n", "- PKG_NAME=walrus\n", "- PKG_NAME=wedderga\n", "- PKG_NAME=xmod\n", "- PKG_NAME=xmodalg\n", "- PKG_NAME=yangbaxter\n", "- PKG_NAME=zeromqinterface\n", "\n", "For packages without tests, this is the TODO list to add them:\n", "- [ ] 4ti2interface\n", "- [ ] browse\n", "- [ ] cap\n", "- [ ] convex\n", "- [ ] corelg\n", "- [ ] edim\n", "- [ ] examplesforhomalg\n", "- [ ] fwtree\n", "- [ ] gapdoc\n", "- [ ] gauss\n", "- [ ] gaussforhomalg\n", "- [ ] generalizedmorphismsforcap\n", "- [ ] gradedmodules\n", "- [ ] gradedringforhomalg\n", "- [ ] homalg\n", "- [ ] homalgtocas\n", "- [ ] io_forhomalg\n", "- [ ] itc\n", "- [ ] linearalgebraforcap\n", "- [ ] localizeringforhomalg\n", "- [ ] matricesforhomalg\n", "- [ ] modulepresentationsforcap\n", "- [ ] modules\n", "- [ ] nilmat\n", "- [ ] polymakeinterface\n", "- [ ] quagroup\n", "- [ ] ringsforhomalg\n", "- [ ] sco\n", "- [ ] symbcompcc\n", "- [ ] toolsforhomalg\n", "- [ ] toricvarieties\n", "- [ ] xgap\n", "\n" ] } ], "source": [ "PackagesStandardTests();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An overview of package documentation tools, and also diagnostic of missing css files is produced next." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "*** 113 packages use GAPDoc (immediately or via AutoDoc) \n", "\n", "*** 32 packages do not have GAPDoc-based documentation:\n", "- [ ] ace\n", "- [ ] aclib\n", "- [ ] alnuth\n", "- [ ] automgrp\n", "- [ ] autpgrp\n", "- [ ] carat\n", "- [ ] cohomolo\n", "- [ ] crisp\n", "- [ ] cryst\n", "- [ ] crystcat\n", "- [ ] cubefree\n", "- [ ] design\n", "- [ ] fga\n", "- [ ] format\n", "- [ ] fwtree\n", "- [ ] grape\n", "- [ ] grpconst\n", "- [ ] irredsol\n", "- [ ] itc\n", "- [ ] liepring\n", "- [ ] matgrp\n", "- [ ] modisom\n", "- [ ] nilmat\n", "- [ ] radiroot\n", "- [ ] rds\n", "- [ ] sglppow\n", "- [ ] sonata\n", "- [ ] sonata\n", "- [ ] symbcompcc\n", "- [ ] transgrp\n", "- [ ] unipot\n", "- [ ] xgap\n", "\n", "*** 2 GAPDoc-based manuals miss css files:\n", "- [ ] gbnp\n", "- [ ] simpcomp\n", "\n", "\n" ] } ], "source": [ "PackagesManualFormats();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we are trying to identify all authors involved in developing GAP packages." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "*** Around 200 package authors/maintainers involved\n", "(this is an estimate, and the list may contain duplicates):\n", "\n", "Erhard Aichinger, Michael Albert, Murat Alp, Nurullah Ankaralioglu, \n", "Zekeriya Arvasi, Björn Assmann, Reinald Baart, Thomas Baechler, \n", "Gurmeet Kaur Bakshi, Adolfo Ballester-Bolinches, John Bamberg, \n", "Mohamed Barakat, Laurent Bartholdi, Reimer Behrends, Hans Ulrich Besche, \n", "Anton Betten, Franz Binder, Marcus Bishop, Tom Boothby, Victor Bovdi, \n", "John N. Bray, Thomas Breuer, Osnel Broche Cristo, Peter Brooksbank, \n", "Stuart Burrell, Andreas Bächle, Thomas Bächler, Philippe Cara, \n", "Nathan Carter, Frank Celler, Serena Cicalò, Carmelo Cisco, A.M. Cohen, \n", "Enric Cosme-Llópez, Marco Costantini, Jasper Cramwinckel, Vahid Dabbaghian, \n", "Jan De Beule, Karel Dekimpe, Manuel Delgado, Alla Detinko, Florian Diebold, \n", "Heiko Dietrich, Andreas Distler, Ann Dooms, James East, Jürgen Ecker, \n", "Felix Effenberger, Attila Egri-Nagy, Bettina Eick, Luke Elliott, \n", "Graham Ellis, Ramón Esteban-Romero, Paolo Faccin, Dörte Feichtenschlager, \n", "Volkmar Felsch, Joe Fields, Dane Flannery, Strazzanti Francesco, \n", "The GAP Team, Greg Gamble, Pedro A. Garcia-Sanchez, \n", "Juan Ignacio García-García, Vladimir Gerdt, Simon Goertzen, Edward Green, \n", "Sebastian Gutsche, Franz Gähler, Simon Görtzen, Sergei Haller, \n", "Nicholas Ham, René Hartung, George Havas, Benjamín Alarcón Heredia, \n", "Allen Herman, Andrés Herrera-Poyatos, Anne Heyworth, Ludger Hippe, \n", "Ruth Hoffmann, Derek Holt, Max Horn, Stephen Howe, Alexander Hulpke, \n", "Burkhard Höfling, Sebastian Jambor, Adam James, Christopher Jefferson, \n", "Eric Jespers, Julius Jonusas, David Joyner, Markus Kirschmer, J.W. Knopper, \n", "Stefan Kohl, Alexander Konovalov, Vladimir Kornyak, Markus Lange-Hegermann, \n", "Vasyl Laver, Michel Lavrauw, Maska Law, Martin Leuner, Steve Linton, \n", "Arne Lorenz, Frank Lübeck, Lukas Maas, Kay Magaard, Sugandha Maheshwary, \n", "Gunter Malle, Leo Margolis, Manuel Martins, Nicola Maugeri, Peter Mayr, \n", "John McDermott, Thomas Merkwitz, Robert Miller, Eric Minkes, James Mitchell, \n", "Emma J. Moore, Jose Morais, José João Morais, Carlos Jesús Moreno Ávila, \n", "Oleksandr Motsak, Juergen Mueller, Yevgen Muntyan, Gábor Nagy, \n", "Liam Naughton, Joachim Neubüser, Max Neunhoeffer, Max Neunhöffer, \n", "Werner Nickel, Simon Nickerson, Max Nicosia, Alice Niemeyer, Felix Noeske, \n", "Christof Nöbauer, Eamonn O'Brien, Chris O'Neill, Alper Odabas, \n", "Ignacio Ojeda, Aurora Olivieri, Gabriela Olteanu, Richard A. Parker, \n", "Dima V. Pasechnik, Götz Pfeiffer, Markus Pfeiffer, Sebastian Posur, \n", "Colin Ramsay, Daniel Robertz, Marc Roeder, Erik Roijackers, \n", "Colva M. Roney-Dougal, Richard Rossmanith, Tobias Rossmann, Lea Ruscio, \n", "Christopher Russell, Alessio Sammartano, Dmytro Savchuk, Csaba Schneider, \n", "Hans Schönemann, Ákos Seress, Sergey Shpectorov, Christian Sievers, \n", "Øystein Skartsæterhagen, Finn Smith, Jhevon Smith, Leonard H. Soicher, \n", "Oeyvind Solberg, Andrew Solomon, Panagiotis Soules, Jonathan Spreer, \n", "Andreas Steenpaß, Benjamin Steinberg, Klara Stokes, \n", "Alfredo Sánchez-R. Navarro, Christof Söger, Cen Tjhai, Michael Torpey, \n", "Dmitriy Traytel, Enver Onder Uslu, Inneke Van Gelder, Michael Vaughan-Lee, \n", "Leandro Vendramin, Helena Verrill, Petr Vojtěchovský, Helmut Volklein, \n", "Vinay Wagh, Nina Wagner, Chris Wensley, Christopher D. Wensley, Glen Whitney, \n", "Madeleine Whybrow, Murray Whyte, Robert A. Wilson, Wilf Wilson, \n", "Charles R.B. Wright, Elena Yakimenko, Fabian Zickgraf, Giuseppe Zito, \n", "Willem de Graaf, Willem Adriaan de Graaf, Angel del Rio, \n", "\n", "Authors with the same surname and different first names:\n", " - Jose Morais, José João Morais, \n", " - Götz Pfeiffer, Markus Pfeiffer, \n", " - Finn Smith, Jhevon Smith, \n", " - Chris Wensley, Christopher D. Wensley, \n", " - Robert A. Wilson, Wilf Wilson, \n", " - Willem de Graaf, Willem Adriaan de Graaf, \n", "\n", "\n" ] } ], "source": [ "PackageAuthors();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next diagram shows the number of packages having a given number of authors. Most of the packages are developed collaboratively." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "( function ( element ) {\n", "if(!window.hasOwnProperty(\"runGAP\")){window.runGAP=function(code,callback){if(!Jupyter||!Jupyter.notebook||!Jupyter.notebook.kernel)return callback(null,\"JavaScript-based output must be re-evaluated when the notebook\"+\" is reloaded. (Re-run the cell to clear this problem.)\");var errorMessages=[];var timeout=null;Jupyter.notebook.kernel.execute(code,{iopub:{output:function(message){if(\"data\"in message.content)return callback(message.content.data,null);if(!(\"text\"in message.content))return callback(null,message.content);errorMessages.push(message.content.text);if(timeout!==null)clearTimeout(timeout);timeout=setTimeout(function(){callback(null,errorMessages.join(\"\\n\"))},200)},clear_output:function(message){}},shell:{reply:function(message){}},input:function(message){}},{})}}if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){window.createVisualization(element,{\"data\" : {\"data\" : [{\"x\" : [1,2,3,4,5,6,7,8,9,10,13,17,18],\"y\" : [30,56,28,13,4,5,1,1,1,2,2,1,1],\"type\" : \"bar\"}],\"layout\" : {\"height\" : 400}},\"tool\" : \"plotly\"}\n", ",function(element,visualization){\n", "});\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"viz-tool-plotly\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"viz-tool-plotly\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"viz-tool-plotly\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"main\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"main\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"main\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", ";\n", "} )( element.get( 0 ) )" ] }, "execution_count": 13, "metadata": { "application/javascript": "" }, "output_type": "execute_result" } ], "source": [ "Plot(PackageAuthorNumbers(),rec(type:=\"bar\"));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We finish with the map displaying GAP package development activity per country. For each package, each author gives a point to the country of their location, derived from the metadata from the latest version of their package. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Warning: no country detected for Carmelo Cisco, package numericalsgps\n", "Warning: no country detected for Stephen Howe, package recog\n", "--------------------------------------------------------\n", "Package activities by country\n", "--------------------------------------------------------\n", "175 : Germany\n", "93 : U.K.\n", "30 : U.S.\n", "21 : \n", "15 : Australia\n", "13 : Italy\n", "10 : Belgium\n", "10 : Portugal\n", "10 : Spain\n", "7 : India\n", "6 : Netherlands\n", "6 : Turkey\n", "5 : New Zealand\n", "4 : Austria\n", "4 : Ireland\n", "3 : Brazil\n", "3 : Hungary\n", "3 : Norway\n", "2 : Canada\n", "2 : Russia\n", "2 : United Arab Emirates\n", "1 : Argentina\n", "1 : Greece\n", "1 : Japan\n", "1 : Romania\n", "1 : Sweden\n", "1 : Ukraine\n", "1 : Venezuela\n", "--------------------------------------------------------\n" ] } ], "source": [ "mapdata:=PackagesByCountries();;" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "( function ( element ) {\n", "if(!window.hasOwnProperty(\"runGAP\")){window.runGAP=function(code,callback){if(!Jupyter||!Jupyter.notebook||!Jupyter.notebook.kernel)return callback(null,\"JavaScript-based output must be re-evaluated when the notebook\"+\" is reloaded. (Re-run the cell to clear this problem.)\");var errorMessages=[];var timeout=null;Jupyter.notebook.kernel.execute(code,{iopub:{output:function(message){if(\"data\"in message.content)return callback(message.content.data,null);if(!(\"text\"in message.content))return callback(null,message.content);errorMessages.push(message.content.text);if(timeout!==null)clearTimeout(timeout);timeout=setTimeout(function(){callback(null,errorMessages.join(\"\\n\"))},200)},clear_output:function(message){}},shell:{reply:function(message){}},input:function(message){}},{})}}if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){if(!window.hasOwnProperty(\"librariesLoadedFromGAP\")){window.librariesLoadedFromGAP={}}function myCallback(){window.createVisualization(element,{\"data\" : {\"data\" : [{\"z\" : [\"21\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"0\",\"0\",\"15\",\"4\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"10\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"3\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"2\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"175\",\"0\",\"0\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"3\",\"0\",\"7\",\"0\",\"0\",\"0\",\"4\",\"0\",\"13\",\"0\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"6\",\"0\",\"0\",\"5\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"3\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"10\",\"0\",\"0\",\"0\",\"1\",\"2\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"10\",\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"6\",\"0\",\"0\",\"93\",\"0\",\"0\",\"30\",\"0\",\"1\",\"2\",\"0\",\"0\",\"0\",\"0\",\"1\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"],\"name\" : \"B\",\"type\" : \"choropleth\",\"autocolorscale\" : false,\"colorbar\" : {\"title\" : \"\",\"thickness\" : 10},\"colorscale\" : [[0,\"rgb(255,255,255)\"],[0.01,\"rgb(245,195,157)\"],[0.20000000000000001,\"rgb(245,160,105)\"],[1,\"rgb(178,10,28)\"]],\"locationmode\" : \"country names\",\"locationssrc\" : \"Dreamshot:9297:009d61\",\"showscale\" : true,\"zauto\" : false,\"zmin\" : 0,\"zsrc\" : \"Dreamshot:9297:7e6159\",\"locations\" : [\"\",\"Afghanistan\",\"Albania\",\"Algeria\",\"American Samoa\",\"Andorra\",\"Angola\",\"Anguilla\",\"Antarctica\",\"Antigua and Barbuda\",\"Argentina\",\"Armenia\",\"Aruba\",\"Australia\",\"Austria\",\"Azerbaijan\",\"Bahamas\",\"Bahrain\",\"Bangladesh\",\"Barbados\",\"Belarus\",\"Belgium\",\"Belize\",\"Benin\",\"Bermuda\",\"Bhutan\",\"Bolivia\",\"Bosnia and Herzgovina\",\"Botswana\",\"Bouvet Island\",\"Brazil\",\"British Indian Ocean Territory\",\"British Virgin Islands\",\"Brunei\",\"Bulgaria\",\"Burkina Faso\",\"Burundi\",\"Cambodia\",\"Cameroon\",\"Canada\",\"Cape Verde\",\"Cayman Islands\",\"Central African Republic\",\"Chad\",\"Chile\",\"China\",\"Christmas Island\",\"Cocos [Keeling] Islands\",\"Colombia\",\"Comoros\",\"Congo - Brazzaville\",\"Congo - Kinshasa\",\"Cook Islands\",\"Costa Rica\",\"Cote d'Ivoire\",\"Croatia\",\"Cuba\",\"Cyprus\",\"Czech Republic\",\"Denmark\",\"Djibouti\",\"Dominica\",\"Dominican Republic\",\"Ecuador\",\"Egypt\",\"El Salvador\",\"Equatorial Guinea\",\"Eritrea\",\"Estonia\",\"Ethiopia\",\"Falkland Islands\",\"Faroe Islands\",\"Fiji\",\"Finland\",\"France\",\"French Guiana\",\"French Polynesia\",\"French Southern Territories\",\"Gabon\",\"Gambia\",\"Georgia\",\"Germany\",\"Ghana\",\"Gibraltar\",\"Greece\",\"Greenland\",\"Grenada\",\"Guadeloupe\",\"Guam\",\"Guatemala\",\"Guinea\",\"Guinea-Bissau\",\"Guyana\",\"Haiti\",\"Heard Island and McDonald Islands\",\"Honduras\",\"Hong Kong SAR China\",\"Hungary\",\"Iceland\",\"India\",\"Indonesia\",\"Iran\",\"Iraq\",\"Ireland\",\"Israel\",\"Italy\",\"Jamaica\",\"Japan\",\"Jordan\",\"Kazakhstan\",\"Kenya\",\"Kiribati\",\"Korea\",\"Kuwait\",\"Kyrgyzstan\",\"Laos\",\"Latvia\",\"Lebanon\",\"Lesotho\",\"Liberia\",\"Libya\",\"Liechtenstein\",\"Lithuania\",\"Luxembourg\",\"Macau SAR China\",\"Macedonia\",\"Madagascar\",\"Malawi\",\"Malaysia\",\"Maldives\",\"Mali\",\"Malta\",\"Marshall Islands\",\"Martinique\",\"Mauritiana\",\"Mauritius\",\"Mayotte\",\"Mexico\",\"Micronesia\",\"Moldova\",\"Monaco\",\"Mongolia\",\"Montserrat\",\"Morocco\",\"Mozambique\",\"Myanmar [Burma]\",\"Namibia\",\"Nauru\",\"Nepal\",\"Netherlands\",\"Netherlands Antilles\",\"New Caledonia\",\"New Zealand\",\"Nicaragua\",\"Niger\",\"Nigeria\",\"Niue\",\"Norfolk Island\",\"North Korea\",\"Northern Mariana Islands\",\"Norway\",\"Oman\",\"Pakistan\",\"Palau\",\"Panama\",\"Papua New Guinea\",\"Paraguay\",\"Peru\",\"Philippines\",\"Pitcairn Islands\",\"Poland\",\"Portugal\",\"Puerto Rico\",\"Qatar\",\"Reunion\",\"Romania\",\"Russia\",\"Rwanda\",\"Saint Helena\",\"Saint Kitts and Nevis\",\"Saint Lucia\",\"Saint Pierre and Miquelon\",\"Saint Vincent and the Grenadines\",\"Samoa\",\"San Marino\",\"Sao Tome and Principe\",\"Saudi Arabia\",\"Senegal\",\"Serbia\",\"Seychelles\",\"Sierra Leone\",\"Singapore\",\"Slovakia\",\"Slovenia\",\"Solomon Islands\",\"Somalia\",\"South Africa\",\"South Georgia and the South Sandwich Islands\",\"South Korea\",\"Spain\",\"Sri Lanka\",\"Sudan\",\"Suriname\",\"Svalbard and Jan Mayen\",\"Swaziland\",\"Sweden\",\"Switzerland\",\"Syria\",\"Taiwan\",\"Tajikstan\",\"Tanzania\",\"Thailand\",\"Timor-Leste\",\"Togo\",\"Tokelau\",\"Tonga\",\"Trinidad and Tobago\",\"Tunisia\",\"Turkemenistan\",\"Turkey\",\"Turks and Caicos Islands\",\"Tuvalu\",\"U.K.\",\"U.S Minor Outlying Islands\",\"U.S Virgin Islands\",\"U.S.\",\"Uganda\",\"Ukraine\",\"United Arab Emirates\",\"Uruguay\",\"Uzbekistan\",\"Vanuatu\",\"Vatican City\",\"Venezuela\",\"Vietnam\",\"Wallis and Futuna\",\"Western Sahara\",\"Yemen\",\"Zambia\",\"Zimbabwe\"],\"zmax\" : 175}],\"layout\" : {\"height\" : 1000,\"title\" : \"Locations of GAP package authors\",\"autosize\" : true,\"font\" : {\"family\" : \"Overpass\"},\"geo\" : {\"projection\" : {\"type\" : \"equirectangular\"},\"center\" : {\"lat\" : 55.31688841607437,\"lon\" : -65.030234686345878}},\"hovermode\" : \"closest\",\"titlefont\" : {\"family\" : \"Overpass\"}},\"frames\" : [{\"name\" : \"workspace-breakpoint-0\",\"layout\" : {\"width\" : 400,\"height\" : 300,\"title\" : \"Locations of GAP package authors\",\"autosize\" : false,\"font\" : {\"size\" : 10},\"geo\" : {\"projection\" : {\"type\" : \"equirectangular\"},\"center\" : {\"lat\" : 76.156725115232689,\"lon\" : -81.574735072207119}},\"hovermode\" : \"closest\",\"margin\" : {\"b\" : 40,\"l\" : 40,\"r\" : 40,\"t\" : 75},\"titlefont\" : {\"family\" : \"Overpass\",\"size\" : 12}}}]},\"tool\" : \"plotly\"}\n", ",function(element,visualization){\n", "});\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"viz-tool-plotly\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"viz-tool-plotly\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"viz-tool-plotly\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", "}if(window.librariesLoadedFromGAP.hasOwnProperty(\"main\"\n", ")){myCallback()}else{var filenameString=JSON.stringify(\"main\"\n", ");var GAPcode=\"JUPVIZFileContents( LoadJavaScriptFile( \"+filenameString+\" ) );\";window.runGAP(GAPcode,function(result,error){if(error)throw Error(\"When loading library \"+filenameString+\": \"+error);result=result[\"text/plain\"];window.librariesLoadedFromGAP[\"main\"\n", "]=result;try{var whatItEvaluatesTo=eval(result)}catch(e){throw Error(\"Error evaluating code for library \"+filenameString+\": \"+e)}return myCallback()})}\n", ";\n", "} )( element.get( 0 ) )" ] }, "execution_count": 15, "metadata": { "application/javascript": "" }, "output_type": "execute_result" } ], "source": [ "CreateVisualization( rec( tool := \"plotly\", data := mapdata ) );" ] } ], "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.10.2" } }, "nbformat": 4, "nbformat_minor": 2 }