From ccaaaa8c62ddfb5f036ba8e7c86cd15f387416a0 Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Mon, 2 May 2022 23:52:14 +0200 Subject: [PATCH] modif insertion et debut split --- slides/cours_23.md | 322 +++++++++++++++++++++++++ slides/figs/barbres_ordre2_supp1.svg | 340 +++++++++++++++++++++++++++ slides/figs/barbres_ordre2_supp2.svg | 329 ++++++++++++++++++++++++++ 3 files changed, 991 insertions(+) create mode 100644 slides/cours_23.md create mode 100644 slides/figs/barbres_ordre2_supp1.svg create mode 100644 slides/figs/barbres_ordre2_supp2.svg diff --git a/slides/cours_23.md b/slides/cours_23.md new file mode 100644 index 0000000..85022b1 --- /dev/null +++ b/slides/cours_23.md @@ -0,0 +1,322 @@ +--- +title: "B-Arbres" +date: "2022-04-13" +patat: + eval: + tai: + command: fish + fragment: false + replace: true + ccc: + command: fish + fragment: false + replace: true + images: + backend: auto +--- + +# Rappel: Les B-arbres + +## Pourquoi utiliser un B-arbre? + +. . . + +## À quoi ressemble un B-arbre? + +. . . + +## Qu'est-ce qu'un B-arbre d'ordre $n$ + +* Chaque page d'un arbre contient au plus $2\cdot n$ *clés*; +* Chaque page (excepté la racine) contient au moins $n$ clés; +* Chaque page qui contient $m$ clés contient soit: + * $0$ descendants; + * $m+1$ descendants. +* Toutes les pages terminales apparaissent au même niveau. + + +# Rappel: Les B-arbres + +## Quelques propriétés + +* Dans chaque noeud les clés sont **triées**. +* Chaque page contient au plus $n$ noeuds: check; +* Chaque noeud avec $m$ clés a $m+1$ descendants; +* Toutes les feuilles apparaissent au même niveau. + +# Les B-arbres + +## Exemple de recherche: trouver `32` + + + +. . . + +* Si `n` plus petit que la 1e clé ou plus grand que la dernière descendre. +* Sinon parcourir (par bissection ou séquentiellement) jusqu'à trouver ou descendre entre 2 éléments. + +# Les B-arbres + +## La recherche de la clé `C` algorithme + +0. En partant de la racine. +1. Si on est dans une feuille: + * Si la `C` est dans une page, retourner la page; + * Sinon c'est perdu. +2. Sinon: + * Tant que `C > page` passer à la page suivante + * Descendre + + +# Les B-arbres + +## Exercice: insérer `22, 45, 50, 5, 32, 55, 60, 41` dans l'arbre d'ordre 2 + + + +. . . + + + +# Les B-arbres + +## L'algorithme d'insertion + +0. Rechercher la feuille (la page a aucun enfant) où insérer; +1. Si la page n'est pas pleine insérer dans l'ordre croissant. +2. Si la page est pleine: + 1. On décale les éléments plus grand que `N`; + 2. On insère `N` dans la place "vide"; + 3. On trouve la valeur médiane `M` de la page (quel indice?); + 4. On crée une nouvelle page de droite; + 5. On copie les valeur à droite de `M` dans la nouvelle page; + 6. On promeut `M` dans la page du dessus; + 7. On connecte le pointeur de gauche de `M` et de droite de `M` avec l'ancienne et la nouvelle page respectivement. + +# Les B-arbres + +## Pseudo-code structure de données (3min, matrix)? + +. . . + +```C +struct page + entier ordre, nb + element tab[2*ordre + 2] +``` + +```C +struct element + int clé + page pg +``` + +# Les B-arbres + +\footnotesize + +## Les fonctions utilitaires (5min matrix) + +```C +booléen est_feuille(page) // la page est elle une feuille? +entier position(page, valeur) // à quelle indice on insère? +booléen est_dans_page(page, valeur) // la valeur est dans la page +``` + +. . . + +```C +booléen est_feuille(page) + retourne (page.tab[0] == vide) +entier position(page, valeur) + i = 0 + tant que i < page.nb && val >= page.tab[i] + i += 1 + retourne i +booléen est_dans_page(page, valeur) + i = position(page, valeur) + retourne (i > 0 && page.tab[i] == valeur) +``` + +# Les B-arbres + +\footnotesize + +## Les fonctions utilitaires (5min matrix) + +```C +page nouvelle_page(ordre) // creer une page +rien liberer_memoire(page) // liberer tout un arbre! +``` +. . . + +```C +page nouvelle_page(ordre) + page = allouer(page) + page.ordre = ordre + page.nb = 0 + page.tab = allouer(2*ordre+2) + retourner page +rien liberer_memoire(page) + si est_feuille(page) + liberer(page.tab) + liberer(page) + sinon + pour fille dans page.tab + liberer_memoire(fille) + liberer(page.tab) + liberer(page) +``` + +# Les B-arbres + +## Les fonctions (5min matrix) + +```C +page recherche(page, valeur) // retourner la page contenant + // la valeur ou vide +``` + +. . . + +```C +page recherche(page, valeur) + si est_dans_page(page, valeur) + retourne page + sinon si est_feuille(page) && !est_dans_page(page, valeur) + retourne vide + sinon + recherche(page.tab[position(page, valeur)], valeur) +``` + +# Les B-arbres + +## Les fonctions + +```C +page inserer(page, valeur) // inserer une valeur +``` + +. . . + +```C +page inserer(page, valeur) + element = nouvel_element(valeur) + inserer_element(page, element) // on change elmement pour savoir s'il faut le remonter + si element.page != vide + page = ajouter_niveau(page, element) // si on atteint le sommet! + retourne page +``` + +# Les B-arbres + +## Les fonctions + +```C +rien inserer_element(page, element) // inserer un element et voir s'il remonte +``` + +. . . + +```C +rien inserer_element(page, element) + si est_feuille(page) + placer(page, element) + sinon + sous_page = page.tab[position(page, element)].page + inserer_element(sous_page, element) + si element.page != vide + placer(page, element) +``` + +# Les B-arbres + +## Les fonctions (5min matrix) + +```C +rien placer(page, element) // inserer un élément +``` + +. . . + +```C +rien placer(page, element) + i = position(page, element.clé) + pour i de 2*page.ordre à i+1 + page.tab[i+1] = page.tab[i] + page.tab[i+1] = element + page.nb += 1 + si page.nb > 2*page.ordre + scinder(page, element) +``` + +# Les B-arbres + +## Les fonctions (5min matrix) + +```C +rien scinder(page, element) // casser une page et remonter +``` + +. . . + +```C +rien scinder(page, element) + new_page = new_page(page.ordre) + new_page.nb = page.ordre + pour i de 0 à ordre inclu + new_page.tab[i] = page.tab[i+ordre+1] + element.clé = page.tab[ordre+1].clé + element.page = new_page +``` + +# Les B-arbres + +## Les fonctions (5min matrix) + +```C +page ajouter_niveau(page, element) // si on remonte à la racine... + // on doit créer une nouvelle racine +``` + +. . . + +```C +page ajouter_niveau(page, element) + tmp = nouvelle_page(page.ordre) + tmp.tab[0].page = page + tmp.tab[1].clé = element.clé + tmp.tab[1].page = element.page + retourne tmp +``` + +# Les B-arbres: suppression + +## Cas simplissime + +{width=80%} + +. . . + +{width=80%} + + +<!-- # Les B-arbres --> + +<!-- ## Structure de données en C (3min, matrix) --> + +<!-- . . . --> + +<!-- ```C --> +<!-- typedef struct _page { --> +<!-- int order, nb; --> +<!-- struct _element *tab; --> +<!-- } page; --> +<!-- ``` --> + +<!-- ```C --> +<!-- typedef struct element { --> +<!-- int key; --> +<!-- struct _page *pg; --> +<!-- } element; --> +<!-- ``` --> diff --git a/slides/figs/barbres_ordre2_supp1.svg b/slides/figs/barbres_ordre2_supp1.svg new file mode 100644 index 0000000..ba649d5 --- /dev/null +++ b/slides/figs/barbres_ordre2_supp1.svg @@ -0,0 +1,340 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="291.39478mm" + height="90.311111mm" + viewBox="0 0 291.39478 90.311113" + version="1.1" + id="svg5" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + sodipodi:docname="barbres_ordre2_supp1.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:document-units="mm" + showgrid="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="1.1737386" + inkscape:cx="672.21098" + inkscape:cy="174.22959" + inkscape:window-width="944" + inkscape:window-height="1022" + inkscape:window-x="14" + inkscape:window-y="44" + inkscape:window-maximized="1" + inkscape:current-layer="layer1"> + <inkscape:grid + type="xygrid" + id="grid824" + originx="0.17639326" + originy="-15.698609" /> + </sodipodi:namedview> + <defs + id="defs2" /> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0.17639426,-15.698611)"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848" + width="26.458332" + height="26.458332" + x="74.083328" + y="15.875" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6" + width="26.458332" + height="26.458332" + x="105.83333" + y="15.874999" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#020000;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-opacity:1" + x="80.349121" + y="32.956631" + id="text5839"><tspan + sodipodi:role="line" + id="tspan5837" + style="fill:#020000;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-opacity:1" + x="80.349121" + y="32.956631">10</tspan></text> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240" + width="5.2916665" + height="26.458332" + x="100.54166" + y="15.874999" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-7" + width="5.2916665" + height="26.458332" + x="68.791664" + y="15.875" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5" + width="5.2919998" + height="26.458332" + x="132.29167" + y="15.874999" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2" + width="26.458332" + height="26.458332" + x="137.58334" + y="15.875001" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9" + width="5.2919998" + height="26.458332" + x="164.0417" + y="15.875001" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-7" + width="26.458332" + height="26.458332" + x="169.33334" + y="15.875001" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-0" + width="5.2919998" + height="26.458332" + x="195.79169" + y="15.875001" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-9" + width="26.458332" + height="26.458332" + x="68.791306" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-3" + width="5.2919998" + height="26.458332" + x="95.249664" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-7-6" + width="26.458332" + height="26.458332" + x="100.54131" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-0-0" + width="5.2919998" + height="26.458332" + x="126.99965" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#040000;fill-opacity:1;stroke-width:0.264583" + x="112.21022" + y="32.903568" + id="text8608-2"><tspan + sodipodi:role="line" + id="tspan8606-6" + style="fill:#040000;fill-opacity:1;stroke-width:0.264583" + x="112.21022" + y="32.903568">15</tspan></text> + <text + xml:space="preserve" + style="font-size:10.5831px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#040000;fill-opacity:1;stroke-width:0.264579" + x="144.02982" + y="32.97282" + id="text8608-2-7" + transform="scale(0.9999849,1.0000151)"><tspan + sodipodi:role="line" + id="tspan8606-6-9" + style="fill:#040000;fill-opacity:1;stroke-width:0.264579" + x="144.02982" + y="32.97282">30</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-9" + width="26.458332" + height="26.458332" + x="5.291666" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-3" + width="26.458332" + height="26.458332" + x="37.041664" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-1" + width="5.2916665" + height="26.458332" + x="31.749994" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-7-8" + width="5.2916665" + height="26.458332" + x="-5.7529296e-06" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-7" + width="5.2916665" + height="26.458332" + x="63.500008" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583" + x="11.629802" + y="96.456635" + id="text17588"><tspan + sodipodi:role="line" + id="tspan17586" + style="stroke-width:0.264583" + x="11.629802" + y="96.456635">13</tspan></text> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583" + x="43.253193" + y="96.4618" + id="text17588-2"><tspan + sodipodi:role="line" + id="tspan17586-3" + style="stroke-width:0.264583" + x="43.253193" + y="96.4618">14</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-9-9" + width="26.458332" + height="26.458332" + x="164.04167" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-3-2" + width="26.458332" + height="26.458332" + x="195.79167" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-1-3" + width="5.2916665" + height="26.458332" + x="190.5" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-7-8-7" + width="5.2916665" + height="26.458332" + x="158.75" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-7-5" + width="5.2916665" + height="26.458332" + x="222.25002" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.264583" + x="170.50125" + y="96.382401" + id="text17588-9"><tspan + sodipodi:role="line" + id="tspan17586-2" + style="fill:#000000;fill-opacity:1;stroke-width:0.264583" + x="170.50125" + y="96.382401">20</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 100.54166,42.333334 18.520832,79.375001" + id="path19781" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 137.58333,42.333334 174.625,79.375" + id="path19783" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-6" + width="26.458332" + height="26.458332" + x="227.54167" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-2" + width="5.2919998" + height="26.458332" + x="254.00003" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-7-61" + width="26.458332" + height="26.458332" + x="259.29166" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-0-8" + width="5.2919998" + height="26.458332" + x="285.75" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583" + x="202.36235" + y="96.382401" + id="text17588-7"><tspan + sodipodi:role="line" + id="tspan17586-5" + style="stroke-width:0.264583" + x="202.36235" + y="96.382401">25</tspan></text> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583" + x="234.10202" + y="96.457329" + id="text17588-92"><tspan + sodipodi:role="line" + id="tspan17586-28" + style="stroke-width:0.264583" + x="234.10202" + y="96.457329">27</tspan></text> + </g> +</svg> diff --git a/slides/figs/barbres_ordre2_supp2.svg b/slides/figs/barbres_ordre2_supp2.svg new file mode 100644 index 0000000..30a827e --- /dev/null +++ b/slides/figs/barbres_ordre2_supp2.svg @@ -0,0 +1,329 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="291.39478mm" + height="90.311111mm" + viewBox="0 0 291.39478 90.311113" + version="1.1" + id="svg5" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + sodipodi:docname="barbres_ordre2_supp2.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:document-units="mm" + showgrid="true" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + inkscape:zoom="1.1737386" + inkscape:cx="672.21098" + inkscape:cy="174.22959" + inkscape:window-width="1920" + inkscape:window-height="1080" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer1"> + <inkscape:grid + type="xygrid" + id="grid824" + originx="0.17639326" + originy="-15.698609" /> + </sodipodi:namedview> + <defs + id="defs2" /> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0.17639426,-15.698611)"> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848" + width="26.458332" + height="26.458332" + x="74.083328" + y="15.875" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6" + width="26.458332" + height="26.458332" + x="105.83333" + y="15.874999" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#020000;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-opacity:1" + x="80.349121" + y="32.956631" + id="text5839"><tspan + sodipodi:role="line" + id="tspan5837" + style="fill:#020000;fill-opacity:1;stroke:none;stroke-width:0.264583;stroke-opacity:1" + x="80.349121" + y="32.956631">10</tspan></text> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240" + width="5.2916665" + height="26.458332" + x="100.54166" + y="15.874999" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-7" + width="5.2916665" + height="26.458332" + x="68.791664" + y="15.875" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5" + width="5.2919998" + height="26.458332" + x="132.29167" + y="15.874999" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2" + width="26.458332" + height="26.458332" + x="137.58334" + y="15.875001" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9" + width="5.2919998" + height="26.458332" + x="164.0417" + y="15.875001" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-7" + width="26.458332" + height="26.458332" + x="169.33334" + y="15.875001" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-0" + width="5.2919998" + height="26.458332" + x="195.79169" + y="15.875001" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-9" + width="26.458332" + height="26.458332" + x="68.791306" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-3" + width="5.2919998" + height="26.458332" + x="95.249664" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-7-6" + width="26.458332" + height="26.458332" + x="100.54131" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-0-0" + width="5.2919998" + height="26.458332" + x="126.99965" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#040000;fill-opacity:1;stroke-width:0.264583" + x="112.21022" + y="32.903568" + id="text8608-2"><tspan + sodipodi:role="line" + id="tspan8606-6" + style="fill:#040000;fill-opacity:1;stroke-width:0.264583" + x="112.21022" + y="32.903568">15</tspan></text> + <text + xml:space="preserve" + style="font-size:10.5831px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#040000;fill-opacity:1;stroke-width:0.264579" + x="144.02982" + y="32.97282" + id="text8608-2-7" + transform="scale(0.9999849,1.0000151)"><tspan + sodipodi:role="line" + id="tspan8606-6-9" + style="fill:#040000;fill-opacity:1;stroke-width:0.264579" + x="144.02982" + y="32.97282">30</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-9" + width="26.458332" + height="26.458332" + x="5.291666" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-3" + width="26.458332" + height="26.458332" + x="37.041664" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-1" + width="5.2916665" + height="26.458332" + x="31.749994" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-7-8" + width="5.2916665" + height="26.458332" + x="-5.7529296e-06" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-7" + width="5.2916665" + height="26.458332" + x="63.500008" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583" + x="11.629802" + y="96.456635" + id="text17588"><tspan + sodipodi:role="line" + id="tspan17586" + style="stroke-width:0.264583" + x="11.629802" + y="96.456635">13</tspan></text> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583" + x="43.253193" + y="96.4618" + id="text17588-2"><tspan + sodipodi:role="line" + id="tspan17586-3" + style="stroke-width:0.264583" + x="43.253193" + y="96.4618">14</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-9-9" + width="26.458332" + height="26.458332" + x="164.04167" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-3-2" + width="26.458332" + height="26.458332" + x="195.79167" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-1-3" + width="5.2916665" + height="26.458332" + x="190.5" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-7-8-7" + width="5.2916665" + height="26.458332" + x="158.75" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-7-5" + width="5.2916665" + height="26.458332" + x="222.25002" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;fill:#000000;fill-opacity:1;stroke-width:0.264583" + x="170.50125" + y="96.382401" + id="text17588-9"><tspan + sodipodi:role="line" + id="tspan17586-2" + style="fill:#000000;fill-opacity:1;stroke-width:0.264583" + x="170.50125" + y="96.382401">20</tspan></text> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 100.54166,42.333334 18.520832,79.375001" + id="path19781" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 137.58333,42.333334 174.625,79.375" + id="path19783" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-6" + width="26.458332" + height="26.458332" + x="227.54167" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-2" + width="5.2919998" + height="26.458332" + x="254.00003" + y="79.375" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none" + id="rect848-6-2-7-61" + width="26.458332" + height="26.458332" + x="259.29166" + y="79.375" /> + <rect + style="fill:none;fill-opacity:1;stroke:#020000;stroke-width:0.352777;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect9240-5-9-0-8" + width="5.2919998" + height="26.458332" + x="285.75" + y="79.375" /> + <text + xml:space="preserve" + style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;stroke-width:0.264583" + x="202.35202" + y="96.457329" + id="text17588-92"><tspan + sodipodi:role="line" + id="tspan17586-28" + style="stroke-width:0.264583" + x="202.35202" + y="96.457329">27</tspan></text> + </g> +</svg> -- GitLab