diff --git a/slides/cours_20.md b/slides/cours_20.md
new file mode 100644
index 0000000000000000000000000000000000000000..421328be703481fba85238c81f95960327c2251f
--- /dev/null
+++ b/slides/cours_20.md
@@ -0,0 +1,967 @@
+---
+title: "Arbres quarternaires, compression et Barnes-Hut"
+date: "2023-05-05"
+---
+
+# Le cours précédent (1/2)
+
+## Questions
+
+* Qu'est-ce qu'un arbre quaternaire?
+
+. . .
+
+* Un arbre où chaque nœud a soit **4 enfants** soit **aucun**.
+* A quoi peut servir un arbre quaternaire?
+
+. . .
+
+* Compression
+
+# Le cours précédent (2/2)
+
+## Questions
+
+
+* Structure de données d'un arbre quaternaire?
+
+. . .
+
+```C
+typedef struct _node {
+    int info;
+    struct _node *child[4];
+} node;
+```
+
+. . .
+
+* Dessin d'un nœud d'arbre quaternaire (avec correspondance `node`)?
+
+. . .
+
+```{.mermaid format=pdf width=400 loc=figs/}
+graph TD;
+    id0(("    "))-->|"child[0]"| id1(("info"));
+    id0-->|"child[1]"| id2(("info"));
+    id0-->|"child[2]"| id3(("info"));
+    id0-->|"child[3]"| id4(("info"));
+```
+
+# Transformations avec un arbre quaternaire
+
+## A faire
+
+* Symétrie axiale (horizontale/verticale).
+* Rotation quart de cercle (gauche/droite).
+* Compression.
+
+# La symétrie verticale
+
+## Que donne la symétrie verticale de
+
+```
+   SG=0  |  SD=1
+ 21 | 12 | 4 |  4
+  9 |  7 | 4 |  4
+-----------------
+  1 |  1 | 0 | 31
+  1 |  1 | 3 | 27
+   IG=2  |  ID=3
+```
+
+. . .
+
+```
+   SG=0  |  SD=1
+  4 |  4 | 12 | 21
+  4 |  4 |  7 |  9
+------------------
+ 31 |  0 |  1 |  1
+ 27 |  3 |  1 |  1
+   IG=2  |  ID=3
+```
+
+# La symétrie d'axe vertical
+
+## Comment faire sur une matrice (3min, matrix)?
+
+. . .
+
+\footnotesize
+
+```C
+matrice symétrie(matrice)
+    pour i de 0 à nb_colonnes(matrice) / 2
+        pour j de 0 à nb_lignes(matrice)
+            échanger(matrice[i][j], matrice[nb_colonnes(matrice)-1-i][j])
+    retourne matrice
+```
+
+# La symétrie d'axe vertical
+
+## Comment faire sur un arbre?
+
+* Faire un dessin de l'arbre avant/après (5min, matrix)
+
+    ```
+       SG=0  |  SD=1        SG=0  |  SD=1        
+     21 | 12 | 4 |  4       4 | 4 | 12 | 21
+      9 |  7 | 4 |  4       4 | 4 |  7 |  9
+    -----------------  =>  ----------------
+      1 |  1 | 0 | 31      31 | 0 |  1 |  1
+      1 |  1 | 3 | 27      27 | 3 |  1 |  1
+       IG=2  |  ID=3        IG=2  |  ID=3
+    ```
+
+* Écrire le pseudo-code (3min, matrix)
+
+. . .
+
+\footnotesize
+
+```C
+arbre symétrie(arbre)
+    si !est_feuille(arbre)
+        échanger(arbre.enfant[0], arbre.enfant[1])
+        échanger(arbre.enfant[2], arbre.enfant[3])
+        pour i de 0 à 3
+            symétrie(arbre.enfant[i])
+    retourne arbre
+```
+
+# La symétrie d'axe horizontal
+
+* Trivial de faire l'axe horizontal (exercice à la maison)
+
+# Rotation d'un quart de cercle
+
+## Comment faire sur un arbre?
+
+* Faire un dessin de l'arbre avant/après (5min, matrix)
+
+    ```
+       SG=0  |  SD=1        SG=0  |  SD=1   
+     21 | 12 | 4 |  4      4 |  4 | 31 | 27
+      9 |  7 | 4 |  4      4 |  4 |  0 |  3
+    -----------------  => ----------------- 
+      1 |  1 | 0 | 31     12 |  7 |  1 |  1
+      1 |  1 | 3 | 27     21 |  9 |  1 |  1
+       IG=2  |  ID=3        IG=2  |  ID=3
+
+    ```
+
+* Écrire le pseudo-code (3min, matrix)
+
+. . .
+
+```C
+rien rotation_gauche(arbre) 
+    si !est_feuille(arbre)
+        échange_cyclique_gauche(arbre.enfant)
+        pour i de 0 à 3
+            rotation_gauche(arbre.enfant[i])
+```
+
+# Rotation d'un quart de cercle
+
+\footnotesize
+
+## Comment faire sur un arbre?
+
+```
+   SG=0  |  SD=1        SG=0  |  SD=1   
+ 21 | 12 | 4 |  4      4 |  4 | 31 | 27
+  9 |  7 | 4 |  4      4 |  4 |  0 |  3
+-----------------  => ----------------- 
+  1 |  1 | 0 | 31     12 |  7 |  1 |  1
+  1 |  1 | 3 | 27     21 |  9 |  1 |  1
+   IG=2  |  ID=3        IG=2  |  ID=3
+```
+
+* Écrire le vrai (5min, matrix)
+
+. . .
+
+```C
+void rotate(node *qt) {
+    if (!is_leaf(qt)) {
+        node *tmp = qt->child[2];
+        qt->child[2] = qt->child[0];
+        qt->child[0] = qt->child[1];
+        qt->child[1] = qt->child[3];
+        qt->child[3] = tmp;
+        for (int i=0;i < 4; i++) { 
+            rotate(qt->child[i]);
+        }
+    }
+}
+```
+
+# Compression sans perte (1/N)
+
+## Idée générale
+
+* Regrouper les pixels par valeur
+
+```
+   SG=0  |  SD=1        SG=0   |  SD=1   
+ 21 | 12 | 4 |  4      21 | 12 |   4
+  9 |  7 | 4 |  4       9 |  7 |  
+-----------------  => ----------------- 
+  1 |  1 | 0 | 31         1    |  0 | 31
+  1 |  1 | 3 | 27              |  3 | 27
+   IG=2  |  ID=3        IG=2   |  ID=3
+```
+
+* Comment faire?
+
+# Compression sans perte (2/N)
+
+## Que devient l'arbre suivant?
+
+![](figs/quad_img_simple.svg)
+
+. . . 
+
+## Arbre compressé
+
+![](figs/quad_img_simple_comp.svg)
+
+# Compression sans perte (3/N)
+
+* Si un nœud a tous ses enfants égaux:
+    * Donner la valeur au nœud,
+    * Supprimer les enfants.
+* Remonter jusqu'à la racine.
+
+## Écrire le pseudo-code (5min, matrix)
+
+. . .
+
+```C
+rien compression_sans_pertes(arbre)
+    si !est_feuille(arbre)
+        pour i de 0 à 3
+            compression_sans_pertes(arbre.enfant[i])
+        si derniere_branche(arbre)
+            valeur, toutes_égales = valeur_enfants(arbre)
+            si toutes_egales
+                arbre.info = valeur
+                detruire_enfants(arbre)
+```
+
+# Compression sans perte (4/N)
+
+\footnotesize
+
+## Écrire le code C (5min, matrix)
+
+. . .
+
+```C
+void lossless_compression(node *qt) {
+    if (!is_leaf(qt)) {
+        for (int i = 0; i < CHILDREN; i++) {
+            lossless_compression(qt->child[i]);
+        }
+        if (is_last_branch(qt)) {
+            int val = -1;
+            if (last_value(qt, &val)) {
+                qt->info = val;
+                for (int i = 0; i < 4; ++i) {  
+                    free(qt->child[i]);
+                    qt->child[i] = NULL;
+                }
+            }
+        }
+    }
+}
+```
+
+# Compression sans perte (5/N)
+
+\footnotesize
+
+```C
+bool is_last_branch(node *qt) {
+    for (int i = 0; i < 4; ++i) {
+        if (!is_leaf(qt)) {
+            return false;
+        }
+    }
+    return true;
+}
+bool last_value(node *qt, int *val) {
+    int info = qt->child[0];
+    for (int i = 1; i < 4; ++i) {
+        if (info != qt->child[i]) {
+            return false;
+        }
+    }
+    *val = info;
+    return true;
+}
+```
+
+
+# Compression avec perte (1/N)
+
+## Idée générale
+
+* Regrouper les pixels par valeur sous certaines conditions
+
+```
+   SG=0  |  SD=1        SG=0   |  SD=1   
+ 21 | 12 | 4 |  3      21 | 12 |    4
+  9 |  7 | 4 |  4       9 |  7 |  
+-----------------  => ------------------
+  1 |  1 | 0 | 31         1    |  0 | 31
+  2 |  1 | 3 | 27              |  3 | 27
+   IG=2  |  ID=3        IG=2   |  ID=3
+```
+
+* On enlève si l'écart à la moyenne est "petit"?
+
+# Compression avec perte (2/N)
+
+## Que devient l'arbre suivant si l'écart est petit?
+
+![](figs/quad_img_simple_variation.svg)
+
+. . . 
+
+## Arbre compressé
+
+![](figs/quad_img_simple_comp_loss.svg)
+
+# Compression avec perte (3/N)
+
+## Comment mesurer l'écart à la moyenne?
+
+. . .
+
+* Avec l'écart-type
+
+\begin{equation*}
+\mu = \frac{1}{4}\sum_{i=0}^{3} p[i],\quad \sigma = \sqrt{\frac{1}{4}\sum_{i=0}^3 (\mu-p[i])
+^2} = \sqrt{\frac{1}{4}\left(\sum_{i=0}^3p[i]^2\right)-\mu^2}
+\end{equation*}
+
+## Que devient l'algorithme?
+
+. . .
+
+* Si $\sigma<\theta$, $\theta$ est la **tolérance**:
+    * Remplacer la valeur du pixel par la moyenne des enfants.
+    * Remonter les valeurs dans l'arbre.
+
+## Quelle influence de la valeur de $\theta$ sur la compression?
+
+. . .
+
+* Plus $\theta$ est grand, plus l'image sera compressée.
+
+# Compression avec perte (4/N)
+
+## Que devient l'arbre avec $\theta=0.5$?
+
+![L'arbre original.](figs/quad_img_simple_variation.svg)
+
+. . .
+
+![Arbre compressé.](figs/quad_img_simple_comp_avg.svg)
+
+# Compression avec perte (6/N)
+
+## Modifications sur la structure de données?
+
+. . .
+
+* On stocke la moyenne, et la moyenne des carrés.
+
+```C
+struct noeud
+    flottant moyenne, moyenne_carre
+    node enfants[4]
+```
+
+* Comment on calcule `moyenne` et `moyenne_carre` sur chaque nœud (pseudo-code)?
+
+# Calcul de la moyenne
+
+## Pseudo-code (5min, matrix)
+
+. . .
+
+```C
+rien moyenne(arbre) {
+    si !est_feuille(arbre)
+        pour enfant dans arbre.enfants
+            moyenne(enfant)
+        pour enfant dans arbre.enfants
+            arbre.moyenne += enfant.moyenne
+            arbre.moyenne_carre += enfant.moyenne_carre
+        arbre.moyenne /= 4
+        arbre.moyenne_carre /= 4
+```
+
+# La compression avec pertes
+
+\footnotesize
+
+## Pseudo-code (5min, matrix)
+
+. . .
+
+```C
+rien compression_avec_pertes(arbre, theta)
+    si !est_feuille(arbre)
+        pour i de 0 à 3
+            compression_avec_pertes(arbre.enfant[i])
+        si derniere_branche(arbre)
+            si racine(arbre.moyenne_carre - arbre.moyenne^2) < theta
+                detruire_enfants(arbre)
+```
+
+## Le code en entier
+
+```C
+arbre = matrice_à_arbre(matrice)
+moyenne(arbre)
+compression_sans_pertes(arbre)
+```
+
+# La dynamique des corps célestes
+
+## Slides très fortement inspirés du cours de J. Latt, Unige
+
+## Simulation du problème à $N$-corps
+
+* Prédiction du mouvement d'un grand nombre de corps célestes.
+* Modélisation:
+    * On se limite aux étoiles;
+    * Chaque étoile est caractérisée par un point (coordonnées) et une masse;
+    * On simule en deux dimensions.
+    * Interactions uniquement par les lois de la gravitation Newtonienne (oui-oui c'est de la **physique**!).
+
+
+# Les équations du mouvement
+
+## Mouvement de la $i$-ème étoile
+
+* Algorithme de Verlet ($t_{n+1}=t_n+\delta t$)
+
+    $$
+   \vec x_i(t_{n+1})= 2\vec x_i(t_n)-\vec x_i(t_{n-1})+\vec a_i(t_n)\delta t^2.
+   $$
+
+## Force de gravitation
+
+* $\vec a_i(t_n)=\vec F_i/m_i$.
+* Sur l'étoile $i$, la force résultante est donnée par
+
+    $$
+    \vec F_i=\sum_{j=1,j\neq i}^N \vec F_{ij}.
+    $$
+    avec
+    $$
+    \vec F_{ij}=\frac{G m_i m_j(\vec x_j-\vec x_i)}{||\vec x_j-\vec x_i||^3}.
+    $$
+
+# Algorithme du problème à $n$-corps
+
+## Pseudo-code: structure de données
+
+```C
+struct étoile
+    flottant m
+    vec x, x_precedent, f
+```
+
+## Pseudo-code: itération temporelle
+
+```C
+rien iteration_temporelle(étoiles, dt)
+    pour étoile_une dans étoiles
+        étoile_une.f = 0
+        pour étoile_deux dans étoiles
+            si (étoile_un != étoile_deux)
+                étoile_une.f += 
+                    force(étoile_une, étoile_deux)
+    pour étoile dans étoiles
+        étoile.x, étoile.x_precedent = 
+            verlet(étoile.x, étoile.x_precedent, 
+                   étoile.f / étoile.m, dt)
+```
+
+# Algorithme du problème à $n$-corps
+
+## Complexité
+
+* Complexité de chacune des parties?
+
+. . .
+
+* $\mathcal{O}(N^2)$, $\mathcal{O}(N)$.
+
+## En temps CPU pour **une itération**
+
+\footnotesize
+
+* Si temps pour $N=1$ on calcule en $1\mu s$:
+
++--------+-------+-------+-----------+
+|     N  |  N^2  | t [s] | t [réel]  |
++--------+-------+-------+-----------+
+|    10  |  10^2 | 1e-4  |           |
++--------+-------+-------+-----------+
+|  10^4  |  10^8 | 1e+2  | ~1min     |
++--------+-------+-------+-----------+
+|  10^6  | 10^12 | 1e+6  | ~11j      |
++--------+-------+-------+-----------+
+|  10^9  | 10^18 | 1e+12 | ~30k ans  |
++--------+-------+-------+-----------+
+|  10^11 | 10^22 | 1e+16 | ~300M ans |
++--------+-------+-------+-----------+
+
+* Typiquement il y a des milliers-millions d'itérations.
+* Il y a $10^{11}$ étoiles dans la galaxie.
+* Houston we have a problem.
+
+# Question
+
+## Comment faire mieux, des idées?
+
+. . .
+
+* Si un groupe d'étoiles est suffisamment loin, on le modélise comme un corps unique situé en son centre de masse.
+* Exemple: Si on simule plusieurs galaxies, on considère chaque galaxie comme un corps unique!
+* Un arbre quaternaire est une structure parfaite pour regrouper les étoiles.
+
+# Le cas à 10 corps
+
+::: columns
+
+:::: {.column width=50%}
+
+## Illustration: le cas à 10 corps
+
+![](figs/nbody_bare.png){width=60%}
+
+::::
+
+:::: {.column width=50%}
+
+## Problématique
+
+* On veut calculer la force sur $1$.
+
+::::
+
+:::
+
+. . .
+
+
+::: columns
+
+:::: {.column width=50%}
+
+## Illustration: le cas à 10 corps
+
+![](figs/nbody_n2.png){width=60%}
+
+
+::::
+
+:::: {.column width=50%}
+
+## Résultat
+
+* Calcul et somme des forces venant des $9$ autre corps.
+
+::::
+
+:::
+
+# Le cas à 10 corps
+
+::: columns
+
+:::: {.column width=50%}
+
+## Réduction d'un groupe à un seul corps
+
+![](figs/nbody_group.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Idée
+
+* On accélère le calcul en traitant un groupe comme un seul corps.
+* Fonctionne uniquement si le groupe est assez loin.
+* Autrement l'approximation est trop grossière.
+
+::::
+
+:::
+
+# Solution: l'arbre quaternaire
+
+## Corps célestes - arbre
+
+![](figs/nbody_qt_withtree.png)
+
+* On omet les nœuds vides pour éviter la surcharge.
+* La numérotation est:
+    * 0: ID
+    * 1: SD
+    * 2: IG
+    * 3: SG
+
+# Exemple d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 1
+
+![](figs/corps1.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre, niveau 1
+
+![](figs/arbre1.png){width=100%}
+
+* Quadrant ID.
+* La feuille est vide, on insère.
+
+::::
+
+:::
+
+# Exemple d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 2
+
+![](figs/corps2.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre, niveau 1
+
+![](figs/arbre2.png){width=100%}
+
+* Quadrant SD.
+* La feuille est vide, on insère.
+
+::::
+
+:::
+
+# Exemple d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 3 (1/N)
+
+![](figs/corps3_1.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre, niveau 1
+
+![](figs/arbre3_1.png){width=100%}
+
+* Quadrant SD.
+* La feuille est prise par 2.
+
+::::
+
+:::
+
+# Exemple d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 3 (2/N)
+
+![](figs/corps3_2.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre, niveau 2
+
+![](figs/arbre3_2.png){width=100%}
+
+* On crée un nouveau nœud.
+* Deux corps dans le nœud ID.
+* On crée un nouveau nœud.
+
+::::
+
+:::
+
+# Exemple d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Insertion corps 3 (3/N)
+
+![](figs/corps3_3.png){width=100%}
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre, niveau 3
+
+![](figs/arbre3_3.png){width=100%}
+
+* 2 va dans ID.
+* 3 va dans SG.
+* C'est des feuilles vides, tout va bien.
+
+::::
+
+:::
+
+# Exemple d'insertion
+
+::: columns
+
+:::: {.column width=50%}
+
+## Que fait-on avec les nœuds intérieurs?
+
+* On les utilise pour:
+    * stocker la masse totale;
+    * stocker le centre de masse.
+
+\begin{align}
+m&=m_2+m_3,\\
+\vec x &= \frac{m_2\vec x_2+m_3\vec x_3}{m}.
+\end{align}
+
+## Chaque feuille contient **une étoile**
+
+::::
+
+:::: {.column width=50%}
+
+## Arbre
+
+![](figs/arbre3_3.png){width=100%}
+
+::::
+
+:::
+
+# Résumé
+
+* Insertion du corps `c` dans le nœud `n` en partant de la racine.
+* Si le nœud `n`
+    * ne contient pas de corps, on y dépose `c`,
+    * est interne, on met à jour masse et centre de masse. `c` est inséré récursivement dans le bon quadrant.
+    * est externe, on subdivise `n`, on met à jour la masse et centre de masse, on insère récursivement les deux nœuds dans les quadrants appropriés.
+
+## Remarque
+
+* Il faut stocker les coordonnées des quadrants.
+* Un nœud a un comportement différent s'il est interne ou externe.
+
+# Algorithme d'insertion
+
+## Structure de données
+
+```C
+struct node
+    etoile e // externe: pour stocker 
+    etoile sup_etoile // interne: pour stocker m, x
+    quadrant q  // coordonnées du quadrant
+    node enfants[4]
+```
+
+## Remarque: 
+
+* On fait une simplification "moche": `sup_etoile` pourrait juste avoir une masse et une position.
+
+# Algorithme d'insertion
+
+\footnotesize
+
+## Algorithme d'insertion, pseudo-code (15min, matrix)
+
+. . .
+
+```C
+rien insertion_etoile(arbre, e)  
+    si (!est_vide(arbre) && dans_le_quadrant(arbre.q, e.x)) {
+        si (est_feuille(arbre))
+            si (!contient_etoile(arbre))
+                arbre.e = e
+            sinon
+                // on crée enfants et arbre.sup_etoile est initialisée
+                subdivision_arbre(arbre, e) 
+                pour enfant dans arbre.enfants
+                    insertion_etoile(enfant, arbre.e)
+                pour enfant dans arbre.enfants
+                    insertion_etoile(enfant, e)
+                destruction(arbre.e)
+        sinon
+            maj_masse_cdm(arbre.sup_etoile, e)
+            pour enfant dans arbre.enfants
+                insertion_etoile(enfant, e)
+```
+
+# Utilisation de l'arbre
+
+* L'arbre est rempli: comment on calcule la force sur le corps 1?
+* Parcours de l'arbre: 
+    * si la distance entre 1 et le centre de masse est suffisante, on utilise la masse totale et centre de masse pour calculer la force.
+    * sinon, on continue le parcours
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_1.png)
+
+* Le cadrant ID ne contient que `1`, rien à faire.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_2.png)
+
+* Le cadrant SG ne contient `5` corps.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_3.png)
+
+* La distance entre `1` et le centre de masse de SG est `d`.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_4.png)
+
+* La distance entre `1` et le centre de masse de SG est `d`.
+* Est-ce que `d` est assez grand?
+* On va comparer avec la distance `d` avec la taille du quadrant `s`.
+
+# Critère $\theta$
+
+* On compare $d=||\vec x_1-\vec x_{cm}||$ avec $s$ la taille du quadrant.
+* Le domain est assez éloigné si
+
+    $$
+    \frac{s}{d}<\theta,
+    $$
+* $\theta$ est la valeur de seuil.
+* Une valeur typique est $\theta=0.5$, donc la condition devient
+
+    $$
+    d>2s.
+    $$
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_4.png)
+
+* Ici $d<2s$, domaine rejeté.
+* ON descend dans l'arbre.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_5.png)
+
+* `s` est plus petit, mais....
+* Cela ne suffit pas $d<2s$, domaine rejeté.
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_6.png)
+
+* Les nœuds sont des feuilles, on calcule la force.
+* On ajoute la force qu'ils exercent sur `1`.
+
+# Algorithme pour le calcul de la force
+
+Pour calculer la force sur un corps `c`, on parcourt l'arbre en commençant par la racine:
+
+* Si le nœud `n` est une feuille et n'est pas `c`, on ajoute la force dûe à `n` sur `c`;
+* Sinon si $s/d<\theta$, on traite `n` comme une feuille et on ajoute la force dûe à `n` sur `c`;
+* Sinon on continue sur les enfants récursivement.
+
+
+## Cotinuous notre exemple précédent!
+
+# Calcul de la force
+
+## Calcul de la force sur `1`
+
+![](figs/force_7.png)
+
+* Il y a deux corps dans le quadrant vert.
+* Quel est le critère pour remplacer les étoiles par leur centre de masse?
+
+. . .
+
+* Et oui! $d>2s$ on peut remplacer les étoiles par leur centre de masse!
+
+# Algorithme du calcul de force
+
+## Écrire le psuedo-code du calcul de la force
+
+\footnotesize
+
+```C
+rien maj_force_sur_etoile(arbre, e, theta)
+    si est_vide(arbre)
+        retourne
+
+    si est_feuille(arbre) && contient_etoile(arbre) && dans_le_quadrant(arbre.q, e.x)
+        maj_force(e, arbre.e)
+    sinon si noeud_assez_loin(arbre, e, theta)
+        maj_force(e, arbre.sup_etoile)
+    sinon
+        pour enfant dans enfants
+            maj_force_sur_etoile(enfant, e, theta)
+```
+
+
diff --git a/slides/figs/arbre1.png b/slides/figs/arbre1.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d72a06adb936d7855a916895f22346c7bebb90b
Binary files /dev/null and b/slides/figs/arbre1.png differ
diff --git a/slides/figs/arbre2.png b/slides/figs/arbre2.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7a95bf99a5743250396e15705373189891f9b60
Binary files /dev/null and b/slides/figs/arbre2.png differ
diff --git a/slides/figs/arbre3_1.png b/slides/figs/arbre3_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..69487dde2226d1e2c44c4f58aff2a9a1c929b849
Binary files /dev/null and b/slides/figs/arbre3_1.png differ
diff --git a/slides/figs/arbre3_2.png b/slides/figs/arbre3_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a67682c6a3ba3244b310a0637e0678589fa0c3a8
Binary files /dev/null and b/slides/figs/arbre3_2.png differ
diff --git a/slides/figs/arbre3_3.png b/slides/figs/arbre3_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..01ab4c135acb8da54790923ef33b55d977097050
Binary files /dev/null and b/slides/figs/arbre3_3.png differ
diff --git a/slides/figs/arbre_couvrant_bien.png b/slides/figs/arbre_couvrant_bien.png
new file mode 100644
index 0000000000000000000000000000000000000000..ddd64ea22b85bfaa2a47797204347439db083d71
Binary files /dev/null and b/slides/figs/arbre_couvrant_bien.png differ
diff --git a/slides/figs/arbre_couvrant_exemples.png b/slides/figs/arbre_couvrant_exemples.png
new file mode 100644
index 0000000000000000000000000000000000000000..511b08aa671d07a0ffa25a4fe3d602aa4fc06f4c
Binary files /dev/null and b/slides/figs/arbre_couvrant_exemples.png differ
diff --git a/slides/figs/arbre_couvrant_mal.png b/slides/figs/arbre_couvrant_mal.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c4cd6f375d73ab335ff4509836508bbf9c91360
Binary files /dev/null and b/slides/figs/arbre_couvrant_mal.png differ
diff --git a/slides/figs/arbre_couvrant_minimal_exemple.png b/slides/figs/arbre_couvrant_minimal_exemple.png
new file mode 100644
index 0000000000000000000000000000000000000000..0705ed97e9cc959bcd4abff6216ee02c588b78d7
Binary files /dev/null and b/slides/figs/arbre_couvrant_minimal_exemple.png differ
diff --git a/slides/figs/arbre_couvrant_vide.png b/slides/figs/arbre_couvrant_vide.png
new file mode 100644
index 0000000000000000000000000000000000000000..ecc8eb81bcddea0ad9e7c2e7eae8f8e2b12f7fc6
Binary files /dev/null and b/slides/figs/arbre_couvrant_vide.png differ
diff --git a/slides/figs/arbres_couvrants_parcours.png b/slides/figs/arbres_couvrants_parcours.png
new file mode 100644
index 0000000000000000000000000000000000000000..7324b3f570db6feaa590f229a0b9ac3b63c2e935
Binary files /dev/null and b/slides/figs/arbres_couvrants_parcours.png differ
diff --git a/slides/figs/corps1.png b/slides/figs/corps1.png
new file mode 100644
index 0000000000000000000000000000000000000000..42cfc3c3ca0cb6457e7fec97cc2069e6bb5a0562
Binary files /dev/null and b/slides/figs/corps1.png differ
diff --git a/slides/figs/corps2.png b/slides/figs/corps2.png
new file mode 100644
index 0000000000000000000000000000000000000000..18a4b1d91e017078a48e600fab0e7b081936b141
Binary files /dev/null and b/slides/figs/corps2.png differ
diff --git a/slides/figs/corps3_1.png b/slides/figs/corps3_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..baae25fae36ee5c52dd9c12d91862fd67ab59750
Binary files /dev/null and b/slides/figs/corps3_1.png differ
diff --git a/slides/figs/corps3_2.png b/slides/figs/corps3_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..35d5aec9a13fd2b6502e15087ca4df033afe6806
Binary files /dev/null and b/slides/figs/corps3_2.png differ
diff --git a/slides/figs/corps3_3.png b/slides/figs/corps3_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b2676505189a1a046389d3bbfcc33695b77ec34
Binary files /dev/null and b/slides/figs/corps3_3.png differ
diff --git a/slides/figs/force_1.png b/slides/figs/force_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e04dab8bf3fa363b2931a5625f752635021cef88
Binary files /dev/null and b/slides/figs/force_1.png differ
diff --git a/slides/figs/force_2.png b/slides/figs/force_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b9050c9c54c905d1a0b257b9acf5bb59d311c77
Binary files /dev/null and b/slides/figs/force_2.png differ
diff --git a/slides/figs/force_3.png b/slides/figs/force_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..e83e68e3440c1e8f261e67fa511693dc7d99a9bc
Binary files /dev/null and b/slides/figs/force_3.png differ
diff --git a/slides/figs/force_4.png b/slides/figs/force_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3582f03e43f7e591d28de4fcd3a6247390534c2
Binary files /dev/null and b/slides/figs/force_4.png differ
diff --git a/slides/figs/force_5.png b/slides/figs/force_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..67f2a8c6ea47e40bf25f2f0f45c2ba4d9ee791d2
Binary files /dev/null and b/slides/figs/force_5.png differ
diff --git a/slides/figs/force_6.png b/slides/figs/force_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b6837fdeb3fd1dae92d73e11bac878dbf52d9a6
Binary files /dev/null and b/slides/figs/force_6.png differ
diff --git a/slides/figs/force_7.png b/slides/figs/force_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..751ef2e9d7d7a6ed16f5cc7a2e7d9cb48b03efe1
Binary files /dev/null and b/slides/figs/force_7.png differ
diff --git a/slides/figs/nbody_bare.png b/slides/figs/nbody_bare.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ec156a59cd82d80a03ec1ae4cb7ca5f76edf38c
Binary files /dev/null and b/slides/figs/nbody_bare.png differ
diff --git a/slides/figs/nbody_group.png b/slides/figs/nbody_group.png
new file mode 100644
index 0000000000000000000000000000000000000000..50ead198cf998d2a78092e4259ef6454ebccabaa
Binary files /dev/null and b/slides/figs/nbody_group.png differ
diff --git a/slides/figs/nbody_n2.png b/slides/figs/nbody_n2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a56fbfaf77c2d3410ea62a2cacb69b6e2040504b
Binary files /dev/null and b/slides/figs/nbody_n2.png differ
diff --git a/slides/figs/nbody_qt.png b/slides/figs/nbody_qt.png
new file mode 100644
index 0000000000000000000000000000000000000000..dee26a7c232eabad134a8ce20c9828421f36a7cf
Binary files /dev/null and b/slides/figs/nbody_qt.png differ
diff --git a/slides/figs/nbody_qt_withtree.png b/slides/figs/nbody_qt_withtree.png
new file mode 100644
index 0000000000000000000000000000000000000000..fad251be9156e47ee2561f2e621da2ac09543dce
Binary files /dev/null and b/slides/figs/nbody_qt_withtree.png differ
diff --git a/slides/figs/quad_img_simple_comp.svg b/slides/figs/quad_img_simple_comp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8246f9ebf4751ee03b896848470239f005b12e6c
--- /dev/null
+++ b/slides/figs/quad_img_simple_comp.svg
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="566pt" height="188pt" viewBox="0.00 0.00 566.00 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
+<title>G</title>
+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-184 562,-184 562,4 -4,4"/>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<ellipse fill="none" stroke="#000000" cx="279" cy="-162" rx="27" ry="18"/>
+<text text-anchor="middle" x="279" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000"> </text>
+</g>
+<!-- sg1 -->
+<g id="node2" class="node">
+<title>sg1</title>
+<ellipse fill="none" stroke="#000000" cx="171" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="171" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">SG</text>
+</g>
+<!-- 0&#45;&gt;sg1 -->
+<g id="edge1" class="edge">
+<title>0-&gt;sg1</title>
+<path fill="none" stroke="#000000" d="M259.6918,-149.1278C242.6445,-137.763 217.5981,-121.0654 198.4656,-108.3104"/>
+<polygon fill="#000000" stroke="#000000" points="200.4031,-105.3956 190.1411,-102.7607 196.5201,-111.2199 200.4031,-105.3956"/>
+</g>
+<!-- sd1 -->
+<g id="node3" class="node">
+<title>sd1</title>
+<ellipse fill="none" stroke="#000000" cx="243" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="243" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">4</text>
+</g>
+<!-- 0&#45;&gt;sd1 -->
+<g id="edge2" class="edge">
+<title>0-&gt;sd1</title>
+<path fill="none" stroke="#000000" d="M270.2854,-144.5708C266.0403,-136.0807 260.8464,-125.6929 256.1337,-116.2674"/>
+<polygon fill="#000000" stroke="#000000" points="259.237,-114.6477 251.6343,-107.2687 252.976,-117.7782 259.237,-114.6477"/>
+</g>
+<!-- ig1 -->
+<g id="node4" class="node">
+<title>ig1</title>
+<ellipse fill="none" stroke="#000000" cx="315" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="315" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">1</text>
+</g>
+<!-- 0&#45;&gt;ig1 -->
+<g id="edge3" class="edge">
+<title>0-&gt;ig1</title>
+<path fill="none" stroke="#000000" d="M287.7146,-144.5708C291.9597,-136.0807 297.1536,-125.6929 301.8663,-116.2674"/>
+<polygon fill="#000000" stroke="#000000" points="305.024,-117.7782 306.3657,-107.2687 298.763,-114.6477 305.024,-117.7782"/>
+</g>
+<!-- id1 -->
+<g id="node5" class="node">
+<title>id1</title>
+<ellipse fill="none" stroke="#000000" cx="387" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="387" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">ID</text>
+</g>
+<!-- 0&#45;&gt;id1 -->
+<g id="edge4" class="edge">
+<title>0-&gt;id1</title>
+<path fill="none" stroke="#000000" d="M298.3082,-149.1278C315.3555,-137.763 340.4019,-121.0654 359.5344,-108.3104"/>
+<polygon fill="#000000" stroke="#000000" points="361.4799,-111.2199 367.8589,-102.7607 357.5969,-105.3956 361.4799,-111.2199"/>
+</g>
+<!-- sg2 -->
+<g id="node6" class="node">
+<title>sg2</title>
+<ellipse fill="none" stroke="#000000" cx="27" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">21</text>
+</g>
+<!-- sg1&#45;&gt;sg2 -->
+<g id="edge5" class="edge">
+<title>sg1-&gt;sg2</title>
+<path fill="none" stroke="#000000" d="M149.1295,-79.0647C124.7778,-66.8889 85.238,-47.119 57.7715,-33.3858"/>
+<polygon fill="#000000" stroke="#000000" points="59.114,-30.1439 48.6045,-28.8022 55.9835,-36.4049 59.114,-30.1439"/>
+</g>
+<!-- sd2 -->
+<g id="node7" class="node">
+<title>sd2</title>
+<ellipse fill="none" stroke="#000000" cx="99" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="99" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">12</text>
+</g>
+<!-- sg1&#45;&gt;sd2 -->
+<g id="edge6" class="edge">
+<title>sg1-&gt;sd2</title>
+<path fill="none" stroke="#000000" d="M155.7307,-74.7307C145.803,-64.803 132.6847,-51.6847 121.5637,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="123.7933,-37.8436 114.2473,-33.2473 118.8436,-42.7933 123.7933,-37.8436"/>
+</g>
+<!-- ig2 -->
+<g id="node8" class="node">
+<title>ig2</title>
+<ellipse fill="none" stroke="#000000" cx="171" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="171" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">9</text>
+</g>
+<!-- sg1&#45;&gt;ig2 -->
+<g id="edge7" class="edge">
+<title>sg1-&gt;ig2</title>
+<path fill="none" stroke="#000000" d="M171,-71.8314C171,-64.131 171,-54.9743 171,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="174.5001,-46.4132 171,-36.4133 167.5001,-46.4133 174.5001,-46.4132"/>
+</g>
+<!-- id2 -->
+<g id="node9" class="node">
+<title>id2</title>
+<ellipse fill="none" stroke="#000000" cx="243" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="243" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">7</text>
+</g>
+<!-- sg1&#45;&gt;id2 -->
+<g id="edge8" class="edge">
+<title>sg1-&gt;id2</title>
+<path fill="none" stroke="#000000" d="M186.2693,-74.7307C196.197,-64.803 209.3153,-51.6847 220.4363,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="223.1564,-42.7933 227.7527,-33.2473 218.2067,-37.8436 223.1564,-42.7933"/>
+</g>
+<!-- sg5 -->
+<g id="node10" class="node">
+<title>sg5</title>
+<ellipse fill="none" stroke="#000000" cx="315" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="315" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">0</text>
+</g>
+<!-- id1&#45;&gt;sg5 -->
+<g id="edge9" class="edge">
+<title>id1-&gt;sg5</title>
+<path fill="none" stroke="#000000" d="M371.7307,-74.7307C361.803,-64.803 348.6847,-51.6847 337.5637,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="339.7933,-37.8436 330.2473,-33.2473 334.8436,-42.7933 339.7933,-37.8436"/>
+</g>
+<!-- sd5 -->
+<g id="node11" class="node">
+<title>sd5</title>
+<ellipse fill="none" stroke="#000000" cx="387" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="387" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">31</text>
+</g>
+<!-- id1&#45;&gt;sd5 -->
+<g id="edge10" class="edge">
+<title>id1-&gt;sd5</title>
+<path fill="none" stroke="#000000" d="M387,-71.8314C387,-64.131 387,-54.9743 387,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="390.5001,-46.4132 387,-36.4133 383.5001,-46.4133 390.5001,-46.4132"/>
+</g>
+<!-- ig5 -->
+<g id="node12" class="node">
+<title>ig5</title>
+<ellipse fill="none" stroke="#000000" cx="459" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="459" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">3</text>
+</g>
+<!-- id1&#45;&gt;ig5 -->
+<g id="edge11" class="edge">
+<title>id1-&gt;ig5</title>
+<path fill="none" stroke="#000000" d="M402.2693,-74.7307C412.197,-64.803 425.3153,-51.6847 436.4363,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="439.1564,-42.7933 443.7527,-33.2473 434.2067,-37.8436 439.1564,-42.7933"/>
+</g>
+<!-- id5 -->
+<g id="node13" class="node">
+<title>id5</title>
+<ellipse fill="none" stroke="#000000" cx="531" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="531" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">27</text>
+</g>
+<!-- id1&#45;&gt;id5 -->
+<g id="edge12" class="edge">
+<title>id1-&gt;id5</title>
+<path fill="none" stroke="#000000" d="M408.8705,-79.0647C433.2222,-66.8889 472.762,-47.119 500.2285,-33.3858"/>
+<polygon fill="#000000" stroke="#000000" points="502.0165,-36.4049 509.3955,-28.8022 498.886,-30.1439 502.0165,-36.4049"/>
+</g>
+</g>
+</svg>
\ No newline at end of file
diff --git a/slides/figs/quad_img_simple_comp_avg.svg b/slides/figs/quad_img_simple_comp_avg.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2912f485a2ed5ebd7794c57dde69618566c89f63
--- /dev/null
+++ b/slides/figs/quad_img_simple_comp_avg.svg
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="582pt" height="211pt" viewBox="0.00 0.00 582.00 210.83" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 206.8313)">
+<title>G</title>
+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-206.8313 578,-206.8313 578,4 -4,4"/>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<ellipse fill="none" stroke="#000000" cx="286" cy="-184.8313" rx="27" ry="18"/>
+<text text-anchor="middle" x="286" y="-180.6313" font-family="Times,serif" font-size="14.00" fill="#000000"> </text>
+</g>
+<!-- sg1 -->
+<g id="node2" class="node">
+<title>sg1</title>
+<ellipse fill="none" stroke="#000000" cx="163" cy="-101.4156" rx="33.6754" ry="29.3315"/>
+<text text-anchor="middle" x="163" y="-105.6156" font-family="Times,serif" font-size="14.00" fill="#000000">12.25</text>
+<text text-anchor="middle" x="163" y="-88.8156" font-family="Times,serif" font-size="14.00" fill="#000000"> 5.36</text>
+</g>
+<!-- 0&#45;&gt;sg1 -->
+<g id="edge1" class="edge">
+<title>0-&gt;sg1</title>
+<path fill="none" stroke="#000000" d="M266.9039,-171.9899C250.6822,-161.0698 226.7895,-144.9585 206,-130.8313 203.4634,-129.1076 200.8445,-127.3245 198.2095,-125.528"/>
+<polygon fill="#000000" stroke="#000000" points="200.0521,-122.5481 189.8198,-119.8004 196.1053,-128.3293 200.0521,-122.5481"/>
+</g>
+<!-- sd1 -->
+<g id="node3" class="node">
+<title>sd1</title>
+<ellipse fill="none" stroke="#000000" cx="246" cy="-101.4156" rx="31.2258" ry="29.3315"/>
+<text text-anchor="middle" x="246" y="-105.6156" font-family="Times,serif" font-size="14.00" fill="#000000">3.75</text>
+<text text-anchor="middle" x="246" y="-88.8156" font-family="Times,serif" font-size="14.00" fill="#000000"> 0.43</text>
+</g>
+<!-- 0&#45;&gt;sd1 -->
+<g id="edge2" class="edge">
+<title>0-&gt;sd1</title>
+<path fill="none" stroke="#000000" d="M277.712,-167.5475C273.5772,-158.925 268.4114,-148.1521 263.4571,-137.8205"/>
+<polygon fill="#000000" stroke="#000000" points="266.4822,-136.0343 259.0024,-128.5307 260.1704,-139.061 266.4822,-136.0343"/>
+</g>
+<!-- ig1 -->
+<g id="node4" class="node">
+<title>ig1</title>
+<ellipse fill="none" stroke="#000000" cx="326" cy="-101.4156" rx="31.2258" ry="29.3315"/>
+<text text-anchor="middle" x="326" y="-105.6156" font-family="Times,serif" font-size="14.00" fill="#000000">1.25</text>
+<text text-anchor="middle" x="326" y="-88.8156" font-family="Times,serif" font-size="14.00" fill="#000000"> 0.43</text>
+</g>
+<!-- 0&#45;&gt;ig1 -->
+<g id="edge3" class="edge">
+<title>0-&gt;ig1</title>
+<path fill="none" stroke="#000000" d="M294.288,-167.5475C298.4228,-158.925 303.5886,-148.1521 308.5429,-137.8205"/>
+<polygon fill="#000000" stroke="#000000" points="311.8296,-139.061 312.9976,-128.5307 305.5178,-136.0343 311.8296,-139.061"/>
+</g>
+<!-- id1 -->
+<g id="node5" class="node">
+<title>id1</title>
+<ellipse fill="none" stroke="#000000" cx="411" cy="-101.4156" rx="36.125" ry="29.3315"/>
+<text text-anchor="middle" x="411" y="-105.6156" font-family="Times,serif" font-size="14.00" fill="#000000">15.25</text>
+<text text-anchor="middle" x="411" y="-88.8156" font-family="Times,serif" font-size="14.00" fill="#000000"> 13.86</text>
+</g>
+<!-- 0&#45;&gt;id1 -->
+<g id="edge4" class="edge">
+<title>0-&gt;id1</title>
+<path fill="none" stroke="#000000" d="M305.2573,-171.9804C323.5964,-159.7423 351.6784,-141.0024 374.2949,-125.9099"/>
+<polygon fill="#000000" stroke="#000000" points="376.2884,-128.7873 382.6636,-120.3252 372.4029,-122.9647 376.2884,-128.7873"/>
+</g>
+<!-- sg2 -->
+<g id="node6" class="node">
+<title>sg2</title>
+<ellipse fill="none" stroke="#000000" cx="27" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">21</text>
+</g>
+<!-- sg1&#45;&gt;sg2 -->
+<g id="edge5" class="edge">
+<title>sg1-&gt;sg2</title>
+<path fill="none" stroke="#000000" d="M135.4784,-84.5352C112.3184,-70.33 79.3088,-50.0836 55.7965,-35.6623"/>
+<polygon fill="#000000" stroke="#000000" points="57.3348,-32.5 46.9805,-30.255 53.6749,-38.467 57.3348,-32.5"/>
+</g>
+<!-- sd2 -->
+<g id="node7" class="node">
+<title>sd2</title>
+<ellipse fill="none" stroke="#000000" cx="99" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="99" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">12</text>
+</g>
+<!-- sg1&#45;&gt;sd2 -->
+<g id="edge6" class="edge">
+<title>sg1-&gt;sd2</title>
+<path fill="none" stroke="#000000" d="M144.144,-76.8394C135.8231,-65.9941 126.067,-53.2783 117.7574,-42.4479"/>
+<polygon fill="#000000" stroke="#000000" points="120.3226,-40.0414 111.4585,-34.238 114.7689,-44.3024 120.3226,-40.0414"/>
+</g>
+<!-- ig2 -->
+<g id="node8" class="node">
+<title>ig2</title>
+<ellipse fill="none" stroke="#000000" cx="171" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="171" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">9</text>
+</g>
+<!-- sg1&#45;&gt;ig2 -->
+<g id="edge7" class="edge">
+<title>sg1-&gt;ig2</title>
+<path fill="none" stroke="#000000" d="M165.843,-71.7715C166.6299,-63.5664 167.4822,-54.6796 168.263,-46.5388"/>
+<polygon fill="#000000" stroke="#000000" points="171.7659,-46.6751 169.2366,-36.3866 164.7979,-46.0067 171.7659,-46.6751"/>
+</g>
+<!-- id2 -->
+<g id="node9" class="node">
+<title>id2</title>
+<ellipse fill="none" stroke="#000000" cx="243" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="243" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">7</text>
+</g>
+<!-- sg1&#45;&gt;id2 -->
+<g id="edge8" class="edge">
+<title>sg1-&gt;id2</title>
+<path fill="none" stroke="#000000" d="M184.8604,-78.622C196.1694,-66.83 209.9328,-52.479 221.2289,-40.7006"/>
+<polygon fill="#000000" stroke="#000000" points="223.8495,-43.0247 228.2452,-33.3848 218.7974,-38.1795 223.8495,-43.0247"/>
+</g>
+<!-- sg5 -->
+<g id="node10" class="node">
+<title>sg5</title>
+<ellipse fill="none" stroke="#000000" cx="331" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="331" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">0</text>
+</g>
+<!-- id1&#45;&gt;sg5 -->
+<g id="edge9" class="edge">
+<title>id1-&gt;sg5</title>
+<path fill="none" stroke="#000000" d="M388.7155,-78.1797C377.4137,-66.3954 363.7473,-52.1455 352.5506,-40.4707"/>
+<polygon fill="#000000" stroke="#000000" points="355.0469,-38.0171 345.5991,-33.2224 349.9948,-42.8623 355.0469,-38.0171"/>
+</g>
+<!-- sd5 -->
+<g id="node11" class="node">
+<title>sd5</title>
+<ellipse fill="none" stroke="#000000" cx="403" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="403" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">31</text>
+</g>
+<!-- id1&#45;&gt;sd5 -->
+<g id="edge10" class="edge">
+<title>id1-&gt;sd5</title>
+<path fill="none" stroke="#000000" d="M408.157,-71.7715C407.3701,-63.5664 406.5178,-54.6796 405.737,-46.5388"/>
+<polygon fill="#000000" stroke="#000000" points="409.2021,-46.0067 404.7634,-36.3866 402.2341,-46.6751 409.2021,-46.0067"/>
+</g>
+<!-- ig5 -->
+<g id="node12" class="node">
+<title>ig5</title>
+<ellipse fill="none" stroke="#000000" cx="475" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="475" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">3</text>
+</g>
+<!-- id1&#45;&gt;ig5 -->
+<g id="edge11" class="edge">
+<title>id1-&gt;ig5</title>
+<path fill="none" stroke="#000000" d="M430.2021,-76.3882C438.5112,-65.5583 448.1987,-52.932 456.4352,-42.1968"/>
+<polygon fill="#000000" stroke="#000000" points="459.3652,-44.1277 462.6756,-34.0633 453.8115,-39.8667 459.3652,-44.1277"/>
+</g>
+<!-- id5 -->
+<g id="node13" class="node">
+<title>id5</title>
+<ellipse fill="none" stroke="#000000" cx="547" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="547" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">27</text>
+</g>
+<!-- id1&#45;&gt;id5 -->
+<g id="edge12" class="edge">
+<title>id1-&gt;id5</title>
+<path fill="none" stroke="#000000" d="M439.8421,-83.7253C462.9705,-69.5395 495.2668,-49.7305 518.3455,-35.5753"/>
+<polygon fill="#000000" stroke="#000000" points="520.3114,-38.4754 527.0058,-30.2634 516.6515,-32.5084 520.3114,-38.4754"/>
+</g>
+</g>
+</svg>
\ No newline at end of file
diff --git a/slides/figs/quad_img_simple_comp_loss.svg b/slides/figs/quad_img_simple_comp_loss.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c8972b12117d86a3a25eca49a3f7e3a01765b456
--- /dev/null
+++ b/slides/figs/quad_img_simple_comp_loss.svg
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="568pt" height="188pt" viewBox="0.00 0.00 568.00 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
+<title>G</title>
+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-184 564,-184 564,4 -4,4"/>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<ellipse fill="none" stroke="#000000" cx="280" cy="-162" rx="27" ry="18"/>
+<text text-anchor="middle" x="280" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000"> </text>
+</g>
+<!-- sg1 -->
+<g id="node2" class="node">
+<title>sg1</title>
+<ellipse fill="none" stroke="#000000" cx="170" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="170" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">SG</text>
+</g>
+<!-- 0&#45;&gt;sg1 -->
+<g id="edge1" class="edge">
+<title>0-&gt;sg1</title>
+<path fill="none" stroke="#000000" d="M260.5874,-149.2936C243.258,-137.9507 217.6682,-121.201 198.1028,-108.3946"/>
+<polygon fill="#000000" stroke="#000000" points="199.8724,-105.3698 189.5885,-102.8216 196.0387,-111.2267 199.8724,-105.3698"/>
+</g>
+<!-- sd1 -->
+<g id="node3" class="node">
+<title>sd1</title>
+<ellipse fill="none" stroke="#000000" cx="243" cy="-90" rx="27.8725" ry="18"/>
+<text text-anchor="middle" x="243" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">3.75</text>
+</g>
+<!-- 0&#45;&gt;sd1 -->
+<g id="edge2" class="edge">
+<title>0-&gt;sd1</title>
+<path fill="none" stroke="#000000" d="M271.2315,-144.937C266.8721,-136.4537 261.5047,-126.0092 256.6247,-116.513"/>
+<polygon fill="#000000" stroke="#000000" points="259.6463,-114.7352 251.9626,-107.4407 253.4203,-117.9348 259.6463,-114.7352"/>
+</g>
+<!-- ig1 -->
+<g id="node4" class="node">
+<title>ig1</title>
+<ellipse fill="none" stroke="#000000" cx="317" cy="-90" rx="27.8725" ry="18"/>
+<text text-anchor="middle" x="317" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">1.25</text>
+</g>
+<!-- 0&#45;&gt;ig1 -->
+<g id="edge3" class="edge">
+<title>0-&gt;ig1</title>
+<path fill="none" stroke="#000000" d="M288.7685,-144.937C293.1279,-136.4537 298.4953,-126.0092 303.3753,-116.513"/>
+<polygon fill="#000000" stroke="#000000" points="306.5797,-117.9348 308.0374,-107.4407 300.3537,-114.7352 306.5797,-117.9348"/>
+</g>
+<!-- id1 -->
+<g id="node5" class="node">
+<title>id1</title>
+<ellipse fill="none" stroke="#000000" cx="390" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="390" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">ID</text>
+</g>
+<!-- 0&#45;&gt;id1 -->
+<g id="edge4" class="edge">
+<title>0-&gt;id1</title>
+<path fill="none" stroke="#000000" d="M299.4126,-149.2936C316.742,-137.9507 342.3318,-121.201 361.8972,-108.3946"/>
+<polygon fill="#000000" stroke="#000000" points="363.9613,-111.2267 370.4115,-102.8216 360.1276,-105.3698 363.9613,-111.2267"/>
+</g>
+<!-- sg2 -->
+<g id="node6" class="node">
+<title>sg2</title>
+<ellipse fill="none" stroke="#000000" cx="27" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">21</text>
+</g>
+<!-- sg1&#45;&gt;sg2 -->
+<g id="edge5" class="edge">
+<title>sg1-&gt;sg2</title>
+<path fill="none" stroke="#000000" d="M148.2814,-79.0647C124.2386,-66.9593 85.287,-47.3473 58.032,-33.6245"/>
+<polygon fill="#000000" stroke="#000000" points="59.4288,-30.4092 48.923,-29.0382 56.2808,-36.6614 59.4288,-30.4092"/>
+</g>
+<!-- sd2 -->
+<g id="node7" class="node">
+<title>sd2</title>
+<ellipse fill="none" stroke="#000000" cx="99" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="99" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">12</text>
+</g>
+<!-- sg1&#45;&gt;sd2 -->
+<g id="edge6" class="edge">
+<title>sg1-&gt;sd2</title>
+<path fill="none" stroke="#000000" d="M154.9427,-74.7307C145.153,-64.803 132.2169,-51.6847 121.2503,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="123.5492,-37.9102 114.0356,-33.2473 118.5649,-42.8252 123.5492,-37.9102"/>
+</g>
+<!-- ig2 -->
+<g id="node8" class="node">
+<title>ig2</title>
+<ellipse fill="none" stroke="#000000" cx="171" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="171" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">9</text>
+</g>
+<!-- sg1&#45;&gt;ig2 -->
+<g id="edge7" class="edge">
+<title>sg1-&gt;ig2</title>
+<path fill="none" stroke="#000000" d="M170.2523,-71.8314C170.3593,-64.131 170.4865,-54.9743 170.6053,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="174.1049,-46.4609 170.7443,-36.4133 167.1056,-46.3637 174.1049,-46.4609"/>
+</g>
+<!-- id2 -->
+<g id="node9" class="node">
+<title>id2</title>
+<ellipse fill="none" stroke="#000000" cx="243" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="243" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">7</text>
+</g>
+<!-- sg1&#45;&gt;id2 -->
+<g id="edge8" class="edge">
+<title>sg1-&gt;id2</title>
+<path fill="none" stroke="#000000" d="M185.1256,-75.0816C195.3345,-65.0125 208.9878,-51.5463 220.4693,-40.2221"/>
+<polygon fill="#000000" stroke="#000000" points="222.9806,-42.6611 227.6426,-33.147 218.0651,-37.6773 222.9806,-42.6611"/>
+</g>
+<!-- sg5 -->
+<g id="node10" class="node">
+<title>sg5</title>
+<ellipse fill="none" stroke="#000000" cx="317" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="317" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">0</text>
+</g>
+<!-- id1&#45;&gt;sg5 -->
+<g id="edge9" class="edge">
+<title>id1-&gt;sg5</title>
+<path fill="none" stroke="#000000" d="M374.8744,-75.0816C364.6655,-65.0125 351.0122,-51.5463 339.5307,-40.2221"/>
+<polygon fill="#000000" stroke="#000000" points="341.9349,-37.6773 332.3574,-33.147 337.0194,-42.6611 341.9349,-37.6773"/>
+</g>
+<!-- sd5 -->
+<g id="node11" class="node">
+<title>sd5</title>
+<ellipse fill="none" stroke="#000000" cx="389" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="389" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">31</text>
+</g>
+<!-- id1&#45;&gt;sd5 -->
+<g id="edge10" class="edge">
+<title>id1-&gt;sd5</title>
+<path fill="none" stroke="#000000" d="M389.7477,-71.8314C389.6407,-64.131 389.5135,-54.9743 389.3947,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="392.8944,-46.3637 389.2557,-36.4133 385.8951,-46.4609 392.8944,-46.3637"/>
+</g>
+<!-- ig5 -->
+<g id="node12" class="node">
+<title>ig5</title>
+<ellipse fill="none" stroke="#000000" cx="461" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="461" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">3</text>
+</g>
+<!-- id1&#45;&gt;ig5 -->
+<g id="edge11" class="edge">
+<title>id1-&gt;ig5</title>
+<path fill="none" stroke="#000000" d="M405.0573,-74.7307C414.847,-64.803 427.7831,-51.6847 438.7497,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="441.4351,-42.8252 445.9644,-33.2473 436.4508,-37.9102 441.4351,-42.8252"/>
+</g>
+<!-- id5 -->
+<g id="node13" class="node">
+<title>id5</title>
+<ellipse fill="none" stroke="#000000" cx="533" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="533" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">27</text>
+</g>
+<!-- id1&#45;&gt;id5 -->
+<g id="edge12" class="edge">
+<title>id1-&gt;id5</title>
+<path fill="none" stroke="#000000" d="M411.7186,-79.0647C435.7614,-66.9593 474.713,-47.3473 501.968,-33.6245"/>
+<polygon fill="#000000" stroke="#000000" points="503.7192,-36.6614 511.077,-29.0382 500.5712,-30.4092 503.7192,-36.6614"/>
+</g>
+</g>
+</svg>
\ No newline at end of file
diff --git a/slides/figs/quad_img_simple_variation.svg b/slides/figs/quad_img_simple_variation.svg
new file mode 100644
index 0000000000000000000000000000000000000000..eafe19ff0484820ffb90fb9b5cc7bfe21c959fae
--- /dev/null
+++ b/slides/figs/quad_img_simple_variation.svg
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.40.1 (20161225.0304)
+ -->
+<!-- Title: G Pages: 1 -->
+<svg width="1142pt" height="188pt" viewBox="0.00 0.00 1142.00 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
+<title>G</title>
+<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-184 1138,-184 1138,4 -4,4"/>
+<!-- 0 -->
+<g id="node1" class="node">
+<title>0</title>
+<ellipse fill="none" stroke="#000000" cx="567" cy="-162" rx="27" ry="18"/>
+<text text-anchor="middle" x="567" y="-157.8" font-family="Times,serif" font-size="14.00" fill="#000000"> </text>
+</g>
+<!-- sg1 -->
+<g id="node2" class="node">
+<title>sg1</title>
+<ellipse fill="none" stroke="#000000" cx="171" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="171" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">SG</text>
+</g>
+<!-- 0&#45;&gt;sg1 -->
+<g id="edge1" class="edge">
+<title>0-&gt;sg1</title>
+<path fill="none" stroke="#000000" d="M540.7107,-157.2201C471.8543,-144.7008 286.1298,-110.9327 207.2397,-96.589"/>
+<polygon fill="#000000" stroke="#000000" points="207.7449,-93.1236 197.28,-94.7782 206.4926,-100.0107 207.7449,-93.1236"/>
+</g>
+<!-- sd1 -->
+<g id="node3" class="node">
+<title>sd1</title>
+<ellipse fill="none" stroke="#000000" cx="459" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="459" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">SD</text>
+</g>
+<!-- 0&#45;&gt;sd1 -->
+<g id="edge2" class="edge">
+<title>0-&gt;sd1</title>
+<path fill="none" stroke="#000000" d="M547.6918,-149.1278C530.6445,-137.763 505.5981,-121.0654 486.4656,-108.3104"/>
+<polygon fill="#000000" stroke="#000000" points="488.4031,-105.3956 478.1411,-102.7607 484.5201,-111.2199 488.4031,-105.3956"/>
+</g>
+<!-- ig1 -->
+<g id="node4" class="node">
+<title>ig1</title>
+<ellipse fill="none" stroke="#000000" cx="675" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="675" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">IG</text>
+</g>
+<!-- 0&#45;&gt;ig1 -->
+<g id="edge3" class="edge">
+<title>0-&gt;ig1</title>
+<path fill="none" stroke="#000000" d="M586.3082,-149.1278C603.3555,-137.763 628.4019,-121.0654 647.5344,-108.3104"/>
+<polygon fill="#000000" stroke="#000000" points="649.4799,-111.2199 655.8589,-102.7607 645.5969,-105.3956 649.4799,-111.2199"/>
+</g>
+<!-- id1 -->
+<g id="node5" class="node">
+<title>id1</title>
+<ellipse fill="none" stroke="#000000" cx="963" cy="-90" rx="27" ry="18"/>
+<text text-anchor="middle" x="963" y="-85.8" font-family="Times,serif" font-size="14.00" fill="#000000">ID</text>
+</g>
+<!-- 0&#45;&gt;id1 -->
+<g id="edge4" class="edge">
+<title>0-&gt;id1</title>
+<path fill="none" stroke="#000000" d="M593.2893,-157.2201C662.1457,-144.7008 847.8702,-110.9327 926.7603,-96.589"/>
+<polygon fill="#000000" stroke="#000000" points="927.5074,-100.0107 936.72,-94.7782 926.2551,-93.1236 927.5074,-100.0107"/>
+</g>
+<!-- sg2 -->
+<g id="node6" class="node">
+<title>sg2</title>
+<ellipse fill="none" stroke="#000000" cx="27" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="27" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">21</text>
+</g>
+<!-- sg1&#45;&gt;sg2 -->
+<g id="edge5" class="edge">
+<title>sg1-&gt;sg2</title>
+<path fill="none" stroke="#000000" d="M149.1295,-79.0647C124.7778,-66.8889 85.238,-47.119 57.7715,-33.3858"/>
+<polygon fill="#000000" stroke="#000000" points="59.114,-30.1439 48.6045,-28.8022 55.9835,-36.4049 59.114,-30.1439"/>
+</g>
+<!-- sd2 -->
+<g id="node7" class="node">
+<title>sd2</title>
+<ellipse fill="none" stroke="#000000" cx="99" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="99" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">12</text>
+</g>
+<!-- sg1&#45;&gt;sd2 -->
+<g id="edge6" class="edge">
+<title>sg1-&gt;sd2</title>
+<path fill="none" stroke="#000000" d="M155.7307,-74.7307C145.803,-64.803 132.6847,-51.6847 121.5637,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="123.7933,-37.8436 114.2473,-33.2473 118.8436,-42.7933 123.7933,-37.8436"/>
+</g>
+<!-- ig2 -->
+<g id="node8" class="node">
+<title>ig2</title>
+<ellipse fill="none" stroke="#000000" cx="171" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="171" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">9</text>
+</g>
+<!-- sg1&#45;&gt;ig2 -->
+<g id="edge7" class="edge">
+<title>sg1-&gt;ig2</title>
+<path fill="none" stroke="#000000" d="M171,-71.8314C171,-64.131 171,-54.9743 171,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="174.5001,-46.4132 171,-36.4133 167.5001,-46.4133 174.5001,-46.4132"/>
+</g>
+<!-- id2 -->
+<g id="node9" class="node">
+<title>id2</title>
+<ellipse fill="none" stroke="#000000" cx="243" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="243" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">7</text>
+</g>
+<!-- sg1&#45;&gt;id2 -->
+<g id="edge8" class="edge">
+<title>sg1-&gt;id2</title>
+<path fill="none" stroke="#000000" d="M186.2693,-74.7307C196.197,-64.803 209.3153,-51.6847 220.4363,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="223.1564,-42.7933 227.7527,-33.2473 218.2067,-37.8436 223.1564,-42.7933"/>
+</g>
+<!-- sg3 -->
+<g id="node10" class="node">
+<title>sg3</title>
+<ellipse fill="none" stroke="#000000" cx="315" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="315" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">4</text>
+</g>
+<!-- sd1&#45;&gt;sg3 -->
+<g id="edge9" class="edge">
+<title>sd1-&gt;sg3</title>
+<path fill="none" stroke="#000000" d="M437.1295,-79.0647C412.7778,-66.8889 373.238,-47.119 345.7715,-33.3858"/>
+<polygon fill="#000000" stroke="#000000" points="347.114,-30.1439 336.6045,-28.8022 343.9835,-36.4049 347.114,-30.1439"/>
+</g>
+<!-- sd3 -->
+<g id="node11" class="node">
+<title>sd3</title>
+<ellipse fill="none" stroke="#000000" cx="387" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="387" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">3</text>
+</g>
+<!-- sd1&#45;&gt;sd3 -->
+<g id="edge10" class="edge">
+<title>sd1-&gt;sd3</title>
+<path fill="none" stroke="#000000" d="M443.7307,-74.7307C433.803,-64.803 420.6847,-51.6847 409.5637,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="411.7933,-37.8436 402.2473,-33.2473 406.8436,-42.7933 411.7933,-37.8436"/>
+</g>
+<!-- ig3 -->
+<g id="node12" class="node">
+<title>ig3</title>
+<ellipse fill="none" stroke="#000000" cx="459" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="459" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">4</text>
+</g>
+<!-- sd1&#45;&gt;ig3 -->
+<g id="edge11" class="edge">
+<title>sd1-&gt;ig3</title>
+<path fill="none" stroke="#000000" d="M459,-71.8314C459,-64.131 459,-54.9743 459,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="462.5001,-46.4132 459,-36.4133 455.5001,-46.4133 462.5001,-46.4132"/>
+</g>
+<!-- id3 -->
+<g id="node13" class="node">
+<title>id3</title>
+<ellipse fill="none" stroke="#000000" cx="531" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="531" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">4</text>
+</g>
+<!-- sd1&#45;&gt;id3 -->
+<g id="edge12" class="edge">
+<title>sd1-&gt;id3</title>
+<path fill="none" stroke="#000000" d="M474.2693,-74.7307C484.197,-64.803 497.3153,-51.6847 508.4363,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="511.1564,-42.7933 515.7527,-33.2473 506.2067,-37.8436 511.1564,-42.7933"/>
+</g>
+<!-- sg4 -->
+<g id="node14" class="node">
+<title>sg4</title>
+<ellipse fill="none" stroke="#000000" cx="603" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="603" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">1</text>
+</g>
+<!-- ig1&#45;&gt;sg4 -->
+<g id="edge13" class="edge">
+<title>ig1-&gt;sg4</title>
+<path fill="none" stroke="#000000" d="M659.7307,-74.7307C649.803,-64.803 636.6847,-51.6847 625.5637,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="627.7933,-37.8436 618.2473,-33.2473 622.8436,-42.7933 627.7933,-37.8436"/>
+</g>
+<!-- sd4 -->
+<g id="node15" class="node">
+<title>sd4</title>
+<ellipse fill="none" stroke="#000000" cx="675" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="675" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">1</text>
+</g>
+<!-- ig1&#45;&gt;sd4 -->
+<g id="edge14" class="edge">
+<title>ig1-&gt;sd4</title>
+<path fill="none" stroke="#000000" d="M675,-71.8314C675,-64.131 675,-54.9743 675,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="678.5001,-46.4132 675,-36.4133 671.5001,-46.4133 678.5001,-46.4132"/>
+</g>
+<!-- ig4 -->
+<g id="node16" class="node">
+<title>ig4</title>
+<ellipse fill="none" stroke="#000000" cx="747" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="747" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">2</text>
+</g>
+<!-- ig1&#45;&gt;ig4 -->
+<g id="edge15" class="edge">
+<title>ig1-&gt;ig4</title>
+<path fill="none" stroke="#000000" d="M690.2693,-74.7307C700.197,-64.803 713.3153,-51.6847 724.4363,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="727.1564,-42.7933 731.7527,-33.2473 722.2067,-37.8436 727.1564,-42.7933"/>
+</g>
+<!-- id4 -->
+<g id="node17" class="node">
+<title>id4</title>
+<ellipse fill="none" stroke="#000000" cx="819" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="819" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">1</text>
+</g>
+<!-- ig1&#45;&gt;id4 -->
+<g id="edge16" class="edge">
+<title>ig1-&gt;id4</title>
+<path fill="none" stroke="#000000" d="M696.8705,-79.0647C721.2222,-66.8889 760.762,-47.119 788.2285,-33.3858"/>
+<polygon fill="#000000" stroke="#000000" points="790.0165,-36.4049 797.3955,-28.8022 786.886,-30.1439 790.0165,-36.4049"/>
+</g>
+<!-- sg5 -->
+<g id="node18" class="node">
+<title>sg5</title>
+<ellipse fill="none" stroke="#000000" cx="891" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="891" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">0</text>
+</g>
+<!-- id1&#45;&gt;sg5 -->
+<g id="edge17" class="edge">
+<title>id1-&gt;sg5</title>
+<path fill="none" stroke="#000000" d="M947.7307,-74.7307C937.803,-64.803 924.6847,-51.6847 913.5637,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="915.7933,-37.8436 906.2473,-33.2473 910.8436,-42.7933 915.7933,-37.8436"/>
+</g>
+<!-- sd5 -->
+<g id="node19" class="node">
+<title>sd5</title>
+<ellipse fill="none" stroke="#000000" cx="963" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="963" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">31</text>
+</g>
+<!-- id1&#45;&gt;sd5 -->
+<g id="edge18" class="edge">
+<title>id1-&gt;sd5</title>
+<path fill="none" stroke="#000000" d="M963,-71.8314C963,-64.131 963,-54.9743 963,-46.4166"/>
+<polygon fill="#000000" stroke="#000000" points="966.5001,-46.4132 963,-36.4133 959.5001,-46.4133 966.5001,-46.4132"/>
+</g>
+<!-- ig5 -->
+<g id="node20" class="node">
+<title>ig5</title>
+<ellipse fill="none" stroke="#000000" cx="1035" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="1035" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">3</text>
+</g>
+<!-- id1&#45;&gt;ig5 -->
+<g id="edge19" class="edge">
+<title>id1-&gt;ig5</title>
+<path fill="none" stroke="#000000" d="M978.2693,-74.7307C988.197,-64.803 1001.3153,-51.6847 1012.4363,-40.5637"/>
+<polygon fill="#000000" stroke="#000000" points="1015.1564,-42.7933 1019.7527,-33.2473 1010.2067,-37.8436 1015.1564,-42.7933"/>
+</g>
+<!-- id5 -->
+<g id="node21" class="node">
+<title>id5</title>
+<ellipse fill="none" stroke="#000000" cx="1107" cy="-18" rx="27" ry="18"/>
+<text text-anchor="middle" x="1107" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">27</text>
+</g>
+<!-- id1&#45;&gt;id5 -->
+<g id="edge20" class="edge">
+<title>id1-&gt;id5</title>
+<path fill="none" stroke="#000000" d="M984.8705,-79.0647C1009.2222,-66.8889 1048.762,-47.119 1076.2285,-33.3858"/>
+<polygon fill="#000000" stroke="#000000" points="1078.0165,-36.4049 1085.3955,-28.8022 1074.886,-30.1439 1078.0165,-36.4049"/>
+</g>
+</g>
+</svg>
\ No newline at end of file