From 0e79a27a51c824d870fe897dc4395536529d930d Mon Sep 17 00:00:00 2001 From: Johannes Kaisinger Date: Fri, 18 Aug 2023 20:00:26 +0200 Subject: [PATCH] Update inpection notebooks --- doc/source/dev/index.rst | 2 +- doc/source/dev/inspect_slicot_slycot.ipynb | 694 ++++++++++++++++++ doc/source/dev/inspect_slycot.ipynb | 78 +- ...cot_procedures.txt => slicot_routines.txt} | 0 doc/source/dev/slicot_slycot.ipynb | 682 ----------------- 5 files changed, 734 insertions(+), 722 deletions(-) create mode 100644 doc/source/dev/inspect_slicot_slycot.ipynb rename doc/source/dev/{slicot_procedures.txt => slicot_routines.txt} (100%) delete mode 100644 doc/source/dev/slicot_slycot.ipynb diff --git a/doc/source/dev/index.rst b/doc/source/dev/index.rst index b236236a..21cfebb4 100644 --- a/doc/source/dev/index.rst +++ b/doc/source/dev/index.rst @@ -7,4 +7,4 @@ Development contributing inspect_slycot - slicot_slycot + inspect_slicot_slycot diff --git a/doc/source/dev/inspect_slicot_slycot.ipynb b/doc/source/dev/inspect_slicot_slycot.ipynb new file mode 100644 index 00000000..fd965ad4 --- /dev/null +++ b/doc/source/dev/inspect_slicot_slycot.ipynb @@ -0,0 +1,694 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Inspect Slycot vs SLICOT" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This notebook shows how to inspect the slycot module and the slicot libary.\n", + "The result gives us a insight which slicot routines are implemented slycot." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.1.dev612+g3d12a1d'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import re\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib_venn import venn2\n", + "\n", + "import slycot\n", + "slycot.__version__" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Helper function" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def print_list_chunks(routines_list, n=8):\n", + " \"\"\"Print list in chunks of lists.\"\"\"\n", + " start = 0\n", + " end = len(routines_list)\n", + " step = n\n", + " for i in range(start, end, step):\n", + " x = i\n", + " print(routines_list[x:x+step])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def get_slycot_routines(sly):\n", + " all_attributes = dir(sly)\n", + " r = re.compile(\"[a-z][a-z][0-9][0-9a-z][a-z][a-z]\")\n", + " matched_attributes = list(filter(r.match, all_attributes)) # Read Note below\n", + " return matched_attributes" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inspect function" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are currently 49 routines that are found in slycot.\n", + "------\n", + "['ab01nd', 'ab05md', 'ab05nd', 'ab07nd', 'ab08nd', 'ab08nz', 'ab09ad', 'ab09ax']\n", + "['ab09bd', 'ab09md', 'ab09nd', 'ab13bd', 'ab13dd', 'ab13ed', 'ab13fd', 'ab13md']\n", + "['mb03rd', 'mb03vd', 'mb03vy', 'mb03wd', 'mb05md', 'mb05nd', 'mc01td', 'sb01bd']\n", + "['sb02md', 'sb02mt', 'sb02od', 'sb03md', 'sb03md57', 'sb03od', 'sb04md', 'sb04qd']\n", + "['sb10ad', 'sb10dd', 'sb10fd', 'sb10hd', 'sg02ad', 'sg03ad', 'sg03bd', 'tb01id']\n", + "['tb01pd', 'tb03ad', 'tb04ad', 'tb05ad', 'tc01od', 'tc04ad', 'td04ad', 'tf01md']\n", + "['tf01rd']\n", + "None\n", + "\n", + "\n", + "There are currently 607 routines that are found in slicot.\n", + "------\n", + "['mb01wd', 'tg01gd', 'ab13fd', 'sg03ay', 'mb01oe', 'mb02fd', 'tg01oa', 'dg01ny']\n", + "['sg03ax', 'fb01qd', 'ma02az', 'mc01md', 'md03by', 'tf01mx', 'ib01nd', 'mb02rz']\n", + "['mb04bp', 'tb01kd', 'ab09gd', 'ma02jz', 'ud01cd', 'ib01rd', 'nf01bx', 'mb02rd']\n", + "['ma02es', 'mb04iy', 'tg01id', 'mb01rd', 'mc01xd', 'mb04wr', 'sg03bs', 'mb03kc']\n", + "['ma02cd', 'tb04ad', 'md03bx', 'mb03vy', 'ab09cd', 'tf01nd', 'sb09md', 'sb03ot']\n", + "['mb04pu', 'mb04yd', 'mb02pd', 'mb04tu', 'mb02ud', 'ib01cd', 'mb04dp', 'tg01fz']\n", + "['sb04od', 'nf01ad', 'mb03qd', 'ab09bd', 'mb02jd', 'sb02mw', 'ma02ad', 'mb04dl']\n", + "['sb08ed', 'tb01uy', 'md03ba', 'ab05nd', 'mb03pd', 'sb02mx', 'sb04ow', 'ma02mz']\n", + "['mb02cy', 'ag08by', 'mb03bb', 'ab09cx', 'mb01kd', 'sb02sd', 'mb01xd', 'sb01md']\n", + "['mb02ny', 'sb02ox', 'sb10pd', 'ma01cd', 'tg01hd', 'mb02nd', 'sb02cx', 'sb04px']\n", + "['mb03qg', 'tg01hx', 'mb03ag', 'mc01py', 'mb03kb', 'mb04jd', 'tg01bd', 'tb03ay']\n", + "['ab13ed', 'sb03rd', 'ma02id', 'ma02md', 'sb03os', 'mb02cv', 'mb05oy', 'sb06nd']\n", + "['nf01bp', 'sb02od', 'mb03md', 'fb01vd', 'ma02iz', 'tb01ld', 'mb02sd', 'tb01nd']\n", + "['ud01md', 'mb02xd', 'mb02md', 'sg03br', 'mb04az', 'sb02ru', 'sb10qd', 'sg03bu']\n", + "['sb04qr', 'mb03lf', 'ma01ad', 'sb04rd', 'ma02gd', 'sb04ry', 'ab13ad', 'ab13md']\n", + "['nf01by', 'mb04nd', 'mb03yt', 'sg02cx', 'tg01hu', 'ab09kx', 'mb04hd', 'mb03gd']\n", + "['sb08cd', 'mb03od', 'sb04mr', 'mb02kd', 'ab09jx', 'ud01bd', 'fb01sd', 'mb03rd']\n", + "['ab07nd', 'mb03fd', 'sb03ou', 'mb03ya', 'mb01rh', 'sb08hd', 'ab08nw', 'ab07md']\n", + "['ab05qd', 'mb02qy', 'mb03id', 'ma02bd', 'ma02dd', 'mb04ed', 'sb03td', 'mb04tv']\n", + "['td04ad', 'tb01ud', 'tc01od', 'nf01bs', 'ma02oz', 'sg02nd', 'mb04ru', 'mc01rd']\n", + "['mb03bd', 'mb04tt', 'sb08ny', 'tg01ad', 'sb04qu', 'nf01bf', 'tg01qd', 'mc01td']\n", + "['mb04fp', 'mb03ud', 'mb3lzp', 'sb04nv', 'mb04qb', 'mb04wp', 'mc01sy', 'sb10dd']\n", + "['mb02sz', 'mb04kd', 'tb04bw', 'mb01ry', 'sb03mv', 'tb03ad', 'mb03gz', 'mb01ot']\n", + "['mb03be', 'tb01zd', 'ab04md', 'mb01os', 'sb03qx', 'mb04pb', 'nf01bu', 'mb04su']\n", + "['mc01od', 'sb16bd', 'mb02td', 'sg03ad', 'sb03qy', 'mb03xs', 'md03bb', 'mb04qc']\n", + "['mb03jd', 'sb01by', 'ab09nd', 'sb03md', 'mb04oy', 'mb05nd', 'ab08nx', 'mb01rb']\n", + "['dg01md', 'mb02wd', 'sb03ud', 'mb03py', 'mc01pd', 'ma02pz', 'ab09iy', 'ma02od']\n", + "['sb10td', 'tf01my', 'sb16cy', 'tg01oz', 'ab05pd', 'mb04cd', 'sb16ay', 'sb10hd']\n", + "['mb02gd', 'mc03md', 'mb03bc', 'sb04nx', 'mc01qd', 'ab01od', 'ab09jd', 'sb16ad']\n", + "['sg03bv', 'nf01bb', 'ab09dd', 'mb03lp', 'md03bf', 'mb03ah', 'mb3jzp', 'sb04mu']\n", + "['ab09kd', 'sb03ov', 'sb03pd', 'fd01ad', 'sb03sd', 'td05ad', 'mb02hd', 'mb02cd']\n", + "['mb03qx', 'sb04nd', 'mb04tb', 'sb04pd', 'tg01jy', 'tb04cd', 'tg01dd', 'ab09ed']\n", + "['mb03wx', 'tg01pd', 'tf01pd', 'sb08fd', 'ab13ax', 'nf01ba', 'sb08md', 'mb04dy']\n", + "['sb04my', 'ab09fd', 'mb04vd', 'mb01md', 'ib01oy', 'mb04ld', 'sb01bd', 'sb02mu']\n", + "['sg03bx', 'tg01ed', 'mb02qd', 'mb01ss', 'mb01rw', 'sb10ud', 'mb03cz', 'ag8byz']\n", + "['sb02ow', 'mb02dd', 'sb08nd', 'mb03my', 'mb03yd', 'tg01od', 'mc01sw', 'ma02bz']\n", + "['ib01ad', 'ab09hd', 'ud01mz', 'td03ad', 'sb03my', 'ib03bd', 'mb04dd', 'mb04xd']\n", + "['ma02hd', 'ab09ax', 'tg01hy', 'mc01sx', 'tb01ux', 'df01md', 'mb04vx', 'mb04wd']\n", + "['ab08md', 'tb01vd', 'nf01ay', 'md03bd', 'mb03rz', 'ab09ix', 'ab13dd', 'tb01iz']\n", + "['nf01bw', 'mb04qf', 'ab05sd', 'mb04db', 'mb03ai', 'sb08gd', 'mb02od', 'mb04ty']\n", + "['mb02uv', 'ib01px', 'tb01ty', 'sb03oy', 'sb03mu', 'tg01nd', 'ab09hx', 'ab09id']\n", + "['mb04id', 'mb03ed', 'mb04di', 'mb04tx', 'sb03od', 'mb04xy', 'mb03hz', 'tc04ad']\n", + "['mb01rx', 'sb02ov', 'mb03zd', 'mb03jp', 'mb02yd', 'mb04ox', 'bd01ad', 'mb04fd']\n", + "['ab05md', 'tb04bx', 'dg01od', 'sb10zd', 'mb01rt', 'sb02mr', 'ab01nd', 'mb04bz']\n", + "['ma01bz', 'ma02ed', 'mb03ld', 'tb01md', 'tb01xz', 'mb04qs', 'ab09md', 'sb10id']\n", + "['sb03sx', 'mb02cu', 'ab13bd', 'mb3oyz', 'mb02tz', 'tb01px', 'mb03iz', 'sg03bw']\n", + "['mb04dz', 'nf01bv', 'bd02ad', 'tf01md', 'mb03wd', 'mb4dbz', 'mb04tw', 'mb03vd']\n", + "['mb01oo', 'fb01rd', 'mb04rb', 'mb03ry', 'mb01xy', 'tb05ad', 'ib03ad', 'mb03xz']\n", + "['mb05md', 'mb02ed', 'sb03mw', 'sg03bd', 'mb01ru', 'mb01oc', 'bb02ad', 'ab09jw']\n", + "['mb03cd', 'mb04pa', 'sb10yd', 'mb02jx', 'tg01az', 'sg02ad', 'ma02hz', 'mb03dz']\n", + "['tg01md', 'sb08my', 'tb04ay', 'sb02nd', 'sb02mt', 'sb04rw', 'mb04wu', 'nf01be']\n", + "['de01pd', 'sb02mv', 'sb10ed', 'sb10zp', 'mb03lz', 'sb02oy', 'sb04md', 'mb03bg']\n", + "['mb03ad', 'mb01uw', 'sb10kd', 'ma02jd', 'ma02gz', 'tf01qd', 'mb03td', 'mb04gd']\n", + "['tb04bv', 'tg01ld', 'mb03ba', 'ue01md', 'mb3pyz', 'mb03xp', 'sb02ou', 'mb01nd']\n", + "['sg02cw', 'mb04yw', 'sb04mw', 'mb01uy', 'sg03by', 'ib01py', 'mb02uw', 'tg01ob']\n", + "['mb03jz', 'mb04ad', 'tg01fd', 'mb03sd', 'ab13id', 'ab08ny', 'mb03za', 'mb02uu']\n", + "['ab08nd', 'mc01wd', 'tg01ly', 'mb01uz', 'mb03xu', 'mb03nd', 'ag07bd', 'sg03bt']\n", + "['mb03xd', 'ma02nz', 'ab13dx', 'ab08nz', 'sb04ny', 'mb03ts', 'sb04qy', 'mb03rx']\n", + "['mb03af', 'ib01md', 'mb03ke', 'sb02pd', 'sb16cd', 'ab8nxz', 'mb04bd', 'tf01rd']\n", + "['mb01ux', 'mb03bz', 'sb03sy', 'mc03ny', 'sb10ld', 'ma02fd', 'td03ay', 'bb04ad']\n", + "['mb03ab', 'dk01md', 'ab05od', 'mc03nx', 'mb01td', 'tb01id', 'tg01cd', 'mb04ow']\n", + "['sb04nw', 'mb03ae', 'mb03rw', 'mb03qy', 'sb04py', 'nf01bq', 'mb03dd', 'tb01kx']\n", + "['mb01ud', 'ma01bd', 'mb03ny', 'ab08mz', 'sb02rd', 'sb04qd', 'tb01wx', 'ag08bz']\n", + "['tg01wd', 'tb04bd', 'sb02md', 'bb01ad', 'mc01sd', 'mc01vd', 'sb10ad', 'mb01vd']\n", + "['de01od', 'ib01pd', 'mb03bf', 'sb02ms', 'mb04py', 'mc03nd', 'tb01wd', 'mc01nd']\n", + "['dg01nd', 'ab09ad', 'mb02id', 'tb01yd', 'sb03mx', 'mb03vw', 'sg02cv', 'ab05rd']\n", + "['mb04ds', 'mb01od', 'mb4dpz', 'mb03oy', 'sb03qd', 'sb01bx', 'sb08dd', 'ib01od']\n", + "['sb10md', 'mb01ld', 'mb04iz', 'mb05od', 'tb01td', 'mb02vd', 'mb03fz', 'mb05my']\n", + "['mb01oh', 'mb04zd', 'sb03oz', 'tg01kz', 'mb02cx', 'tg01jd', 'mb01zd', 'mb01pd']\n", + "['sb01dd', 'mb03hd', 'sb02qd', 'mb03qw', 'tb01xd', 'ud01nd', 'sb10rd', 'ib01my']\n", + "['tf01od', 'ud01dd', 'tb01vy', 'ab09hy', 'sb04rx', 'ib01qd', 'mb04od', 'mb03qv']\n", + "['sg03bz', 'sb03or', 'mb03kd', 'ab13cd', 'tg01kd', 'mb03wa', 'mb04ts', 'mb03ka']\n", + "['mb4dlz', 'mb04qu', 'sb10fd', 'ma02pd', 'sb10jd', 'mb01qd', 'ab09jv', 'sb10vd']\n", + "['fb01td', 'ma02ez', 'tc05ad', 'sb10wd', 'md03ad', 'nf01bd', 'ma02cz', 'mb04ny']\n", + "['sb04rv', 'nf01br', 'tb01pd', 'ab01md', 'ib01bd', 'mb01yd', 'tg01nx', 'sb01fy']\n", + "['mb04md', 'sb10sd', 'mb04ud', 'mb01sd', 'ag08bd', 'ab09bx', 'bb03ad']\n", + "None\n" + ] + } + ], + "source": [ + "slycot_routines = get_slycot_routines(slycot)\n", + "\n", + "print(f\"There are currently {len(slycot_routines)} routines that are found in slycot.\")\n", + "print(\"------\")\n", + "print(print_list_chunks(slycot_routines))\n", + "print(\"\\n\")\n", + "\n", + "with open('slicot_routines.txt') as f:\n", + " lines = f.readlines()\n", + "\n", + "slicot_routines = [x.split(\"\\n\")[0] for x in lines]\n", + "\n", + "print(f\"There are currently {len(slicot_routines)} routines that are found in slicot.\")\n", + "print(\"------\")\n", + "print(print_list_chunks(slicot_routines))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Sets for the Venn-Diagramm" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are currently 1 routines that are found in slycot and not in slicot.\n", + "------\n", + "['sb03md57']\n", + "None\n", + "\n", + "\n", + "There are currently 559 routines that are found in slicot and not in slycot.\n", + "------\n", + "['tb01ux', 'mb03xs', 'fb01qd', 'ma01bz', 'ib01bd', 'ab8nxz', 'mb03xd', 'sb08md']\n", + "['ab08md', 'dg01ny', 'nf01be', 'sb10jd', 'mb02qd', 'fb01vd', 'sb04rd', 'tg01qd']\n", + "['mb02hd', 'mb03ai', 'nf01bd', 'mb01ru', 'mb04ru', 'mb04bz', 'tb01px', 'sb10rd']\n", + "['mb04dy', 'sb10td', 'mb04ad', 'ma02gz', 'sb03ov', 'sb02pd', 'ma02cz', 'mb03bz']\n", + "['sb03mv', 'mb03qw', 'mb02td', 'mb01ss', 'sb08cd', 'sb03td', 'mb04tt', 'nf01bb']\n", + "['mb03ld', 'tb01xz', 'sb04nx', 'tg01oz', 'mb01od', 'tb03ay', 'mb02ud', 'sb10qd']\n", + "['mb03bf', 'mb01ux', 'sb08ny', 'mb04tu', 'mb01pd', 'mb02ed', 'mb03bd', 'mb02cy']\n", + "['sg03bx', 'mb04dl', 'mb04az', 'mb03ny', 'mb03td', 'bb03ad', 'ab09kd', 'mb02sz']\n", + "['fb01sd', 'mc01nd', 'tg01ld', 'mb05od', 'sb03mu', 'sb16bd', 'sb08fd', 'md03ad']\n", + "['sb04ny', 'tb01kd', 'mb03ag', 'bb04ad', 'mc01md', 'mb01wd', 'sb03ou', 'sb03qx']\n", + "['ab09hx', 'mc01py', 'nf01bs', 'mb02gd', 'mb03hz', 'mc03md', 'sb04my', 'tg01bd']\n", + "['sb10pd', 'tg01ob', 'mc01od', 'mb02wd', 'mb03ya', 'dg01nd', 'sb04od', 'ab09cd']\n", + "['sb09md', 'mc01sw', 'mb02uu', 'mb02kd', 'ab09bx', 'mb01uz', 'nf01br', 'ib03ad']\n", + "['ma01cd', 'mb04zd', 'bb02ad', 'sb16ay', 'mb03pd', 'ab09hy', 'ab05rd', 'mb03bg']\n", + "['sb01dd', 'mb04iy', 'mb02od', 'ma02ad', 'nf01bu', 'sb03sd', 'mc01wd', 'sg03bz']\n", + "['mb3oyz', 'mb02cv', 'sb04nw', 'tb04cd', 'sb04mr', 'mb04oy', 'sb06nd', 'mb02cu']\n", + "['mb02rz', 'sg03bt', 'mb02vd', 'mb03id', 'dg01od', 'tg01nx', 'mb04pa', 'mb03rz']\n", + "['mb01oe', 'tf01my', 'ab05qd', 'mb03wx', 'mb03lz', 'ab09cx', 'mb03kd', 'mb01zd']\n", + "['ab09jx', 'mb02xd', 'mb05my', 'mb01vd', 'mb01ot', 'tb01ld', 'mb01rt', 'mb03sd']\n", + "['tf01qd', 'ab08mz', 'sb10zd', 'mb03oy', 'mb03xu', 'ab05od', 'ma02ez', 'mb04qs']\n", + "['sb03qy', 'tg01id', 'ud01dd', 'tg01kz', 'tg01fd', 'mb04dp', 'sb10yd', 'ab13ax']\n", + "['tg01md', 'ab09jd', 'mb03cd', 'sb02mw', 'mb02md', 'sb02mv', 'mb04md', 'ma02dd']\n", + "['ma02hz', 'mb04di', 'mb04qc', 'sb03qd', 'ab07md', 'ag8byz', 'mc01qd', 'mb02rd']\n", + "['tg01jd', 'mb03ab', 'sb02ov', 'mb03ka', 'ag07bd', 'bd02ad', 'nf01ba', 'tb01ud']\n", + "['md03ba', 'mc01xd', 'ab09iy', 'mb02jd', 'mb01ld', 'sb03my', 'mb02uw', 'tb04bx']\n", + "['ud01cd', 'mb04nd', 'nf01bw', 'df01md', 'nf01bq', 'ud01nd', 'mb01yd', 'sb03sx']\n", + "['tb04ay', 'sb10ld', 'tg01hu', 'tg01od', 'mb04tb', 'tg01az', 'mb03bb', 'sb04rw']\n", + "['tg01kd', 'tf01pd', 'sb03os', 'mb04pb', 'tg01pd', 'mb04vx', 'sb02ox', 'ud01bd']\n", + "['tb01uy', 'nf01bf', 'mb01xd', 'mb01nd', 'sb03or', 'mb04ow', 'mb03qv', 'mb04su']\n", + "['mb04fp', 'ib01rd', 'mb03ah', 'mb04yw', 'mb01uy', 'sb02mx', 'md03bx', 'mb01rw']\n", + "['mb04kd', 'mb04od', 'mb04qf', 'ab09dd', 'mb04db', 'ma02pz', 'sb03ot', 'ib01oy']\n", + "['mc03nx', 'sb10ed', 'sb04nd', 'sb02mr', 'ma02id', 'mb03xp', 'sg03bs', 'mb03lp']\n", + "['mb02cd', 'sg03bw', 'tg01nd', 'mb03hd', 'sg03ay', 'ab09ix', 'mb01ud', 'mb04ty']\n", + "['tg01wd', 'mb03fz', 'mb01rd', 'mb03zd', 'mb03dd', 'mb01xy', 'bd01ad', 'mb03ry']\n", + "['mb03xz', 'sg02cx', 'sb10sd', 'sb02ou', 'mb04qu', 'mc01sy', 'mb02jx', 'mb4dpz']\n", + "['sb08gd', 'tg01oa', 'ab01md', 'mb03vw', 'mb05oy', 'mb01oc', 'ab05sd', 'bb01ad']\n", + "['mb04tw', 'de01pd', 'sb02cx', 'mb02yd', 'mb02cx', 'mb01rb', 'ab08ny', 'ib03bd']\n", + "['ib01qd', 'mb01os', 'sb04qy', 'mb04bd', 'sb10id', 'ib01md', 'tg01fz', 'ab13id']\n", + "['tg01dd', 'mc01vd', 'sb04px', 'mb04hd', 'mb04wr', 'sg03ax', 'ma02oz', 'mb04qb']\n", + "['mb03rx', 'mb04ds', 'sb03oz', 'mb02id', 'ma02bd', 'ab09gd', 'ib01px', 'tg01hy']\n", + "['ma02iz', 'mb04jd', 'sb03oy', 'ab09jv', 'mb03qx', 'ab13cd', 'mb03kc', 'sb08ed']\n", + "['ib01nd', 'ma02ed', 'tf01mx', 'mb01kd', 'ab08nx', 'ib01cd', 'tg01hx', 'mb4dbz']\n", + "['mb03gd', 'ab09fd', 'sb04qr', 'mb4dlz', 'mb03jz', 'tb01wx', 'mb04bp', 'mb03bc']\n", + "['mb03ba', 'ma02es', 'ma02az', 'sb08hd', 'mb03py', 'mc01pd', 'mb03qy', 'mb04ud']\n", + "['mb03kb', 'ma02nz', 'dk01md', 'sb10ud', 'sb04mw', 'sb03pd', 'sb10kd', 'sg03by']\n", + "['tg01ad', 'mb04xy', 'ab08nw', 'mc01rd', 'ag08bd', 'ib01ad', 'mb03rw', 'mb04wd']\n", + "['md03bb', 'ab09jw', 'tb01vy', 'sb10wd', 'sg03br', 'mb03md', 'sb04rx', 'sb16cy']\n", + "['de01od', 'sb03ud', 'ud01mz', 'ma01bd', 'ma02bz', 'mb02pd', 'sb01by', 'mb01td']\n", + "['mb02qy', 'mb04tx', 'tb01kx', 'mb03dz', 'mb01sd', 'sb08my', 'mb04iz', 'tf01nd']\n", + "['sb04rv', 'mb01rx', 'tb04bv', 'mb02dd', 'mb3pyz', 'mb03be', 'tb01zd', 'tb01td']\n", + "['ag08by', 'mb02sd', 'tb01vd', 'fb01td', 'tg01ed', 'sb02rd', 'mb03od', 'md03by']\n", + "['nf01ay', 'tf01od', 'sb02ru', 'sb03rd', 'sb01fy', 'tb01iz', 'ma01ad', 'mb3jzp']\n", + "['ab01od', 'nf01bx', 'ab09hd', 'sb04ow', 'sg02cv', 'ab04md', 'mb03wa', 'ma02gd']\n", + "['ab13ad', 'fd01ad', 'tb01ty', 'ab09id', 'sb02nd', 'ib01pd', 'tg01jy', 'ud01md']\n", + "['mb03gz', 'sb01bx', 'sb03sy', 'mb01md', 'sb02ow', 'mb04py', 'sb10vd', 'mb02nd']\n", + "['mb01oo', 'sg02nd', 'ma02mz', 'ib01od', 'mb03jd', 'dg01md', 'ab05pd', 'mb03nd']\n", + "['mb03my', 'mb04xd', 'mb03ts', 'sb02ms', 'mb01ry', 'tb01md', 'md03bd', 'tg01ly']\n", + "['ab09kx', 'td03ad', 'tb04bw', 'mb03lf', 'mb04dd', 'sb04qu', 'mb03ed', 'mb04cd']\n", + "['mc03nd', 'sb01md', 'tb01nd', 'mb01uw', 'mb03cz', 'mb03fd', 'ma02hd', 'mc01sx']\n", + "['tb01yd', 'mb01qd', 'ma02jz', 'tg01hd', 'sb03mx', 'sb04pd', 'td03ay', 'md03bf']\n", + "['ue01md', 'sb02mu', 'ib01py', 'mc01sd', 'mb04ox', 'td05ad', 'mb03yd', 'sb02sd']\n", + "['fb01rd', 'mb04wu', 'sb16cd', 'mb01rh', 'sb16ad', 'mb3lzp', 'mb03ad', 'mb04dz']\n", + "['sg03bu', 'tc05ad', 'mb04pu', 'sb08nd', 'ma02pd', 'mb04ld', 'sb10md', 'mb02uv']\n", + "['ab13dx', 'sb03mw', 'mb03iz', 'nf01bv', 'tb04bd', 'ma02cd', 'sb04ry', 'mb04ts']\n", + "['mb03ud', 'mb03za', 'sb04mu', 'ib01my', 'mb04wp', 'ma02md', 'mb04tv', 'sg03bv']\n", + "['mb04vd', 'sb04py', 'mb04ny', 'tb01wd', 'nf01by', 'sb02oy', 'mb03ae', 'nf01ad']\n", + "['nf01bp', 'sg02cw', 'mb04gd', 'mb03ke', 'mc03ny', 'mb03af', 'tg01cd', 'ag08bz']\n", + "['mb02tz', 'mb04ed', 'tg01gd', 'mb04rb', 'mb02ny', 'mb03qd', 'ma02jd', 'mb02fd']\n", + "['mb01oh', 'sb10zp', 'ab09ed', 'sb04nv', 'mb03jp', 'ma02fd', 'mb03qg', 'mb03yt']\n", + "['ma02od', 'sb08dd', 'mb04yd', 'tb01xd', 'sb02qd', 'mb04fd', 'mb04id']\n", + "None\n", + "\n", + "\n" + ] + } + ], + "source": [ + "not_in_slicot = list(set(slycot_routines)- set(slicot_routines))\n", + "not_in_slicot\n", + "\n", + "print(f\"There are currently {len(not_in_slicot)} routines that are found in slycot and not in slicot.\")\n", + "print(\"------\")\n", + "print(print_list_chunks(not_in_slicot))\n", + "print(\"\\n\")\n", + "\n", + "not_in_slycot = list(set(slicot_routines) - set(slycot_routines))\n", + "not_in_slycot\n", + "\n", + "print(f\"There are currently {len(not_in_slycot)} routines that are found in slicot and not in slycot.\")\n", + "print(\"------\")\n", + "print(print_list_chunks(not_in_slycot))\n", + "print(\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are currently 608 routines that are found in slicot or in slycot. (union)\n", + "------\n", + "['tb01ux', 'mb03xs', 'fb01qd', 'ma01bz', 'ib01bd', 'ab8nxz', 'mb03xd', 'sb08md']\n", + "['ab08md', 'dg01ny', 'nf01be', 'sb10jd', 'mb02qd', 'fb01vd', 'sb04rd', 'tg01qd']\n", + "['mb02hd', 'mb03ai', 'nf01bd', 'mb01ru', 'mb04ru', 'mb04bz', 'tb01px', 'sb10rd']\n", + "['mb04dy', 'sb10td', 'mb04ad', 'ma02gz', 'sb03ov', 'sb02pd', 'ma02cz', 'mb03bz']\n", + "['sb03mv', 'mb03qw', 'mb02td', 'mb01ss', 'sb08cd', 'sb03td', 'mb04tt', 'nf01bb']\n", + "['mb03ld', 'mb03wd', 'tb01xz', 'sb04nx', 'tg01oz', 'mb01od', 'tb03ay', 'mb02ud']\n", + "['sb10qd', 'ab08nz', 'mb03bf', 'tb01pd', 'mb01ux', 'sb08ny', 'mb04tu', 'mb01pd']\n", + "['mb02ed', 'mb03bd', 'mb02cy', 'sg03bx', 'mb04dl', 'mb04az', 'mb03ny', 'mb03td']\n", + "['bb03ad', 'ab09kd', 'mb02sz', 'fb01sd', 'ab09md', 'mc01nd', 'tg01ld', 'mb05od']\n", + "['sb03mu', 'sb16bd', 'sb08fd', 'md03ad', 'mc01td', 'sb04ny', 'tb01kd', 'mb03ag']\n", + "['bb04ad', 'mc01md', 'mb01wd', 'sb03ou', 'sb03qx', 'ab09hx', 'mc01py', 'nf01bs']\n", + "['mb02gd', 'mb03hz', 'mc03md', 'sb04my', 'tg01bd', 'sb10pd', 'tg01ob', 'mc01od']\n", + "['mb02wd', 'mb03ya', 'dg01nd', 'sb04od', 'ab09cd', 'sb09md', 'mc01sw', 'sb10fd']\n", + "['mb03vd', 'mb02uu', 'mb02kd', 'ab09bx', 'mb01uz', 'nf01br', 'ib03ad', 'ma01cd']\n", + "['mb04zd', 'bb02ad', 'sb16ay', 'mb03pd', 'ab09hy', 'ab05rd', 'sb02mt', 'mb03bg']\n", + "['sb01dd', 'mb04iy', 'mb02od', 'ma02ad', 'nf01bu', 'sb03sd', 'mc01wd', 'sg03bz']\n", + "['mb3oyz', 'mb02cv', 'sg02ad', 'sb04nw', 'tb04cd', 'sb04mr', 'sb03md', 'mb04oy']\n", + "['sb06nd', 'mb02cu', 'mb02rz', 'sg03bt', 'mb02vd', 'mb03id', 'dg01od', 'tg01nx']\n", + "['sb04qd', 'mb04pa', 'mb03rz', 'mb01oe', 'tf01my', 'ab05qd', 'mb03wx', 'mb03lz']\n", + "['ab09cx', 'mb03kd', 'sg03ad', 'mb01zd', 'ab09jx', 'mb02xd', 'mb05my', 'mb01vd']\n", + "['mb01ot', 'tb01ld', 'mb01rt', 'mb03sd', 'tf01qd', 'ab08mz', 'sb10zd', 'mb03oy']\n", + "['mb03xu', 'ab05od', 'ma02ez', 'mb04qs', 'sb03qy', 'tg01id', 'ud01dd', 'tg01kz']\n", + "['tg01fd', 'mb04dp', 'sb10yd', 'ab13ax', 'tg01md', 'ab09bd', 'ab09jd', 'mb03cd']\n", + "['sb02mw', 'mb02md', 'sb02mv', 'mb04md', 'ma02dd', 'ma02hz', 'tc04ad', 'mb04di']\n", + "['tb05ad', 'mb04qc', 'sb03qd', 'ab07md', 'ag8byz', 'mc01qd', 'mb02rd', 'ab13fd']\n", + "['tg01jd', 'mb03ab', 'sb02ov', 'mb03ka', 'ag07bd', 'bd02ad', 'nf01ba', 'sb04md']\n", + "['tb01ud', 'md03ba', 'mc01xd', 'ab09iy', 'mb02jd', 'mb01ld', 'sb03my', 'mb02uw']\n", + "['tb04bx', 'ud01cd', 'mb04nd', 'nf01bw', 'df01md', 'sb10ad', 'nf01bq', 'tf01md']\n", + "['ud01nd', 'mb01yd', 'sb03sx', 'tb04ay', 'sb10ld', 'tg01hu', 'tg01od', 'mb04tb']\n", + "['tg01az', 'mb03bb', 'sb04rw', 'tg01kd', 'tf01pd', 'sb03os', 'mb04pb', 'tg01pd']\n", + "['mb04vx', 'sb02ox', 'ud01bd', 'tb01uy', 'nf01bf', 'mb01xd', 'mb01nd', 'sb03or']\n", + "['mb04ow', 'mb03qv', 'mb04su', 'mb04fp', 'ab13ed', 'ib01rd', 'mb03ah', 'mb04yw']\n", + "['mb01uy', 'sb02mx', 'md03bx', 'tf01rd', 'td04ad', 'mb01rw', 'ab09ad', 'mb04kd']\n", + "['mb04od', 'mb04qf', 'ab09dd', 'mb04db', 'ma02pz', 'sb03ot', 'ib01oy', 'mc03nx']\n", + "['sb10ed', 'sb04nd', 'sb02mr', 'ma02id', 'mb03xp', 'sg03bs', 'mb03lp', 'mb02cd']\n", + "['sb02md', 'sg03bw', 'tg01nd', 'mb03hd', 'sg03ay', 'ab09ix', 'mb01ud', 'mb04ty']\n", + "['ab05nd', 'mb03vy', 'tg01wd', 'mb03fz', 'mb01rd', 'mb03zd', 'mb03dd', 'mb01xy']\n", + "['bd01ad', 'mb03ry', 'mb03xz', 'sg02cx', 'sb10sd', 'sb02ou', 'mb04qu', 'mc01sy']\n", + "['mb02jx', 'mb4dpz', 'sb08gd', 'tg01oa', 'ab01md', 'mb03vw', 'mb05oy', 'mb01oc']\n", + "['ab05sd', 'bb01ad', 'mb04tw', 'de01pd', 'sb02cx', 'mb02yd', 'mb02cx', 'mb01rb']\n", + "['ab08ny', 'ib03bd', 'ib01qd', 'mb01os', 'sb04qy', 'mb04bd', 'sb10id', 'ib01md']\n", + "['tg01fz', 'ab13id', 'tg01dd', 'mc01vd', 'sb04px', 'mb04hd', 'mb04wr', 'sg03ax']\n", + "['ma02oz', 'mb04qb', 'mb03rx', 'tb01id', 'ab09ax', 'mb04ds', 'sb03oz', 'mb02id']\n", + "['ma02bd', 'ab09gd', 'ib01px', 'tg01hy', 'ma02iz', 'mb04jd', 'sb03oy', 'ab09jv']\n", + "['tb04ad', 'sb03md57', 'mb03qx', 'ab13cd', 'mb03kc', 'sb08ed', 'ab13md', 'ib01nd']\n", + "['ma02ed', 'tf01mx', 'mb01kd', 'ab08nx', 'ib01cd', 'tg01hx', 'mb4dbz', 'sg03bd']\n", + "['mb03gd', 'sb03od', 'ab09fd', 'sb04qr', 'mb4dlz', 'mb03jz', 'tb01wx', 'mb04bp']\n", + "['mb03bc', 'mb03ba', 'ma02es', 'ma02az', 'sb08hd', 'mb03py', 'mc01pd', 'mb03qy']\n", + "['mb04ud', 'mb03kb', 'ma02nz', 'dk01md', 'sb01bd', 'sb10ud', 'sb04mw', 'sb03pd']\n", + "['sb10kd', 'sg03by', 'tg01ad', 'mb04xy', 'ab08nw', 'mc01rd', 'ag08bd', 'ib01ad']\n", + "['mb03rw', 'mb04wd', 'md03bb', 'ab09jw', 'tb01vy', 'sb10wd', 'sg03br', 'mb03md']\n", + "['sb04rx', 'sb16cy', 'de01od', 'sb03ud', 'ud01mz', 'sb10dd', 'ma01bd', 'ma02bz']\n", + "['mb02pd', 'sb01by', 'ab08nd', 'mb01td', 'mb02qy', 'mb04tx', 'tb01kx', 'mb03dz']\n", + "['mb01sd', 'sb08my', 'mb04iz', 'tf01nd', 'sb04rv', 'mb01rx', 'tb04bv', 'ab07nd']\n", + "['mb02dd', 'mb3pyz', 'mb03be', 'mb05nd', 'tb01zd', 'tb01td', 'ag08by', 'mb02sd']\n", + "['tb01vd', 'fb01td', 'tg01ed', 'sb02rd', 'mb03od', 'md03by', 'ab13dd', 'nf01ay']\n", + "['tf01od', 'sb02ru', 'sb03rd', 'tb03ad', 'sb01fy', 'tb01iz', 'ma01ad', 'mb3jzp']\n", + "['ab01od', 'nf01bx', 'ab09hd', 'sb04ow', 'sg02cv', 'ab04md', 'mb03wa', 'ma02gd']\n", + "['ab01nd', 'ab13ad', 'fd01ad', 'tb01ty', 'ab09id', 'sb02nd', 'ib01pd', 'tg01jy']\n", + "['ud01md', 'mb03gz', 'sb01bx', 'sb03sy', 'mb01md', 'sb02ow', 'mb04py', 'sb10vd']\n", + "['mb02nd', 'mb01oo', 'sg02nd', 'ma02mz', 'tc01od', 'sb02od', 'ib01od', 'mb03jd']\n", + "['dg01md', 'ab05pd', 'mb03nd', 'mb03my', 'mb04xd', 'mb03ts', 'sb02ms', 'mb01ry']\n", + "['tb01md', 'md03bd', 'tg01ly', 'ab09kx', 'td03ad', 'tb04bw', 'mb03lf', 'mb04dd']\n", + "['sb04qu', 'mb03ed', 'mb04cd', 'mc03nd', 'sb01md', 'tb01nd', 'mb01uw', 'mb03cz']\n", + "['mb03fd', 'ma02hd', 'mc01sx', 'tb01yd', 'mb01qd', 'ma02jz', 'tg01hd', 'sb03mx']\n", + "['sb04pd', 'td03ay', 'md03bf', 'ue01md', 'sb02mu', 'ib01py', 'mc01sd', 'sb10hd']\n", + "['mb04ox', 'td05ad', 'mb03yd', 'sb02sd', 'fb01rd', 'mb04wu', 'sb16cd', 'mb01rh']\n", + "['sb16ad', 'ab05md', 'mb3lzp', 'mb03ad', 'mb04dz', 'sg03bu', 'tc05ad', 'mb04pu']\n", + "['sb08nd', 'ma02pd', 'mb04ld', 'sb10md', 'mb02uv', 'ab13dx', 'sb03mw', 'mb03iz']\n", + "['nf01bv', 'tb04bd', 'ma02cd', 'sb04ry', 'mb04ts', 'mb03ud', 'mb03za', 'sb04mu']\n", + "['ib01my', 'ab09nd', 'mb04wp', 'ma02md', 'mb04tv', 'sg03bv', 'mb04vd', 'sb04py']\n", + "['mb04ny', 'tb01wd', 'nf01by', 'sb02oy', 'mb03ae', 'mb05md', 'nf01ad', 'nf01bp']\n", + "['sg02cw', 'mb04gd', 'mb03ke', 'mc03ny', 'mb03af', 'tg01cd', 'ag08bz', 'mb02tz']\n", + "['mb04ed', 'tg01gd', 'mb04rb', 'mb02ny', 'mb03qd', 'ma02jd', 'mb02fd', 'mb01oh']\n", + "['sb10zp', 'ab09ed', 'sb04nv', 'mb03jp', 'ma02fd', 'mb03qg', 'mb03yt', 'ma02od']\n", + "['sb08dd', 'mb04yd', 'tb01xd', 'sb02qd', 'ab13bd', 'mb04fd', 'mb04id', 'mb03rd']\n", + "None\n", + "\n", + "\n", + "There are currently 48 routines that are found in slicot and slycot. (intersection)\n", + "------\n", + "['mb05md', 'ab13fd', 'sg03ad', 'sb02mt', 'sb01bd', 'ab05md', 'ab09md', 'tb04ad']\n", + "['mc01td', 'mb03wd', 'sb04md', 'ab01nd', 'ab13md', 'ab07nd', 'sb02md', 'mb05nd']\n", + "['ab13ed', 'ab08nz', 'sg03bd', 'sg02ad', 'sb03od', 'tb01pd', 'sb03md', 'ab05nd']\n", + "['mb03vy', 'tf01rd', 'ab09bd', 'td04ad', 'ab09ad', 'sb10ad', 'ab09nd', 'tf01md']\n", + "['sb10fd', 'ab13dd', 'tc01od', 'mb03vd', 'sb10dd', 'sb04qd', 'tc04ad', 'tb01id']\n", + "['sb02od', 'tb03ad', 'ab09ax', 'tb05ad', 'ab13bd', 'ab08nd', 'sb10hd', 'mb03rd']\n", + "None\n" + ] + } + ], + "source": [ + "union = list(set(slicot_routines) | set(slycot_routines))\n", + "\n", + "print(f\"There are currently {len(union)} routines that are found in slicot or in slycot. (union)\")\n", + "print(\"------\")\n", + "print(print_list_chunks(union))\n", + "print(\"\\n\")\n", + "\n", + "intersection = list(set(slicot_routines) & set(slycot_routines))\n", + "intersection\n", + "\n", + "print(f\"There are currently {len(intersection)} routines that are found in slicot and slycot. (intersection)\")\n", + "print(\"------\")\n", + "print(print_list_chunks(intersection))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
chapter nameslycot routinesslicot routines
aAnalysis Routines1660
bBenchmark06
cAdaptive Control00
dData Analysis08
fFiltering06
iIdentification015
mMathematical routines7281
nNonlinear Systems016
sSynthesis Routines16131
tTransformation Routines1077
uUtility Routines07
total-49607
\n", + "
" + ], + "text/plain": [ + " chapter name slycot routines slicot routines\n", + "a Analysis Routines 16 60\n", + "b Benchmark 0 6\n", + "c Adaptive Control 0 0\n", + "d Data Analysis 0 8\n", + "f Filtering 0 6\n", + "i Identification 0 15\n", + "m Mathematical routines 7 281\n", + "n Nonlinear Systems 0 16\n", + "s Synthesis Routines 16 131\n", + "t Transformation Routines 10 77\n", + "u Utility Routines 0 7\n", + "total - 49 607" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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dDFx4kRRt25doaenJ2rUqCG8vb3Ftm3bpKdE/PPPP2LgwIHC1NRUGBgYCB8fH+kJBUI8uXnM1NRUrd1t27aJp/+ZpaWliY4dOwqFQiEAiEOHDpV6E1hBQYEIDQ0VNWvWFLq6uqJJkyZiz549UnlZbh57VlkXnxMREdG7o6y/v2VClONrpahUMpkM27Zt41u3KlhmZiZMTU2RkZHBG8mIiIgqibL+/q6ya2yJiIiISLMwsSUiIiIijVBlbx5727jig4iIiOjN4owtEREREWkEJrZEREREpBGY2BIRERGRRmBiS0REREQagYktEREREWkEJrZEREREpBGY2BIRERGRRmBiS0REREQagYktEREREWkEJrZEREREpBGY2BIRERGRRmBiS0REREQagYktEREREWkEJrZEREREpBGY2BIRERGRRmBiS0REREQagYktEREREWkEnYoOgDSTTCbDtm3b0K1bt9duy8vLC02bNsWiRYteuy1JWC1ALit7/dCM8uubiIiI3gjO2L4BQUFBkMlkkMlk0NXVRY0aNdCxY0f8+OOPKCwsfKm2IiMjoVQqyzW+devWQVtbGyNHjizXdt+UrVu3YubMmRUdBhEREb3jmNi+Ib6+vlCpVEhJScGePXvQrl07fPbZZ/Dz80N+fn6FxrZ69WpMmDAB69atw+PHjys0lrIwMzODsbFxRYdBRERE7zgmtm+IXC6HlZUVatasCTc3N3z55ZfYsWMH9uzZg8jISKneN998g0aNGsHIyAi2trYYMWIEsrKyAAAxMTEYNGgQMjIypBng0NBQAMCaNWvg7u4OY2NjWFlZoX///khLS3thXMnJyTh+/DgmTpwIZ2dnbN26Va28aIZ43759cHV1hUKhkJL0IqdOnULHjh1RvXp1mJqaom3btvjzzz9L7bN9+/YYNWqU2rG7d+9CT08P0dHRAIDvvvsOdevWhb6+PmrUqIFevXpJdb28vDBmzBhp/3l1n5WTk4PMzEy1jYiIiDQTE9u3qH379mjSpIlaMqmlpYUlS5bgr7/+QlRUFH7//XdMmDABANCqVSssWrQIJiYmUKlUUKlUCAkJAQDk5eVh5syZOHfuHLZv346UlBQEBQW9MIaIiAh06dIFpqam+Pjjj7F69epidbKzs7FgwQKsWbMGR44cQWpqqtQvADx8+BCBgYE4duwY/vjjD9StWxed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gM8++wyXLl3CypUrERkZidmzZ6udHxoaiu7du+PChQsIDg4usY/s7GwsWLAAa9aswZEjR5CamoqQkBCpfN68eVi7di0iIiIQGxuLzMzMMi2NCAsLg6mpqbTZ2tq+4igQERHRu46JbRW0a9cuKBQKaevdu/dz61tYWAAAlEolrKyspP3p06dj4sSJCAwMhJOTEzp27IiZM2di5cqVauf3798fgwYNgpOTE+zs7ErsIy8vDytWrIC7uzvc3NwwatQoREdHS+VLly7FpEmT0L17d9SrVw/Lli0r041nkyZNQkZGhrTduHHjhecQERFR5cQ1tlVQu3btsHz5cmnfyMgI/fr1e+l2zp07h9jYWLUZ2oKCAjx+/BjZ2dkwNDQEALi7u7+wLUNDQ9SuXVvat7a2RlpaGgAgIyMDd+7cQYsWLaRybW1tvPfeeygsLHxuu3K5HHK5/KWui4iIiConJrZVkJGREerUqfPa7WRlZWH69Ono0aNHsTJ9fX21/l5EV1dXbV8mk0EI8doxEhERUdXBxJbKRFdXFwUFBWrH3NzckJiYWC5J8vOYmpqiRo0aOHXqFNq0aQPgyczwn3/+iaZNm75ao5NuAiYm5RckERERVTgmtlQmDg4OiI6OhqenJ+RyOapVq4apU6fCz88PdnZ26NWrF7S0tHDu3DlcvHgRs2bNKtf+P/30U4SFhaFOnTqoV68eli5digcPHkAme8FLFoiIiKjK4M1jVCbh4eE4cOAAbG1t0axZMwCAj48Pdu3ahf3796N58+Z4//33sXDhQtjb25d7/1988QX69euHgIAAtGzZEgqFAj4+PmpLHoiIiKhqkwkuZKRKqLCwEK6urujTp89z35j2rMzMTJiamiIjIwMmXIpARERUKZT19zeXIlClcP36dezfvx9t27ZFTk4Oli1bhuTkZPTv37+iQyMiIqJ3BJciUKWgpaWFyMhING/eHJ6enrhw4QIOHjwIV1fXig6NiIiI3hGcsaVKwdbWFrGxsRUdBhEREb3DOGNLRERERBqBiS0RERERaQQmtkRERESkEZjYEhEREZFGYGJLRERERBqBiS0RERERaQQmtkRERESkEZjYEhEREZFGYGJLRERERBqBiS0RERERaQQmtkRERESkEZjYEhEREZFGYGJLRERERBqBiS0RERERaQQmtkRERESkEZjYEhEREZFGYGJL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p3379li2bBnOnj2L06dPY9iwYWozr5aWljAwMMDevXtx586dEme2y8Lb2xstW7ZEt27dsH//fqSkpOD48eOYPHkyTp8+jX///RejRo1CTEwMrl+/jtjYWJw6dQqurq6v1B8RERFpDia2L8HJyQlHjhzB5cuX4e3tDQ8PD2zcuBGbNm2Cr6+vVG/o0KFwcXGBu7s7LCwsis2GlkXPnj3h6+uLdu3awcLCAuvWrZPKvL29YW1tDR8fH9jY2LzStYwaNQoJCQnYtGkT3NzcsHHjRqxfvx4NGzbE1KlTMWPGDLUbx8LDw2Fra4vWrVujf//+CAkJgaGhoVSuo6ODJUuWYOXKlbCxsYG/v/8rxSWTybB79260adMGgwYNgrOzMz766CNcv34dNWrUgLa2Nu7fv4+AgAA4OzujT58+6NSpE598QERERJCJZxdO0jsvKysLNWvWREREBHr06FHR4VQqmZmZMDU1RUZGBm8kIyIiqiTK+vuba2wrkcLCQty7dw/h4eFQKpX48MMPKzokIiIioncGE9tKJDU1FY6OjqhVqxYiIyNLfT0vERERUVXEzKgScXBwKPbILSIiIiJ6gjePEREREZFGYGJLRERERBqBiS0RERERaQQmtkRERESkEZjYEhEREZFGYGJLRERERBqBiS0RERERaQQmtkRERESkEZjYEhEREZFG4JvHqEopenNbZmZmBUdCREREZVX0e/tFb2BlYktVyv379wEAtra2FRwJERERvayHDx/C1NS01HImtlSlmJmZAQBSU1Of+4NBZZOZmQlbW1vcuHEDJiYmFR1OpcfxLF8cz/LF8SxfHM+XI4TAw4cPYWNj89x6TGypStHSerKs3NTUlP+RlCMTExOOZznieJYvjmf54niWL45n2ZVlQoo3jxERERGRRmBiS0REREQagYktVSlyuRzTpk2DXC6v6FA0AsezfHE8yxfHs3xxPMsXx/PNkIkXPTeBiIiIiKgS4IwtEREREWkEJrZEREREpBGY2BIRERGRRmBiS0REREQagYktEREREWkEJrZUZXz77bdwcHCAvr4+PDw8cPLkyYoOqVIIDQ2FTCZT2+rVqyeVP378GCNHjoS5uTkUCgV69uyJO3fuVGDE75YjR46ga9eusLGxgUwmw/bt29XKhRCYOnUqrK2tYWBgAG9vb1y9elWtzj///IMBAwbAxMQE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "slicot_full_names = {\n", + " \"a\": \"Analysis Routines\",\n", + " \"b\": \"Benchmark\",\n", + " \"c\": \"Adaptive Control\",\n", + " \"d\": \"Data Analysis\",\n", + " \"f\": \"Filtering\",\n", + " \"i\": \"Identification\",\n", + " \"m\": \"Mathematical routines\",\n", + " \"n\": \"Nonlinear Systems\",\n", + " \"s\": \"Synthesis Routines\",\n", + " \"t\": \"Transformation Routines\",\n", + " \"u\": \"Utility Routines\",\n", + "}\n", + "\n", + "def count_methods(list_routines, keys):\n", + " d = {key: 0 for key in keys}\n", + " for w in list_routines:\n", + " if w:\n", + " if w[0] in d:\n", + " d[w[0]] = d[w[0]] + 1\n", + " else:\n", + " d[w[0]] = 1\n", + " return d\n", + "\n", + "slicot_routines_dict = count_methods(slicot_routines, keys=slicot_full_names.keys())\n", + "slycot_routines_dict = count_methods(slycot_routines, keys=slicot_full_names.keys())\n", + "\n", + "df = pd.DataFrame(\n", + " {\n", + " \"chapter name\": slicot_full_names.values(),\n", + " \"slycot routines\": slycot_routines_dict.values(),\n", + " \"slicot routines\": slicot_routines_dict.values(),\n", + " },\n", + " index=slicot_routines_dict.keys()\n", + ")\n", + "csum = df.sum()\n", + "df.loc['total']= df.sum()\n", + "df.loc[df.index[-1], 'chapter name'] = '-'\n", + "display(df)\n", + "\n", + "names_sli = list(slicot_routines_dict.keys())\n", + "names_sli.reverse()\n", + "values_sli = list(slicot_routines_dict.values())\n", + "values_sli.reverse()\n", + "\n", + "names_sly = list(slycot_routines_dict.keys())\n", + "names_sly.reverse()\n", + "values_sly = list(slycot_routines_dict.values())\n", + "values_sly.reverse()\n", + "\n", + "height = 0.25\n", + "plt.barh(np.arange(len(slycot_routines_dict)), values_sly, height=height)\n", + "plt.barh(np.arange(len(slicot_routines_dict)) - height, values_sli, height=height)\n", + "plt.yticks(np.arange(len(slicot_routines_dict)) - height, [slicot_full_names[x] for x in names_sli])\n", + "plt.legend((\"Slycot\",\"SLICOT\"))\n", + "plt.title(\"Slycot vs SLICOT\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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4+x2O1544QVIkoTHH398QrmIzsfiI9KZwsJC7N27FzU1NVF/7u3bt6O7uxtf+MIXYDQaL/v4t956CzabDXfeeeeI9xcXF2PZsmXYsmULPB5PtOOSTrH4iHTmO9/5DtxuN+bPn48lS5bg0UcfxebNmxEIBCb83EePHgUAzJkzZ1SPP3LkCMrKymC1Wi/6mHnz5iEQCODUqVMTzkcEsPiIdGfVqlXYsWMHbrvtNhw4cABPPvkkbrzxRuTl5WHjxo0Tem6n0wkASExMHNXjXS7XZR977v5zz000USw+Ih1auHAhXn/9dfT09GDXrl147LHH4HK5sG7dOhw5cmTcz+twOABECm00EhMTL/vYc/ePtkyJLofFR6RjFosFCxcuxI9//GP89re/RSAQwKuvvjru5ysvLwcQuU5wNGbMmIHjx4/D5/Nd9DEHDx6E2WzGtGnTxp2L6HwsPiICACxYsAAA0NLSMu7nWLZsGVJSUvDyyy8jFApd9vG33HILvF7vRcu2oaEBlZWVWLFiBex2+7hzEZ2PxUekM1u3boUsy8Nu37RpEwCgrKxs3M8dFxeHRx99FEePHsWjjz464uu8+OKL2LVrFwDgwQcfRGZmJh555BHU1dUNeZzX68X69eshyzJ+8IMfjDsT0YW4cguRzjz00ENwu9244447UF5eDr/fj+rqarzyyisoKirC+vXrBx976tQp/OhHPxr2HBUVFVi7du2Iz//II4/g8OHD+PnPf46tW7di3bp1yM7ORmtrK9544w3s2rUL1dXVAIC0tDS89tprWLt2La644ophK7ecOnUKzzzzDFdioegSfAE9EU2yt99+W/7yl78sl5eXywkJCbLFYpGnTp0qP/TQQ8NWbgEw4td9990ny/LIK7ec89prr8mrV6+WU1NTZZPJJOfk5Mh33XWXvG3btmGPra+vl++//365oKBANpvNcnp6unzbbbfJlZWVl/xZuHILjYckyyMciyAiItIonuMjIiJdYfEREZGusPiIiEhXWHxERKQrLD4iItIVFh8REekKi4+IiHSFxUdERLrC4iMiIl1h8RERka6w+IiISFdYfEREpCv/HxgY3EYFJ+nnAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "venn2(subsets = (len(set(slycot_routines)),\n", + " len(set(slicot_routines)), \n", + " len(intersection)), set_labels = ('Slycot', 'SLICOT'))\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "slycot-dev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/doc/source/dev/inspect_slycot.ipynb b/doc/source/dev/inspect_slycot.ipynb index 81907b4a..a08ccdb1 100644 --- a/doc/source/dev/inspect_slycot.ipynb +++ b/doc/source/dev/inspect_slycot.ipynb @@ -20,14 +20,14 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0.1.dev609+g4f08655.d20230809\n" + "0.1.dev612+g3d12a1d\n" ] } ], @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -92,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -132,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -175,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -194,19 +194,19 @@ "text": [ "There are currently 10 routines that found in slycot not in slycot._wrapper.\n", "------\n", - "['sb02od', 'tb05ad', 'sb02mt', 'tb04ad', 'sb03md57', 'sg02ad']\n", - "['tc01od', 'tb03ad', 'td04ad', 'tc04ad']\n", + "['tc04ad', 'tb05ad', 'sb02od', 'tc01od', 'td04ad', 'tb04ad']\n", + "['sb02mt', 'sb03md57', 'sg02ad', 'tb03ad']\n", "None\n", "\n", "\n", "There are currently 32 routines that are found in slycot._wrapper not in slycot.\n", "------\n", - "['tb05ad_ag', 'sb02od_b', 'td04ad_c', 'tg01ad', 'sb02mt_n', 'sg02ad_bc']\n", - "['sb02od_n', 'tb05ad_nh', 'tg01fd_ii', 'ag08bd', 'tg01fd_nn', 'tc04ad_l']\n", - "['sg02ad_bd', 'sb10jd', 'tb05ad_ng', 'sb02od_d', 'tb03ad_r', 'tg01fd_uu']\n", - "['tc04ad_r', 'tb04ad_r', 'tb04ad_c', 'sb02mt_cl', 'sg02ad_bb', 'tc01od_l']\n", - "['td04ad_r', 'sb02mt_nl', 'tc01od_r', 'sg02ad_g', 'tb03ad_l', 'sb02od_c']\n", - "['sg02ad_bn', 'sb02mt_c']\n", + "['td04ad_r', 'tb03ad_l', 'tc04ad_l', 'sg02ad_g', 'sg02ad_bn', 'ag08bd']\n", + "['sb10jd', 'tc01od_r', 'sg02ad_bb', 'tb03ad_r', 'tg01fd_nn', 'tb04ad_r']\n", + "['tc04ad_r', 'tg01fd_uu', 'sb02mt_nl', 'sg02ad_bc', 'tb05ad_nh', 'tb05ad_ag']\n", + "['tg01fd_ii', 'sb02od_n', 'tb04ad_c', 'sb02od_b', 'sb02od_c', 'sg02ad_bd']\n", + "['sb02od_d', 'sb02mt_n', 'tb05ad_ng', 'tc01od_l', 'tg01ad', 'td04ad_c']\n", + "['sb02mt_c', 'sb02mt_cl']\n", "None\n", "\n", "\n" @@ -233,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -242,32 +242,32 @@ "text": [ "There are currently 81 routines that are found in slycot or in slycot._wrapper. (union)\n", "------\n", - "['tb05ad_ag', 'sb02md', 'sb03md', 'ab08nd', 'tg01fd_ii', 'tb05ad_nh']\n", - "['sb04md', 'ag08bd', 'tb01pd', 'mb03vd', 'sb03md57', 'ab13bd']\n", - "['sb02mt', 'tc04ad', 'ab09nd', 'tc04ad_l', 'sb10jd', 'tf01rd']\n", - "['tb05ad_ng', 'sb02od_d', 'ab05md', 'ab07nd', 'sb04qd', 'ab08nz']\n", - "['tb04ad', 'mb05nd', 'ab09bd', 'tg01fd_uu', 'mb03vy', 'td04ad']\n", - "['ab09ad', 'sb10dd', 'sb10hd', 'sg02ad_bb', 'sg03ad', 'tc01od_l']\n", - "['td04ad_r', 'ab13md', 'tc01od', 'mb03wd', 'sb02mt_nl', 'tc01od_r']\n", - "['tb03ad_l', 'tb05ad', 'tf01md', 'sb02od_c', 'sb01bd', 'mc01td']\n", - "['sb02mt_c', 'sb02od_b', 'td04ad_c', 'tg01ad', 'sb02mt_n', 'sg02ad_bc']\n", - "['sb02od_n', 'sg03bd', 'sg02ad', 'tb03ad', 'tb01id', 'mb05md']\n", - "['tg01fd_nn', 'sg02ad_bd', 'ab13dd', 'tb03ad_r', 'ab09ax', 'ab05nd']\n", - "['mb03rd', 'sb10ad', 'tc04ad_r', 'ab01nd', 'tb04ad_r', 'ab09md']\n", - "['tb04ad_c', 'sb02mt_cl', 'ab13fd', 'ab13ed', 'sb03od', 'sg02ad_g']\n", - "['sb02od', 'sb10fd', 'sg02ad_bn']\n", + "['tb05ad', 'td04ad_r', 'ab13ed', 'td04ad', 'tb01id', 'sb02mt']\n", + "['tf01rd', 'ab13bd', 'ab13fd', 'sb03md', 'mb03vy', 'ab08nd']\n", + "['ab05nd', 'sb10jd', 'sg02ad_bb', 'tb03ad_r', 'tc01od_r', 'tb04ad_r']\n", + "['tc04ad_r', 'tb05ad_nh', 'tb05ad_ag', 'tb03ad', 'tc04ad', 'mb05nd']\n", + "['sb02od_b', 'sb04qd', 'sg03bd', 'sb02od_c', 'sb02od_d', 'tb05ad_ng']\n", + "['mc01td', 'sb10dd', 'ab01nd', 'tc01od', 'sb02md', 'sb02mt_cl']\n", + "['ab09md', 'tb01pd', 'mb03rd', 'sb03od', 'ab09bd', 'mb03wd']\n", + "['tb03ad_l', 'tc04ad_l', 'sg02ad_g', 'sg02ad_bn', 'ab09nd', 'ag08bd']\n", + "['tg01fd_nn', 'tb04ad', 'mb03vd', 'tg01fd_uu', 'sb02mt_nl', 'sg02ad_bc']\n", + "['tg01fd_ii', 'sb02od_n', 'sg03ad', 'sb02od', 'tf01md', 'tb04ad_c']\n", + "['ab05md', 'sg02ad_bd', 'sb01bd', 'sb02mt_n', 'ab07nd', 'ab13md']\n", + "['sb10hd', 'ab09ax', 'ab09ad', 'ab08nz', 'tc01od_l', 'tg01ad']\n", + "['sb10fd', 'ab13dd', 'td04ad_c', 'sb03md57', 'sg02ad', 'sb10ad']\n", + "['sb02mt_c', 'mb05md', 'sb04md']\n", "None\n", "\n", "\n", "There are currently 39 routines that are found in slycot and in slycot._wrapper. (intersection)\n", "------\n", - "['sb02md', 'sb03md', 'ab08nd', 'sb04md', 'sg03bd', 'tb01pd']\n", - "['mb03vd', 'tb01id', 'ab13bd', 'mb05md', 'ab09nd', 'ab13dd']\n", - "['tf01rd', 'ab05md', 'ab07nd', 'ab09ax', 'ab08nz', 'sb04qd']\n", - "['ab05nd', 'mb03rd', 'mb05nd', 'ab09bd', 'sb10ad', 'mb03vy']\n", - "['ab01nd', 'ab09md', 'ab09ad', 'sb10dd', 'sb10hd', 'sg03ad']\n", - "['ab13md', 'ab13fd', 'ab13ed', 'mb03wd', 'sb03od', 'tf01md']\n", - "['sb01bd', 'sb10fd', 'mc01td']\n", + "['sb03od', 'ab09bd', 'mb03wd', 'ab13ed', 'tb01id', 'mb03rd']\n", + "['tf01rd', 'ab13bd', 'ab13fd', 'sb03md', 'mb03vy', 'ab09nd']\n", + "['ab08nd', 'ab05nd', 'mb03vd', 'sg03ad', 'mb05nd', 'tf01md']\n", + "['sb04qd', 'sg03bd', 'ab05md', 'sb01bd', 'ab07nd', 'ab13md']\n", + "['sb10hd', 'ab09ax', 'ab09ad', 'ab08nz', 'mc01td', 'sb10dd']\n", + "['sb10fd', 'ab13dd', 'ab01nd', 'sb02md', 'sb10ad', 'mb05md']\n", + "['ab09md', 'tb01pd', 'sb04md']\n", "None\n", "\n", "\n" @@ -294,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 18, "metadata": {}, "outputs": [ { diff --git a/doc/source/dev/slicot_procedures.txt b/doc/source/dev/slicot_routines.txt similarity index 100% rename from doc/source/dev/slicot_procedures.txt rename to doc/source/dev/slicot_routines.txt diff --git a/doc/source/dev/slicot_slycot.ipynb b/doc/source/dev/slicot_slycot.ipynb deleted file mode 100644 index ddc76215..00000000 --- a/doc/source/dev/slicot_slycot.ipynb +++ /dev/null @@ -1,682 +0,0 @@ -{ - "cells": [ - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Inspect SLICOT and Slycot" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook shows how to inspect the slicot libary and the slycot module.\n", - "The result gives us a insight which slicot routines are implemented slycot." - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0.1.dev609+g4f08655.d20230809'" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import re\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "from matplotlib_venn import venn2\n", - "\n", - "import slycot\n", - "slycot.__version__" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Helper function" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "def print_list_chunks(routines_list, n=6):\n", - " \"\"\"Print list in chunks of lists.\"\"\"\n", - " start = 0\n", - " end = len(routines_list)\n", - " step = n\n", - " for i in range(start, end, step):\n", - " x = i\n", - " print(routines_list[x:x+step])" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "def get_slycot_routines(sly):\n", - " all_attributes = dir(sly)\n", - " r = re.compile(\"[a-z][a-z][0-9][0-9a-z][a-z][a-z]\")\n", - " matched_attributes = list(filter(r.match, all_attributes)) # Read Note below\n", - " return matched_attributes" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inspect function" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are currently 607 routines that are found in slicot.\n", - "['mb01wd', 'tg01gd', 'ab13fd', 'sg03ay', 'mb01oe', 'mb02fd']\n", - "['tg01oa', 'dg01ny', 'sg03ax', 'fb01qd', 'ma02az', 'mc01md']\n", - "['md03by', 'tf01mx', 'ib01nd', 'mb02rz', 'mb04bp', 'tb01kd']\n", - "['ab09gd', 'ma02jz', 'ud01cd', 'ib01rd', 'nf01bx', 'mb02rd']\n", - "['ma02es', 'mb04iy', 'tg01id', 'mb01rd', 'mc01xd', 'mb04wr']\n", - "['sg03bs', 'mb03kc', 'ma02cd', 'tb04ad', 'md03bx', 'mb03vy']\n", - "['ab09cd', 'tf01nd', 'sb09md', 'sb03ot', 'mb04pu', 'mb04yd']\n", - "['mb02pd', 'mb04tu', 'mb02ud', 'ib01cd', 'mb04dp', 'tg01fz']\n", - "['sb04od', 'nf01ad', 'mb03qd', 'ab09bd', 'mb02jd', 'sb02mw']\n", - "['ma02ad', 'mb04dl', 'sb08ed', 'tb01uy', 'md03ba', 'ab05nd']\n", - "['mb03pd', 'sb02mx', 'sb04ow', 'ma02mz', 'mb02cy', 'ag08by']\n", - "['mb03bb', 'ab09cx', 'mb01kd', 'sb02sd', 'mb01xd', 'sb01md']\n", - "['mb02ny', 'sb02ox', 'sb10pd', 'ma01cd', 'tg01hd', 'mb02nd']\n", - "['sb02cx', 'sb04px', 'mb03qg', 'tg01hx', 'mb03ag', 'mc01py']\n", - "['mb03kb', 'mb04jd', 'tg01bd', 'tb03ay', 'ab13ed', 'sb03rd']\n", - "['ma02id', 'ma02md', 'sb03os', 'mb02cv', 'mb05oy', 'sb06nd']\n", - "['nf01bp', 'sb02od', 'mb03md', 'fb01vd', 'ma02iz', 'tb01ld']\n", - "['mb02sd', 'tb01nd', 'ud01md', 'mb02xd', 'mb02md', 'sg03br']\n", - "['mb04az', 'sb02ru', 'sb10qd', 'sg03bu', 'sb04qr', 'mb03lf']\n", - "['ma01ad', 'sb04rd', 'ma02gd', 'sb04ry', 'ab13ad', 'ab13md']\n", - "['nf01by', 'mb04nd', 'mb03yt', 'sg02cx', 'tg01hu', 'ab09kx']\n", - "['mb04hd', 'mb03gd', 'sb08cd', 'mb03od', 'sb04mr', 'mb02kd']\n", - "['ab09jx', 'ud01bd', 'fb01sd', 'mb03rd', 'ab07nd', 'mb03fd']\n", - "['sb03ou', 'mb03ya', 'mb01rh', 'sb08hd', 'ab08nw', 'ab07md']\n", - "['ab05qd', 'mb02qy', 'mb03id', 'ma02bd', 'ma02dd', 'mb04ed']\n", - "['sb03td', 'mb04tv', 'td04ad', 'tb01ud', 'tc01od', 'nf01bs']\n", - "['ma02oz', 'sg02nd', 'mb04ru', 'mc01rd', 'mb03bd', 'mb04tt']\n", - "['sb08ny', 'tg01ad', 'sb04qu', 'nf01bf', 'tg01qd', 'mc01td']\n", - "['mb04fp', 'mb03ud', 'mb3lzp', 'sb04nv', 'mb04qb', 'mb04wp']\n", - "['mc01sy', 'sb10dd', 'mb02sz', 'mb04kd', 'tb04bw', 'mb01ry']\n", - "['sb03mv', 'tb03ad', 'mb03gz', 'mb01ot', 'mb03be', 'tb01zd']\n", - "['ab04md', 'mb01os', 'sb03qx', 'mb04pb', 'nf01bu', 'mb04su']\n", - "['mc01od', 'sb16bd', 'mb02td', 'sg03ad', 'sb03qy', 'mb03xs']\n", - "['md03bb', 'mb04qc', 'mb03jd', 'sb01by', 'ab09nd', 'sb03md']\n", - "['mb04oy', 'mb05nd', 'ab08nx', 'mb01rb', 'dg01md', 'mb02wd']\n", - "['sb03ud', 'mb03py', 'mc01pd', 'ma02pz', 'ab09iy', 'ma02od']\n", - "['sb10td', 'tf01my', 'sb16cy', 'tg01oz', 'ab05pd', 'mb04cd']\n", - "['sb16ay', 'sb10hd', 'mb02gd', 'mc03md', 'mb03bc', 'sb04nx']\n", - "['mc01qd', 'ab01od', 'ab09jd', 'sb16ad', 'sg03bv', 'nf01bb']\n", - "['ab09dd', 'mb03lp', 'md03bf', 'mb03ah', 'mb3jzp', 'sb04mu']\n", - "['ab09kd', 'sb03ov', 'sb03pd', 'fd01ad', 'sb03sd', 'td05ad']\n", - "['mb02hd', 'mb02cd', 'mb03qx', 'sb04nd', 'mb04tb', 'sb04pd']\n", - "['tg01jy', 'tb04cd', 'tg01dd', 'ab09ed', 'mb03wx', 'tg01pd']\n", - "['tf01pd', 'sb08fd', 'ab13ax', 'nf01ba', 'sb08md', 'mb04dy']\n", - "['sb04my', 'ab09fd', 'mb04vd', 'mb01md', 'ib01oy', 'mb04ld']\n", - "['sb01bd', 'sb02mu', 'sg03bx', 'tg01ed', 'mb02qd', 'mb01ss']\n", - "['mb01rw', 'sb10ud', 'mb03cz', 'ag8byz', 'sb02ow', 'mb02dd']\n", - "['sb08nd', 'mb03my', 'mb03yd', 'tg01od', 'mc01sw', 'ma02bz']\n", - "['ib01ad', 'ab09hd', 'ud01mz', 'td03ad', 'sb03my', 'ib03bd']\n", - "['mb04dd', 'mb04xd', 'ma02hd', 'ab09ax', 'tg01hy', 'mc01sx']\n", - "['tb01ux', 'df01md', 'mb04vx', 'mb04wd', 'ab08md', 'tb01vd']\n", - "['nf01ay', 'md03bd', 'mb03rz', 'ab09ix', 'ab13dd', 'tb01iz']\n", - "['nf01bw', 'mb04qf', 'ab05sd', 'mb04db', 'mb03ai', 'sb08gd']\n", - "['mb02od', 'mb04ty', 'mb02uv', 'ib01px', 'tb01ty', 'sb03oy']\n", - "['sb03mu', 'tg01nd', 'ab09hx', 'ab09id', 'mb04id', 'mb03ed']\n", - "['mb04di', 'mb04tx', 'sb03od', 'mb04xy', 'mb03hz', 'tc04ad']\n", - "['mb01rx', 'sb02ov', 'mb03zd', 'mb03jp', 'mb02yd', 'mb04ox']\n", - "['bd01ad', 'mb04fd', 'ab05md', 'tb04bx', 'dg01od', 'sb10zd']\n", - "['mb01rt', 'sb02mr', 'ab01nd', 'mb04bz', 'ma01bz', 'ma02ed']\n", - "['mb03ld', 'tb01md', 'tb01xz', 'mb04qs', 'ab09md', 'sb10id']\n", - "['sb03sx', 'mb02cu', 'ab13bd', 'mb3oyz', 'mb02tz', 'tb01px']\n", - "['mb03iz', 'sg03bw', 'mb04dz', 'nf01bv', 'bd02ad', 'tf01md']\n", - "['mb03wd', 'mb4dbz', 'mb04tw', 'mb03vd', 'mb01oo', 'fb01rd']\n", - "['mb04rb', 'mb03ry', 'mb01xy', 'tb05ad', 'ib03ad', 'mb03xz']\n", - "['mb05md', 'mb02ed', 'sb03mw', 'sg03bd', 'mb01ru', 'mb01oc']\n", - "['bb02ad', 'ab09jw', 'mb03cd', 'mb04pa', 'sb10yd', 'mb02jx']\n", - "['tg01az', 'sg02ad', 'ma02hz', 'mb03dz', 'tg01md', 'sb08my']\n", - "['tb04ay', 'sb02nd', 'sb02mt', 'sb04rw', 'mb04wu', 'nf01be']\n", - "['de01pd', 'sb02mv', 'sb10ed', 'sb10zp', 'mb03lz', 'sb02oy']\n", - "['sb04md', 'mb03bg', 'mb03ad', 'mb01uw', 'sb10kd', 'ma02jd']\n", - "['ma02gz', 'tf01qd', 'mb03td', 'mb04gd', 'tb04bv', 'tg01ld']\n", - "['mb03ba', 'ue01md', 'mb3pyz', 'mb03xp', 'sb02ou', 'mb01nd']\n", - "['sg02cw', 'mb04yw', 'sb04mw', 'mb01uy', 'sg03by', 'ib01py']\n", - "['mb02uw', 'tg01ob', 'mb03jz', 'mb04ad', 'tg01fd', 'mb03sd']\n", - "['ab13id', 'ab08ny', 'mb03za', 'mb02uu', 'ab08nd', 'mc01wd']\n", - "['tg01ly', 'mb01uz', 'mb03xu', 'mb03nd', 'ag07bd', 'sg03bt']\n", - "['mb03xd', 'ma02nz', 'ab13dx', 'ab08nz', 'sb04ny', 'mb03ts']\n", - "['sb04qy', 'mb03rx', 'mb03af', 'ib01md', 'mb03ke', 'sb02pd']\n", - "['sb16cd', 'ab8nxz', 'mb04bd', 'tf01rd', 'mb01ux', 'mb03bz']\n", - "['sb03sy', 'mc03ny', 'sb10ld', 'ma02fd', 'td03ay', 'bb04ad']\n", - "['mb03ab', 'dk01md', 'ab05od', 'mc03nx', 'mb01td', 'tb01id']\n", - "['tg01cd', 'mb04ow', 'sb04nw', 'mb03ae', 'mb03rw', 'mb03qy']\n", - "['sb04py', 'nf01bq', 'mb03dd', 'tb01kx', 'mb01ud', 'ma01bd']\n", - "['mb03ny', 'ab08mz', 'sb02rd', 'sb04qd', 'tb01wx', 'ag08bz']\n", - "['tg01wd', 'tb04bd', 'sb02md', 'bb01ad', 'mc01sd', 'mc01vd']\n", - "['sb10ad', 'mb01vd', 'de01od', 'ib01pd', 'mb03bf', 'sb02ms']\n", - "['mb04py', 'mc03nd', 'tb01wd', 'mc01nd', 'dg01nd', 'ab09ad']\n", - "['mb02id', 'tb01yd', 'sb03mx', 'mb03vw', 'sg02cv', 'ab05rd']\n", - "['mb04ds', 'mb01od', 'mb4dpz', 'mb03oy', 'sb03qd', 'sb01bx']\n", - "['sb08dd', 'ib01od', 'sb10md', 'mb01ld', 'mb04iz', 'mb05od']\n", - "['tb01td', 'mb02vd', 'mb03fz', 'mb05my', 'mb01oh', 'mb04zd']\n", - "['sb03oz', 'tg01kz', 'mb02cx', 'tg01jd', 'mb01zd', 'mb01pd']\n", - "['sb01dd', 'mb03hd', 'sb02qd', 'mb03qw', 'tb01xd', 'ud01nd']\n", - "['sb10rd', 'ib01my', 'tf01od', 'ud01dd', 'tb01vy', 'ab09hy']\n", - "['sb04rx', 'ib01qd', 'mb04od', 'mb03qv', 'sg03bz', 'sb03or']\n", - "['mb03kd', 'ab13cd', 'tg01kd', 'mb03wa', 'mb04ts', 'mb03ka']\n", - "['mb4dlz', 'mb04qu', 'sb10fd', 'ma02pd', 'sb10jd', 'mb01qd']\n", - "['ab09jv', 'sb10vd', 'fb01td', 'ma02ez', 'tc05ad', 'sb10wd']\n", - "['md03ad', 'nf01bd', 'ma02cz', 'mb04ny', 'sb04rv', 'nf01br']\n", - "['tb01pd', 'ab01md', 'ib01bd', 'mb01yd', 'tg01nx', 'sb01fy']\n", - "['mb04md', 'sb10sd', 'mb04ud', 'mb01sd', 'ag08bd', 'ab09bx']\n", - "['bb03ad']\n", - "None\n" - ] - } - ], - "source": [ - "with open('slicot_procedures.txt') as f:\n", - " lines = f.readlines()\n", - "\n", - "slicot_routines = [x.split(\"\\n\")[0] for x in lines]\n", - "\n", - "print(f\"There are currently {len(slicot_routines)} routines that are found in slicot.\")\n", - "print(print_list_chunks(slicot_routines))" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are currently 49 routines that are found in slycot.\n", - "------\n", - "['ab01nd', 'ab05md', 'ab05nd', 'ab07nd', 'ab08nd', 'ab08nz']\n", - "['ab09ad', 'ab09ax', 'ab09bd', 'ab09md', 'ab09nd', 'ab13bd']\n", - "['ab13dd', 'ab13ed', 'ab13fd', 'ab13md', 'mb03rd', 'mb03vd']\n", - "['mb03vy', 'mb03wd', 'mb05md', 'mb05nd', 'mc01td', 'sb01bd']\n", - "['sb02md', 'sb02mt', 'sb02od', 'sb03md', 'sb03md57', 'sb03od']\n", - "['sb04md', 'sb04qd', 'sb10ad', 'sb10dd', 'sb10fd', 'sb10hd']\n", - "['sg02ad', 'sg03ad', 'sg03bd', 'tb01id', 'tb01pd', 'tb03ad']\n", - "['tb04ad', 'tb05ad', 'tc01od', 'tc04ad', 'td04ad', 'tf01md']\n", - "['tf01rd']\n", - "None\n" - ] - } - ], - "source": [ - "slycot_routines = get_slycot_routines(slycot)\n", - "\n", - "print(f\"There are currently {len(slycot_routines)} routines that are found in slycot.\")\n", - "print(\"------\")\n", - "print(print_list_chunks(slycot_routines))" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Generate Sets for the Venn-Diagramm" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are currently 1 routines that are found in slycot and not in slicot.\n", - "------\n", - "['sb03md57']\n", - "None\n", - "\n", - "\n", - "There are currently 559 routines that are found in slicot and not in slycot.\n", - "------\n", - "['mb03od', 'tb04bw', 'mb03qy', 'tc05ad', 'mb04pu', 'ab08md']\n", - "['ab09jw', 'sb04rx', 'ma02iz', 'sg03bu', 'tg01gd', 'ab09ed']\n", - "['mb01zd', 'sb02oy', 'mb04iz', 'sb10rd', 'mb01wd', 'sb10pd']\n", - "['sb02ox', 'mb03hz', 'mb03bb', 'tb04bd', 'tg01ob', 'tg01md']\n", - "['sb01fy', 'mb02uu', 'sb01md', 'mb03lp', 'tg01hd', 'tb01wd']\n", - "['mb02cd', 'ma02hz', 'sb10kd', 'mb04dz', 'mb03za', 'mb04iy']\n", - "['sb02ow', 'ab09hx', 'sb03qd', 'tg01az', 'sb08my', 'sb03mv']\n", - "['sb02mv', 'mb03rw', 'mb03fz', 'dg01nd', 'ma02cz', 'sb03sd']\n", - "['ma02gd', 'mc01wd', 'ab05qd', 'sb01by', 'sb03mw', 'mb03vw']\n", - "['mb03kd', 'sb03oy', 'ib01qd', 'mb02uv', 'mb01vd', 'md03ba']\n", - "['ma01cd', 'tg01ld', 'sb04ny', 'mb03xd', 'ab09cx', 'mb04qb']\n", - "['mb03ka', 'mb04qc', 'mb04az', 'sb03ud', 'mb03iz', 'mb04di']\n", - "['mb01uw', 'mc03nx', 'mb01kd', 'sb04my', 'mb03ae', 'mb01oc']\n", - "['mb02fd', 'mb02sz', 'tb01kd', 'tg01ad', 'ib01oy', 'mb04wd']\n", - "['tg01cd', 'mb01oo', 'tg01qd', 'tb01ty', 'tb01yd', 'sb02qd']\n", - "['tg01id', 'mb04bd', 'tb01ld', 'tb01td', 'tg01nd', 'sb03or']\n", - "['ab09hy', 'nf01bq', 'mb02rd', 'tg01ed', 'ma02od', 'ib01cd']\n", - "['mb03ke', 'nf01bw', 'mb02qy', 'md03bx', 'mb04vd', 'mb04ny']\n", - "['sb02mx', 'ab8nxz', 'mb04ad', 'tg01kz', 'tg01fd', 'mc03nd']\n", - "['mb03jd', 'mb01rw', 'sb08cd', 'mb02tz', 'mb02od', 'mb02gd']\n", - "['mb02yd', 'nf01be', 'sb03oz', 'mb03qw', 'sg03bw', 'ud01dd']\n", - "['mb03md', 'mc01xd', 'sb10jd', 'nf01bp', 'ma02es', 'sb02ms']\n", - "['mb04fp', 'fb01sd', 'ma02az', 'mb03xs', 'mb02ed', 'mb04vx']\n", - "['mb01td', 'ib01bd', 'mb04xy', 'mb03lz', 'sb04nx', 'ma02ad']\n", - "['sg03ay', 'tg01hx', 'sb04mu', 'mb04dy', 'ab04md', 'mb01rt']\n", - "['ab09id', 'tb04ay', 'sb08dd', 'sb03ot', 'nf01bu', 'mb03xz']\n", - "['sb10id', 'sb04rv', 'ma02gz', 'mb03ud', 'mb04bz', 'tg01pd']\n", - "['mb03wa', 'mb03ed', 'mb03be', 'sg02cw', 'sb10wd', 'mc03md']\n", - "['mb01ud', 'nf01bb', 'sb03mu', 'ab09hd', 'ab09iy', 'mb04od']\n", - "['sb04mr', 'mb04qu', 'ib01px', 'td05ad', 'nf01ay', 'mb3pyz']\n", - "['mb03bg', 'mb03xp', 'mb03zd', 'dk01md', 'sg02cv', 'ud01cd']\n", - "['mb03sd', 'tb01ux', 'tf01nd', 'sb02cx', 'sb10sd', 'mb03qg']\n", - "['sb10zd', 'mb01rh', 'mb03nd', 'tb01vy', 'ib03bd', 'de01od']\n", - "['mb01nd', 'ib01rd', 'mb02cu', 'mb03jz', 'mb02pd', 'ab09ix']\n", - "['mb03fd', 'mb03kb', 'mb04zd', 'mb04ed', 'ag8byz', 'ib03ad']\n", - "['sb04rd', 'mb01od', 'mb02qd', 'bb04ad', 'ab08mz', 'fb01qd']\n", - "['ab09bx', 'bb01ad', 'mb03wx', 'sb01dd', 'mb01qd', 'ab09gd']\n", - "['sb04pd', 'mb03dz', 'ab09jd', 'sb02ou', 'ab09kd', 'mb02jx']\n", - "['ma02pd', 'mb04wu', 'ab09dd', 'sb01bx', 'sb03rd', 'nf01ba']\n", - "['tg01nx', 'sb16cd', 'mb05oy', 'sb04qu', 'tb01zd', 'tb01wx']\n", - "['tb01ud', 'bd01ad', 'sb08ed', 'sg03bv', 'ma01bz', 'mb02vd']\n", - "['mb02cv', 'sb10ed', 'mb03ba', 'nf01bf', 'mb04oy', 'md03ad']\n", - "['ma01bd', 'mb03ab', 'tg01bd', 'mb03td', 'ab09jx', 'sg03by']\n", - "['tg01kd', 'tf01pd', 'mb3jzp', 'sb04nw', 'sb16cy', 'mb01pd']\n", - "['mb04kd', 'nf01bs', 'mb04ow', 'ud01bd', 'tb01nd', 'sb08nd']\n", - "['mb04wp', 'ma02cd', 'tg01od', 'sb04mw', 'mc01rd', 'fb01vd']\n", - "['mb04yw', 'mb01uz', 'mb01rd', 'ud01md', 'mb01ld', 'md03bf']\n", - "['tb01uy', 'fb01rd', 'mb01ot', 'ab01od', 'mb03ag', 'mb03ai']\n", - "['sb10md', 'mb03pd', 'mb01ux', 'mb01xy', 'mc01vd', 'mb04py']\n", - "['mb03rx', 'ma02pz', 'tg01hu', 'mb02wd', 'sb09md', 'sb03my']\n", - "['ma02jd', 'ab05od', 'mb04pb', 'mb03id', 'tf01od', 'mb04jd']\n", - "['ab08ny', 'nf01bx', 'mb03ny', 'tb03ay', 'tb04bv', 'ma02id']\n", - "['sb10qd', 'tg01dd', 'mb03rz', 'sb03qy', 'bd02ad', 'mc01qd']\n", - "['tb01iz', 'mc03ny', 'ma02ed', 'mb02kd', 'tg01ly', 'ab05rd']\n", - "['ab08nx', 'mb02dd', 'mb03xu', 'ma02nz', 'mb04md', 'mb04tu']\n", - "['sb02ru', 'ab09fd', 'mb02xd', 'sb08gd', 'ab05sd', 'mb03dd']\n", - "['ib01nd', 'mb03oy', 'ma02fd', 'ib01od', 'bb03ad', 'mb03ld']\n", - "['ib01py', 'mb04nd', 'tg01jd', 'mb04tv', 'mc01sx', 'tf01mx']\n", - "['mb3lzp', 'sb10td', 'sb10zp', 'nf01ad', 'sb02mu', 'tg01hy']\n", - "['tg01wd', 'mb04ld', 'mb02ud', 'mb04pa', 'mb04tw', 'mb03bc']\n", - "['tb01xz', 'tb01px', 'tg01fz', 'sb04qy', 'sb03td', 'mb04gd']\n", - "['dg01md', 'mb03lf', 'nf01br', 'md03bd', 'mb04rb', 'sb03ov']\n", - "['sb03pd', 'mb01oh', 'sb03os', 'ab13ad', 'mb03bz', 'mb01uy']\n", - "['ib01pd', 'sb04qr', 'mb4dbz', 'tf01my', 'sb03qx', 'ab05pd']\n", - "['sb04rw', 'ab08nw', 'mb03qx', 'mb01oe', 'mb01yd', 'tg01oz']\n", - "['mb02ny', 'ma02dd', 'sb03sy', 'mb04tb', 'sb04py', 'mb03ya']\n", - "['sb16ay', 'mb04id', 'ib01my', 'ma02ez', 'sb10vd', 'sb16bd']\n", - "['mb01rx', 'ab13dx', 'mc01sd', 'mb04fd', 'mb03jp', 'mb04qf']\n", - "['ma01ad', 'mb01os', 'mc01py', 'ag07bd', 'mb03ts', 'mc01od']\n", - "['mb05od', 'sg03ax', 'mb02jd', 'tb01kx', 'tb01md', 'sb03ou']\n", - "['mb03bf', 'sb02nd', 'sb02mw', 'sb04ry', 'mb04wr', 'sg03bz']\n", - "['sb04nv', 'sb03mx', 'bb02ad', 'mb04yd', 'mb03py', 'mb4dlz']\n", - "['fb01td', 'sb04px', 'mb03hd', 'ma02mz', 'mb04tt', 'mb04qs']\n", - "['mb01md', 'ud01nd', 'mb03yd', 'mc01md', 'de01pd', 'mb03ry']\n", - "['ma02hd', 'ab09kx', 'sg03br', 'tb04cd', 'mb4dpz', 'mb04ud']\n", - "['ib01md', 'mb03yt', 'mb03cz', 'tg01oa', 'nf01bv', 'nf01bd']\n", - "['ib01ad', 'mb02cy', 'mc01pd', 'sb10ud', 'sg03bs', 'tg01jy']\n", - "['td03ay', 'mb02nd', 'sb03sx', 'mb01rb', 'ab01md', 'mb03gd']\n", - "['mb04su', 'sb08hd', 'sg03bx', 'sb02pd', 'mb04bp', 'mb03af']\n", - "['mb05my', 'mb03gz', 'mb02id', 'sb04od', 'ma02bd', 'mb04dp']\n", - "['nf01by', 'mb03kc', 'mb04ox', 'mc01nd', 'dg01od', 'sb02ov']\n", - "['sb10yd', 'sg02nd', 'mb02td', 'ab13ax', 'ab09jv', 'ma02oz']\n", - "['fd01ad', 'tb04bx', 'ag08bz', 'mb04dl', 'mb02hd', 'sb04nd']\n", - "['sg02cx', 'ab13id', 'mc01sw', 'mb01ss', 'sg03bt', 'mb3oyz']\n", - "['sb16ad', 'mb02cx', 'tb01xd', 'tb01vd', 'ma02md', 'mb04xd']\n", - "['md03bb', 'mb04ds', 'mb01sd', 'mb02uw', 'mb04ts', 'mb02md']\n", - "['mb04tx', 'mb02sd', 'dg01ny', 'sb06nd', 'sb08fd', 'mc01sy']\n", - "['ab09cd', 'ab07md', 'mb04db', 'mb03ad', 'ud01mz', 'mb03qd']\n", - "['tf01qd', 'ab13cd', 'mb03bd', 'ag08bd', 'ma02bz', 'mb03ah']\n", - "['ma02jz', 'md03by', 'df01md', 'td03ad', 'sb10ld', 'ue01md']\n", - "['sb08ny', 'ag08by', 'sb02mr', 'mb04ty', 'mb03cd', 'sb08md']\n", - "['mb04cd', 'sb04ow', 'mb03qv', 'mb03my', 'mb04ru', 'mb02rz']\n", - "['sb02sd', 'mb04hd', 'mb04dd', 'mb01ru', 'sb02rd', 'mb01ry']\n", - "['mb01xd']\n", - "None\n", - "\n", - "\n" - ] - } - ], - "source": [ - "not_in_slicot = list(set(slycot_routines)- set(slicot_routines))\n", - "not_in_slicot\n", - "\n", - "print(f\"There are currently {len(not_in_slicot)} routines that are found in slycot and not in slicot.\")\n", - "print(\"------\")\n", - "print(print_list_chunks(not_in_slicot))\n", - "print(\"\\n\")\n", - "\n", - "not_in_slycot = list(set(slicot_routines) - set(slycot_routines))\n", - "not_in_slycot\n", - "\n", - "print(f\"There are currently {len(not_in_slycot)} routines that are found in slicot and not in slycot.\")\n", - "print(\"------\")\n", - "print(print_list_chunks(not_in_slycot))\n", - "print(\"\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are currently 608 routines that are found in slicot or in slycot. (union)\n", - "------\n", - "['mb03od', 'tb04bw', 'mb03qy', 'tc05ad', 'mb04pu', 'ab08nd']\n", - "['ab08md', 'ab09jw', 'sb04rx', 'ma02iz', 'sg03bu', 'tg01gd']\n", - "['sb03od', 'ab09ed', 'mb01zd', 'sb02oy', 'mb04iz', 'sb10rd']\n", - "['mb01wd', 'sb10pd', 'sb02ox', 'mb03hz', 'mb03bb', 'tb04bd']\n", - "['tg01ob', 'tg01md', 'sb01fy', 'mb02uu', 'ab07nd', 'sb01md']\n", - "['mb03lp', 'tg01hd', 'tb01wd', 'mb02cd', 'ma02hz', 'sb10kd']\n", - "['mb04dz', 'mb03za', 'mb04iy', 'sb02ow', 'ab09hx', 'sb03qd']\n", - "['tg01az', 'sb08my', 'sb03mv', 'sb02mv', 'mb03rw', 'mb03fz']\n", - "['dg01nd', 'ma02cz', 'sb03sd', 'mb05nd', 'ma02gd', 'mc01wd']\n", - "['ab05qd', 'sb01by', 'sb03mw', 'mb03vw', 'mb03kd', 'sb03oy']\n", - "['ib01qd', 'tf01rd', 'mb02uv', 'mb01vd', 'md03ba', 'ma01cd']\n", - "['tg01ld', 'sb04ny', 'mb03xd', 'ab09cx', 'mb04qb', 'mb03ka']\n", - "['mb04qc', 'mb04az', 'sb03ud', 'mb03iz', 'mb04di', 'sb04md']\n", - "['mb01uw', 'sg03bd', 'mc03nx', 'mb01kd', 'sb04my', 'mb03ae']\n", - "['mb01oc', 'mb02fd', 'mb02sz', 'tb01kd', 'tg01ad', 'ib01oy']\n", - "['mb04wd', 'tg01cd', 'mb01oo', 'tg01qd', 'tb01ty', 'tb01yd']\n", - "['sb02qd', 'tg01id', 'mb04bd', 'tb01ld', 'tb01td', 'tg01nd']\n", - "['tb05ad', 'sb03or', 'ab09hy', 'nf01bq', 'mb02rd', 'tg01ed']\n", - "['ma02od', 'ib01cd', 'mb03ke', 'nf01bw', 'mb02qy', 'ab09md']\n", - "['md03bx', 'mb04vd', 'mb04ny', 'sb02mx', 'ab8nxz', 'mb04ad']\n", - "['tg01kz', 'tg01fd', 'mc03nd', 'mb03jd', 'mb01rw', 'sb08cd']\n", - "['mb02tz', 'mb02od', 'mb02gd', 'mb02yd', 'nf01be', 'ab13dd']\n", - "['sb03oz', 'sb04qd', 'mb03qw', 'sg03bw', 'ud01dd', 'mb03md']\n", - "['mc01xd', 'sb10jd', 'nf01bp', 'ma02es', 'sb02ms', 'mb04fp']\n", - "['fb01sd', 'ma02az', 'mb03xs', 'mb02ed', 'mb04vx', 'mb01td']\n", - "['ib01bd', 'mb04xy', 'mb03lz', 'sb04nx', 'ma02ad', 'td04ad']\n", - "['sg03ay', 'tg01hx', 'sb04mu', 'mb04dy', 'ab04md', 'mb01rt']\n", - "['ab09id', 'tb04ay', 'sb08dd', 'sb03ot', 'nf01bu', 'mb03xz']\n", - "['sb10id', 'sb04rv', 'ma02gz', 'mb03ud', 'mb04bz', 'tg01pd']\n", - "['mb05md', 'tf01md', 'mb03wa', 'mb03ed', 'mb03be', 'sg02cw']\n", - "['sb10wd', 'mc03md', 'mb01ud', 'sg02ad', 'nf01bb', 'sb03mu']\n", - "['ab09hd', 'ab09iy', 'mb04od', 'sb04mr', 'mb04qu', 'sb03md']\n", - "['ib01px', 'td05ad', 'nf01ay', 'mb3pyz', 'mb03bg', 'mb03xp']\n", - "['mb03zd', 'dk01md', 'sg02cv', 'ud01cd', 'mb03sd', 'tb01ux']\n", - "['tf01nd', 'sb02cx', 'sb10sd', 'mb03qg', 'sb10zd', 'mb01rh']\n", - "['mb03nd', 'tb01vy', 'ib03bd', 'de01od', 'mb01nd', 'ib01rd']\n", - "['mb02cu', 'mb03jz', 'mb02pd', 'ab09ix', 'mb03fd', 'mb03kb']\n", - "['mb04zd', 'mb04ed', 'ag8byz', 'ib03ad', 'sb04rd', 'mb01od']\n", - "['mb02qd', 'bb04ad', 'ab08mz', 'fb01qd', 'ab09bx', 'bb01ad']\n", - "['mb03wx', 'sb01dd', 'mb01qd', 'ab09gd', 'tb04ad', 'sb04pd']\n", - "['mb03dz', 'ab09jd', 'sb02ou', 'ab09kd', 'mb02jx', 'ma02pd']\n", - "['sb03md57', 'mb04wu', 'ab09dd', 'sb01bx', 'ab13bd', 'sb03rd']\n", - "['nf01ba', 'tg01nx', 'sb16cd', 'mb05oy', 'sb04qu', 'tb01zd']\n", - "['tb01wx', 'tb01ud', 'bd01ad', 'sb08ed', 'sg03bv', 'ma01bz']\n", - "['mb02vd', 'mb02cv', 'sb10ed', 'mb03ba', 'sb10fd', 'nf01bf']\n", - "['mb04oy', 'md03ad', 'ma01bd', 'mb03ab', 'tg01bd', 'mb03td']\n", - "['ab09jx', 'sg03by', 'tg01kd', 'ab09nd', 'tf01pd', 'mb3jzp']\n", - "['sb04nw', 'sb16cy', 'tc04ad', 'mb01pd', 'mb04kd', 'nf01bs']\n", - "['mb03wd', 'mb04ow', 'ud01bd', 'tb01nd', 'sb08nd', 'mb04wp']\n", - "['ma02cd', 'tg01od', 'sb04mw', 'mc01rd', 'fb01vd', 'mb04yw']\n", - "['mb01uz', 'mb01rd', 'ud01md', 'mb01ld', 'md03bf', 'tb01pd']\n", - "['tb01uy', 'fb01rd', 'mb01ot', 'ab01od', 'mb03ag', 'sb01bd']\n", - "['mb03ai', 'sb10md', 'sb10dd', 'mb03pd', 'mb01ux', 'mb01xy']\n", - "['mc01vd', 'ab01nd', 'mb04py', 'mb03rx', 'ma02pz', 'tg01hu']\n", - "['mb02wd', 'ab13fd', 'sb09md', 'sb03my', 'ma02jd', 'ab05od']\n", - "['mb04pb', 'mb03id', 'tf01od', 'mb04jd', 'ab08ny', 'nf01bx']\n", - "['mb03ny', 'tb03ay', 'tb04bv', 'ma02id', 'sb10qd', 'tg01dd']\n", - "['mb03rz', 'sb03qy', 'bd02ad', 'ab05md', 'mc01qd', 'mc01td']\n", - "['tb01iz', 'mc03ny', 'ma02ed', 'mb02kd', 'tg01ly', 'ab05rd']\n", - "['ab08nz', 'ab08nx', 'mb02dd', 'mb03xu', 'ma02nz', 'mb04md']\n", - "['mb04tu', 'sb02ru', 'ab09fd', 'mb02xd', 'sb08gd', 'ab05sd']\n", - "['mb03dd', 'ib01nd', 'ab09ax', 'sb10ad', 'mb03oy', 'ma02fd']\n", - "['ib01od', 'bb03ad', 'mb03ld', 'ib01py', 'mb04nd', 'tg01jd']\n", - "['mb04tv', 'mc01sx', 'tf01mx', 'mb3lzp', 'ab13md', 'sb10td']\n", - "['sb10zp', 'nf01ad', 'sb02mu', 'tg01hy', 'tg01wd', 'mb04ld']\n", - "['mb02ud', 'mb04pa', 'mb04tw', 'mb03bc', 'tb01xz', 'tb01px']\n", - "['tg01fz', 'sb04qy', 'sb03td', 'mb04gd', 'dg01md', 'mb03lf']\n", - "['nf01br', 'md03bd', 'mb04rb', 'sb03ov', 'sb03pd', 'mb01oh']\n", - "['sb03os', 'ab13ad', 'mb03bz', 'mb01uy', 'ib01pd', 'sb04qr']\n", - "['mb4dbz', 'tf01my', 'sb03qx', 'ab05pd', 'sb04rw', 'ab08nw']\n", - "['mb03qx', 'mb01oe', 'mb01yd', 'tg01oz', 'mb02ny', 'ma02dd']\n", - "['sb03sy', 'mb04tb', 'sb04py', 'mb03ya', 'sb16ay', 'mb04id']\n", - "['ib01my', 'ma02ez', 'sb10vd', 'sb16bd', 'mb01rx', 'ab13dx']\n", - "['mc01sd', 'mb04fd', 'mb03jp', 'ab05nd', 'mb04qf', 'ma01ad']\n", - "['mb01os', 'mc01py', 'ag07bd', 'mb03ts', 'mc01od', 'mb05od']\n", - "['sg03ax', 'mb02jd', 'tb01kx', 'tb01md', 'sb03ou', 'mb03bf']\n", - "['sb02nd', 'sb02mw', 'sb04ry', 'mb04wr', 'sg03bz', 'sb04nv']\n", - "['sb03mx', 'sb02mt', 'bb02ad', 'mb04yd', 'sb02md', 'mb03py']\n", - "['mb4dlz', 'fb01td', 'sb04px', 'mb03hd', 'ma02mz', 'mb04tt']\n", - "['mb04qs', 'mb01md', 'ud01nd', 'mb03yd', 'mc01md', 'de01pd']\n", - "['mb03ry', 'ma02hd', 'ab09kx', 'sg03br', 'tb04cd', 'mb4dpz']\n", - "['mb04ud', 'ib01md', 'mb03yt', 'mb03cz', 'tg01oa', 'nf01bv']\n", - "['nf01bd', 'ib01ad', 'mb02cy', 'ab09ad', 'mc01pd', 'sb10ud']\n", - "['sg03bs', 'tg01jy', 'td03ay', 'mb02nd', 'sb03sx', 'mb01rb']\n", - "['ab01md', 'mb03gd', 'mb04su', 'mb03rd', 'sb08hd', 'sg03bx']\n", - "['sb02pd', 'mb04bp', 'mb03af', 'mb05my', 'mb03gz', 'mb02id']\n", - "['sb04od', 'ma02bd', 'mb04dp', 'nf01by', 'mb03kc', 'mb04ox']\n", - "['mc01nd', 'dg01od', 'sb02ov', 'sb10yd', 'sb02od', 'sg02nd']\n", - "['mb02td', 'ab13ax', 'ab09jv', 'ma02oz', 'fd01ad', 'tb04bx']\n", - "['ag08bz', 'mb04dl', 'mb02hd', 'sb04nd', 'sg02cx', 'ab13id']\n", - "['tb01id', 'mc01sw', 'mb01ss', 'sg03bt', 'mb3oyz', 'sb16ad']\n", - "['mb02cx', 'sb10hd', 'tb01xd', 'ab13ed', 'sg03ad', 'tb01vd']\n", - "['ma02md', 'mb04xd', 'md03bb', 'mb04ds', 'mb01sd', 'mb02uw']\n", - "['mb04ts', 'mb02md', 'mb04tx', 'mb02sd', 'dg01ny', 'mb03vy']\n", - "['sb06nd', 'sb08fd', 'mc01sy', 'ab09cd', 'ab07md', 'mb04db']\n", - "['mb03ad', 'ud01mz', 'mb03qd', 'tf01qd', 'ab13cd', 'mb03bd']\n", - "['ag08bd', 'ma02bz', 'mb03ah', 'ma02jz', 'md03by', 'df01md']\n", - "['td03ad', 'sb10ld', 'ue01md', 'tb03ad', 'sb08ny', 'ag08by']\n", - "['sb02mr', 'mb04ty', 'mb03cd', 'sb08md', 'mb04cd', 'sb04ow']\n", - "['mb03qv', 'mb03my', 'tc01od', 'mb04ru', 'mb02rz', 'sb02sd']\n", - "['mb04hd', 'mb04dd', 'ab09bd', 'mb01ru', 'sb02rd', 'mb01ry']\n", - "['mb03vd', 'mb01xd']\n", - "None\n", - "\n", - "\n", - "There are currently 48 routines that are found in slicot and slycot. (intersection)\n", - "------\n", - "['ab09nd', 'ab13md', 'sb04md', 'sg03bd', 'mb03rd', 'ab01nd']\n", - "['ab09md', 'mc01td', 'tc04ad', 'td04ad', 'sb03md', 'tb01id']\n", - "['tb04ad', 'mb03wd', 'ab08nd', 'mb05nd', 'ab13fd', 'mb03vd']\n", - "['ab08nz', 'sb03od', 'ab13bd', 'tb03ad', 'sb10hd', 'ab13dd']\n", - "['ab05nd', 'ab13ed', 'sb04qd', 'sg03ad', 'tf01rd', 'sb02md']\n", - "['ab07nd', 'tb01pd', 'tc01od', 'ab09ad', 'ab09ax', 'sb10ad']\n", - "['sb02od', 'mb05md', 'tf01md', 'ab09bd', 'sb01bd', 'mb03vy']\n", - "['sb10fd', 'tb05ad', 'sb02mt', 'sb10dd', 'ab05md', 'sg02ad']\n", - "None\n" - ] - } - ], - "source": [ - "union = list(set(slicot_routines) | set(slycot_routines))\n", - "\n", - "print(f\"There are currently {len(union)} routines that are found in slicot or in slycot. (union)\")\n", - "print(\"------\")\n", - "print(print_list_chunks(union))\n", - "print(\"\\n\")\n", - "\n", - "\n", - "intersection = list(set(slicot_routines) & set(slycot_routines))\n", - "intersection\n", - "\n", - "print(f\"There are currently {len(intersection)} routines that are found in slicot and slycot. (intersection)\")\n", - "print(\"------\")\n", - "print(print_list_chunks(intersection))" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "slicot_routines_dict = {'a': 60, 'b': 6, 'c': 0, 'd': 8, 'f': 6, 'i': 15, 'm': 281, 'n': 16, 's': 131, 't': 77, 'u': 7}\n", - "slycot_routines_dict = {'a': 16, 'b': 0, 'c': 0, 'd': 0, 'f': 0, 'i': 0, 'm': 7, 'n': 0, 's': 15, 't': 10, 'u': 0}\n", - " names slycot routines slicot routines\n", - "0 Analysis Routines 60 16\n", - "1 Benchmark 6 0\n", - "2 Adaptive Control 0 0\n", - "3 Data Analysis 8 0\n", - "4 Filtering 6 0\n", - "5 Identification 15 0\n", - "6 Mathematical routines 281 7\n", - "7 Nonlinear Systems 16 0\n", - "8 Synthesis Routines 131 15\n", - "9 Transformation Routines 77 10\n", - "10 Utility Routines 7 0\n" - ] - }, - { - "data": { - "image/png": "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fm99pc33e299qTrO2BIRERFVM48ePcLIkSNhY2MDqVQKCwsL+Pj4IC4uDgBgZ2eHpUuXlnhuWloaJBIJEhMTlY7v2rULHTp0gKGhIWQyGRo3boxZs2bh77//Fuv8888/mDlzJpydnSGVSlGrVi3069cPv//+u1jHzs4OEomk1C0oKKiih0PExJaIiIiomunTpw8uXbqE6Oho3Lx5E/v370eHDh2QkZHxVu1NmzYNAQEBaN68OQ4dOoRr164hMjISly9fxsaNGwEAubm58Pb2xoYNGzBnzhzcvHkTBw8exIsXL9CyZUv89ttvAICEhAQoFAooFArs2rULAJCcnCweW7ZsWcUMQgm4FIFqpoi6gLRyn1Vo93xLpbavKvgnOCKiN/PkyROcPn0asbGxaN++PQDA1tYWLVq0eKv2zp07h3nz5mHp0qX44osvxON2dnbo0qULnjx5AgBYunQp4uPjcenSJbi7u4v97tq1Cy1btsSwYcNw7do1mJmZiW2YmJgAAMzNzWFkZPRW8b0JztgSERERVSMymQwymQx79+5Fbm7uO7e3efNmyGQyjBo1qsTyooR0y5Yt6NKli5jUFlFTU8OXX36J69ev4/Lly+8cz7tgYktERERUjWhoaEAulyM6OhpGRkbw8vLC1KlTceXKlbdq79atW3BwcICmpmaZ9W7evAlXV9cSy4qO37x5861iqChMbImIiIiqmT59+uDevXvYv38/fH19ERsbCw8PD8jl8jduSxCESqlbFZjYEhEREVVD2tra6NKlC6ZPn44zZ84gKCgIM2fOfON2nJ2d8ccffyA/P/+19ZKSkkosKzru7Oz8xv1XJCa2RERERCrAzc0Nz549e+PzBg4ciOzsbKxatarE8qKbxz799FMcO3as2DrawsJCLFmyBG5ubsXW375vfCoCERERUTWSkZGBfv36ITg4GI0bN4a+vj7Onz+PhQsXokePHmK9//3vf8WeVWtra1usvZYtW2LixIn46quv8L///Q+9evWClZUVbt++jTVr1qBNmzb44osv8OWXX2Lfvn3o3r07IiMj0bJlSzx48ADz5s1DUlISjh07Bomkcp849DpMbImIiIhe8SE/ilAmk6Fly5ZYsmQJUlJSkJ+fD2tra4SEhGDq1KlivUWLFmHRokVK527cuBFt2rQp1uaCBQvQrFkzfPvtt1izZg0KCwtRr1499O3bF4GBgQBeLn04fvw45s2bh6lTp+LOnTvQ19dHx44d8dtvv6Fhw4aVe+HlIBE+9FXA1ZCdnR3GjRuHcePGvXNbQUFBePLkCfbu3fvObb1vYWFh2Lt3b7HfFqtSVlYWDA0NkTlZHwZ8ju0H4UP+4UFEqu358+dITU2Fvb09tLW1qzqcGq+sz0P8+Z2ZCQMDg1LbqHFrbOPj46Gurg4/v+rxw3TZsmVvdYcj8P+vzCvaTExM0L59e5w+fbpigwQgkUiKJd+hoaGIiYmp8L6IiIiISlLjEtv169fj888/x6lTp3Dv3r2qDue1DA0N3/lNHceOHYNCocCpU6dgZWUFf39/PHjwoGICLINMJoOpqWml90NEREQE1LDENjs7G9u3b8fIkSPh5+dXbCY0NjYWEokEMTEx8PT0hK6uLlq3bo3k5GSxTkpKCnr06IHatWtDJpOhefPmOHbsWKl9BgcHw9/fX+lYfn4+zM3NsX79egDAjz/+iEaNGkFHRwempqbw9vYW72oMCgpCz549xXPLqlsaU1NTWFhYoGHDhpg6dSqysrJw9uxZsfzkyZNo0aIFpFIpLC0tMXnyZLx48UIst7Ozw9KlS5XabNKkCcLCwsRyAOjVqxckEom4HxYWhiZNmojnFF3LokWLYGlpCVNTU4wePVrp8SK5ubkIDQ1FnTp1oKenh5YtWyI2NlYsv3PnDrp37w5jY2Po6emhQYMGOHjwYJnXT0RERDVDjUpsd+zYgfr168PFxQWfffYZNmzYUOKDhqdNm4bIyEicP38eGhoaCA4OFsuys7PRrVs3xMTE4NKlS/D19UX37t2Rnp5eYp/Dhw/H4cOHoVAoxGMHDhxATk4OAgICoFAoMGDAAAQHByMpKQmxsbHo3bt3iXG9Sd2S/PPPP/jhhx8AAFpaWgBe3jHZrVs3NG/eHJcvX8bq1auxfv16zJkzp1xtAkBCQgIAICoqCgqFQtwvyYkTJ5CSkoITJ04gOjoacrlc6ReMMWPGID4+Htu2bcOVK1fQr18/+Pr64tatWwCA0aNHIzc3F6dOncLVq1exYMECyGSyUvvLzc1FVlaW0kZERESqqUY9FWH9+vX47LPPAAC+vr7IzMzEyZMn0aFDB6V6c+fORfv27QEAkydPhp+fH54/fw5tbW24u7srPaNt9uzZ2LNnD/bv348xY8YU67N169ZwcXHBxo0bMXHiRAAvE8B+/fpBJpPh5s2bePHiBXr37i0+gqNRo0Ylxq9QKMpd99UY1NTUkJOTA0EQ0KxZM3Tu3BkAsGrVKlhbW2PlypWQSCSoX78+7t27h0mTJmHGjBlQU3v97z5mZmYAXr5L2sLCosy6xsbGWLlyJdTV1VG/fn34+fkhJiYGISEhSE9PR1RUFNLT02FlZQXg5Trdw4cPIyoqCvPmzUN6ejr69OkjXreDg0OZ/UVERCA8PPy110BERETVX42ZsU1OTsa5c+cwYMAAAC/fsxwQECAuB/i3xo0bi19bWloCAB4+fAjg5YxtaGgoXF1dYWRkBJlMhqSkpFJnbIGXs7ZRUVEAgAcPHuDQoUPiLLC7uzs6d+6MRo0aoV+/fli3bh0eP35cYjtvUvfftm/fjkuXLmHXrl1wdHSEXC4X3wedlJSEVq1aKT13zsvLC9nZ2fjzzz9f2/abatCgAdTV1cV9S0tLcWyvXr2KgoICODs7QyaTidvJkyeRkpICABg7dizmzJkDLy8vzJw587XvxZ4yZQoyMzPF7e7duxV+TURERPRhqDGJ7fr16/HixQtYWVlBQ0MDGhoaWL16NXbt2oXMzEylukVJHwAx4SssLATwcgZxz549mDdvHk6fPo3ExEQ0atQIeXl5pfY9ZMgQ/PHHH4iPj8emTZtgb2+Ptm3bAgDU1dVx9OhRHDp0CG5ublixYgVcXFyQmpparJ03qftv1tbWcHJyQq9evTBv3jz06tULubm55Rs4AGpqasWWO7zutXul+ffYAi/Ht2hss7Ozoa6ujgsXLiAxMVHckpKSsGzZMgAvf0n4448/MHjwYFy9ehWenp5YsWJFqf1JpVIYGBgobURERKSaakRi++LFC/zwww+IjIxUSpguX74MKysrbN26tdxtxcXFISgoCL169UKjRo1gYWGBtLS0Ms8xNTVFz549ERUVBblcjqFDhyqVSyQSeHl5ITw8HJcuXYKWlhb27NlTYltvUrckffv2hYaGhvjaPFdXV8THxyslrnFxcdDX10fdunUBvFxq8O81wllZWcWSaU1NTRQUFJQ7jpI0bdoUBQUFePjwIRwdHZW2fy9xsLa2xogRI7B792589dVXWLdu3Tv1S0RERKqhRiS2Bw4cwOPHjzFs2DA0bNhQaevTp0+JyxFK4+TkhN27d4uJ8cCBA8UZx7IMHz4c0dHRSEpKEt/gAQBnz57FvHnzcP78eaSnp2P37t149OgRXF1di7XxJnVLI5FIMHbsWMyfPx85OTkYNWoU7t69i88//xw3btzAvn37MHPmTIwfP15cX9upUyds3LgRp0+fxtWrVxEYGKi0nAB4+WSEmJgY3L9/v1zLI0ri7OyMQYMGYciQIdi9ezdSU1Nx7tw5RERE4OeffwYAjBs3DkeOHEFqaiouXryIEydOvNH1ExERkeqqETePrV+/Ht7e3jA0NCxW1qdPHyxcuPC1azWLLF68GMHBwWjdujVq1aqFSZMmletOe29vb1haWqJBgwbijVEAYGBggFOnTmHp0qXIysqCra0tIiMj0bVr12JtvEndsgQGBmLatGlYuXIlJk6ciIMHD2LChAlwd3eHiYkJhg0bhq+//lqsP2XKFKSmpsLf3x+GhoaYPXt2sRnbyMhIjB8/HuvWrUOdOnVeO4tdmqioKMyZM0d8X3WtWrXw0UcfiY9MKygowOjRo/Hnn3/CwMAAvr6+WLJkyVv1RUREVKqw4jlD5fWV+fo6b0gikWDPnj1KjwytCfhK3fckOzsbderUQVRUFHr37l3V4dRYfKXuh4ev1CWiqlLmK3U/8MT20aNHmDFjBn7++Wc8ePAAxsbGcHd3x4wZM+Dl5fXeE9sOHTqgSZMmxZ57/yYq4pW6NWLGtioVFhbir7/+QmRkJIyMjPDJJ59UdUhERERUzfXp0wd5eXmIjo6Gg4MDHjx4gJiYGGRkZFR1aFWqRqyxrUrp6emoXbs2tmzZgg0bNkBDg79LEBER0dt78uQJTp8+jQULFqBjx46wtbVFixYtMGXKlBIn0Dp16lTsWfuPHj2ClpYWYmJiALx8odGkSZNgbW0NqVQKR0dHpXuQynpLaVBQEE6ePIlly5ZBIpFAIpG89ZLEd8XEtpLZ2dlBEATcvXtXfCkCERER0dsqes773r17y/X4zuHDh2PLli1KdTdt2oQ6deqgU6dOAF4+mnTr1q1Yvnw5kpKSsHbtWvHNnq97S+myZcvQqlUrhISEQKFQQKFQwNrauhKu/PWY2BIRERFVIxoaGpDL5YiOjoaRkRG8vLwwderUUm+EL7q3Z9++feIxuVyOoKAgSCQS3Lx5Ezt27MCGDRvQq1cvODg4oHPnzggICACg/JbS+vXro2fPnggPD0dkZCQKCwthaGgILS0t6OrqwsLCAhYWFsWenvS+MLElIiIiqmb69OmDe/fuYf/+/fD19UVsbCw8PDwgl8uL1dXW1sbgwYOxYcMGAMDFixdx7do1BAUFAQASExOhrq6O9u3bl9jX+35L6bvggk+qmab8CVTyW8jSKrV1IiKq6bS1tdGlSxd06dIF06dPx/DhwzFz5kwxYf234cOHo0mTJvjzzz8RFRWFTp06wdbWFgCgo6PzniOvPJyxJSIiIlIBbm5uePbsWYlljRo1gqenJ9atW4ctW7YgODhYqaywsBAnT54s8dzyvKVUS0vrnd9AWhGY2BIRERFVIxkZGejUqRM2bdqEK1euIDU1FTt37sTChQvRo0ePUs8bPnw45s+fD0EQ0KtXL/G4nZ0dAgMDERwcjL179yI1NRWxsbHYsWMHAJTrLaV2dnY4e/Ys0tLS8Ndff5XrrayVgUsRiIiIiF5VCW8DqygymQwtW7bEkiVLkJKSgvz8fFhbWyMkJARTp04t9bwBAwZg3LhxGDBgQLEXIKxevRpTp07FqFGjkJGRARsbG7GtOnXqvPYtpaGhoQgMDISbmxv++ecfpKamws7OrlKuvyx88xjVKOV9cwkREam+Mt88poLS0tJQr149JCQkwMPDo6rDKYZvHiMiIiKiMuXn5yMjIwNff/01Pvroow8yqa0oXGNLREREpMLi4uJgaWmJhIQErFmzpqrDqVScsaUaqeHMI1CT6pZZJ22+33uKhoiIqPJ06NABNWXlKWdsiYiIiEglMLElIiKiGq2mzGZ+6Cric2BiS0RERDWSpqYmACAnJ6eKIyHg/z+Hos/lbXCNLREREdVI6urqMDIywsOHDwEAurq6kEgkVRxVzSMIAnJycvDw4UMYGRlBXV39rdtiYktEREQ1loWFBQCIyS1VHSMjI/HzeFtMbImIiKjGkkgksLS0hLm5OfLz86s6nBpLU1PznWZqizCxpRLFxsaiY8eOePz4MYyMjKo6HABAUFAQnjx5gr1791Z1KEREpGLU1dUrJLGiqsWbxz5AQUFBkEgk4mZqagpfX19cuXKlqkMjIiIi+mAxsf1A+fr6QqFQQKFQICYmBhoaGvD396/qsKpEQUEBCgsLqzoMIiIi+sAxsf1ASaVSWFhYwMLCAk2aNMHkyZNx9+5dPHr0CABw9+5d9O/fH0ZGRjAxMUGPHj2QlpYmnh8UFISePXti0aJFsLS0hKmpKUaPHq20fig3NxeTJk2CtbU1pFIpHB0dsX79eqU4Lly4AE9PT+jq6qJ169ZITk4Wy8LCwtCkSRNs2LABNjY2kMlkGDVqFAoKCrBw4UJYWFjA3Nwcc+fOVWpz8eLFaNSoEfT09GBtbY1Ro0YhOztbLJfL5TAyMsL+/fvh5uYGqVSK9PT0YmOUkJAAMzMzLFiw4J3GmoiIiFQDE9tqIDs7G5s2bYKjoyNMTU2Rn58PHx8f6Ovr4/Tp04iLi4NMJoOvry/y8vLE806cOIGUlBScOHEC0dHRkMvlkMvlYvmQIUOwdetWLF++HElJSVi7di1kMplS39OmTUNkZCTOnz8PDQ0NBAcHK5WnpKTg0KFDOHz4MLZu3Yr169fDz88Pf/75J06ePIkFCxbg66+/xtmzZ8Vz1NTUsHz5cvz++++Ijo7G8ePHMXHiRKV2c3JysGDBAnz//ff4/fffYW5urlR+/PhxdOnSBXPnzsWkSZNKHbvc3FxkZWUpbURERKSaePPYB+rAgQNikvns2TNYWlriwIEDUFNTw5YtW1BYWIjvv/9efN5eVFQUjIyMEBsbi48//hgAYGxsjJUrV0JdXR3169eHn58fYmJiEBISgps3b2LHjh04evQovL29AQAODg7F4pg7dy7at28PAJg8eTL8/Pzw/PlzaGtrAwAKCwuxYcMG6Ovrw83NDR07dkRycjIOHjwINTU1uLi4YMGCBThx4gRatmwJABg3bpzYvp2dHebMmYMRI0Zg1apV4vH8/HysWrUK7u7uxWLas2cPhgwZgu+//x4BAQFljmNERATCw8PLNeZERERUvXHG9gPVsWNHJCYmIjExEefOnYOPjw+6du2KO3fu4PLly7h9+zb09fUhk8kgk8lgYmKC58+fIyUlRWyjQYMGSnd4Wlpais/pS0xMhLq6upi0lqZx48ZK5wPKz/qzs7ODvr6+uF+7dm24ublBTU1N6di/zzl27Bg6d+6MOnXqQF9fH4MHD0ZGRobSm1+0tLSU+i5y9uxZ9OvXDxs3bnxtUgsAU6ZMQWZmprjdvXv3tecQERFR9cQZ2w+Unp4eHB0dxf3vv/8ehoaGWLduHbKzs9GsWTNs3ry52HlmZmbi16++kk4ikYg3Yeno6JQrjn+3UTQ7/O8buUrqo6x+09LS4O/vj5EjR2Lu3LkwMTHBr7/+imHDhiEvLw+6urpifCW9/aVevXowNTXFhg0b4Ofn99rX7kmlUkil0nJdKxEREVVvnLGtJiQSCdTU1PDPP//Aw8MDt27dgrm5ORwdHZU2Q0PDcrXXqFEjFBYW4uTJk5UcubILFy6gsLAQkZGR+Oijj+Ds7Ix79+6V+/xatWrh+PHjuH37Nvr378+HaRMREZGIie0HKjc3F/fv38f9+/eRlJSEzz//HNnZ2ejevTsGDRqEWrVqoUePHjh9+jRSU1MRGxuLsWPH4s8//yxX+3Z2dggMDERwcDD27t0rtrFjx45KvS5HR0fk5+djxYoV+OOPP7Bx40asWbPmjdowNzfH8ePHcePGDQwYMAAvXryopGiJiIioOmFi+4E6fPgwLC0tYWlpiZYtWyIhIQE7d+5Ehw4doKuri1OnTsHGxga9e/eGq6srhg0bhufPn8PAwKDcfaxevRp9+/bFqFGjUL9+fYSEhODZs2eVeFWAu7s7Fi9ejAULFqBhw4bYvHkzIiIi3rgdCwsLHD9+HFevXsWgQYNQUFBQCdESERFRdSIRBEGo6iCI3pesrCwYGhrCetwOqEl1y6ybNt/vPUVFREREZSn6+Z2ZmVnmJB5nbImIiIhIJTCxJSIiIiKVwMSWiIiIiFQCE1siIiIiUglMbImIiIhIJfDNY1QjXQv3eaNHoxEREdGHjzO2RERERKQSmNgSERERkUpgYktEREREKoGJLRERERGpBCa2RERERKQSmNgSERERkUpgYktEREREKoGJLRERERGpBCa2RERERKQSmNgSERERkUpgYktEREREKoGJLRERERGpBCa2RERERKQSmNi+hbCwMDRp0uS99BUUFISePXu+l76qm7S0NEgkEiQmJlZ1KERERPQBYGILID4+Hurq6vDz86uyGEpL0pYtWwa5XF7p/WdlZWHatGmoX78+tLW1YWFhAW9vb+zevRuCIFRYP0zUiYiIqLJoVHUAH4L169fj888/x/r163Hv3j1YWVlVdUgiQ0PDSu/jyZMnaNOmDTIzMzFnzhw0b94cGhoaOHnyJCZOnIhOnTrByMio0uP4t/z8fGhqar7XPomIiKh6q/EzttnZ2di+fTtGjhwJPz+/EmdH58+fj9q1a0NfXx/Dhg3D8+fPlcoTEhLQpUsX1KpVC4aGhmjfvj0uXryoVEcikWD16tXo2rUrdHR04ODggB9//FEst7e3BwA0bdoUEokEHTp0AKA8w/ndd9/BysoKhYWFSm336NEDwcHB4v6+ffvg4eEBbW1tODg4IDw8HC9evCh1DKZOnYq0tDScPXsWgYGBcHNzg7OzM0JCQpCYmAiZTAYAePz4MYYMGQJjY2Po6uqia9euuHXrltiOXC6HkZERjhw5AldXV8hkMvj6+kKhUAB4uYQjOjoa+/btg0QigUQiQWxsrDhbvX37drRv3x7a2trYvHkzCgsLMWvWLNStWxdSqRRNmjTB4cOHS70OIiIiquGEGm79+vWCp6enIAiC8NNPPwn16tUTCgsLxfLt27cLUqlU+P7774UbN24I06ZNE/T19QV3d3exTkxMjLBx40YhKSlJuH79ujBs2DChdu3aQlZWllgHgGBqaiqsW7dOSE5OFr7++mtBXV1duH79uiAIgnDu3DkBgHDs2DFBoVAIGRkZgiAIQmBgoNCjRw9BEATh77//FrS0tIRjx46J7WZkZCgdO3XqlGBgYCDI5XIhJSVF+OWXXwQ7OzshLCysxOsvKCgQjI2Nhf/85z+vHatPPvlEcHV1FU6dOiUkJiYKPj4+gqOjo5CXlycIgiBERUUJmpqagre3t5CQkCBcuHBBcHV1FQYOHCgIgiA8ffpU6N+/v+Dr6ysoFApBoVAIubm5QmpqqgBAsLOzE3bt2iX88ccfwr1794TFixcLBgYGwtatW4UbN24IEydOFDQ1NYWbN28KgiCI5126dKnUmJ8/fy5kZmaK2927dwUAQmZm5muvl4iIiD4MmZmZ5fr5XeMT29atWwtLly4VBEEQ8vPzhVq1agknTpwQy1u1aiWMGjVK6ZyWLVsqJbavKigoEPT19YWffvpJPAZAGDFiRLF2Ro4cKQhC6UnavxNbQRCEHj16CMHBweL+2rVrBSsrK6GgoEAQBEHo3LmzMG/ePKU2Nm7cKFhaWpYY64MHDwQAwuLFi0u9HkEQhJs3bwoAhLi4OPHYX3/9Jejo6Ag7duwQBOFlYgtAuH37tljn22+/FWrXrl3q9fz72os+hyJWVlbC3LlzlY41b95c/DzKk9jOnDlTAFBsY2JLRERUfZQ3sa3RSxGSk5Nx7tw5DBgwAACgoaGBgIAArF+/XqyTlJSEli1bKp3XqlUrpf0HDx4gJCQETk5OMDQ0hIGBAbKzs5Genl7mea1atUJSUtIbxTxo0CDs2rULubm5AIDNmzfj008/hZray4/y8uXLmDVrFmQymbiFhIRAoVAgJyenWHtCOW8MS0pKgoaGhtJYmJqawsXFRekadHV1Ua9ePXHf0tISDx8+LFcfnp6e4tdZWVm4d+8evLy8lOp4eXm90ZhNmTIFmZmZ4nb37t1yn0tERETVS42+eWz9+vV48eKF0s1igiBAKpVi5cqV5b5xKzAwEBkZGVi2bBlsbW0hlUrRqlUr5OXlVXjM3bt3hyAI+Pnnn9G8eXOcPn0aS5YsEcuzs7MRHh6O3r17FztXW1u72DEzMzMYGRnhxo0bFRLfqzd8SSSScifPenp6FRLDv0mlUkil0gpvl4iIiD48NXbG9sWLF/jhhx8QGRmJxMREcbt8+TKsrKywdetWAICrqyvOnj2rdO5vv/2mtB8XF4exY8eiW7duaNCgAaRSKf76669ifb563m+//QZXV1cAgJaWFgCgoKCgzLi1tbXRu3dvbN68GVu3boWLiws8PDzEcg8PDyQnJ8PR0bHYVjSr+29qamr49NNPsXnzZty7d69YeXZ2Nl68eAFXV1e8ePFCaSwyMjKQnJwMNze3MmP+Ny0trddeIwAYGBjAysoKcXFxSsfj4uLeqD8iIiKqOWrsjO2BAwfw+PFjDBs2rNjMbJ8+fbB+/XqMGDECX3zxBYKCguDp6QkvLy9s3rwZv//+OxwcHMT6Tk5O2LhxIzw9PZGVlYUJEyZAR0enWJ87d+6Ep6cn2rRpg82bN+PcuXPisgdzc3Po6Ojg8OHDqFu3LrS1tUudMR40aBD8/f3x+++/47PPPlMqmzFjBvz9/WFjY4O+fftCTU0Nly9fxrVr1zBnzpwS25s7dy5iY2PRsmVLzJ07F56entDU1MTp06cRERGBhIQEODk5oUePHggJCcHatWuhr6+PyZMno06dOujRo0e5x93Ozg5HjhxBcnIyTE1Ny5wVnzBhAmbOnIl69eqhSZMmiIqKQmJiIjZv3lzu/oiIiKgGeQ/rfT9I/v7+Qrdu3UosO3v2rABAuHz5siAIgjB37lyhVq1agkwmEwIDA4WJEycq3Tx28eJFwdPTU9DW1hacnJyEnTt3Cra2tsKSJUvEOgCEb7/9VujSpYsglUoFOzs7Yfv27Ur9rlu3TrC2thbU1NSE9u3bC4JQ8s1WBQUFgqWlpQBASElJKRb/4cOHhdatWws6OjqCgYGB0KJFC+G7774rczyePHkiTJ48WXBychK0tLSE2rVrC97e3sKePXvEp0T8/fffwuDBgwVDQ0NBR0dH8PHxEZ9QIAgvbx4zNDRUanfPnj3Cv/+ZPXz4UOjSpYsgk8kEAMKJEydKvQmsoKBACAsLE+rUqSNoamoK7u7uwqFDh8Ty8tw89qryLj4nIiKiD0d5f35LBKECXytFpZJIJNizZw/fulXFsrKyYGhoiMzMTBgYGFR1OERERFQO5f35XWPX2BIRERGRamFiS0REREQqocbePPa+ccUHERERUeXijC0RERERqQQmtkRERESkEpjYEhEREZFKYGJLRERERCqBiS0RERERqQQmtkRERESkEpjYEhEREZFKYGJLRERERCqBiS0RERERqQS+eYxqpIYzj0BNqlvu+mnz/SoxGiIiIqoInLElIiIiIpXAxJaIiIiIVAITWyIiIiJSCUxsiYiIiEglMLElIiIiIpXAxJaIiIiIVAITW6oUEokEe/furZC2OnTogHHjxlVIW0RERKS6mNhWgqCgIEgkEkgkEmhqaqJ27dro0qULNmzYgMLCwjdqSy6Xw8jIqELj27p1K9TV1TF69OgKbbey7N69G7Nnz67qMIiIiOgDx8S2kvj6+kKhUCAtLQ2HDh1Cx44d8cUXX8Df3x8vXryo0tjWr1+PiRMnYuvWrXj+/HmVxlIeJiYm0NfXr+owiIiI6APHxLaSSKVSWFhYoE6dOvDw8MDUqVOxb98+HDp0CHK5XKy3ePFiNGrUCHp6erC2tsaoUaOQnZ0NAIiNjcXQoUORmZkpzgCHhYUBADZu3AhPT0/o6+vDwsICAwcOxMOHD18bV2pqKs6cOYPJkyfD2dkZu3fvViovmiE+cuQIXF1dIZPJxCS9SEJCArp06YJatWrB0NAQ7du3x8WLF0vts1OnThgzZozSsUePHkFLSwsxMTEAgFWrVsHJyQna2tqoXbs2+vbtK9Z9dSlCWXWJiIio5mJi+x516tQJ7u7uSsmkmpoali9fjt9//x3R0dE4fvw4Jk6cCABo3bo1li5dCgMDAygUCigUCoSGhgIA8vPzMXv2bFy+fBl79+5FWloagoKCXhtDVFQU/Pz8YGhoiM8++wzr168vVicnJweLFi3Cxo0bcerUKaSnp4v9AsDTp08RGBiIX3/9Fb/99hucnJzQrVs3PH36tMQ+hw8fji1btiA3N1c8tmnTJtSpUwedOnXC+fPnMXbsWMyaNQvJyck4fPgw2rVrV2Jbb1IXAHJzc5GVlaW0ERERkWrSqOoAapr69evjypUr4v6/ZyLt7OwwZ84cjBgxAqtWrYKWlhYMDQ0hkUhgYWGh1E5wcLD4tYODA5YvX47mzZsjOzsbMpmsxL4LCwshl8uxYsUKAMCnn36Kr776CqmpqbC3txfr5efnY82aNahXrx4AYMyYMZg1a5ZY3qlTJ6V2v/vuOxgZGeHkyZPw9/cv1m/v3r0xZswY7Nu3D/379wfwcma4aC1yeno69PT04O/vD319fdja2qJp06YlXsOb1AWAiIgIhIeHl1pOREREqoMztu+ZIAiQSCTi/rFjx9C5c2fUqVMH+vr6GDx4MDIyMpCTk1NmOxcuXED37t1hY2MDfX19tG/fHsDLxK80R48exbNnz9CtWzcAQK1atcSb2v5NV1dXTGoBwNLSUmmZw4MHDxASEgInJycYGhrCwMAA2dnZpfatra2NwYMHi/1cvHgR165dE2eYu3TpAltbWzg4OGDw4MHYvHlzqdf/JnUBYMqUKcjMzBS3u3fvllqXiIiIqjcmtu9ZUlKSODualpYGf39/NG7cGLt27cKFCxfw7bffAgDy8vJKbePZs2fw8fGBgYEBNm/ejISEBOzZs+e1561fvx5///03dHR0oKGhAQ0NDRw8eBDR0dFKT2vQ1NRUOk8ikUAQBHE/MDAQiYmJWLZsGc6cOYPExESYmpqW2ffw4cNx9OhR/Pnnn4iKikKnTp1ga2sLANDX18fFixexdetWWFpaYsaMGXB3d8eTJ0+KtfMmdYGXa50NDAyUNiIiIlJNTGzfo+PHj+Pq1avo06cPgJezroWFhYiMjMRHH30EZ2dn3Lt3T+kcLS0tFBQUKB27ceMGMjIyMH/+fLRt2xb169d/7Y1jGRkZ2LdvH7Zt24bExERxu3TpEh4/foxffvml3NcRFxeHsWPHolu3bmjQoAGkUin++uuvMs9p1KgRPD09sW7dOmzZskVpKQUAaGhowNvbGwsXLsSVK1eQlpaG48ePl9jWm9QlIiKimoNrbCtJbm4u7t+/j4KCAjx48ACHDx9GREQE/P39MWTIEACAo6Mj8vPzsWLFCnTv3h1xcXFYs2aNUjt2dnbIzs5GTEwM3N3doaurCxsbG2hpaWHFihUYMWIErl279trnvG7cuBGmpqbo37+/0lIIAOjWrRvWr18PX1/fcl2bk5OT+FSGrKwsTJgwATo6Oq89b/jw4RgzZgz09PTQq1cv8fiBAwfwxx9/oF27djA2NsbBgwdRWFgIFxeXYm28SV0iIiKqWThjW0kOHz4MS0tL2NnZwdfXFydOnMDy5cuxb98+qKurAwDc3d2xePFiLFiwAA0bNsTmzZsRERGh1E7r1q0xYsQIBAQEwMzMDAsXLoSZmRnkcjl27twJNzc3zJ8/H4sWLSozng0bNqBXr17FkloA6NOnD/bv3//aWdci69evx+PHj+Hh4YHBgwdj7NixMDc3f+15AwYMgIaGBgYMGABtbW3xuJGREXbv3o1OnTrB1dUVa9aswdatW9GgQYNibbxJXSIiIqpZJMK/F08SVaK0tDTUq1cPCQkJ8PDwqJIYsrKyYGhoCOtxO6Am1S33eWnz/SoxKiIiIipL0c/vzMzMMu+X4VIEqnT5+fnIyMjA119/jY8++qjKkloiIiJSbVyKQJUuLi4OlpaWSEhIKLaGmIiIiKiicMaWKl2HDh3AFS9ERERU2ThjS0REREQqgYktEREREakEJrZEREREpBK4xpZqpGvhPny9LhERkYrhjC0RERERqQQmtkRERESkEpjYEhEREZFKYGJLRERERCqBiS0RERERqQQ+FYFqpIYzj0BNqltmnbT5fu8pGiIiIqoInLElIiIiIpXAxJaIiIiIVAITWyIiIiJSCUxsiYiIiEglMLElIiIiIpXAxJaIiIiIVAITWyIiIiJSCUxsCQDQoUMHjBs3Tty3s7PD0qVLK6Wv2NhYSCQSPHnypFLaJyIiopqJiW0NExQUBIlEUmxbuHAhZs+eXep5EokEe/furZAYWrduDYVCAUNDwwppj4iIiAjgm8dqJF9fX0RFRSkdMzMzg7q6eqX3nZ+fDy0tLVhYWFR6X0RERFSzcMa2BpJKpbCwsFDaOnfurLQU4d/s7OwAAL169YJEIhH3AWDfvn3w8PCAtrY2HBwcEB4ejhcvXojlEokEq1evxieffAI9PT3MnTu32FIEuVwOIyMjHDlyBK6urpDJZPD19YVCoRDbefHiBcaOHQsjIyOYmppi0qRJCAwMRM+ePcu81tzcXGRlZSltREREpJqY2NJrJSQkAACioqKgUCjE/dOnT2PIkCH44osvcP36daxduxZyuRxz585VOj8sLAy9evXC1atXERwcXGIfOTk5WLRoETZu3IhTp04hPT0doaGhYvmCBQuwefNmREVFIS4uDllZWeVaGhEREQFDQ0Nxs7a2fstRICIiog8dE9sa6MCBA5DJZOLWr1+/MuubmZkBAIyMjGBhYSHuh4eHY/LkyQgMDISDgwO6dOmC2bNnY+3atUrnDxw4EEOHDoWDgwNsbGxK7CM/Px9r1qyBp6cnPDw8MGbMGMTExIjlK1aswJQpU9CrVy/Ur18fK1euhJGR0WuvdcqUKcjMzBS3u3fvvvYcIiIiqp64xrYG6tixI1avXi3u6+npYcCAAW/czuXLlxEXF6c0Q1tQUIDnz58jJycHurq6AABPT8/XtqWrq4t69eqJ+5aWlnj48CEAIDMzEw8ePECLFi3EcnV1dTRr1gyFhYVltiuVSiGVSt/ouoiIiKh6YmJbA+np6cHR0fGd28nOzkZ4eDh69+5drExbW1upv9fR1NRU2pdIJBAE4Z1jJCIiopqDiS2Vi6amJgoKCpSOeXh4IDk5uUKS5LIYGhqidu3aSEhIQLt27QC8nBm+ePEimjRpUql9ExERUfXBxJbKxc7ODjExMfDy8oJUKoWxsTFmzJgBf39/2NjYoG/fvlBTU8Ply5dx7do1zJkzp0L7//zzzxEREQFHR0fUr18fK1aswOPHjyGRSCq0HyIiIqq+ePMYlUtkZCSOHj0Ka2trNG3aFADg4+ODAwcO4JdffkHz5s3x0UcfYcmSJbC1ta3w/idNmoQBAwZgyJAhaNWqFWQyGXx8fJSWPBAREVHNJhG4kJGqocLCQri6uqJ///5lvjHtVVlZWS8f+zVuB9SkumXWTZvv965hEhERUQUo+vmdmZkJAwODUutxKQJVC3fu3MEvv/yC9u3bIzc3FytXrkRqaioGDhxY1aERERHRB4JLEahaUFNTg1wuR/PmzeHl5YWrV6/i2LFjcHV1rerQiIiI6APBGVuqFqytrREXF1fVYRAREdEHjDO2RERERKQSmNgSERERkUrgUgSqka6F+5R5VyURERFVP5yxJSIiIiKVwMSWiIiIiFQCE1siIiIiUglMbImIiIhIJTCxJSIiIiKVwKciUI3UcOYRqEl1K639tPl+ldY2ERERlYwztkRERESkEpjYEhEREZFKYGJLRERERCqBiS0RERERqQQmtkRERESkEpjYEhEREZFKYGJLRERERCqBie0HoEOHDhg3blyl95OWlgaJRILExETxWFxcHBo1agRNTU307NkTsbGxkEgkePLkSaXGEhQUhJ49e1ZqH0RERFSz8AUN70FQUBCePHmCvXv3Vmmf1tbWUCgUqFWrlnhs/PjxaNKkCQ4dOgSZTAZdXV0oFAoYGhpWSBxpaWmwt7fHpUuX0KRJE/H4smXLIAhChfRBREREBDCxrVHU1dVhYWGhdCwlJQUjRoxA3bp1xWOv1qkMFZU4ExERERXhUoT37NmzZxgyZAhkMhksLS0RGRlZrE5ubi5CQ0NRp04d6OnpoWXLloiNjRXL5XI5jIyMcOTIEbi6ukImk8HX1xcKhQIAEBYWhujoaOzbtw8SiQQSiQSxsbFKSxGKvs7IyEBwcDAkEgnkcnmJSxHi4uLQoUMH6OrqwtjYGD4+Pnj8+DEA4PDhw2jTpg2MjIxgamoKf39/pKSkiOfa29sDAJo2bQqJRIIOHToAKL4UITc3F2PHjoW5uTm0tbXRpk0bJCQkiOVFccXExMDT0xO6urpo3bo1kpOTyxzv3NxcZGVlKW1ERESkmpjYvmcTJkzAyZMnsW/fPvzyyy+IjY3FxYsXleqMGTMG8fHx2LZtG65cuYJ+/frB19cXt27dEuvk5ORg0aJF2LhxI06dOoX09HSEhoYCAEJDQ9G/f38x2VUoFGjdurVSH0XLEgwMDLB06VIoFAoEBAQUizcxMRGdO3eGm5sb4uPj8euvv6J79+4oKCgA8DJRHz9+PM6fP4+YmBioqamhV69eKCwsBACcO3cOAHDs2DEoFArs3r27xHGZOHEidu3ahejoaFy8eBGOjo7w8fHB33//rVRv2rRpiIyMxPnz56GhoYHg4OAyxzsiIgKGhobiZm1tXWZ9IiIiqr64FOE9ys7Oxvr167Fp0yZ07twZABAdHa20DCA9PR1RUVFIT0+HlZUVgJeJ6uHDhxEVFYV58+YBAPLz87FmzRrUq1cPwMtkeNasWQAAmUwGHR0d5ObmlrqsoGhZgkQigaGhYan1Fi5cCE9PT6xatUo81qBBA/HrPn36KNXfsGEDzMzMcP36dTRs2BBmZmYAAFNT01L7ePbsGVavXg25XI6uXbsCANatW4ejR49i/fr1mDBhglh37ty5aN++PQBg8uTJ8PPzw/Pnz6GtrV1i21OmTMH48ePF/aysLCa3REREKoqJ7XuUkpKCvLw8tGzZUjxmYmICFxcXcf/q1asoKCiAs7Oz0rm5ubkwNTUV93V1dcWkFgAsLS3x8OHDCo85MTER/fr1K7X81q1bmDFjBs6ePYu//vpLnKlNT09Hw4YNy9VHSkoK8vPz4eXlJR7T1NREixYtkJSUpFS3cePG4teWlpYAgIcPH8LGxqbEtqVSKaRSabniICIiouqNie0HJjs7G+rq6rhw4QLU1dWVymQymfi1pqamUplEIqmUpwzo6OiUWd69e3fY2tpi3bp1sLKyQmFhIRo2bIi8vLwKjwVQvm6JRAIAYjJNRERENRvX2L5H9erVg6amJs6ePSsee/z4MW7evCnuN23aFAUFBXj48CEcHR2Vtjd5WoGWlpa4DvZdNG7cGDExMSWWZWRkIDk5GV9//TU6d+4MV1dX8aayf8cBoMxY6tWrBy0tLcTFxYnH8vPzkZCQADc3t3e+BiIiIqoZOGP7HslkMgwbNgwTJkyAqakpzM3NMW3aNKip/f/vF87Ozhg0aBCGDBmCyMhING3aFI8ePUJMTAwaN24MPz+/cvVlZ2eHI0eOIDk5Gaampm/9eK0pU6agUaNGGDVqFEaMGAEtLS2cOHEC/fr1g4mJCUxNTfHdd9/B0tIS6enpmDx5stL55ubm0NHRweHDh1G3bl1oa2sXi0VPTw8jR47EhAkTYGJiAhsbGyxcuBA5OTkYNmzYW8VNRERENQ9nbN+zb775Bm3btkX37t3h7e2NNm3aoFmzZkp1oqKiMGTIEHz11VdwcXFBz549kZCQUOo60pKEhITAxcUFnp6eMDMzU5oNfRPOzs745ZdfcPnyZbRo0QKtWrXCvn37oKGhATU1NWzbtg0XLlxAw4YN8eWXX+Kbb75ROl9DQwPLly/H2rVrYWVlhR49epTYz/z589GnTx8MHjwYHh4euH37No4cOQJjY+O3ipuIiIhqHonA1z9RDZKVlfXysV/jdkBNqltp/aTNL9/MOhEREb1e0c/vzMxMGBgYlFqPM7ZEREREpBKY2BIRERGRSmBiS0REREQqgYktEREREakEJrZEREREpBL4HFuqka6F+5R5VyURERFVP5yxJSIiIiKVwMSWiIiIiFQCE1siIiIiUglMbImIiIhIJTCxJSIiIiKVwKciUM0UUReQSl5bze75lvcQDBERUfWXNt+vqkPgjC0RERERqQYmtkRERESkEpjYEhEREZFKYGJLRERERCqBiS0RERERqQQmtkRERESkEpjYEhEREZFKUJnENigoCD179qzqMN5Ihw4dMG7cuApr70Mbg7S0NEgkEiQmJlZ1KERERFQDVHpiGxQUBIlEghEjRhQrGz16NCQSCYKCgsrdXnVMlmJjYyGRSPDkyROl47t378bs2bOrJqgKVlJSbW1tDYVCgYYNG1ZNUERERFSjvJcZW2tra2zbtg3//POPeOz58+fYsmULbGxs3kcIHyQTExPo6+tXWf8FBQUoLCystPbV1dVhYWEBDQ2+4I6IiIgq33tJbD08PGBtbY3du3eLx3bv3g0bGxs0bdpUqe7hw4fRpk0bGBkZwdTUFP7+/khJSRHL7e3tAQBNmzaFRCJBhw4dlM5ftGgRLC0tYWpqitGjRyM/P18sy83NRWhoKOrUqQM9PT20bNkSsbGxYrlcLoeRkREOHDgAFxcX6Orqom/fvsjJyUF0dDTs7OxgbGyMsWPHoqCgQDxv48aN8PT0hL6+PiwsLDBw4EA8fPgQwMsZ5o4dOwIAjI2NlWaoX12KkJubi0mTJsHa2hpSqRSOjo5Yv349gJdJ6LBhw2Bvbw8dHR24uLhg2bJlb/Q5FF3f/v374ebmBqlUivT0dDx+/BhDhgyBsbExdHV10bVrV9y6dUs8LywsDE2aNFFqa+nSpbCzsxPLo6OjsW/fPkgkEkgkEsTGxhabXS+auY6JiYGnpyd0dXXRunVrJCcnK7W9b98+eHh4QFtbGw4ODggPD8eLFy8AAIIgICwsDDY2NpBKpbCyssLYsWPfaByIiIhINb23NbbBwcGIiooS9zds2IChQ4cWq/fs2TOMHz8e58+fR0xMDNTU1NCrVy9xZvHcuXMAgGPHjkGhUCglyydOnEBKSgpOnDiB6OhoyOVyyOVysXzMmDGIj4/Htm3bcOXKFfTr1w++vr5KSVxOTg6WL1+Obdu24fDhw4iNjUWvXr1w8OBBHDx4EBs3bsTatWvx448/iufk5+dj9uzZuHz5Mvbu3Yu0tDQxebW2tsauXbsAAMnJyVAoFKUmpEOGDMHWrVuxfPlyJCUlYe3atZDJZACAwsJC1K1bFzt37sT169cxY8YMTJ06FTt27HiTjwE5OTlYsGABvv/+e/z+++8wNzdHUFAQzp8/j/379yM+Ph6CIKBbt25KvxSUJTQ0FP3794evry8UCgUUCgVat25dav1p06YhMjIS58+fh4aGBoKDg8Wy06dPY8iQIfjiiy9w/fp1rF27FnK5HHPnzgUA7Nq1C0uWLMHatWtx69Yt7N27F40aNSq1r9zcXGRlZSltREREpJre29+IP/vsM0yZMgV37twBAMTFxWHbtm1KM6YA0KdPH6X9DRs2wMzMDNevX0fDhg1hZmYGADA1NYWFhYVSXWNjY6xcuRLq6uqoX78+/Pz8EBMTg5CQEKSnpyMqKgrp6emwsrIC8DIhO3z4MKKiojBv3jwAL5PU1atXo169egCAvn37YuPGjXjw4AFkMhnc3NzQsWNHnDhxAgEBAQCglJg5ODhg+fLlaN68ObKzsyGTyWBiYgIAMDc3h5GRUYnjc/PmTezYsQNHjx6Ft7e32FYRTU1NhIeHi/v29vaIj4/Hjh070L9//9eM/v/Lz8/HqlWr4O7uDgC4desW9u/fj7i4ODEZ3bx5M6ytrbF3717069fvtW3KZDLo6OggNze32GdSkrlz56J9+/YAgMmTJ8PPzw/Pnz+HtrY2wsPDMXnyZAQGBopjMHv2bEycOBEzZ85Eeno6LCws4O3tDU1NTdjY2KBFixal9hUREaE0bkRERKS63tuMrZmZGfz8/CCXyxEVFQU/Pz/UqlWrWL1bt25hwIABcHBwgIGBgfjn7vT09Nf20aBBA6irq4v7lpaW4pKAq1evoqCgAM7OzpDJZOJ28uRJpaUOurq6YlILALVr14adnZ04c1p0rKhdALhw4QK6d+8OGxsb6Ovri0lbeWIukpiYCHV1dfHcknz77bdo1qwZzMzMIJPJ8N13371RHwCgpaWFxo0bi/tJSUnQ0NBAy5YtxWOmpqZwcXFBUlLSG7VdXv/u39LSEgDE8bx8+TJmzZql9BmFhIRAoVAgJycH/fr1wz///AMHBweEhIRgz5494jKFkkyZMgWZmZnidvfu3Uq5JiIiIqp67/WunuDgYIwZMwbAyyStJN27d4etrS3WrVsHKysrFBYWomHDhsjLy3tt+5qamkr7EolEXMKQnZ0NdXV1XLhwQSn5BaCUtJbURlntPnv2DD4+PvDx8cHmzZthZmaG9PR0+Pj4lCvmIjo6OmWWb9u2DaGhoYiMjESrVq2gr6+Pb775BmfPni13H0X9SCSSNzpHTU0NgiAoHSvvMoWS/Hs8i2L59+cUHh6O3r17FztPW1sb1tbWSE5OxrFjx3D06FGMGjUK33zzDU6ePFnscwIAqVQKqVT61rESERFR9fFeE1tfX1/k5eVBIpHAx8enWHlGRgaSk5Oxbt06tG3bFgDw66+/KtXR0tICAKWbt8qjadOmKCgowMOHD8W2K8KNGzeQkZGB+fPnw9raGgBw/vx5pTrliblRo0YoLCzEyZMnxaUI/1a0VGDUqFHisX/PNL8tV1dXvHjxAmfPnhWXIhR9Dm5ubgBezrbfv38fgiCIieirj1vT0tJ648+kJB4eHkhOToajo2OpdXR0dNC9e3d0794do0ePRv369XH16lV4eHi8c/9ERERUfb3XxFZdXV388/ars6bAyzWypqam+O6772BpaYn09HRMnjxZqY65uTl0dHRw+PBh1K1bF9ra2jA0NHxt387Ozhg0aBCGDBmCyMhING3aFI8ePUJMTAwaN24MPz+/t7omGxsbaGlpYcWKFRgxYgSuXbtW7Nm0tra2kEgkOHDgALp16wYdHR2lWWIAsLOzQ2BgIIKDg7F8+XK4u7vjzp07ePjwIfr37w8nJyf88MMPOHLkCOzt7bFx40YkJCSIT4l4W05OTujRowdCQkKwdu1a6OvrY/LkyahTpw569OgB4OXTGx49eoSFCxeib9++OHz4MA4dOgQDAwOl+I8cOYLk5GSYmpqW6zMpyYwZM+Dv7w8bGxv07dsXampquHz5Mq5du4Y5c+ZALpejoKAALVu2hK6uLjZt2gQdHR3Y2tq+0zgQERFR9ffe3zxmYGCglBD9m5qaGrZt24YLFy6gYcOG+PLLL/HNN98o1dHQ0MDy5cuxdu1aWFlZiclXeURFRWHIkCH46quv4OLigp49eyIhIeGdnqVrZmYGuVyOnTt3ws3NDfPnz8eiRYuU6tSpU0e8Kap27dricoxXrV69Gn379sWoUaNQv359hISE4NmzZwCA//73v+jduzcCAgLQsmVLZGRkKM3evouoqCg0a9YM/v7+aNWqFQRBwMGDB8U/7bu6umLVqlX49ttv4e7ujnPnziE0NFSpjZCQELi4uMDT0xNmZmaIi4t7q1h8fHxw4MAB/PLLL2jevDk++ugjLFmyRExcjYyMsG7dOnh5eaFx48Y4duwYfvrpJ5iamr7bIBAREVG1JxFeXTxJpMKysrJgaGiIzMn6MJC+fq2x3fMt7yEqIiKi6i9t/tv99bs8xJ/fmZmlTpACVTBjS0RERERUGZjYEhEREZFKYGJLRERERCqBiS0RERERqQQmtkRERESkEt7rc2yJPhhT/gTKuKuySFrlR0JEREQVhDO2RERERKQSmNgSERERkUpgYktEREREKoGJLRERERGpBCa2RERERKQS+FQEqpEazjwCNalupfZRme/MJiIiouI4Y0tEREREKoGJLRERERGpBCa2RERERKQSmNgSERERkUpgYktEREREKoGJLRERERGpBCa2RERERKQSmNi+hbS0NEgkEiQmJgIAYmNjIZFI8OTJkyqNi4iIiKgmU5nENigoCBKJBPPnz1c6vnfvXkgkkkrtu3Xr1lAoFDA0NKzUft7FunXr4O7uDplMBiMjIzRt2hQREREV0jYTeyIiIvoQqExiCwDa2tpYsGABHj9+/F771dLSgoWFRaUn0K+Tl5dX4vENGzZg3LhxGDt2LBITExEXF4eJEyciOzv7PUdIREREVHlUKrH19vaGhYXFa2cid+3ahQYNGkAqlcLOzg6RkZFK5XZ2dpg3bx6Cg4Ohr68PGxsbfPfdd6W29+qMpVwuh5GREY4cOQJXV1fIZDL4+vpCoVAonff999/D1dUV2traqF+/PlatWqVUPmnSJDg7O0NXVxcODg6YPn068vPzxfKwsDA0adIE33//Pezt7aGtrV1ifPv370f//v0xbNgwODo6okGDBhgwYADmzp0LADh16hQ0NTVx//59pfPGjRuHtm3bAgDu3LmD7t27w9jYGHp6emjQoAEOHjyItLQ0dOzYEQBgbGwMiUSCoKAgAEBhYSEiIiJgb28PHR0duLu748cffyw2bkeOHEHTpk2ho6ODTp064eHDhzh06BBcXV1hYGCAgQMHIicnRzzvxx9/RKNGjaCjowNTU1N4e3vj2bNnpX4+REREVDOoVGKrrq6OefPmYcWKFfjzzz9LrHPhwgX0798fn376Ka5evYqwsDBMnz4dcrlcqV5kZCQ8PT1x6dIljBo1CiNHjkRycnK5Y8nJycGiRYuwceNGnDp1Cunp6QgNDRXLN2/ejBkzZmDu3LlISkrCvHnzMH36dERHR4t19PX1IZfLcf36dSxbtgzr1q3DkiVLlPq5ffs2du3ahd27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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "slicot_full_names = {\n", - " \"a\": \"Analysis Routines\",\n", - " \"b\": \"Benchmark\",\n", - " \"c\": \"Adaptive Control\",\n", - " \"d\": \"Data Analysis\",\n", - " \"f\": \"Filtering\",\n", - " \"i\": \"Identification\",\n", - " \"m\": \"Mathematical routines\",\n", - " \"n\": \"Nonlinear Systems\",\n", - " \"s\": \"Synthesis Routines\",\n", - " \"t\": \"Transformation Routines\",\n", - " \"u\": \"Utility Routines\",\n", - "}\n", - "\n", - "def count_methods(list_routines, keys):\n", - " d = {key: 0 for key in keys}\n", - " for w in list_routines:\n", - " if w:\n", - " if w[0] in d:\n", - " d[w[0]] = d[w[0]] + 1\n", - " else:\n", - " d[w[0]] = 1\n", - " return d\n", - "\n", - "slicot_routines_dict = count_methods(slicot_routines, keys=slicot_full_names.keys())\n", - "slycot_routines_dict = count_methods(slycot_routines, keys=slicot_full_names.keys())\n", - "slycot_routines_dict['s'] -= 1\n", - "\n", - "print(f\"{slicot_routines_dict = }\")\n", - "print(f\"{slycot_routines_dict = }\")\n", - "\n", - "df = pd.DataFrame(\n", - " {\n", - " \"names\": slicot_full_names.values(),\n", - " \"slycot routines\": slicot_routines_dict.values(),\n", - " \"slicot routines\": slycot_routines_dict.values(),\n", - " }\n", - ")\n", - "print(df)\n", - "\n", - "\n", - "\n", - "names_sli = list(slicot_routines_dict.keys())\n", - "names_sli.reverse()\n", - "values_sli = list(slicot_routines_dict.values())\n", - "values_sli.reverse()\n", - "\n", - "names_sly = list(slycot_routines_dict.keys())\n", - "names_sly.reverse()\n", - "values_sly = list(slycot_routines_dict.values())\n", - "values_sly.reverse()\n", - "\n", - "\n", - "plt.barh(range(len(slicot_routines_dict)), values_sli, tick_label=[slicot_full_names[x] for x in names_sli])\n", - "plt.barh(range(len(slycot_routines_dict)), values_sly)\n", - "plt.legend((\"SLICOT\",\"Slycot\"))\n", - "plt.title(\"SLICOT vs Slycot\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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qsViUdeuXdvh92/7XocPH+60TiIyLk51UpcOHTqEESNGIC0t7ZKv5eTk9Om5W1tb8etf/xqlpaX4z//8TyiKcslj7rzzTkycOBEA8Ic//AFVVVV47rnnMGjQoAse53a78frrr0NRFDzxxBN9qouIjIvBR10qKirC5s2bsXPnzpg/95o1a1BXV4dvf/vbsFqtXT7+/fffh8vlwu23397h10tKSjBlyhR89tlnaG1tjXW5RGQADD7q0k9/+lP4fD6MHTsWkydPxvz58/Hxxx8jFAr1+bn37NkDABg1alS3Hr97924MGzYMTqfzso8ZM2YMQqEQDh482Of6iMh4GHzUpRkzZmDdunW4+eabsW3bNjz77LOYOXMmCgoKsHTp0j49d2NjIwAgJSWlW49vamrq8rFtX297biKi8zH4qFsmTJiAd955B/X19di4cSMeffRRNDU1Ye7cudi9e3evn9fr9QIQgdYdKSkpXT627evdDVMiMhcGH/WIw+HAhAkT8PTTT+OVV15BKBTCW2+91evnKy0tBSD2CXZHWVkZ9u3bh0AgcNnHbN++HXa7HUOGDOl1XURkXAw+6rXx48cDAE6dOtXr55gyZQrS09OxaNEiRCKRLh9/4403wu/3XzZsjxw5gtWrV2P69Olwu929rouIjIvBR11asWIFVFW95P5ly5YBAIYNG9br5/Z4PJg/fz727NmD+fPnd/h93njjDWzcuBEAcP/99yMnJwePPPIIKioqLnic3+/HvHnzoKoqHn/88V7XRETGxs4t1KUHH3wQPp8Pt912G0pLSxEMBlFeXo4333wTxcXFmDdvXvtjDx48iCeffPKS5xg3bhzmzJnT4fM/8sgj2LVrF55//nmsWLECc+fORV5eHqqqqvDuu+9i48aNKC8vBwBkZmZi8eLFmDNnDq644opLOrccPHgQL730EjuxENHlSd5ATzrw4Ycfqt/73vfU0tJSNTk5WXU4HOrgwYPVBx988JLOLQA6vH3/+99XVbXjzi1tFi9erN5www1qRkaGarPZ1H79+ql33HGHunLlyksee/jwYfXee+9VCwsLVbvdrmZlZak333yzunr16k5fCzu3EJGiqh3MLRERERkUr/EREZGpMPiIiMhUGHxERGQqDD4iIjIVBh8REZkKg4+IiEyFwUdERKbC4CMiIlNh8BERkakw+IiIyFQYfEREZCoMPiIiMpX/D+bmrS0HWWnlAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "venn2(subsets = (len(set(slicot_routines)), \n", - " len(set(slycot_routines)), \n", - " len(intersection)), set_labels = ('SLICOT', 'Slycot'))\n", - "plt.show()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "slycot-dev", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -}